TLS gebruiken met een ingangscontroller in Azure Kubernetes Service (AKS)
Het TLS-protocol (Transport Layer Security) maakt gebruik van certificaten om beveiliging te bieden voor communicatie, versleuteling, verificatie en integriteit. Door TLS te gebruiken met een ingangscontroller op AKS, kunt u de communicatie tussen uw toepassingen beveiligen en de voordelen van een ingangscontroller ervaren.
U kunt uw eigen certificaten meenemen en integreren met het stuurprogramma Secrets Store CSI. U kunt ook certificaatbeheer gebruiken, waarmee automatisch certificaten van Let's Encrypt worden gegenereerd en geconfigureerd. Twee toepassingen worden uitgevoerd in het AKS-cluster, die elk toegankelijk zijn via één IP-adres.
Belangrijk
De invoegtoepassing Toepassingsroutering wordt aanbevolen voor inkomend verkeer in AKS. Zie Beheerde nginx-toegangsbeheerobjecten met de invoegtoepassing voor toepassingsroutering voor meer informatie.
Belangrijk
Microsoft beheert of biedt geen ondersteuning voor certificaatbeheer en eventuele problemen die voortvloeien uit het gebruik ervan. Zie de documentatie voor het oplossen van problemen met certificaatbeheer voor problemen met cert-manager.
Er zijn twee opensource-ingangscontrollers voor Kubernetes op basis van Nginx: één wordt onderhouden door de Kubernetes-community (kubernetes/ingress-nginx) en één wordt onderhouden door NGINX, Inc. (nginxinc/kubernetes-ingress). In dit artikel wordt de controller voor inkomend verkeer van de Kubernetes-community gebruikt.
Voordat u begint
In dit artikel wordt ervan uitgegaan dat u een ingangscontroller en toepassingen hebt ingesteld. Als u een controller voor inkomend verkeer of voorbeeldtoepassingen nodig hebt, raadpleegt u Een controller voor inkomend verkeer maken.
In dit artikel wordt Helm 3 gebruikt om de NGINX-ingangscontroller te installeren op een ondersteunde versie van Kubernetes. Zorg ervoor dat u de nieuwste versie van Helm gebruikt en toegang hebt tot de
ingress-nginx
enjetstack
Helm-opslagplaatsen. De stappen die in dit artikel worden beschreven, zijn mogelijk niet compatibel met eerdere versies van de Helm-grafiek, NGINX-ingangscontroller of Kubernetes.- Zie Toepassingen installeren met Helm in AKS voor meer informatie over het configureren en gebruiken van Helm. Zie de Helm-installatiedocumenten voor upgrade-instructies.
In dit artikel wordt ervan uitgegaan dat u een bestaand AKS-cluster hebt met een geïntegreerd Azure Container Registry (ACR). Zie Verifiëren met ACR vanuit AKS voor meer informatie over het maken van een AKS-cluster met een geïntegreerde ACR.
Als u Azure CLI gebruikt, moet u voor dit artikel azure CLI versie 2.0.64 of hoger uitvoeren. Voer
az --version
uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.Als u Azure PowerShell gebruikt, moet u voor dit artikel Azure PowerShell versie 5.9.0 of hoger gebruiken. Voer
Get-InstalledModule -Name Az
uit om de versie te bekijken. Als u PowerShell wilt installeren of upgraden, raadpleegt u De Azure PowerShell installeren.
TLS gebruiken met uw eigen certificaten met Secrets Store CSI Driver
Als u TLS wilt gebruiken met uw eigen certificaten met Secrets Store CSI Driver, hebt u een AKS-cluster nodig met het CSI-stuurprogramma Secrets Store geconfigureerd en een Azure Key Vault-exemplaar.
Zie Geheimenarchief CSI-stuurprogramma instellen voor het inschakelen van NGINX-ingangscontroller met TLS voor meer informatie.
TLS gebruiken met Let's Encrypt-certificaten
Als u TLS wilt gebruiken met Let's Encrypt-certificaten , implementeert u certificaatbeheer, dat automatisch certificaten genereert en configureert.
Importeer de certificaatbeheerinstallatiekopieën die door de Helm-grafiek worden gebruikt in uw ACR
Gebruik
az acr import
dit om de volgende afbeeldingen in uw ACR te importeren.REGISTRY_NAME=<REGISTRY_NAME> CERT_MANAGER_REGISTRY=quay.io CERT_MANAGER_TAG=v1.8.0 CERT_MANAGER_IMAGE_CONTROLLER=jetstack/cert-manager-controller CERT_MANAGER_IMAGE_WEBHOOK=jetstack/cert-manager-webhook CERT_MANAGER_IMAGE_CAINJECTOR=jetstack/cert-manager-cainjector az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_CONTROLLER:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_CONTROLLER:$CERT_MANAGER_TAG az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_WEBHOOK:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_WEBHOOK:$CERT_MANAGER_TAG az acr import --name $REGISTRY_NAME --source $CERT_MANAGER_REGISTRY/$CERT_MANAGER_IMAGE_CAINJECTOR:$CERT_MANAGER_TAG --image $CERT_MANAGER_IMAGE_CAINJECTOR:$CERT_MANAGER_TAG
Notitie
U kunt Helm-grafieken ook importeren in uw ACR. Zie Helm-grafieken pushen en ophalen naar een ACR voor meer informatie.
Configuratieopties voor toegangsbeheercontroller
U kunt uw NGINX-ingangscontroller configureren met behulp van een statisch openbaar IP-adres of een dynamisch openbaar IP-adres. Als u een aangepast domein gebruikt, moet u een A-record toevoegen aan uw DNS-zone. Als u geen aangepast domein gebruikt, kunt u een FQDN (Fully Qualified Domain Name) configureren voor het IP-adres van de toegangscontroller.
Een statisch of dynamisch openbaar IP-adres maken
Een statisch, openbaar IP-adres gebruiken
U kunt uw ingangscontroller configureren met een statisch openbaar IP-adres. Het statische openbare IP-adres blijft behouden als u de ingangscontroller verwijdert. Het IP-adres blijft niet behouden als u uw AKS-cluster verwijdert.
Wanneer u uw ingangscontroller bijwerken, moet u een parameter doorgeven aan de Helm-release om ervoor te zorgen dat de controllerservice voor inkomend verkeer op de hoogte wordt gesteld van de load balancer die eraan wordt toegewezen. Voor een correcte werking van de HTTPS-certificaten gebruikt u een DNS-label om een FQDN te configureren voor het IP-adres van de ingangscontroller.
Haal de naam van de resourcegroep van het AKS-cluster op met de
az aks show
opdracht.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
Maak een openbaar IP-adres met de statische toewijzingsmethode met behulp van de
az network public-ip create
opdracht. In het volgende voorbeeld wordt een openbaar IP-adres gemaakt met de naam myAKSPublicIP in de resourcegroep van het AKS-cluster die u in de vorige stap hebt verkregen.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Notitie
U kunt ook een IP-adres maken in een andere resourcegroep, die u afzonderlijk van uw AKS-cluster kunt beheren. Als u een IP-adres in een andere resourcegroep maakt, controleert u of het volgende waar is:
- De clusteridentiteit die wordt gebruikt door het AKS-cluster heeft gedelegeerde machtigingen voor de resourcegroep, zoals Inzender voor het netwerk.
- Voeg de
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
parameter toe. Vervang door<RESOURCE_GROUP>
de naam van de resourcegroep waarin het IP-adres zich bevindt.
Voeg de
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
parameter toe. Het DNS-label kan worden ingesteld wanneer de ingangscontroller voor het eerst wordt geïmplementeerd of later kan worden geconfigureerd.Voeg de
--set controller.service.loadBalancerIP="<STATIC_IP>"
parameter toe. Geef uw eigen openbare IP-adres op dat in de vorige stap is gemaakt.DNS_LABEL="<DNS_LABEL>" NAMESPACE="ingress-basic" STATIC_IP=<STATIC_IP> helm upgrade ingress-nginx ingress-nginx/ingress-nginx \ --namespace $NAMESPACE \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \ --set controller.service.loadBalancerIP=$STATIC_IP \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
Zie Een statisch openbaar IP-adres en DNS-label gebruiken met de AKS-load balancer voor meer informatie.
Een dynamisch, openbaar IP-adres gebruiken
Er wordt een openbaar IP-adres van Azure gemaakt voor uw toegangsbeheerobjectcontroller bij het maken. Het openbare IP-adres is statisch voor de levensduur van uw ingangscontroller. Het openbare IP-adres blijft niet behouden als u de ingangscontroller verwijdert. Als u een nieuwe ingangscontroller maakt, krijgt deze een nieuw openbaar IP-adres toegewezen. De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer.
Gebruik de
kubectl get service
opdracht om het openbare IP-adres voor uw toegangsbeheerobjectcontroller op te halen.# Get the public IP address for your ingress controller kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller # Sample output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-ingress-ingress-nginx-controller LoadBalancer 10.0.74.133 EXTERNAL_IP 80:32486/TCP,443:30953/TCP 44s app.kubernetes.io/component=controller,app.kubernetes.io/instance=nginx-ingress,app.kubernetes.io/name=ingress-nginx
Een A-record toevoegen aan uw DNS-zone
Als u een aangepast domein gebruikt, moet u een A-record toevoegen aan uw DNS-zone. Als u geen aangepast domein gebruikt, kunt u het openbare IP-adres configureren met een FQDN.
Voeg een A-record toe aan uw DNS-zone met het externe IP-adres van de NGINX-service met behulp van
az network dns record-set a add-record
.az network dns record-set a add-record \ --resource-group myResourceGroup \ --zone-name MY_CUSTOM_DOMAIN \ --record-set-name "*" \ --ipv4-address MY_EXTERNAL_IP
Een FQDN configureren voor uw ingangscontroller
U kunt desgewenst een FQDN configureren voor het IP-adres van de ingangscontroller in plaats van een aangepast domein door een DNS-label in te stellen. Uw FQDN moet dit formulier volgen: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Belangrijk
Uw DNS-label moet uniek zijn binnen de Azure-locatie.
U kunt uw FQDN configureren met een van de volgende methoden:
- Stel het DNS-label in met behulp van Azure CLI of Azure PowerShell.
- Stel het DNS-label in met behulp van Helm-grafiekinstellingen.
Zie DNS-naamlabels voor openbare IP-adressen voor meer informatie.
Het DNS-label instellen met behulp van Azure CLI of Azure PowerShell
Zorg ervoor dat u vervangt door <DNS_LABEL>
uw unieke DNS-label.
# Public IP address of your ingress controller
IP="MY_EXTERNAL_IP"
# Name to associate with public IP address
DNSLABEL="<DNS_LABEL>"
# Get the resource-id of the public IP
PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
# Update public IP address with DNS name
az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
# Display the FQDN
az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
Het DNS-label instellen met behulp van Helm-grafiekinstellingen
U kunt een aantekeningsinstelling doorgeven aan uw Helm-grafiekconfiguratie met behulp van de --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
parameter. Deze parameter kan worden ingesteld wanneer de ingangscontroller voor het eerst wordt geïmplementeerd of later kan worden geconfigureerd.
In het volgende voorbeeld ziet u hoe u deze instelling bijwerkt nadat de controller is geïmplementeerd. Zorg ervoor dat u vervangt door <DNS_LABEL>
uw unieke DNS-label.
DNSLABEL="<DNS_LABEL>"
NAMESPACE="ingress-basic"
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace $NAMESPACE \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNSLABEL \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
Cert-manager installeren
De NGINX-ingangscontroller ondersteunt TLS-beëindiging. Er zijn verschillende manieren om certificaten voor HTTPS op te halen en te configureren. In dit artikel wordt certificaatbeheer gebruikt, dat automatische functionaliteit voor het genereren en beheren van certificaten biedt.
Gebruik de volgende opdrachten om de cert-manager-controller te installeren.
# Set variable for ACR location to use for pulling images
ACR_URL=<REGISTRY_URL>
# Label the ingress-basic namespace to disable resource validation
kubectl label namespace ingress-basic cert-manager.io/disable-validation=true
# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io
# Update your local Helm chart repository cache
helm repo update
# Install the cert-manager Helm chart
helm install cert-manager jetstack/cert-manager \
--namespace ingress-basic \
--version=$CERT_MANAGER_TAG \
--set installCRDs=true \
--set nodeSelector."kubernetes\.io/os"=linux \
--set image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_CONTROLLER \
--set image.tag=$CERT_MANAGER_TAG \
--set webhook.image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_WEBHOOK \
--set webhook.image.tag=$CERT_MANAGER_TAG \
--set cainjector.image.repository=$ACR_URL/$CERT_MANAGER_IMAGE_CAINJECTOR \
--set cainjector.image.tag=$CERT_MANAGER_TAG
Zie het certificaatbeheerproject voor meer informatie over de configuratie van certificaatbeheer.
Een CA-clusteruitgever maken
Voordat certificaten kunnen worden uitgegeven, is voor certificaatbeheer een van de volgende verleners vereist:
- Een verlener, die in één naamruimte werkt.
- Een ClusterIssuer-resource , die in alle naamruimten werkt.
Zie de documentatie voor cert-manager issuer voor meer informatie.
Maak een clusteruitgever, zoals
cluster-issuer.yaml
het volgende voorbeeldmanifest. Vervang doorMY_EMAIL_ADDRESS
een geldig adres van uw organisatie.apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: MY_EMAIL_ADDRESS privateKeySecretRef: name: letsencrypt solvers: - http01: ingress: class: nginx podTemplate: spec: nodeSelector: "kubernetes.io/os": linux
Pas de verlener toe met behulp van de
kubectl apply
opdracht.kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Uw toegangsbeheerroutes bijwerken
U moet uw ingangsroutes bijwerken om verkeer naar uw FQDN of aangepast domein te verwerken.
In het volgende voorbeeld wordt verkeer als volgt gerouteerd:
- Verkeer naar hallo wereld-inkomend verkeer. MY_CUSTOM_DOMAIN wordt doorgestuurd naar de aks-helloworld-one-service .
- Verkeer naar hallo wereld-inkomend verkeer. MY_CUSTOM_DOMAIN/hello-world-two wordt doorgestuurd naar de aks-helloworld-two-service .
- Verkeer naar hallo wereld-inkomend verkeer. MY_CUSTOM_DOMAIN/statisch wordt doorgestuurd naar de service met de naam aks-helloworld-one voor statische assets.
Notitie
Als u een FQDN hebt geconfigureerd voor het IP-adres van de ingangscontroller in plaats van een aangepast domein, gebruikt u de FQDN in plaats van hello-world-inkomend verkeer. MY_CUSTOM_DOMAIN.
Als uw FQDN bijvoorbeeld demo-aks-ingress.eastus.cloudapp.azure.com is, vervangt u hello-world-ingress. MY_CUSTOM_DOMAIN met demo-aks-ingress.eastus.cloudapp.azure.com in hello-world-ingress.yaml
.
Maak of werk het
hello-world-ingress.yaml
bestand bij met behulp van het volgende YAML-voorbeeldbestand. Werk despec.tls.hosts
enspec.rules.host
de DNS-naam bij die u in een vorige stap hebt gemaakt.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" cert-manager.io/cluster-issuer: letsencrypt spec: ingressClassName: nginx tls: - hosts: - hello-world-ingress.MY_CUSTOM_DOMAIN secretName: tls-secret rules: - host: hello-world-ingress.MY_CUSTOM_DOMAIN http: paths: - path: /hello-world-one(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80 - path: /hello-world-two(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-two port: number: 80 - path: /(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress-static annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: /static/$2 spec: ingressClassName: nginx tls: - hosts: - hello-world-ingress.MY_CUSTOM_DOMAIN secretName: tls-secret rules: - host: hello-world-ingress.MY_CUSTOM_DOMAIN http: paths: - path: /static(/|$)(.*) pathType: Prefix backend: service: name: aks-helloworld-one port: number: 80
Werk de toegangsbeheerobjectresource bij met behulp van de
kubectl apply
opdracht.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Controleren of er een certificaatobject is gemaakt
Vervolgens moet er een certificaatresource worden gemaakt. De certificaatresource definieert het gewenste X.509-certificaat. Zie certificaten voor certificaatbeheer voor meer informatie.
Certificaatbeheer maakt automatisch een certificaatobject voor u met behulp van inkomend-shim, dat automatisch wordt geïmplementeerd met cert-manager sinds v0.2.2. Zie de documentatie voor inkomend verkeer voor meer informatie.
Als u wilt controleren of het certificaat is gemaakt, gebruikt u de kubectl get certificate --namespace ingress-basic
opdracht en controleert u of READY waar is. Het kan enkele minuten duren voordat de uitvoer wordt weergegeven.
kubectl get certificate --namespace ingress-basic
In de volgende uitvoer ziet u de status van het certificaat.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
De configuratie van inkomend verkeer testen
Open een webbrowser om hallo wereld-inkomend verkeer te openen. MY_CUSTOM_DOMAIN of de FQDN van uw Kubernetes-ingangscontroller. Zorg ervoor dat het volgende waar is:
- U wordt omgeleid om HTTPS te gebruiken.
- Het certificaat wordt vertrouwd.
- De demotoepassing wordt weergegeven in de webbrowser.
- Voeg /hello-world-two toe aan het einde van het domein en zorg ervoor dat de tweede demotoepassing met de aangepaste titel wordt weergegeven.
Resources opschonen
In dit artikel is Helm gebruikt om de inkomende onderdelen, certificaten en voorbeeld-apps te installeren. Wanneer u een Helm-grafiek implementeert, worden er veel Kubernetes-resources gemaakt. Deze resources omvatten pods, implementaties en services. Als u deze resources wilt opschonen, kunt u de volledige voorbeeldnaamruimte of de afzonderlijke resources verwijderen.
De voorbeeldnaamruimte en alle resources verwijderen
Als u de voorbeeldnaamruimte verwijdert, worden ook alle resources in de naamruimte verwijderd.
Verwijder de volledige voorbeeldnaamruimte met behulp van de
kubectl delete
opdracht en geef de naamruimtenaam op.kubectl delete namespace ingress-basic
Resources afzonderlijk verwijderen
U kunt de resource ook afzonderlijk verwijderen.
Verwijder de resources van de clusteruitgever.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Geef de Helm-releases weer met de
helm list
opdracht. Zoek naar grafieken met de naam nginx en cert-manager, zoals wordt weergegeven in de volgende voorbeelduitvoer.$ helm list --namespace ingress-basic NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION cert-manager ingress-basic 1 2020-01-15 10:23:36.515514 -0600 CST deployed cert-manager-v0.13.0 v0.13.0 nginx ingress-basic 1 2020-01-15 10:09:45.982693 -0600 CST deployed nginx-ingress-1.29.1 0.27.0
Verwijder de releases met behulp van de
helm uninstall
opdracht. In het volgende voorbeeld worden de NGINX-implementaties voor inkomend verkeer en certificaatbeheer verwijderd.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
Verwijder de twee voorbeeldtoepassingen.
kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
Verwijder de route voor inkomend verkeer dat verkeer naar de voorbeeld-apps heeft geleid.
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
Verwijder de naamruimte zelf. Gebruik de opdracht en geef de
kubectl delete
naam van uw naamruimte op.kubectl delete namespace ingress-basic
Volgende stappen
Dit artikel bevat enkele externe onderdelen voor AKS. Zie de volgende projectpagina's voor meer informatie over deze onderdelen:
U kunt ook het volgende doen: