Använda TLS med en ingresskontrollant i Azure Kubernetes Service (AKS)
TLS-protokollet (Transport Layer Security) använder certifikat för att ge säkerhet för kommunikation, kryptering, autentisering och integritet. Genom att använda TLS med en ingresskontrollant på AKS kan du skydda kommunikationen mellan dina program och uppleva fördelarna med en ingresskontrollant.
Du kan ta med egna certifikat och integrera dem med CSI-drivrutinen för Secrets Store. Du kan också använda cert-manager, som automatiskt genererar och konfigurerar Let's Encrypt-certifikat . Två program körs i AKS-klustret, som var och en är tillgänglig via en enda IP-adress.
Viktigt
Tillägget Programroutning rekommenderas för ingress i AKS. Mer information finns i Hanterad nginx-ingress med tillägget för programroutning.
Viktigt
Microsoft hanterar eller stöder inte cert-manager och eventuella problem som beror på dess användning. Information om problem med cert-manager finns i felsökningsdokumentationen för cert-manager.
Det finns två öppen källkod ingresskontrollanter för Kubernetes baserat på Nginx: en underhålls av Kubernetes-communityn (kubernetes/ingress-nginx), och en underhålls av NGINX, Inc. (nginxinc/kubernetes-ingress). Den här artikeln använder kubernetes community-ingresskontrollanten.
Den här artikeln förutsätter att du har en ingresskontrollant och program konfigurerade. Om du behöver en ingresskontrollant eller exempelprogram kan du läsa Skapa en ingresskontrollant.
Den här artikeln använder Helm 3 för att installera NGINX-ingresskontrollanten på en version av Kubernetes som stöds. Kontrollera att du använder den senaste versionen av Helm och har åtkomst till Helm-lagringsplatserna
ingress-nginx
ochjetstack
. Stegen som beskrivs i den här artikeln kanske inte är kompatibla med tidigare versioner av Helm-diagrammet, NGINX-ingresskontrollanten eller Kubernetes.- Mer information om hur du konfigurerar och använder Helm finns i Installera program med Helm i AKS. Anvisningar för uppgradering finns i Helm-installationsdokumenten.
Den här artikeln förutsätter att du har ett befintligt AKS-kluster med ett integrerat Azure Container Registry (ACR). Mer information om hur du skapar ett AKS-kluster med en integrerad ACR finns i Autentisera med ACR från AKS.
Om du använder Azure CLI kräver den här artikeln att du kör Azure CLI version 2.0.64 eller senare. Kör
az --version
för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Installera Azure CLI.Om du använder Azure PowerShell kräver den här artikeln att du kör Azure PowerShell version 5.9.0 eller senare. Kör
Get-InstalledModule -Name Az
för att hitta versionen. Om du behöver installera eller uppgradera kan du läsa Install Azure PowerShell (Installera Azure PowerShell).
Om du vill använda TLS med egna certifikat med CSI-drivrutinen för Secrets Store behöver du ett AKS-kluster med CSI-drivrutinen Secrets Store konfigurerad och en Azure Key Vault-instans.
Mer information finns i Konfigurera CSI-drivrutin för Secrets Store för att aktivera NGINX-ingresskontrollant med TLS.
Om du vill använda TLS med Let's Encrypt-certifikat distribuerar du cert-manager, som automatiskt genererar och konfigurerar Let's Encrypt-certifikat.
Använd
az acr import
för att importera följande bilder till din ACR.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
Anteckning
Du kan också importera Helm-diagram till din ACR. Mer information finns i Skicka och hämta Helm-diagram till en ACR.
Du kan konfigurera din NGINX-ingresskontrollant med antingen en statisk offentlig IP-adress eller en dynamisk offentlig IP-adress. Om du använder en anpassad domän måste du lägga till en A-post i DNS-zonen. Om du inte använder en anpassad domän kan du konfigurera ett fullständigt domännamn (FQDN) för ingresskontrollantens IP-adress.
Du kan konfigurera ingresskontrollanten med en statisk offentlig IP-adress. Den statiska offentliga IP-adressen finns kvar om du tar bort ingresskontrollanten. IP-adressen finns inte kvar om du tar bort AKS-klustret.
När du uppgraderar ingresskontrollanten måste du skicka en parameter till Helm-versionen för att säkerställa att ingresskontrollanttjänsten blir medveten om lastbalanseraren som ska allokeras till den. För att HTTPS-certifikaten ska fungera korrekt använder du en DNS-etikett för att konfigurera ett FQDN för ingresskontrollantens IP-adress.
Hämta resursgruppens namn på AKS-klustret med
az aks show
kommandot .az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
Skapa en offentlig IP-adress med den statiska allokeringsmetoden med kommandot
az network public-ip create
. I följande exempel skapas en offentlig IP-adress med namnet myAKSPublicIP i aks-klusterresursgruppen som hämtades i föregående steg.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Anteckning
Du kan också skapa en IP-adress i en annan resursgrupp, som du kan hantera separat från ditt AKS-kluster. Om du skapar en IP-adress i en annan resursgrupp kontrollerar du att följande är sant:
- Klusteridentiteten som används av AKS-klustret har delegerade behörigheter till resursgruppen, till exempel Nätverksdeltagare.
- Lägg till parametern
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
. Ersätt<RESOURCE_GROUP>
med namnet på resursgruppen där IP-adressen finns.
Lägg till parametern
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
. DNS-etiketten kan anges antingen när ingresskontrollanten först distribueras eller så kan den konfigureras senare.Lägg till parametern
--set controller.service.loadBalancerIP="<STATIC_IP>"
. Ange din egen offentliga IP-adress som skapades i föregående steg.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
Mer information finns i Använda en statisk offentlig IP-adress och DNS-etikett med AKS-lastbalanseraren.
En offentlig IP-adress i Azure skapas för ingresskontrollanten när den skapas. Den offentliga IP-adressen är statisk för ingresskontrollantens livslängd. Den offentliga IP-adressen finns inte kvar om du tar bort ingresskontrollanten. Om du skapar en ny ingresskontrollant tilldelas den en ny offentlig IP-adress. Dina utdata bör se ut ungefär som följande exempelutdata.
kubectl get service
Använd kommandot för att hämta den offentliga IP-adressen för ingresskontrollanten.# 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
Om du använder en anpassad domän måste du lägga till en A-post i DNS-zonen. Om du inte använder en anpassad domän kan du konfigurera den offentliga IP-adressen med ett FQDN.
Lägg till en A-post i DNS-zonen med den externa IP-adressen för NGINX-tjänsten med .
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
Du kan också konfigurera ett FQDN för ingresskontrollantens IP-adress i stället för en anpassad domän genom att ange en DNS-etikett. Ditt FQDN bör följa det här formuläret: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Viktigt
DNS-etiketten måste vara unik på dess Azure-plats.
Du kan konfigurera ditt fullständiga domännamn med någon av följande metoder:
- Ange DNS-etiketten med Hjälp av Azure CLI eller Azure PowerShell.
- Ange DNS-etiketten med hjälp av Helm-diagraminställningar.
Mer information finns i Dns-namnetiketter för offentlig IP-adress.
Ersätt <DNS_LABEL>
med din unika DNS-etikett.
# 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
Du kan skicka en anteckningsinställning till helm-diagramkonfigurationen med hjälp av parametern --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
. Den här parametern kan anges när ingresskontrollanten först distribueras, eller så kan den konfigureras senare.
I följande exempel visas hur du uppdaterar den här inställningen när kontrollanten har distribuerats. Ersätt <DNS_LABEL>
med din unika DNS-etikett.
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
NGINX-ingresskontrollanten stöder TLS-avslutning. Det finns flera sätt att hämta och konfigurera certifikat för HTTPS. Den här artikeln använder cert-manager, som tillhandahåller automatisk Lets Encrypt-certifikatgenerering och hanteringsfunktioner.
Om du vill installera cert-manager-kontrollanten använder du följande kommandon.
# 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
Mer information om cert-manager-konfiguration finns i cert-manager-projektet.
Innan certifikat kan utfärdas kräver cert-manager någon av följande utfärdare:
- En utfärdare, som fungerar i ett enda namnområde.
- En ClusterIssuer-resurs som fungerar i alla namnområden.
Mer information finns i dokumentationen för utfärdare av certifikatutfärdare .
Skapa en kluster utfärdare, till exempel
cluster-issuer.yaml
, med hjälp av följande exempelmanifest. ErsättMY_EMAIL_ADDRESS
med en giltig adress från din organisation.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
Använd utfärdaren med kommandot
kubectl apply
.kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Du måste uppdatera dina inkommande vägar för att hantera trafik till ditt fullständiga domännamn eller din anpassade domän.
I följande exempel dirigeras trafik som sådan:
- Trafik till hello-world-ingress. MY_CUSTOM_DOMAIN dirigeras till tjänsten aks-helloworld-one .
- Trafik till hello-world-ingress. MY_CUSTOM_DOMAIN/hello-world-two dirigeras till tjänsten aks-helloworld-two .
- Trafik till hello-world-ingress. MY_CUSTOM_DOMAIN/statisk dirigeras till tjänsten med namnet aks-helloworld-one för statiska tillgångar.
Anteckning
Om du har konfigurerat ett FQDN för ingresskontrollantens IP-adress i stället för en anpassad domän använder du FQDN i stället för hello-world-ingress. MY_CUSTOM_DOMAIN.
Om ditt fullständiga domännamn till exempel är demo-aks-ingress.eastus.cloudapp.azure.com ersätter du hello-world-ingress. MY_CUSTOM_DOMAIN med demo-aks-ingress.eastus.cloudapp.azure.com i hello-world-ingress.yaml
.
Skapa eller uppdatera
hello-world-ingress.yaml
filen med hjälp av följande YAML-exempelfil.spec.tls.hosts
Uppdatera ochspec.rules.host
till det DNS-namn som du skapade i ett tidigare steg.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
Uppdatera ingressresursen
kubectl apply
med kommandot .kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Därefter måste en certifikatresurs skapas. Certifikatresursen definierar önskat X.509-certifikat. Mer information finns i certifikat för cert-manager.
Cert-manager skapar automatiskt ett certifikatobjekt åt dig med ingress-shim, som distribueras automatiskt med cert-manager sedan v0.2.2. Mer information finns i ingress-shim-dokumentationen.
Kontrollera att certifikatet har skapats genom att använda kubectl get certificate --namespace ingress-basic
kommandot och kontrollera att READY är Sant. Det kan ta flera minuter att hämta utdata.
kubectl get certificate --namespace ingress-basic
Följande utdata visar certifikatets status.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
Öppna en webbläsare för att hello-world-ingress. MY_CUSTOM_DOMAIN eller FQDN för din Kubernetes-ingresskontrollant. Kontrollera att följande är sant:
- Du omdirigeras för att använda HTTPS.
- Certifikatet är betrott.
- Demoprogrammet visas i webbläsaren.
- Lägg till /hello-world-two i slutet av domänen och se till att det andra demoprogrammet med den anpassade rubriken visas.
Den här artikeln använde Helm för att installera ingresskomponenter, certifikat och exempelappar. När du distribuerar ett Helm-diagram skapas många Kubernetes-resurser. Dessa resurser omfattar poddar, distributioner och tjänster. Om du vill rensa dessa resurser kan du antingen ta bort hela exempelnamnområdet eller de enskilda resurserna.
Om du tar bort exempelnamnområdet tas även alla resurser i namnområdet bort.
Ta bort hela exempelnamnområdet med kommandot
kubectl delete
och ange namnområdesnamnet.kubectl delete namespace ingress-basic
Du kan också ta bort resursen individuellt.
Ta bort klusterproblemastreringsresurserna.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Visa en lista över Helm-versionerna
helm list
med kommandot . Leta efter diagram med namnet nginx och cert-manager, som du ser i följande exempelutdata.$ 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
Avinstallera versionerna med kommandot
helm uninstall
. I följande exempel avinstalleras NGINX-ingress- och cert-manager-distributionerna.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
Ta bort de två exempelprogrammen.
kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
Ta bort den inkommande vägen som dirigerade trafik till exempelapparna.
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
Ta bort själva namnområdet.
kubectl delete
Använd kommandot och ange namnområdets namn.kubectl delete namespace ingress-basic
Den här artikeln innehåller några externa komponenter till AKS. Mer information om dessa komponenter finns på följande projektsidor:
Du kan även: