Dans un cluster Kubernetes, un NGINX Ingress gère l'accès externe aux services et assure l'équilibrage de charge de niveau 7. Vous pouvez utiliser un NGINX Ingress pour configurer des URL accessibles depuis l'extérieur, des règles de réécriture, des services HTTPS et des fonctionnalités de déploiement canari. Cette rubrique explique comment configurer le routage sécurisé, mettre en place une authentification mutuelle HTTPS, utiliser des expressions régulières et des noms de domaine génériques, ainsi que demander des certificats HTTPS gratuits.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Installé le contrôleur NGINX Ingress. Pour plus d'informations, consultez la section Installation du contrôleur NGINX Ingress.
Un client kubectl connecté au cluster. Pour plus d'informations, consultez la section Obtention du fichier KubeConfig du cluster et connexion au cluster avec kubectl.
Un service exposé par un NGINX Ingress. Pour plus d'informations, consultez la section Création et utilisation d'un NGINX Ingress pour exposer un service.
Méthodes de configuration
Le contrôleur NGINX Ingress dans Container Service for Kubernetes (ACK) est entièrement compatible avec la communauté open source. Pour plus d'informations, consultez la documentation Configuration NGINX.
Trois méthodes de configuration sont prises en charge :
| Méthode | Portée | Référence |
|---|---|---|
| Basée sur les annotations | Par Ingress — configurez les annotations dans le fichier YAML d'un NGINX Ingress spécifique | Annotations |
| Basée sur ConfigMap | Globale — configurez le ConfigMap kube-system/nginx-configuration pour appliquer les paramètres à tous les NGINX Ingresses |
ConfigMaps |
| Modèle NGINX personnalisé | Avancée — modifiez directement le modèle NGINX interne lorsque les méthodes basées sur les annotations et ConfigMap ne répondent pas à vos besoins | Modèle NGINX personnalisé |
Configuration de la redirection d'URL
Par défaut, le contrôleur NGINX Ingress transfère les requêtes en fonction du chemin complet de la requête. Par exemple, une requête vers /service1/api est transférée directement vers /service1/api sur le pod backend. Si le chemin du service backend est /api, une erreur 404 est renvoyée car le chemin ne correspond pas. Utilisez l'annotation nginx.ingress.kubernetes.io/rewrite-target pour réécrire le chemin de la requête vers le répertoire correct.
Créez un NGINX Ingress en fonction de la version de votre cluster.
Clusters exécutant Kubernetes 1.19 ou version ultérieure
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo.bar.com
namespace: default
annotations:
# URL redirection.
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: foo.bar.com
http:
paths:
# If the Ingress controller version is 0.22.0 or later, you must use a regular expression to define the path in the path field and use it with a capturing group in the rewrite-target annotation.
- path: /svc(/|$)(.*)
backend:
service:
name: web1-service
port:
number: 80
pathType: ImplementationSpecific
Clusters exécutant des versions de Kubernetes antérieures à 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: foo.bar.com
namespace: default
annotations:
# URL redirection.
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: foo.bar.com
http:
paths:
# If the Ingress controller version is 0.22.0 or later, you must use a regular expression to define the path in the path field and use it with a capturing group in the rewrite-target annotation.
- path: /svc(/|$)(.*)
backend:
serviceName: web1-service
servicePort: 80
Après le déploiement de l'Ingress, vérifiez la configuration :
-
Récupérez l'adresse de l'Ingress.
kubectl get ingressRésultat attendu :
NAME CLASS HOSTS ADDRESS PORTS AGE foo.bar.com nginx foo.bar.com 172.16.XX.XX 80 46m -
Testez la règle de réécriture. Remplacez
ADDRESSpar l'adresse IP obtenue à l'étape précédente.curl -k -H "Host: foo.bar.com" http://<ADDRESS>/svc/fooRésultat attendu :
web1: /foo
Configuration de règles de réécriture avancées
Pour une réécriture d'URL de base, utilisez l'annotation nginx.ingress.kubernetes.io/rewrite-target comme décrit dans la section Configuration de la redirection d'URL.
Pour des exigences de réécriture complexes, utilisez les annotations suivantes afin d'ajouter des extraits personnalisés à la configuration NGINX :
| Annotation | Zone d'application |
|---|---|
nginx.ingress.kubernetes.io/server-snippet |
Ajoute un extrait de configuration au bloc server de NGINX |
nginx.ingress.kubernetes.io/configuration-snippet |
Ajoute un extrait de configuration au bloc location de NGINX |
Exemple :
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;
Pour afficher la configuration NGINX générée, exécutez la commande suivante. Remplacez le nom du pod par le nom réel du pod du contrôleur NGINX Ingress dans votre cluster.
kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf
La configuration ci-dessus génère la sortie nginx.conf suivante :
# start server foo.bar.com
server {
server_name foo.bar.com ;
listen 80;
listen [::]:80;
set $proxy_upstream_name "-";
# server-snippet configuration.
rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
...
# configuration-snippet configuration.
rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;
...
}
# end server foo.bar.com
Les annotations snippet prennent également en charge les configurations globales. Pour plus d'informations, consultez la section server-snippet. Pour la référence complète de la directive rewrite de NGINX, consultez la documentation officielle de NGINX.
Configurer un certificat HTTPS
Utilisez la sémantique TLS native d'Ingress pour configurer un certificat HTTPS pour votre service.
-
Préparez votre certificat TLS.
Générez un certificat auto-signé et une clé privée. ``
bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"``-
Créez un Kubernetes Secret à partir du certificat et de la clé privée. Référencez ce Secret dans l'Ingress.
kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
Le CN (Common Name) du certificat doit correspondre à l'hôte configuré dans l'Ingress. S'ils ne correspondent pas, le contrôleur NGINX Ingress ne peut pas charger le certificat.
-
Créez une ressource Ingress qui référence le Secret dans le champ
tls. Kubernetes 1.19 ou version ultérieureClusters that run Kubernetes 1.19 or later
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-test-ingress spec: # Reference the TLS certificate. tls: - hosts: - foo.bar.com # The domain name that corresponds to the certificate. secretName: tls-test-ingress rules: - host: tls-test-ingress.com http: paths: - path: /foo backend: service: name: web1-svc port: number: 80 pathType: ImplementationSpecificClusters that run Kubernetes versions earlier than 1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-test-ingress spec: # Reference the TLS certificate. tls: - hosts: - foo.bar.com # The domain name that corresponds to the certificate. secretName: tls-test-ingress rules: - host: tls-test-ingress.com http: paths: - path: /foo backend: serviceName: web1-svc servicePort: 80 Mettez à jour votre fichier
/etc/hostsou utilisez un nom de domaine réel pour accéder au service TLS à l'adressehttps://tls-test-ingress.com/foo.
Configurer l'authentification mutuelle HTTPS
L'authentification mutuelle HTTPS (mTLS) exige que le serveur et le client présentent tous deux des certificats, offrant ainsi une sécurité de connexion plus élevée que le TLS unidirectionnel. Le contrôleur NGINX Ingress prend en charge le mTLS via des annotations.
Étape 1 : Créer les certificats
-
Créez un certificat CA auto-signé.
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Fern Cert Authority'Résultat attendu :
Generating a 4096 bit RSA private key .............................................................................................................++ .....................................................................................++ writing new private key to 'ca.key' -
Créez le certificat côté serveur.
-
Générez la demande de signature de certificat (CSR).
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=foo.bar.com'Résultat attendu :
Generating a 4096 bit RSA private key ................................................................................................................................++ .................................................................++ writing new private key to 'server.key' -
Signez la CSR avec le certificat CA.
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crtRésultat attendu :
Signature ok subject=/CN=foo.bar.com Getting CA Private Key
-
-
Créez le certificat côté client.
-
Générez la CSR cliente.
openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Fern'Résultat attendu :
Generating a 4096 bit RSA private key .......................................................................................................................................................................................++ ..............................................++ writing new private key to 'client.key' ----- -
Signez la CSR cliente avec le certificat CA.
openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crtRésultat attendu :
Signature ok subject=/CN=Fern Getting CA Private Key
-
-
Vérifiez que tous les fichiers de certificat sont présents.
lsRésultat attendu :
ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key
Étape 2 : Créer les Secrets
-
Créez un Secret pour le certificat CA.
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crtRésultat attendu :
secret/ca-secret created -
Créez un Secret pour le certificat serveur.
kubectl create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.keyRésultat attendu :
secret/tls-secret created
Étape 3 : Déployer l'Ingress
Déployez le modèle suivant pour créer un NGINX Ingress activé pour le mTLS.
Clusters that run Kubernetes 1.19 or later
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
name: nginx-test
namespace: default
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
service:
name: http-svc
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- foo.bar.com
secretName: tls-secret
Clusters that run Kubernetes versions earlier than 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
name: nginx-test
namespace: default
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: http-svc
servicePort: 80
path: /
tls:
- hosts:
- foo.bar.com
secretName: tls-secret
Résultat attendu :
ingress.networking.k8s.io/nginx-test configured
Étape 4 : Vérification
-
Récupérez l'adresse IP de l'Ingress.
kubectl get ingLe champ
ADDRESScontient l'adresse IP de l'Ingress :NAME HOSTS ADDRESS PORTS AGE nginx-test foo.bar.com 39.102.XX.XX 80, 443 4h42m -
Mettez à jour le fichier
/etc/hosts. Remplacez l'adresse IP de l'exemple par l'adresse IP réelle de l'Ingress.echo "39.102.XX.XX foo.bar.com" | sudo tee -a /etc/hosts -
Testez l'accès sans certificat client ; le serveur doit rejeter la requête.
curl --cacert ./ca.crt https://foo.bar.comRésultat attendu :
<html> <head><title>400 No required SSL certificate was sent</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>No required SSL certificate was sent</center> <hr><center>nginx/1.19.0</center> </body> </html> -
Testez l'accès avec un certificat client ; la requête doit aboutir.
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://foo.bar.comRésultat attendu :
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p>Thank you for using nginx!</p> </body> </html>
Acheminer le trafic vers un backend HTTPS
Par défaut, le contrôleur d'entrée NGINX transfère les requêtes vers les conteneurs backend via HTTP. Si votre conteneur backend utilise HTTPS, ajoutez l'annotation nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" pour acheminer le trafic via HTTPS.
Clusters exécutant Kubernetes 1.19 ou version ultérieure
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backend-https
annotations:
# Note: You must specify that the backend service is an HTTPS service.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <YOUR-HOST-NAME>
secretName: <YOUR-SECRET-CERT-NAME>
rules:
- host: <YOUR-HOST-NAME>
http:
paths:
- path: /
backend:
service:
name: <YOUR-SERVICE-NAME>
port:
number: <YOUR-SERVICE-PORT>
pathType: ImplementationSpecific
Clusters exécutant des versions de Kubernetes antérieures à la 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend-https
annotations:
# Note: You must specify that the backend service is an HTTPS service.
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <YOUR-HOST-NAME>
secretName: <YOUR-SECRET-CERT-NAME>
rules:
- host: <YOUR-HOST-NAME>
http:
paths:
- path: /
backend:
serviceName: <YOUR-SERVICE-NAME>
servicePort: <YOUR-SERVICE-PORT>
Configurer des noms de domaine avec des expressions régulières
Les ressources Ingress de Kubernetes ne prennent pas nativement en charge les expressions régulières dans le champ host. Utilisez l'annotation nginx.ingress.kubernetes.io/server-alias pour ajouter une correspondance de nom de domaine basée sur une expression régulière.
-
Déployez l'Ingress suivant. Cet exemple utilise l'expression régulière
~^www\.\d+\.example\.com. Kubernetes 1.19 ou version ultérieureClusters exécutant Kubernetes 1.19 ou version ultérieure
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default annotations: nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com' spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecificClusters exécutant des versions de Kubernetes antérieures à la 1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-regex namespace: default annotations: nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com' spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: http-svc1 servicePort: 80 -
Vérifiez la configuration dans le contrôleur d'entrée NGINX.
-
Répertoriez les pods du contrôleur d'entrée NGINX.
kubectl get pods -n kube-system | grep nginx-ingress-controllerRésultat attendu :
nginx-ingress-controller-77cd987c4c-c**** 1/1 Running 0 1h nginx-ingress-controller-77cd987c4c-x**** 1/1 Running 0 1h -
Inspectez le champ
server_namedans la configuration NGINX générée.kubectl exec -n kube-system nginx-ingress-controller-77cd987c4c-c**** cat /etc/nginx/nginx.conf | grep -C3 "foo.bar.com"Résultat attendu :
# start server foo.bar.com server { -- server { server_name foo.bar.com abc.example.com ~^www\.\d+\.example\.com$ ; listen 80 ; listen 443 ssl http2 ; -- -- } } # end server foo.bar.com
-
-
Récupérez l'adresse IP de l'Ingress.
kubectl get ingRésultat attendu :
NAME HOSTS ADDRESS PORTS AGE ingress-regex foo.bar.com 101.37.XX.XX 80 11s -
Testez l'accès au service avec différents en-têtes host. Remplacez
IP_ADDRESSpar l'adresse IP de l'Ingress obtenue à l'étape précédente.-
Accès via
foo.bar.com:curl -H "Host: foo.bar.com" <IP_ADDRESS>/fooRésultat attendu :
/foo -
Accès via
www.123.example.com(correspond à l'expression régulière) :curl -H "Host: www.123.example.com" <IP_ADDRESS>/fooRésultat attendu :
/foo -
Accès via
www.321.example.com(correspond également à l'expression régulière) :curl -H "Host: www.321.example.com" <IP_ADDRESS>/fooRésultat attendu :
/foo
-
Configuration des noms de domaine génériques
NGINX Ingress prend en charge les noms de domaine génériques. L'exemple suivant configure *.ingress-regex.com pour correspondre à n'importe quel sous-domaine.
-
Déployez l'Ingress suivant.
Clusters exécutant Kubernetes 1.19 ou une version ultérieure
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default spec: rules: - host: *.ingress-regex.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecificClusters exécutant des versions de Kubernetes antérieures à 1.19
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-regex namespace: default spec: rules: - host: *.ingress-regex.com http: paths: - path: /foo backend: serviceName: http-svc1 servicePort: 80 -
Vérifiez le champ
server_namedans la configuration NGINX. Remplacez<nginx-ingress-pod-name>par le nom réel du pod NGINX Ingress.kubectl exec -n kube-system <nginx-ingress-pod-name> cat /etc/nginx/nginx.conf | grep -C3 "*.ingress-regex.com"Résultat attendu :
# start server *.ingress-regex.com server { server_name *.ingress-regex.com ; listen 80; listen [::]:80; ... } # end server *.ingress-regex.comDans les versions plus récentes du contrôleur NGINX Ingress, le résultat est le suivant :
## start server *.ingress-regex.com server { server_name ~^(?<subdomain>[\w-]+)\.ingress-regex\.com$ ; listen 80; listen [::]:80; ... } ## end server *.ingress-regex.com -
Récupérez l'adresse IP de l'Ingress.
kubectl get ingRésultat attendu :
NAME HOSTS ADDRESS PORTS AGE ingress-regex *.ingress-regex.com 101.37.XX.XX 80 11s -
Testez l'accès avec différents sous-domaines. Remplacez
IP_ADDRESSpar l'adresse IP de l'Ingress obtenue à l'étape précédente.-
Accédez via
abc.ingress-regex.com:curl -H "Host: abc.ingress-regex.com" <IP_ADDRESS>/fooRésultat attendu :
/foo -
Accédez via
123.ingress-regex.com:curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/fooRésultat attendu :
/foo -
Accédez via
a1b1.ingress-regex.com:curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/fooRésultat attendu :
/foo
-
Mise en œuvre des déploiements canari
Utilisez les annotations canari pour acheminer un sous-ensemble du trafic vers une nouvelle version de service sans déploiement complet. Activez le routage canari en définissant nginx.ingress.kubernetes.io/canary: "true" sur l'Ingress canari, puis combinez-le avec une ou plusieurs annotations de stratégie de routage.
| Annotation | Type | Description |
|---|---|---|
nginx.ingress.kubernetes.io/canary-weight |
Entier (0–100) | Pourcentage de requêtes acheminées vers le service canari |
nginx.ingress.kubernetes.io/canary-by-header |
Chaîne | Routage basé sur un en-tête de requête. Lorsque la valeur de l'en-tête est always, tout le trafic est dirigé vers le service canari. Lorsque la valeur est never, aucun trafic n'est envoyé au service canari. Les autres valeurs sont traitées selon les règles de priorité inférieure. |
nginx.ingress.kubernetes.io/canary-by-header-value |
Chaîne | À utiliser conjointement avec canary-by-header — achemine vers le service canari uniquement lorsque l'en-tête correspond exactement à cette valeur |
nginx.ingress.kubernetes.io/canary-by-cookie |
Chaîne | Routage basé sur un cookie. Prend uniquement en charge les valeurs always et never. |
Priorité des règles, de la plus élevée à la plus faible : basée sur l'en-tête → basée sur le cookie → basée sur le poids. Le routage canari basé sur les cookies ne prend en charge que les valeursalwaysetnever.
Les exemples suivants illustrent des configurations canari courantes. Pour un guide complet incluant les déploiements blue-green, consultez la section Utilisation d'un Ingress NGINX pour mettre en œuvre des déploiements canari et blue-green.
Déploiement canari basé sur le poids — acheminez 20 % du trafic vers le service canari :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
Déploiement canari basé sur l'en-tête — lorsque l'en-tête de requête ack a la valeur always, le trafic est routé vers le service canari ; lorsqu'il a la valeur never, le service canari est ignoré ; pour les autres valeurs d'en-tête, le routage suit la règle de pondération :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "50"
nginx.ingress.kubernetes.io/canary-by-header: "ack"
Déploiement canari basé sur l'en-tête avec une valeur personnalisée — achemine vers le service canari uniquement lorsque l'en-tête ack a exactement la valeur alibaba ; sinon, applique le routage basé sur le poids :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
nginx.ingress.kubernetes.io/canary-by-header: "ack"
nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba"
Déploiement canari basé sur le cookie — lorsqu'aucune règle d'en-tête ne correspond et que le cookie hangzhou_region a la valeur always, le trafic est routé vers le service canari :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
nginx.ingress.kubernetes.io/canary-by-header: "ack"
nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba"
nginx.ingress.kubernetes.io/canary-by-cookie: "hangzhou_region"
Demander un certificat HTTPS gratuit avec cert-manager
cert-manager est un outil open source de gestion des certificats qui permet de provisionner et de renouveler automatiquement les certificats HTTPS dans un cluster.
cert-manager est un composant open source qui n'est pas maintenu par ACK. Utilisez-le avec précaution dans les environnements de production. Pour mettre à niveau la version, consultez la page Upgrading cert-manager.
-
Déployez cert-manager.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml -
Vérifiez que les pods cert-manager sont en cours d'exécution.
kubectl get pods -n cert-managerRésultat attendu :
NAME READY STATUS RESTARTS AGE cert-manager-1 1/1 Running 0 2m11s cert-manager-cainjector 1/1 Running 0 2m11s cert-manager-webhook 1/1 Running 0 2m10s -
Créez un ClusterIssuer utilisant le défi HTTP01 de Let's Encrypt.
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod-http01 spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: <your_email@example.com> # Replace this with your email address. privateKeySecretRef: name: letsencrypt-http01 solvers: - http01: ingress: class: nginx -
Vérifiez que le ClusterIssuer est prêt.
kubectl get clusterissuerRésultat attendu :
NAME READY AGE letsencrypt-prod-http01 True 17s -
Créez une ressource Ingress qui fait référence au ClusterIssuer. Kubernetes 1.19 ou version ultérieure
Le nom de domaine doit répondre aux exigences suivantes : ne pas dépasser 64 caractères, ne pas utiliser de noms de domaine génériques (wildcard) et être accessible sur le réseau public via HTTP.
Clusters exécutant Kubernetes 1.19 ou version ultérieure
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-tls annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod-http01" spec: tls: - hosts: - <YOUR_DOMAIN_NAME> # Replace this with your domain name. secretName: ingress-tls rules: - host: <YOUR_DOMAIN_NAME> # Replace this with your domain name. http: paths: - path: / backend: service: name: <YOUR_SERVICE_NAME> # Replace this with your backend service name. port: number: <YOUR_SERVICE_PORT> # Replace this with your service port. pathType: ImplementationSpecificClusters exécutant des versions de Kubernetes antérieures à 1.19
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tls annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod-http01" spec: tls: - hosts: - <YOUR_DOMAIN_NAME> # Replace this with your domain name. secretName: ingress-tls rules: - host: <YOUR_DOMAIN_NAME> # Replace this with your domain name. http: paths: - path: / backend: serviceName: <YOUR_SERVICE_NAME> # Replace this with your backend service name. servicePort: <YOUR_SERVICE_PORT> # Replace this with your service port. -
Vérifiez que le certificat a été émis.
kubectl get certRésultat attendu :
NAME READY SECRET AGE ingress-tls True ingress-tls 52mSi la valeur de
READYn'est pasTrue, exécutez la commandekubectl describe cert ingress-tlspour inspecter la procédure de traitement du certificat. -
Vérifiez le secret TLS.
kubectl get secret ingress-tlsRésultat attendu :
NAME TYPE DATA AGE ingress-tls kubernetes.io/tls 2 2m Accédez au service à l'adresse
https://<YOUR_DOMAIN_NAME>dans un navigateur.
Configurer la redirection HTTP vers HTTPS
Utilisez l'annotation nginx.ingress.kubernetes.io/ssl-redirect pour forcer la redirection du trafic HTTP vers HTTPS.
Clusters exécutant Kubernetes 1.19 ou version ultérieure
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Force the redirection of HTTP traffic to HTTPS.
Clusters exécutant des versions de Kubernetes antérieures à 1.19
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Force the redirection of HTTP traffic to HTTPS.