Содержание
TLS сертификаты для сайтов (cert-manager)
Cert-manager — это дополнение Kubernetes для автоматизации управления и выдачи сертификатов TLS из различных источников.
Устанавливаем
Устанавливаем из манифеста:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/<version>/cert-manager.yaml
Актуальную версию релиза можно посмотреть тут: https://github.com/cert-manager/cert-manager
Проверяем
Например, создадим самоподписанный сертификат. Создадим файл self-s.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: cert-manager-test
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: test-selfsigned
namespace: cert-manager-test
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: selfsigned-cert
namespace: cert-manager-test
spec:
dnsNames:
- myexample.com
secretName: selfsigned-cert-tls
issuerRef:
name: test-selfsigned
Применим файл:
kubectl apply -f self-s.yaml
Смотрим на результат:
kubectl -n cert-manager-test describe certificate
| Type | Reason | Age | From | Message |
|---|---|---|---|---|
| Normal | Issuing | 14s | cert-manager-certificates-issuing | The certificate has been successfully issued |
Смотрим на ключ и сертификат:
kubectl -n cert-manager-test get secret
| NAME | TYPE | DATA | AGE |
|---|---|---|---|
| selfsigned-cert-tls | kubernetes.io/tls | 3 | 47s |
Сертификаты Let's Encrypt
Создаем тестового выпускающего (ClusterIssuer) обслуживающего весь кластер:
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# Test only
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: [email protected] <- надо указать свой
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: cert-manager-staging-letsencrypt-private-key
# Enable the HTTP-01 challenge provider
solvers:
# An empty 'selector' means that this solver matches all domains
- selector: {}
http01:
ingress:
class: nginx
serviceType: ClusterIP
Создаем prod выпускающего (ClusterIssuer) обслуживающего весь кластер:
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: [email protected] <- надо указать свой
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: cert-manager-prod-letsencrypt-private-key
# Enable the HTTP-01 challenge provider
solvers:
# An empty 'selector' means that this solver matches all domains
- selector: {}
http01:
ingress:
class: nginx
serviceType: ClusterIP
Проверяем выпуск сертификатов Let's Encrypt
Выпустим сертификат:
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: letsencrypt-cert-gen
namespace: mynamespace
labels:
app: example
spec:
secretName: cert-tls
privateKey:
rotationPolicy: Always
issuerRef:
name: letsencrypt-staging <- Это тестовый. Для основного поменять staging на prod.
kind: ClusterIssuer
commonName: mysite.example.ru
dnsNames:
- mysite.example.ru
При этом, dns должен быть настроен, и mysite.examle.ru указывать в нужное место.
При через некоторое время, при успешном завершении процесса, в mynamespace появится secret с названием cert-tls который и будет содержать созданный сертификат.
И еще, если во всех вышеприведенных конфигурациях ClusterIssuer поменять на Issuer (и указать namespace), то в каждом namespace можно указать отдельных Issuer с разными настройками.
Приделаем сертификат к сайту.
Создадим тестовый сайт с использованием созданного сертификата:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deploy
namespace: mynamespace
spec:
replicas: 2
selector:
matchLabels:
app: nginx-test
template:
metadata:
name: nginx-test-temp
labels:
app: nginx-test
spec:
containers:
- name: nginx-container
image: nginxdemos/nginx-hello:plain-text
ports:
- name: http
containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: ng-svc
namespace: mynamespace
spec:
type: ClusterIP
ports:
- name: name-np
port: 80
targetPort: 8080
selector:
app: nginx-test
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: mynamespace
spec:
ingressClassName: nginx
tls:
- hosts:
- mysite.example.ru
secretName: cert-tls
rules:
- host: mysite.example.ru
http:
paths:
- backend:
service:
name: ng-svc
port:
number: 80
path: /
pathType: Prefix
Недописано.
Приходите позже.
