introduction
KubernetesIngresses vous permet d'acheminer de manière flexible le trafic de l'extérieur de votre cluster Kubernetes vers les services à l'intérieur de votre cluster. Ceci est accompli à l'aide d'IngressResources, qui définissent les règles de routage du trafic HTTP et HTTPS vers les services Kubernetes, et d'IngressControllers, qui implémentent les règles en équilibrant la charge du trafic et en l'acheminant vers les services backend appropriés. Les contrôleurs d'entrée les plus courants incluentNginx,Contour,HAProxy etTraefik. Les entrées offrent une alternative plus efficace et flexible à la configuration de plusieurs services LoadBalancer, chacun utilisant son propre Load Balancer dédié.
Dans ce guide, nous allons configurer lesNginx Ingress Controller gérés par Kubernetes et créer des ressources Ingress pour acheminer le trafic vers plusieurs services backend factices. Une fois que nous aurons configuré Ingress, nous installeronscert-manager dans notre cluster pour gérer et provisionner des certificats TLS pour chiffrer le trafic HTTP vers Ingress.
Conditions préalables
Avant de commencer avec ce guide, vous devez disposer des éléments suivants:
-
Un cluster Kubernetes 1.10+ avecrole-based access control (RBAC) activé
-
L'outil de ligne de commande
kubectl
installé sur votre ordinateur local et configuré pour se connecter à votre cluster. Vous pouvez en savoir plus sur l'installation dekubectl
in the official documentation. -
Un nom de domaine et des enregistrements DNS A sur lesquels vous pouvez pointer vers l’équilibreur de charge DigitalOcean utilisé par l’Ingress. Si vous utilisez DigitalOcean pour gérer les enregistrements DNS de votre domaine, consultezHow to Manage DNS Records pour savoir comment créer des enregistrements A.
-
Le gestionnaire de packages Helm installé sur votre machine locale et Tiller installé sur votre cluster, comme détaillé dansHow To Install Software on Kubernetes Clusters with the Helm Package Manager. Assurez-vous d'utiliser Helm v2.12.1 ou une version ultérieure, sinon vous risquez de rencontrer des problèmes lors de l'installation du diagramme Helm de cert-manager. Pour vérifier la version de Helm que vous avez installée, exécutez
helm version
sur votre ordinateur local. -
L'utilitaire de ligne de commande
wget
installé sur votre ordinateur local. Vous pouvez installerwget
à l'aide du gestionnaire de packages intégré à votre système d'exploitation.
Une fois ces composants configurés, vous êtes prêt à commencer par ce guide.
[[step-1 -—- setting-up-dummy-backend-services]] == Étape 1 - Configuration des services de backend factices
Avant de déployer Ingress Controller, nous allons d'abord créer et déployer deux services d'écho factices vers lesquels nous acheminerons le trafic externe à l'aide d'Ingress. Les services d'écho exécuteront le conteneur du serveur Web dehashicorp/http-echo
, qui renvoie une page contenant une chaîne de texte transmise au lancement du serveur Web. Pour en savoir plus surhttp-echo
, consultez sesGitHub Repo, et pour en savoir plus sur les services Kubernetes, consultezServices dans la documentation officielle de Kubernetes.
Sur votre machine locale, créez et modifiez un fichier appeléecho1.yaml
à l'aide denano
ou de votre éditeur préféré:
nano echo1.yaml
Collez le manifeste de service et de déploiement suivant:
echo1.yaml
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1
spec:
selector:
matchLabels:
app: echo1
replicas: 2
template:
metadata:
labels:
app: echo1
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
Dans ce fichier, nous définissons un service appeléecho1
qui achemine le trafic vers les pods avec le sélecteur d'étiquetteapp: echo1
. Il accepte le trafic TCP sur le port80
et l’achemine vers le port5678
, le port par défaut dehttp-echo
.
Nous définissons ensuite un déploiement, également appeléecho1
, qui gère les pods avec lesapp: echo1
Label Selector. Nous spécifions que le déploiement doit avoir 2 réplicas de pod et que les pods doivent démarrer un conteneur appeléecho1
exécutant l'imagehashicorp/http-echo
. Nous passons le paramètretext
et le définissons surecho1
, de sorte que le serveur Web dehttp-echo
renvoieecho1
. Enfin, nous ouvrons le port5678
sur le conteneur Pod.
Une fois que vous êtes satisfait de votre manifeste factice de service et de déploiement, enregistrez et fermez le fichier.
Ensuite, créez les ressources Kubernetes en utilisantkubectl create
avec l'indicateur-f
, en spécifiant le fichier que vous venez d'enregistrer en tant que paramètre:
kubectl create -f echo1.yaml
Vous devriez voir la sortie suivante:
Outputservice/echo1 created
deployment.apps/echo1 created
Vérifiez que le service a démarré correctement en confirmant qu'il dispose d'un ClusterIP, l'adresse IP interne sur laquelle le service est exposé:
kubectl get svc echo1
Vous devriez voir la sortie suivante:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 80/TCP 60s
Cela indique que le serviceecho1
est désormais disponible en interne à10.245.222.129
sur le port80
. Il transférera le trafic vers containerPort5678
sur les pods qu'il sélectionne.
Maintenant que le serviceecho1
est opérationnel, répétez ce processus pour le serviceecho2
.
Créez et ouvrez un fichier appeléecho2.yaml
:
echo2.yaml
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2
spec:
selector:
matchLabels:
app: echo2
replicas: 1
template:
metadata:
labels:
app: echo2
spec:
containers:
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
Ici, nous utilisons essentiellement le même manifeste de service et de déploiement que ci-dessus, mais nommez et renommez le service et le déploiementecho2
. De plus, pour créer un peu de variété, nous créons un seul réplica de pod. Nous nous assurons de définir le paramètretext
surecho2
afin que le serveur Web renvoie le texteecho2
.
Enregistrez et fermez le fichier, puis créez les ressources Kubernetes à l'aide dekubectl
:
kubectl create -f echo2.yaml
Vous devriez voir la sortie suivante:
Outputservice/echo2 created
deployment.apps/echo2 created
Encore une fois, vérifiez que le service est opérationnel:
kubectl get svc
Vous devriez voir les servicesecho1
etecho2
avec des ClusterIP attribués:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 80/TCP 6m6s
echo2 ClusterIP 10.245.128.224 80/TCP 6m3s
kubernetes ClusterIP 10.245.0.1 443/TCP 4d21h
Maintenant que nos faux services Web d'écho sont opérationnels, nous pouvons maintenant déployer le contrôleur Nginx Ingress.
[[step-2 -—- setting-up-the-kubernetes-nginx-ingress-controller]] == Étape 2 - Configuration du contrôleur d'entrée Kubernetes Nginx
Dans cette étape, nous déploieronsv0.24.1
desNginx Ingress Controller gérés par Kubernetes. Notez qu'il existe des contrôleurs d'entrée Nginxseveral; la communauté Kubernetes maintient celle utilisée dans ce guide et Nginx Inc. maintientkubernetes-ingress. Les instructions de ce didacticiel sont basées sur celles du contrôleur d'entrée Kubernetes Nginx officielInstallation Guide.
Nginx Ingress Controller consiste en un pod qui exécute le serveur Web Nginx et surveille le plan de contrôle Kubernetes à la recherche d'objets nouveaux et mis à jour. Une ressource ingress est essentiellement une liste de règles de routage de trafic pour les services backend. Par exemple, une règle Ingress peut spécifier que le trafic HTTP arrivant au chemin/web1
doit être dirigé vers le serveur Web principal deweb1
. En utilisant Ingress Resources, vous pouvez également effectuer un routage basé sur l'hôte: par exemple, acheminer les requêtes qui atteignentweb1.your_domain.com
vers le backend Kubernetes Serviceweb1
.
Dans ce cas, étant donné que nous déployons Ingress Controller sur un cluster DigitalOcean Kubernetes, le contrôleur crée un service LoadBalancer qui optimise un équilibreur de charge DigitalOcean vers lequel tout le trafic externe sera dirigé. Cet équilibreur de charge acheminera le trafic externe vers le module Ingress Controller Pod exécutant Nginx, qui le transmettra ensuite aux services principaux appropriés.
Nous allons commencer par créer les ressources Kubernetes requises par Nginx Ingress Controller. Il s’agit de ConfigMaps contenant la configuration du contrôleur, les rôles de contrôle d’accès en fonction des rôles (RBAC) pour accorder au contrôleur l’accès à l’API Kubernetes et le déploiement réel du contrôleur d’entrée qui utilisev0.24.1 de l’image du contrôleur d’entrée Nginx. Pour afficher la liste complète de ces ressources requises, consultez lesmanifest du dépôt GitHub de Kubernetes Nginx Ingress Controller.
Pour créer ces ressources obligatoires, utilisezkubectl apply
et l'indicateur-f
pour spécifier le fichier manifeste hébergé sur GitHub:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
Nous utilisons iciapply
au lieu decreate
pour qu'à l'avenir, nous puissions incrémenter les modificationsapply
des objets Ingress Controller au lieu de les écraser complètement. Pour en savoir plus surapply
, consultezManaging Resources dans la documentation officielle de Kubernetes.
Vous devriez voir la sortie suivante:
Outputnamespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.extensions/nginx-ingress-controller created
Cette sortie sert également de résumé pratique de tous les objets Ingress Controller créés à partir du manifestemandatory.yaml
.
Nous allons ensuite créer le service Ingress Controller LoadBalancer, qui créera un équilibreur de charge DigitalOcean qui équilibrera la charge et acheminera le trafic HTTP et HTTPS vers le module de contrôle Ingress déployé dans la commande précédente.
Pour créer le service LoadBalancer, à nouveaukubectl apply
un fichier manifeste contenant la définition du service:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml
Vous devriez voir la sortie suivante:
Outputservice/ingress-nginx created
Maintenant, confirmez que l'équilibreur de charge DigitalOcean a été créé avec succès en récupérant les détails du service aveckubectl
:
kubectl get svc --namespace=ingress-nginx
Vous devriez voir une adresse IP externe, correspondant à l'adresse IP de DigitalOcean Load Balancer:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.245.247.67 203.0.113.0 80:32486/TCP,443:32096/TCP 20h
Notez l’adresse IP externe de Load Balancer, car vous en aurez besoin ultérieurement.
[.note] #Note: Par défaut, le service Nginx Ingress LoadBalancer aservice.spec.externalTrafficPolicy
défini sur la valeurLocal
, qui achemine tout le trafic de l'équilibreur de charge vers les nœuds exécutant Nginx Ingress Pods. Les autres nœuds échoueront délibérément aux vérifications de l'état de l'équilibreur de charge afin que le trafic d'entrée ne soit pas acheminé vers eux. Les politiques de trafic externe sortent du cadre de ce didacticiel, mais pour en savoir plus, vous pouvez consulterA Deep Dive into Kubernetes External Traffic Policies etSource IP for Services with Type=LoadBalancer à partir de la documentation officielle de Kubernetes.
#
Cet équilibreur de charge reçoit le trafic sur les ports HTTP et HTTPS 80 et 443 et le transmet au pod du contrôleur Ingress. Ingress Controller acheminera ensuite le trafic vers le service backend approprié.
Nous pouvons maintenant pointer nos enregistrements DNS vers cet équilibreur de charge externe et créer des ressources Ingress pour implémenter des règles de routage du trafic.
[[step-3 -—- creating-the-ingress-resource]] == Étape 3 - Création de la ressource Ingress
Commençons par créer une ressource d’entrée minimale pour acheminer le trafic dirigé vers un sous-domaine donné vers un service principal correspondant.
Dans ce guide, nous utiliserons le domaine de testexample.com. Vous devriez le remplacer par le nom de domaine que vous possédez.
Nous allons d'abord créer une règle simple pour acheminer le trafic dirigé versecho1.example.com vers le service backend deecho1
et le trafic dirigé versecho2.example.com vers le service backendecho2
.
Commencez par ouvrir un fichier appeléecho_ingress.yaml
dans votre éditeur préféré:
nano echo_ingress.yaml
Collez dans la définition d'entrée suivante:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Lorsque vous avez terminé d’éditer vos règles d’entrée, enregistrez et fermez le fichier.
Ici, nous avons spécifié que nous souhaitons créer une ressource d'entrée appeléeecho-ingress
et acheminer le trafic en fonction de l'en-tête Host. Un en-tête d'hôte de requête HTTP spécifie le nom de domaine du serveur cible. Pour en savoir plus sur les en-têtes de demande d'hôte, consultez le Mozilla Developer Networkdefinition page. Les demandes avec l'hôteecho1.example.com seront dirigées vers le backend deecho1
configuré à l'étape 1, et les demandes avec l'hôteecho2.example.com seront dirigées vers le backend deecho2
.
Vous pouvez maintenant créer l'entrée en utilisantkubectl
:
kubectl apply -f echo_ingress.yaml
Vous verrez la sortie suivante confirmant la création d'Ingress:
Outputingress.extensions/echo-ingress created
Pour tester Ingress, accédez à votre service de gestion DNS et créez des enregistrements A pourecho1.example.com
etecho2.example.com
pointant vers l'adresse IP externe de l'équilibreur de charge DigitalOcean. L'adresse IP externe de l'équilibreur de charge est l'adresse IP externe du serviceingress-nginx
, que nous avons récupérée à l'étape précédente. Si vous utilisez DigitalOcean pour gérer les enregistrements DNS de votre domaine, consultezHow to Manage DNS Records pour savoir comment créer des enregistrements A.
Une fois que vous avez créé les enregistrements DNSecho1.example.com
etecho2.example.com
nécessaires, vous pouvez tester le contrôleur d'entrée et la ressource que vous avez créés à l'aide de l'utilitaire de ligne de commandecurl
.
Depuis votre machine locale,curl
le serviceecho1
:
curl echo1.example.com
Vous devriez obtenir la réponse suivante du serviceecho1
:
Outputecho1
Cela confirme que votre demande àecho1.example.com
est correctement acheminée via l'entrée Nginx vers le service backend deecho1
.
Maintenant, effectuez le même test pour le serviceecho2
:
curl echo2.example.com
Vous devriez obtenir la réponse suivante du serviceecho2
:
Outputecho2
Cela confirme que votre demande àecho2.example.com
est correctement acheminée via l'entrée Nginx vers le service backend deecho2
.
À ce stade, vous avez correctement configuré une base Nginx Ingress pour effectuer un routage basé sur un hôte virtuel. À l'étape suivante, nous installeronscert-manager à l'aide de Helm pour provisionner des certificats TLS pour notre entrée et activer le protocole HTTPS plus sécurisé.
[[step-4 -—- install-and-configuring-cert-manager]] == Étape 4 - Installation et configuration de Cert-Manager
Dans cette étape, nous utiliserons Helm pour installer cert-manager dans notre cluster. cert-manager est un service Kubernetes qui fournit des certificats TLS à partir deLet’s Encrypt et d'autres autorités de certification et gère leurs cycles de vie. Les certificats peuvent être demandés et configurés en annotant les ressources Ingress avec l'annotationcertmanager.k8s.io/issuer
, en ajoutant une sectiontls
à la spécification Ingress et en configurant un ou plusieursIssuers pour spécifier votre autorité de certification préférée. Pour en savoir plus sur les objets Issuer, consultez la documentation officielle de cert-manager surIssuers.
[.note] #Note: Assurez-vous que vous utilisez Helm v2.12.1 ou version ultérieure avant d'installer cert-manager. Pour vérifier la version de Helm que vous avez installée, exécutezhelm version
sur votre ordinateur local.
#
Avant d'utiliser Helm pour installer cert-manager dans notre cluster, nous devons créer le cert-managerCustom Resource Definitions (CRD). Créez-les en les appliquant directement depuis le gestionnaire de certificatsGitHub repository:
kubectl apply \
-f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml
Vous devriez voir la sortie suivante:
Outputcustomresourcedefinition.apiextensions.k8s.io/certificates.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/issuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/orders.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/challenges.certmanager.k8s.io created
Ensuite, nous ajouterons une étiquette à l'espace de nomskube-system
, où nous installerons cert-manager, pour activer la validation avancée des ressources à l'aide d'unwebhook:
kubectl label namespace kube-system certmanager.k8s.io/disable-validation="true"
Maintenant, nous allons ajouter lesJetstack Helm repository à Helm. Ce référentiel contient les cert-managerHelm chart.
helm repo add jetstack https://charts.jetstack.io
Enfin, nous pouvons installer le graphique dans l'espace de nomskube-system
:
helm install --name cert-manager --namespace kube-system jetstack/cert-manager --version v0.8.0
Vous devriez voir la sortie suivante:
Output. . .
NOTES:
cert-manager has been deployed successfully!
In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).
More information on the different types of issuers and how to configure them
can be found in our documentation:
https://cert-manager.readthedocs.io/en/latest/reference/issuers.html
For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:
https://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html
Cela indique que l'installation de cert-manager a réussi.
Avant de commencer à émettre des certificats pour nos hôtes Ingress, nous devons créer un émetteur, qui spécifie l'autorité de certification à partir de laquelle les certificats x509 signés peuvent être obtenus. Dans ce guide, nous utiliserons l’autorité de certification Let’s Encrypt, qui fournit des certificats TLS gratuits et offre à la fois un serveur de transfert pour tester la configuration de votre certificat et un serveur de production pour le déploiement de certificats TLS vérifiables.
Créons un émetteur test pour s’assurer que le mécanisme d’approvisionnement en certificats fonctionne correctement. Ouvrez un fichier nomméstaging_issuer.yaml
dans votre éditeur de texte préféré:
nano staging_issuer.yaml
Collez dans le manifeste ClusterIssuer suivant:
staging_issuer.yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
http01: {}
Ici, nous spécifions que nous souhaitons créer un objet ClusterIssuer appeléletsencrypt-staging
et utiliser le serveur de transfert Let’s Encrypt. Nous utiliserons ensuite le serveur de production pour déployer nos certificats, mais le serveur de production peut limiter le nombre de requêtes émises, ainsi, il est préférable d’utiliser l’URL intermédiaire pour les tests.
Nous spécifions ensuite une adresse e-mail pour enregistrer le certificat et créons un KubernetesSecret appeléletsencrypt-staging
pour stocker la clé privée du compte ACME. Nous activons également le mécanisme de challengeHTTP-01
. Pour en savoir plus sur ces paramètres, consultez la documentation officielle de cert-manager surIssuers.
Déployez le ClusterIssuer en utilisantkubectl
:
kubectl create -f staging_issuer.yaml
Vous devriez voir la sortie suivante:
Outputclusterissuer.certmanager.k8s.io/letsencrypt-staging created
Maintenant que nous avons créé notre émetteur de préparation Let’s Encrypt, nous sommes prêts à modifier la ressource Ingress que nous avons créée ci-dessus et à activer le chiffrement TLS pour les cheminsecho1.example.com
etecho2.example.com
.
Ouvrez à nouveauecho_ingress.yaml
dans votre éditeur préféré:
nano echo_ingress.yaml
Ajoutez ce qui suit au manifeste de ressource d’entrée:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-staging
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: letsencrypt-staging
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Ici, nous ajoutons quelques annotations pour spécifier lesingress.class
, qui déterminent le contrôleur d'entrée à utiliser pour implémenter les règles d'entrée. De plus, nous définissons lescluster-issuer
comme étantletsencrypt-staging
, l'émetteur de certificat que nous venons de créer.
Enfin, nous ajoutons un bloctls
pour spécifier les hôtes pour lesquels nous voulons acquérir des certificats, et spécifions unsecretName
. Ce secret contiendra la clé privée TLS et le certificat émis.
Une fois les modifications apportées, enregistrez et fermez le fichier.
Nous allons maintenant mettre à jour la ressource Ingress existante à l'aide dekubectl apply
:
kubectl apply -f echo_ingress.yaml
Vous devriez voir la sortie suivante:
Outputingress.extensions/echo-ingress configured
Vous pouvez utiliserkubectl describe
pour suivre l'état des modifications Ingress que vous venez d'appliquer:
kubectl describe ingress
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 14m nginx-ingress-controller Ingress default/echo-ingress
Normal UPDATE 1m (x2 over 13m) nginx-ingress-controller Ingress default/echo-ingress
Normal CreateCertificate 1m cert-manager Successfully created Certificate "letsencrypt-staging"
Une fois que le certificat a été créé avec succès, vous pouvez exécuter undescribe
supplémentaire dessus pour confirmer davantage sa création réussie:
kubectl describe certificate
Vous devriez voir la sortie suivante dans la sectionEvents
:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Generated 63s cert-manager Generated new private key
Normal OrderCreated 63s cert-manager Created Order resource "letsencrypt-staging-147606226"
Normal OrderComplete 19s cert-manager Order "letsencrypt-staging-147606226" completed successfully
Normal CertIssued 18s cert-manager Certificate issued successfully
Cela confirme que le certificat TLS a été émis avec succès et que le cryptage HTTPS est maintenant actif pour les deux domaines configurés.
Nous sommes maintenant prêts à envoyer une requête à un serveur backendecho
pour vérifier que HTTPS fonctionne correctement.
Exécutez la commandewget
suivante pour envoyer une requête àecho1.example.com
et imprimer les en-têtes de réponse dansSTDOUT
:
wget --save-headers -O- echo1.example.com
Vous devriez voir la sortie suivante:
OutputURL transformed to HTTPS due to an HSTS policy
--2018-12-11 14:38:24-- https://echo1.example.com/
Resolving echo1.example.com (echo1.example.com)... 203.0.113.0
Connecting to echo1.example.com (echo1.example.net)|203.0.113.0|:443... connected.
ERROR: cannot verify echo1.example.com's certificate, issued by ‘CN=Fake LE Intermediate X1’:
Unable to locally verify the issuer's authority.
To connect to echo1.example.com insecurely, use `--no-check-certificate'.
Cela indique que le protocole HTTPS a été activé avec succès, mais le certificat ne peut pas être vérifié car il s’agit d’un faux certificat temporaire émis par le serveur de transfert Let’s Encrypt.
Maintenant que nous avons testé que tout fonctionne avec ce faux certificat temporaire, nous pouvons déployer des certificats de production pour les deux hôtesecho1.example.com
etecho2.example.com
.
[[step-5 -—- rolling-out-production-issuer]] == Étape 5 - Rolling Out Production Issuer
Au cours de cette étape, nous allons modifier la procédure utilisée pour fournir des certificats de transfert et générer un certificat de production valide et vérifiable pour nos hôtes Ingress.
Pour commencer, nous allons d’abord créer un certificat de production ClusterIssuer.
Ouvrez un fichier appeléprod_issuer.yaml
dans votre éditeur préféré:
nano prod_issuer.yaml
Collez dans le manifeste suivant:
prod_issuer.yaml
apiVersion: certmanager.k8s.io/v1alpha1
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: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
http01: {}
Notez les différentes URL du serveur ACME et le nom de la clé secrèteletsencrypt-prod
.
Lorsque vous avez terminé, enregistrez et fermez le fichier.
Maintenant, déployez cet émetteur en utilisantkubectl
:
kubectl create -f prod_issuer.yaml
Vous devriez voir la sortie suivante:
Outputclusterissuer.certmanager.k8s.io/letsencrypt-prod created
Mettez à jourecho_ingress.yaml
pour utiliser ce nouvel émetteur:
nano echo_ingress.yaml
Apportez les modifications suivantes au fichier:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: letsencrypt-prod
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Ici, nous mettons à jour le ClusterIssuer et le nom secret enletsencrypt-prod
.
Une fois que vous êtes satisfait de vos modifications, enregistrez et fermez le fichier.
Déployez les modifications en utilisantkubectl apply
:
kubectl apply -f echo_ingress.yaml
Outputingress.extensions/echo-ingress configured
Attendez quelques minutes que le serveur de production Let’Secrypt envoie le certificat. Vous pouvez suivre sa progression en utilisantkubectl describe
sur l'objetcertificate
:
kubectl describe certificate letsencrypt-prod
Une fois que vous voyez la sortie suivante, le certificat a été délivré avec succès:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Generated 82s cert-manager Generated new private key
Normal OrderCreated 82s cert-manager Created Order resource "letsencrypt-prod-2626449824"
Normal OrderComplete 37s cert-manager Order "letsencrypt-prod-2626449824" completed successfully
Normal CertIssued 37s cert-manager Certificate issued successfully
Nous allons maintenant effectuer un test à l'aide decurl
pour vérifier que HTTPS fonctionne correctement:
curl echo1.example.com
Vous devriez voir ce qui suit:
Output
308 Permanent Redirect
308 Permanent Redirect
nginx/1.15.9
Cela indique que les requêtes HTTP sont redirigées pour utiliser HTTPS.
Exécutezcurl
surhttps://echo1.example.com
:
curl https://echo1.example.com
Vous devriez maintenant voir le résultat suivant:
Outputecho1
Vous pouvez exécuter la commande précédente avec l'indicateur détaillé-v
pour approfondir la négociation du certificat et vérifier les informations du certificat.
À ce stade, vous avez correctement configuré le protocole HTTPS à l’aide d’un certificat Let’s Encrypt pour votre Nginx Ingress.
Conclusion
Dans ce guide, vous configurez Nginx Ingress pour équilibrer la charge et acheminer les demandes externes vers les services backend à l’intérieur de votre cluster Kubernetes. Vous avez également sécurisé Ingress en installant le fournisseur de certificats de cert-manager et en configurant un certificat Let’s Encrypt pour deux chemins d’hôte.
Il existe de nombreuses alternatives au contrôleur Nginx Ingress. Pour en savoir plus, consultezIngress controllers de la documentation officielle de Kubernetes.