Použití protokolu TLS s kontrolerem příchozího přenosu dat na Azure Kubernetes Service (AKS)

Protokol TLS (Transport Layer Security) je protokol pro zajištění zabezpečení komunikace, jako je šifrování, ověřování a integrita, pomocí certifikátů. Použití protokolu TLS s kontrolerem příchozího přenosu dat v AKS umožňuje zabezpečit komunikaci mezi vašimi aplikacemi a zároveň mít výhody kontroleru příchozího přenosu dat.

Můžete použít vlastní certifikáty a integrovat je s ovladačem CSI služby Secrets Store. Alternativně můžete použít také nástroj cert-manager, který se používá k automatickému vygenerování a konfiguraci certifikátů Let's Encrypt . Nakonec se v clusteru AKS spouští dvě aplikace, z nichž každá je přístupná přes jednu IP adresu.

Poznámka

Existují dva kontrolery příchozího přenosu dat open source pro Kubernetes založené na Nginx: jeden spravuje komunita Kubernetes (kubernetes/ingress-nginx) a jeden spravuje NGINX, Inc. (nginxinc/kubernetes-ingress). Tento článek bude používat kontroler příchozího přenosu dat komunity Kubernetes.

Než začnete

Tento článek také předpokládá, že máte nastavený kontroler příchozího přenosu dat a aplikace. Pokud potřebujete kontroler příchozího přenosu dat nebo ukázkové aplikace, přečtěte si téma Vytvoření kontroleru příchozího přenosu dat.

Tento článek používá Helm 3 k instalaci kontroleru příchozího přenosu dat NGINX na podporovanou verzi Kubernetes. Ujistěte se, že používáte nejnovější verzi Nástroje Helm a máte přístup k ingress-nginx úložištím a jetstack úložištím Helm. Kroky popsané v tomto článku nemusí být kompatibilní s předchozími verzemi kontroleru příchozího přenosu dat Helm, kontroleru příchozího přenosu dat NGINX nebo Kubernetes.

Další informace o konfiguraci a používání Nástroje Helm najdete v tématu Instalace aplikací s Helmem v Azure Kubernetes Service (AKS). Pokyny k upgradu najdete v dokumentaci k instalaci Helmu.

Kromě toho tento článek předpokládá, že máte existující cluster AKS s integrovaným Azure Container Registry (ACR). Další informace o vytvoření clusteru AKS s integrovaným ACR najdete v tématu Ověřování pomocí Azure Container Registry z Azure Kubernetes Service.

Tento článek také vyžaduje, abyste spustili Azure CLI verze 2.0.64 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

Použití protokolu TLS s vlastními certifikáty s ovladačem CSI služby Secrets Store

Pokud chcete protokol TLS používat s vlastními certifikáty s ovladačem CSI Úložiště tajných kódů, budete potřebovat cluster AKS s nakonfigurovaným ovladačem CSI služby Secrets Store a instancí Azure Key Vault. Další informace naleznete v tématu Nastavení ovladače CSI úložiště tajných kódů pro povolení kontroleru příchozího přenosu dat NGINX s protokolem TLS.

Použití protokolu TLS s certifikáty Let's Encrypt

Pokud chcete používat protokol TLS s certifikáty Let's Encrypt, nasadíte nástroj cert-manager, který se používá k automatickému vygenerování a konfiguraci certifikátů Let's Encrypt .

Import imagí správce certifikátů používaných chartem Helm do služby ACR

Slouží az acr import k importu těchto imagí do služby 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

Poznámka

Kromě importu imagí kontejnerů do služby ACR můžete do služby ACR také importovat charty Helm. Další informace najdete v tématu Nabízení a vyžádání grafů Helm do Azure Container Registry.

Možnosti konfigurace kontroleru příchozího přenosu dat

Ve výchozím nastavení se vytvoří kontroler příchozího přenosu dat NGINX s novým přiřazením veřejné IP adresy. Tato veřejná IP adresa je pro kontroler příchozího přenosu dat statická a při odstranění a opětovném vytvoření kontroleru dojde ke ztrátě.

Máte možnost zvolit jednu z následujících metod:

  • Použití dynamické veřejné IP adresy
  • Použití statické veřejné IP adresy

Použití statické veřejné IP adresy

Běžným požadavkem na konfiguraci je poskytnutí kontroleru příchozího přenosu dat NGINX stávající statickou veřejnou IP adresu. Statická veřejná IP adresa zůstane, pokud se kontroler příchozího přenosu dat odstraní.

Následující příkazy vytvoří IP adresu, která se odstraní, pokud odstraníte cluster AKS.

Nejprve získejte název skupiny prostředků clusteru AKS pomocí příkazu az aks show :

az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv

Dále pomocí příkazu az network public-ip create vytvořte veřejnou IP adresu pomocí metody statického přidělování. Následující příklad vytvoří veřejnou IP adresu s názvem myAKSPublicIP ve skupině prostředků clusteru AKS získanou v předchozím kroku:

az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv

