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

Protokol TLS (Transport Layer Security) používá certifikáty k zajištění zabezpečení komunikace, šifrování, ověřování a integrity. Použití protokolu TLS s kontrolerem příchozího přenosu dat v AKS umožňuje zabezpečit komunikaci mezi aplikacemi a využívat výhody kontroleru příchozího přenosu dat.

Můžete si přinést vlastní certifikáty a integrovat je s ovladačem CSI úložiště tajných kódů. Alternativně můžete použít nástroj cert-manager, který automaticky generuje a konfiguruje certifikáty Let's Encrypt . V clusteru AKS běží dvě aplikace, z nichž každá je přístupná přes jednu IP adresu.

Důležité

Doplněk Směrování aplikací se doporučuje pro příchozí přenos dat v AKS. Další informace najdete v tématu Spravované příchozí přenosy dat nginx s doplňkem směrování aplikace.

Důležité

Společnost Microsoft nespravuje ani nepodporuje nástroj cert-manager a žádné problémy vyplývající z jejího použití. Informace o problémech s nástrojem cert-manager najdete v dokumentaci k řešení potíží s nástrojem cert-manager.

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 používá kontroler příchozího přenosu dat komunity Kubernetes.

Než začnete

  • Tento článek 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 do podporované verze 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 chartu Helm, kontrolerem příchozího přenosu dat NGINX nebo Kubernetes.

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

  • Pokud používáte Azure CLI, musíte mít 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.

  • Pokud používáte Azure PowerShell, musíte mít Azure PowerShell verze 5.9.0 nebo novější. Verzi zjistíte spuštěním příkazu Get-InstalledModule -Name Az. Pokud potřebujete provést instalaci nebo upgrade, přečtěte si téma Instalace Azure PowerShellu.

Použití protokolu TLS s vlastními certifikáty s ovladačem CSI úložiště tajných kódů

Pokud chcete používat protokol TLS s vlastními certifikáty s ovladačem CSI úložiště tajných kódů, potřebujete cluster AKS s nakonfigurovaným ovladačem CSI úložiště tajných klíčů a instancí služby Azure Key Vault.

Další informace najdete v tématu Nastavení ovladače CSI úložiště tajných kódů pro povolení kontroleru příchozího přenosu dat NGINX pomocí protokolu 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 cert-manager, který automaticky vygeneruje a konfiguruje certifikáty Let's Encrypt.

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

  • Slouží az acr import k importu následujících 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:

Do služby ACR můžete také importovat grafy Helm. Další informace najdete v tématu Vložení a vyžádání chartů Helm do ACR.

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

Kontroler příchozího přenosu dat NGINX můžete nakonfigurovat pomocí statické veřejné IP adresy nebo dynamické veřejné IP adresy. Pokud používáte vlastní doménu, musíte do zóny DNS přidat záznam A. Pokud nepoužíváte vlastní doménu, můžete pro IP adresu kontroleru příchozího přenosu dat nakonfigurovat plně kvalifikovaný název domény (FQDN).

Vytvoření statické nebo dynamické veřejné IP adresy

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

Kontroler příchozího přenosu dat můžete nakonfigurovat se statickou veřejnou IP adresou. Statická veřejná IP adresa zůstane, pokud odstraníte kontroler příchozího přenosu dat. IP adresa nezůstane , pokud odstraníte cluster AKS.

Při upgradu kontroleru příchozího přenosu dat musíte předat do verze Helm parametr, aby služba kontroleru příchozího přenosu dat věděla o nástroji pro vyrovnávání zatížení, který bude přidělen. Aby certifikáty HTTPS fungovaly správně, pomocí popisku DNS nakonfigurujete plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat.

  1. Pomocí příkazu získejte název skupiny prostředků clusteru az aks show AKS.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
  2. Pomocí příkazu vytvořte veřejnou IP adresu se statickou metodou az network public-ip create 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
    

Poznámka:

Případně můžete vytvořit IP adresu v jiné skupině prostředků, kterou můžete 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ů, jako je přispěvatel 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.
  1. --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>" Přidejte parametr. Popisek DNS lze nastavit buď při prvním nasazení kontroleru příchozího přenosu dat, nebo je možné ho nakonfigurovat později.

  2. --set controller.service.loadBalancerIP="<STATIC_IP>" Přidejte parametr. Zadejte vlastní veřejnou IP adresu vytvořenou v předchozím kroku.

    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
    

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é veřejné IP adresy

Při vytváření se pro kontroler příchozího přenosu dat vytvoří veřejná IP adresa Azure. Veřejná IP adresa je statická po dobu životnosti kontroleru příchozího přenosu dat. Pokud odstraníte kontroler příchozího přenosu dat, veřejná IP adresa nezůstane. Pokud vytvoříte nový kontroler příchozího přenosu dat, přiřadí se mu nová veřejná IP adresa. Výstup by měl vypadat podobně jako následující ukázkový výstup.

  • kubectl get service Pomocí příkazu získejte veřejnou IP adresu kontroleru příchozího přenosu dat.

    # 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
    

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

