Ако питате опитен многомудър инженер какво мисли за cert-manager и защо всички го използват, той ще въздъхне, доверително ще ви прегърне и уморено ще каже: „Всички го използват, защото нямаме нормални алтернативи. Нашите мишки плачат, но продължават да живеят с този кактус. Защо го обичаме? Защото работи. Защо не го обичаме? Защото постоянно излизат нови версии с нови функции. И трябва да актуализираме кластера отново и отново. А старите версии спират да работят, защото има заговор и велико мистериозно шаманство.
Но разработчиците уверяват, че с cert-manager 1.0 всичко ще се промени.
Да вярваме ли?

Cert-manager е „родният“ контролер за управление на сертификати в Kubernetes. С него можете да издавате сертификати от различни източници: Let’s Encrypt, HashiCorp Vault, Venafi, двойки ключове за подпис и самоподписани сертификати. Той също така поддържа ключовете актуални по време на действие и се опитва автоматично да обновява сертификатите в зададеното време до техния изтичане. Cert-manager е базиран на kube-lego и също така е използвал някои техники от други подобни проекти, например kube-cert-manager.
Бележки за изданието
С версия 1.0 ние поставяме знак на доверие след три години разработка на проекта cert-manager. През това време той значително е напреднал в функционалността и стабилността, но най-вече в общността. Днес виждаме как много хора го използват за защита на своите Kubernetes клъстери и внедряване в различни части на екосистемата. В последните 16 издания бяха коригирани множество проблеми. А онова, което трябваше да бъде счупено — е счупено. Няколко итерации по работа с API подобриха взаимодействието му с потребителите. Разрешихме 1500 проблема в GitHub с още по-голям брой заявки за сливане от 253 участници в общността.
С издаването на 1.0 официално заявяваме, че cert-manager е зрял проект. Също така обещаваме да поддържаме съвместимостта на нашето API v1.
Огромна благодарност на всички, които ни помогнаха да направим cert-manager такъв през трите години! Нека версия 1.0 бъде първото от много бъдещи големи постижения.
Версия 1.0 е стабилно издание с няколко приоритетни области:
v1API;Екип
kubectl cert-manager status, за помощ при анализиране на проблеми;Използване на новите стабилни API на Kubernetes;
Подобрено журнализиране;
Подобрения в ACME.
Преди актуализацията е задължително да прочетете бележките за актуализация.
API v1
Версия v0.16 работеше с API v1beta1. Това добави някои структурни промени, както и подобри документацията относно полетата на API. Версия 1.0 се основава на всичко това чрез API v1. Този API е нашият първи стабилен, в същото време вече даваме гаранции за съвместимост, но с API v1 обещаваме да поддържаме съвместимост за години напред.
Направените промени (бележка: нашите средства за конвертиране ще се погрижат за всичко вместо вас):
Сертификат:
emailSANsсега се наричаemailAddressesuriSANs—uris
Тези промени добавят съвместимост с други SAN (subject alt names, прим. преводача), а също така и с Go API. Премахваме този термин от нашия API.
Актуализация
Ако използвате Kubernetes 1.16+ — конвертиращите webhook-ове ще ви позволят да работите безпроблемно и едновременно с версиите на API v1alpha2, v1alpha3, v1beta1 и v1. С тях можете да използвате новата версия на API без промяна или повторно разгръщане на вашите стари ресурси. Настоятелно препоръчваме да актуализирате манифестите до API v1, тъй като предишните версии скоро ще бъдат обявени за остарели. Потребителите legacy на версия cert-manager ще продължат да имат достъп само до v1, стъпките за актуализация можете да намерите .
Екипът kubectl cert-manager статус
С новите подобрения в нашето разширение към kubectl стана по-лесно да се изследват проблеми, свързани с неиздаването на сертификати. kubectl cert-manager status сега предоставя значително повече информация относно това, което се случва с сертификатите, и показва етапа на издаване на сертификата.
След инсталирането на разширението можете да стартирате kubectl cert-manager статус сертификат <име-на-сертификата>, което ще доведе до търсене на сертификат с указаното име и всички свързани ресурси, като CertificateRequest, Secret, Issuer, а също и Order и Challenges в случай на използване на сертификати от ACME.
Пример за отстраняване на грешки на все още неготов сертификат:
$ kubectl cert-manager status certificate acme-certificate
Name: acme-certificate
Namespace: default
Created at: 2020-08-21T16:44:13+02:00
Conditions:
Ready: False, Reason: DoesNotExist, Message: Issuing certificate as Secret does not exist
Issuing: True, Reason: DoesNotExist, Message: Issuing certificate as Secret does not exist
DNS Names:
- example.com
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 18m cert-manager Issuing certificate as Secret does not exist
Normal Generated 18m cert-manager Stored new private key in temporary Secret resource "acme-certificate-tr8b2"
Normal Requested 18m cert-manager Created new CertificateRequest resource "acme-certificate-qp5dm"
Issuer:
Name: acme-issuer
Kind: Issuer
Conditions:
Ready: True, Reason: ACMEAccountRegistered, Message: The ACME account was registered with the ACME server
error when finding Secret "acme-tls": secrets "acme-tls" not found
Not Before:
Not After:
Renewal Time:
CertificateRequest:
Name: acme-certificate-qp5dm
Namespace: default
Conditions:
Ready: False, Reason: Pending, Message: Waiting on certificate issuance from order default/acme-certificate-qp5dm-1319513028: "pending"
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal OrderCreated 18m cert-manager Created Order resource default/acme-certificate-qp5dm-1319513028
Order:
Name: acme-certificate-qp5dm-1319513028
State: pending, Reason:
Authorizations:
URL: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/97777571, Identifier: example.com, Initial State: pending, Wildcard: false
Challenges:
- Name: acme-certificate-qp5dm-1319513028-1825664779, Type: DNS-01, Token: J-lOZ39yNDQLZTtP_ZyrYojDqjutMAJOxCL1AkOEZWw, Key: U_W3gGV2KWgIUonlO2me3rvvEOTrfTb-L5s0V1TJMCw, State: pending, Reason: error getting clouddns service account: secret "clouddns-accoun" not found, Processing: true, Presented: false
Командата може да помогне и да предостави повече информация за съдържанието на сертификата. Пример за детайли на сертификат, издаден от Letsencrypt:
$ kubectl cert-manager status certificate example
Name: example
[...]
Secret:
Name: example
Issuer Country: US
Issuer Organisation: Let's Encrypt
Issuer Common Name: Let's Encrypt Authority X3
Key Usage: Digital Signature, Key Encipherment
Extended Key Usages: Server Authentication, Client Authentication
Public Key Algorithm: RSA
Signature Algorithm: SHA256-RSA
Subject Key ID: 65081d98a9870764590829b88c53240571997862
Authority Key ID: a84a6a63047dddbae6d139b7a64565eff3a8eca1
Serial Number: 0462ffaa887ea17797e0057ca81d7ba2a6fb
Events:
Not Before: 2020-06-02T04:29:56+02:00
Not After: 2020-08-31T04:29:56+02:00
Renewal Time: 2020-08-01T04:29:56+02:00
[...]
Използване на най-новите стабилни API на Kubernetes
Cert-manager беше един от първите, които внедриха CRD на Kubernetes. Това, както и нашата поддръжка за версии на Kubernetes до 1.11, наложи необходимостта да поддържаме остарели apiextensions.k8s.io/v1beta1 за нашите CRD, както и admissionregistration.k8s.io/v1beta1 за нашите уебхукове. В момента те са остарели и ще бъдат премахнати в Kubernetes от версия 1.22. С нашата версия 1.0 вече предлагаме пълна поддръжка apiextensions.k8s.io/v1 и admissionregistration.k8s.io/v1 за Kubernetes 1.16 (където бяха добавени) и нови версии. За потребителите на предишни версии продължаваме да предлагаме поддръжка v1beta1 в нашата legacy версия.
Подобрено логиране
В тази версия актуализирахме библиотеката за логиране до klog/v2, използвана в Kubernetes 1.19. Също така проверяваме всеки лог, който пишем, за да му зададем подходящо ниво. Основавахме се на . Има пет (всъщност — шест, прим. преводача) нива на логиране, започващи от Грешка (ниво 0), което извежда само важни грешки, и завършва с Проследяване (ниво 5), което ще помогне да разберете точно какво се случва. С това изменение намалихме броя на логовете, ако не Ви е нужна информация за отстраняване на грешки при работа с cert-manager.
Съвет: по подразбиране cert-manager работи на ниво 2 (Информация), можете да го преопределите, използвайки global.logLevel в Helm chart.
Забележка: прегледът на логовете е последно средство при отстраняване на проблеми. За допълнителна информация, моля, запознайте се с нашето .
N.B. редактора: За повече информация как всичко това работи зад кулисите в Kubernetes, получаване на ценни съвети от практици-преподаватели, както и качествено съдействие от техническата поддръжка, можете да участвате в онлайн интензиви , който ще се проведе от 28 до 30 септември, и , който ще се проведе от 14 до 16 октомври.
Подобрения ACME
Най-честото приложение на cert-manager вероятно е свързано с издаването на сертификати от Let’s Encrypt, използвайки ACME. Версия 1.0 е забележителна с използването на отзиви от общността за добавяне на две малки, но важни подобрения в нашия ACME issuer.
Отключване на създаване на ключа на акаунта
Ако използвате ACME сертификати в големи количества, вероятно използвате същия акаунт на няколко клъстера, така че вашите ограничения за издаване на сертификати ще важат за всички тях. Това вече беше възможно в cert-manager при копиране на секрет, който е указан в privateKeySecretRef. Такъв случай на употреба беше доста проблематичен, тъй като cert-manager се опитваше да бъде полезен и радостно създаваше нов ключ на акаунта, ако не го намереше. Затова добавихме disableAccountKeyGeneration, за да ви предпази от такова поведение, ако зададете този параметър на истинно — cert-manager няма да създаде ключ и ще ви предупреди, че не е предоставен ключ на акаунта.
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
privateKeySecretRef:
name: example-issuer-account-key
disableAccountKeyGeneration: false
Предпочитана верига
29 септември Let’s Encrypt към собствен център за сертификация ISRG Root. Сертификатите с кръстосани подписи ще бъдат заменени с Identrust. Това изменение не изисква корекции в настройките на cert-manager, всички актуализирани или нови сертификати, издадени след тази дата, ще използват новия коренов CA.
Let’s Encrypt вече подписва сертификати чрез този CA и ги предлага като "алтернативна верига сертификати" чрез ACME. В тази версия на cert-manager има възможност за задаване на достъп до тези вериги в настройките на issuer. В параметъра preferredChain можете да посочите името на използвания CA, чрез който ще бъде издаден сертификатът. Ако има наличен CA сертификат, съответстващ на заявката, той ще ви издаде сертификат. Обърнете внимание, че това е предпочитаната опция, ако нищо не бъде намерено — сертификат по подразбиране ще бъде издаден. Това ще гарантира, че все пак ще актуализирате сертификата си след премахването на алтернативната верига от страна на ACME issuer.
Вече днес можете да получавате сертификати, подписани ISRG Root, например:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
preferredChain: "ISRG Root X1"
Ако предпочитате да запазите веригата IdenTrust — задайте този параметър на DST Root CA X3:
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
preferredChain: "DST Root CA X3"
Обърнете внимание, че този коренов център за сертификация скоро ще изтече, Let’s Encrypt ще поддържа тази верига активна до 29 септември 2021 година.
Източник: habr.com