Případně můžete vytvořit IP adresu v jiné skupině prostředků, kterou je možné spravovat odděleně od clusteru AKS. Pokud vytvoříte IP adresu v jiné skupině prostředků, ujistěte se, že platí následující:

  • Identita clusteru používaná clusterem AKS má delegovaná oprávnění ke skupině prostředků, například přispěvateli sítě.
  • --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>" Přidejte parametr. Nahraďte <RESOURCE_GROUP> názvem skupiny prostředků, ve které se nachází IP adresa.

Když aktualizujete kontroler příchozího přenosu dat, musíte předat parametr verzi Helmu, aby kontroler příchozího přenosu dat věděl o statické IP adrese nástroje pro vyrovnávání zatížení, který má být přidělen službě kontroleru příchozího přenosu dat. Aby certifikáty HTTPS správně fungovaly, použije se popisek názvu DNS ke konfiguraci plně kvalifikovaného názvu domény pro IP adresu kontroleru příchozího přenosu dat.

  1. --set controller.service.loadBalancerIP="<EXTERNAL_IP>" Přidejte parametr. Zadejte vlastní veřejnou IP adresu vytvořenou v předchozím kroku.
  2. --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>" Přidejte parametr. Popisek DNS je možné nastavit buď při prvním nasazení kontroleru příchozího přenosu dat, nebo ho můžete nakonfigurovat později.
DNS_LABEL="demo-aks-ingress"
NAMESPACE="ingress-basic"
STATIC_IP=<STATIC_IP>

helm upgrade nginx-ingress 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

Další informace najdete v tématu Použití statické veřejné IP adresy a popisku DNS s nástrojem pro vyrovnávání zatížení AKS.

Použití dynamické IP adresy

Při vytvoření kontroleru příchozího přenosu dat se pro kontroler příchozího přenosu dat vytvoří veřejná IP adresa Azure. Tato veřejná IP adresa je statická pro životní rozsah kontroleru příchozího přenosu dat. Pokud odstraníte kontroler příchozího přenosu dat, dojde ke ztrátě přiřazení veřejné IP adresy. Pokud pak vytvoříte další kontroler příchozího přenosu dat, přiřadí se nová veřejná IP adresa.

Pokud chcete získat veřejnou IP adresu, použijte kubectl get service příkaz.

kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller

Ukázkový výstup ukazuje podrobnosti o kontroleru příchozího přenosu dat:

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

Pokud používáte vlastní doménu, budete muset do zóny DNS přidat záznam A. Jinak budete muset nakonfigurovat veřejnou IP adresu s plně kvalifikovaným názvem domény (FQDN).

Přidání záznamu A do zóny DNS

Přidejte záznam A do zóny DNS s externí IP adresou služby NGINX pomocí příkazu 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

Konfigurace plně kvalifikovaného názvu domény pro kontroler příchozího přenosu dat

Volitelně můžete nakonfigurovat plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat místo vlastní domény. Plně kvalifikovaný název domény bude ve formuláři <CUSTOM LABEL>.<AZURE REGION NAME>.cloudapp.azure.com.

Metoda 1: Nastavení popisku DNS pomocí Azure CLI

Tato ukázka je pro prostředí Bash.

# Public IP address of your ingress controller
IP="MY_EXTERNAL_IP"

# Name to associate with public IP address
DNSNAME="demo-aks-ingress"

# 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 $DNSNAME

# Display the FQDN
az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv

Metoda 2: Nastavení popisku DNS pomocí nastavení chartu Helm

Nastavení poznámek můžete předat konfiguraci chartu Helm pomocí parametru --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name" . Tento parametr lze nastavit buď při prvním nasazení kontroleru příchozího přenosu dat, nebo je možné ho nakonfigurovat později. Následující příklad ukazuje, jak aktualizovat toto nastavení po nasazení kontroleru.

DNS_LABEL="demo-aks-ingress"
NAMESPACE="ingress-basic"

helm upgrade nginx-ingress ingress-nginx/ingress-nginx \
  --namespace $NAMESPACE \
  --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL

Instalace nástroje cert-manager

Kontroler příchozího přenosu dat NGINX podporuje ukončení protokolu TLS. Existuje několik způsobů, jak načíst a nakonfigurovat certifikáty pro protokol HTTPS. Tento článek ukazuje použití nástroje cert-manager, který poskytuje funkce automatického šifrování generování a správy certifikátů.

Instalace kontroleru cert-manager:

# 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

Další informace o konfiguraci nástroje cert-manager najdete v projektu cert-manager.

Vytvoření vystavitele clusteru certifikační autority

Před vydáním certifikátů vyžaduje správce certifikátů prostředek Vystavitel nebo ClusterIssuer . Tyto prostředky Kubernetes jsou v funkcích stejné, ale Issuer fungují v jednom oboru názvů a ClusterIssuer fungují napříč všemi obory názvů. Další informace najdete v dokumentaci vystavitele cert-manageru .