Pokud používáte vlastní doménu, musíte do zóny DNS přidat záznam A . Pokud nepoužíváte vlastní doménu, můžete veřejnou IP adresu nakonfigurovat pomocí plně kvalifikovaného názvu domény.

  • Přidejte do zóny DNS záznam A s externí IP adresou služby NGINX pomocí 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 nastavením popisku DNS. Plně kvalifikovaný název domény by měl vypadat takto: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com.

Důležité

Popisek DNS musí být jedinečný v rámci svého umístění Azure.

Plně kvalifikovaný název domény můžete nakonfigurovat pomocí jedné z následujících metod:

  • Nastavte popisek DNS pomocí Azure CLI nebo Azure PowerShellu.
  • Nastavte popisek DNS pomocí nastavení chartu Helm.

Další informace najdete v tématu Popisky názvů DNS veřejné IP adresy.

Nastavení popisku DNS pomocí Azure CLI nebo Azure PowerShellu

Nezapomeňte nahradit <DNS_LABEL> jedinečným popiskem DNS.

# 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

Nastavení popisku DNS pomocí nastavení chartu Helm

Pomocí parametru můžete do konfigurace chartu --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name" Helm předat nastavení poznámek. Tento parametr lze nastavit při prvním nasazení kontroleru příchozího přenosu dat nebo je možné ho později nakonfigurovat.

Následující příklad ukazuje, jak aktualizovat toto nastavení po nasazení kontroleru. Nezapomeňte nahradit <DNS_LABEL> jedinečným popiskem DNS.

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

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 používá nástroj cert-manager, který poskytuje automatické funkce generování a správy certifikátů Lets Encrypt .

K instalaci kontroleru cert-manager použijte následující příkazy.

# 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 naleznete v projektu cert-manager.

Vytvoření vystavitele clusteru certifikační autority

Před vystavením certifikátů vyžaduje cert-manager jeden z následujících vystavitelů:

  • Vystavitel, který funguje v jednom oboru názvů.
  • Prostředek ClusterIssuer , který funguje ve všech oborech názvů.

Další informace najdete v dokumentaci vystavitele nástroje cert-manager.

  1. Vytvořte vystavitele clusteru, například cluster-issuer.yamlpomocí následujícího ukázkového manifestu. Nahraďte MY_EMAIL_ADDRESS 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
    
  2. Použijte vystavitele pomocí kubectl apply příkazu.

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

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, musíte aktualizovat trasy příchozího přenosu dat.

V následujícím příkladu se provoz směruje takto:

  • Přenosy do příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN se směruje do služby aks-helloworld-one .
  • Přenosy do příchozího přenosu dat hello-world. 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 místo příchozího přenosu dat plně kvalifikovaný název domény. MY_CUSTOM_DOMAIN.

Pokud je například plně kvalifikovaný název domény demo-aks-ingress.eastus.cloudapp.azure.com, nahraďte hello-world-ingress. MY_CUSTOM_DOMAIN s demo-aks-ingress.eastus.cloudapp.azure.com v hello-world-ingress.yaml.

  1. Vytvořte nebo aktualizujte hello-world-ingress.yaml soubor pomocí následujícího příkladu souboru 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
    
  2. 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 se musí vytvořit prostředek certifikátu. Prostředek certifikátu definuje požadovaný certifikát X.509. Další informace najdete v tématu Certifikáty nástroje cert-manager.

Cert-manager automaticky vytvoří objekt certifikátu pro vás pomocí ingress-shim, který se automaticky nasadí s nástrojem cert-manager od verze 0.2.2. Další informace najdete v dokumentaci k příchozímu přenosu dat.

K ověření úspěšného vytvoření certifikátu použijte kubectl get certificate --namespace ingress-basic příkaz a ověřte, že je připraveno true. Získání výstupu může trvat několik minut.

kubectl get certificate --namespace ingress-basic

Následující výstup ukazuje stav certifikátu.

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

Testová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. Ujistěte se, že jsou splněné následující podmínky:

  • Budete přesměrováni na používání protokolu HTTPS.
  • Certifikát je důvěryhodný.
  • Ukázková aplikace se zobrazí ve webovém prohlížeči.
  • Na konec domény přidejte /hello-world-two a ujistěte se, ž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 odstranit celý ukázkový obor názvů nebo jednotlivé prostředky.

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

Odstraněním ukázkového oboru názvů se odstraní také všechny prostředky v oboru názvů.

  • Pomocí příkazu odstraňte celý ukázkový obor názvů kubectl delete a zadejte název vašeho oboru názvů.

    kubectl delete namespace ingress-basic
    

Odstranění prostředků jednotlivě

Případně můžete prostředek odstranit jednotlivě.

  1. Odeberte prostředky vystavitele clusteru.

    kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
    
  2. 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
    
  3. Odinstalujte vydané verze pomocí helm uninstall příkazu. Následující příklad odinstaluje příchozí přenos dat NGINX a nasazení nástroje cert-manager.

    $ helm uninstall cert-manager nginx --namespace ingress-basic
    
    release "cert-manager" uninstalled
    release "nginx" uninstalled
    
  4. 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
    
  5. 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
    
  6. Odstraňte 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é: