Понадобилось сгенерировать wildcard SSL сертификат и раскладывать его по пространствам имён в Kubernetes кластере. Этот сертификат будет использоваться в тестах которые выполняются для набора приложений на каждый запрос на слияние.
В cert-manager настроен ClusterIssuer LE с валидацией через DNS01. Выпуск wildcard сертификата у Let's Encrypt поддерживается только через DNS валидацию и протокол ACMEv2. В примере использован сервис Cloud DNS от Google Cloud Platform.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
email: certificates@example.com
privateKeySecretRef:
name: letsencrypt-production
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- dns01:
cloudDNS:
project: GCP_PROJECT_ID
Манифест для wildcard сертификата (сам сертификат и ключ будут созданы в пространстве имён cert-manager)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-example-com
namespace: cert-manager
spec:
commonName: '*.example.com'
dnsNames:
- '*.example.com'
issuerRef:
kind: ClusterIssuer
name: letsencrypt-production
privateKey:
algorithm: RSA
size: 2048
secretName: wildcard-example-com-tls
Cert-manager не умеет раскидывать секреты самостоятельно и я использовал Kyverno (т.к. он у нас уже используется), но сам cert-manager предлагает использовать reflector или kubernetes-replicator.
Политика Kyverno настроена копировать секрет только в определённые пространства имён, которые соответствуют шаблону "test-*".
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: copy-wildcard-example-com-tls-secret
spec:
rules:
- name: copy-wildcard-example-com-tls-secret
match:
any:
- resources:
kinds:
- Namespace
names:
- "test-*"
generate:
apiVersion: v1
kind: Secret
name: wildcard-example-com-tls
namespace: '{{request.object.metadata.name}}'
synchronize: true
clone:
name: wildcard-example-com-tls
namespace: cert-manager
Чтобы у Kyverno были права работать с секретами нужно добавить дополнительные разрешения в values чарта Kyverno
admissionController:
rbac:
clusterRole:
extraResources:
- apiGroups:
- ''
resources:
- secrets
verbs:
- get
- list
backgroundController:
rbac:
clusterRole:
extraResources:
- apiGroups:
- ''
resources:
- secrets
verbs:
- get
- create
- update
- delete
Без дополнительных прав у Kyverno создание политики она будет завершаться ошибками:
-
admission webhook "validate-policy.kyverno.svc" denied the request: path: spec.rules[0].generate..: system:serviceaccount:kyverno:kyverno-admission-controller requires permissions list,get for resource v1/Secret in namespace {{request.object.metadata.name}} admission webhook "validate-policy.kyverno.svc" denied the request: path: spec.rules[0].generate..: system:serviceaccount:kyverno:kyverno-background-controller requires permissions get,create,update,delete for resource v1/Secret in namespace {{request.object.metadata.name}}
Теперь при создании нового пространства имён (например test-app-pr-123) в нём будет создана копия секрета содержащая wildcard сертификат.
В виде альтернативы можно назначить этот сертификат как сертификат по-умолчанию в ингрес контроллере и тогда можно обойтись без копирования секретов и Kyverno.
Комментариев нет:
Отправить комментарий