Vytvořte vystavitele clusteru, například cluster-issuer.yamlpomocí následujícího ukázkového manifestu. Aktualizujte e-mailovou adresu platnou adresou vaší organizace:

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

K vytvoření vystavitele použijte kubectl apply příkaz.

kubectl apply -f cluster-issuer.yaml

Aktualizace tras příchozího přenosu dat

Abyste mohli zpracovávat provoz do plně kvalifikovaného názvu domény nebo vlastní domény, budete muset aktualizovat trasy příchozího přenosu dat.

V následujícím příkladu provoz na adresu hello-world-ingress. MY_CUSTOM_DOMAIN se směruje do služby aks-helloworld-one . Provoz na adresu hello-world-ingress. MY_CUSTOM_DOMAIN/hello-world-two se směruje do služby aks-helloworld-two . Přenosy do příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN/static se směruje do služby s názvem aks-helloworld-one pro statické prostředky.

Poznámka

Pokud jste nakonfigurovali plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat místo vlastní domény, použijte plně kvalifikovaný název domény místo příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN. Pokud je například plně kvalifikovaný název domény demo-aks-ingress.eastus.cloudapp.azure.com, nahraďte příchozí přenos dat hello-world. MY_CUSTOM_DOMAIN sdemo-aks-ingress.eastus.cloudapp.azure.com v hello-world-ingress.yaml.

Vytvořte nebo aktualizujte soubor pomocí následujícího příkladu hello-world-ingress.yaml YAML. spec.tls.hosts Aktualizujte název DNS, spec.rules.host který jste vytvořili v předchozím kroku.

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

Pomocí příkazu aktualizujte prostředek příchozího kubectl apply přenosu dat.

kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic

Ověření vytvoření objektu certifikátu

Dále musí být vytvořen prostředek certifikátu. Prostředek certifikátu definuje požadovaný certifikát X.509. Další informace najdete v tématu Certifikáty správce certifikátů certifikátu certifikátu. Cert-manager pro vás automaticky vytvořil objekt certifikátu pomocí ingress-shim, který se automaticky nasadí s cert-manager od verze 0.2.2. Další informace najdete v dokumentaci k příchozímu přenosu dat.

Pokud chcete ověřit, že se certifikát úspěšně vytvořil, použijte kubectl get certificate --namespace ingress-basic příkaz a ověřte, že je připraveno, což může trvat několik minut.

kubectl get certificate --namespace ingress-basic

Následující příklad výstupu ukazuje stav certifikátu:

NAME         READY   SECRET       AGE
tls-secret   True    tls-secret   11m

Otestování konfigurace příchozího přenosu dat

Otevřete webový prohlížeč pro hello-world-ingress. MY_CUSTOM_DOMAIN nebo plně kvalifikovaný název domény kontroleru příchozího přenosu dat Kubernetes. Všimněte si, že jste přesměrováni na použití HTTPS a certifikát je důvěryhodný a ukázková aplikace se zobrazí ve webovém prohlížeči. Přidejte cestu /hello-world-two a všimněte si, že se zobrazí druhá ukázková aplikace s vlastním názvem.

Vyčištění prostředků

Tento článek použil Helm k instalaci komponent, certifikátů a ukázkových aplikací příchozího přenosu dat. Když nasadíte chart Helm, vytvoří se mnoho prostředků Kubernetes. Mezi tyto prostředky patří pody, nasazení a služby. Pokud chcete tyto prostředky vyčistit, můžete buď odstranit celý ukázkový obor názvů, nebo jednotlivé prostředky.

Odstranění ukázkového oboru názvů a všech prostředků

Pokud chcete odstranit celý ukázkový obor názvů, použijte kubectl delete příkaz a zadejte název oboru názvů. Odstraní se všechny prostředky v oboru názvů.

kubectl delete namespace ingress-basic

Odstranění prostředků jednotlivě

Případně je podrobnější přístup k odstranění jednotlivých prostředků vytvořených. Nejprve odeberte prostředky vystavitele clusteru:

kubectl delete -f cluster-issuer.yaml --namespace ingress-basic

Vypíše verzi Helmu pomocí helm list příkazu. Vyhledejte grafy s názvem nginx a cert-manager, jak je znázorněno v následujícím příkladu výstupu:

$ 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  

Odinstalujte vydané verze pomocí helm uninstall příkazu. Následující příklad odinstaluje nasazení příchozího přenosu dat NGINX a cert-manageru.

$ helm uninstall cert-manager nginx --namespace ingress-basic

release "cert-manager" uninstalled
release "nginx" uninstalled

Dále odeberte dvě ukázkové aplikace:

kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic
kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic

Odeberte trasu příchozího přenosu dat, která směrovala provoz do ukázkových aplikací:

kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic

Nakonec můžete odstranit samotný obor názvů. kubectl delete Použijte příkaz a zadejte název oboru názvů:

kubectl delete namespace ingress-basic

Další kroky

Tento článek obsahoval některé externí komponenty pro AKS. Další informace o těchto komponentách najdete na následujících stránkách projektu:

Můžete také: