TLS használata bejövőforgalom-vezérlővel az Azure Kubernetes Service-ben (AKS)

A transport layer security (TLS) protokoll tanúsítványokkal biztosítja a kommunikáció, a titkosítás, a hitelesítés és az integritás biztonságát. A TLS és az AKS bejövőforgalom-vezérlővel való használata lehetővé teszi az alkalmazások közötti kommunikáció biztonságossá tételét, és élvezheti a bejövőforgalom-vezérlő előnyeit.

Saját tanúsítványokat hozhat, és integrálhatja őket a Titkos kulcstár CSI-illesztőprogramjával. Másik lehetőségként használhatja a cert-managert, amely automatikusan létrehozza és konfigurálja a Let's Encrypt tanúsítványokat. Két alkalmazás fut az AKS-fürtben, amelyek mindegyike egyetlen IP-címen keresztül érhető el.

Fontos

Az alkalmazás-útválasztási bővítmény ajánlott az AKS-bemenő forgalomhoz. További információ: Managed nginx Ingress with the application routing add-on.

Fontos

A Microsoft nem kezeli vagy támogatja a tanúsítványkezelőt és a használatából eredő problémákat. A cert-managerrel kapcsolatos problémákért tekintse meg a cert-manager hibaelhárítási dokumentációját .

A Kuberneteshez két nyílt forráskód bejövő vezérlő tartozik az Nginx alapján: az egyiket a Kubernetes-közösség (kubernetes/ingress-nginx), a másikat pedig az NGINX, Inc. (nginxinc/kubernetes-ingress) tartja fenn. Ez a cikk a Kubernetes közösségi bejövőforgalom-vezérlőt használja.

Mielőtt elkezdené

  • Ez a cikk feltételezi, hogy be van állítva egy bejövőforgalom-vezérlő és alkalmazások. Ha bejövőforgalom-vezérlőre vagy példaalkalmazásra van szüksége, olvassa el a Bejövőforgalom-vezérlő létrehozása című témakört.

  • Ez a cikk a Helm 3 használatával telepíti az NGINX bejövőforgalom-vezérlőt a Kubernetes támogatott verziójára. Győződjön meg arról, hogy a Helm legújabb kiadását használja, és hozzáfér a ingress-nginx Helm-adattárakhoz jetstack . Előfordulhat, hogy a cikkben ismertetett lépések nem kompatibilisek a Helm-diagram, az NGINX bejövőforgalom-vezérlő vagy a Kubernetes korábbi verzióival.

  • Ez a cikk feltételezi, hogy rendelkezik egy meglévő AKS-fürttel egy integrált Azure Container Registryvel (ACR). Az AKS-fürt integrált ACR-sel való létrehozásáról további információt az AKS hitelesítése az AKS-ből című témakörben talál.

  • Az Azure CLI használata esetén ez a cikk megköveteli az Azure CLI 2.0.64-es vagy újabb verziójának futtatását. A verzió azonosításához futtassa a következőt: az --version. Ha telepíteni vagy frissíteni szeretne: Az Azure CLI telepítése.

  • Ha Az Azure PowerShellt használja, ehhez a cikkhez az Azure PowerShell 5.9.0-s vagy újabb verzióját kell futtatnia. A verzió azonosításához futtassa a következőt: Get-InstalledModule -Name Az. Ha telepíteni vagy frissíteni szeretne, olvassa el az Azure PowerShell telepítését ismertető cikket.

A TLS használata saját tanúsítványokkal a Titkos kulcstár CSI-illesztőprogramjával

Ha saját tanúsítványokkal rendelkező TLS-t szeretne használni a Titkos kulcstár CSI-illesztőprogramjával, szüksége van egy AKS-fürtre, amelyen konfigurálva van a Titkos kulcstár CSI-illesztőprogramja és egy Azure Key Vault-példány.

További információ: Titkos kulcstár CSI-illesztőprogram beállítása az NGINX bejövőforgalom-vezérlő TLS-lel való engedélyezéséhez.

TLS használata Let's Encrypt tanúsítványokkal

Ha tLS-t szeretne használni Let's Encrypt-tanúsítványokkal, a tanúsítványkezelőt fogja üzembe helyezni, amely automatikusan létrehozza és konfigurálja a Let's Encrypt tanúsítványokat.

Importálja a Helm-diagram által használt tanúsítványkezelő lemezképeket az ACR-be

  • A az acr import következő képek importálása az ACR-be.

    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
    

Feljegyzés

Helm-diagramokat is importálhat az ACR-be. További információ: Helm-diagramok leküldése és lekérése egy ACR-be.

Bejövőforgalom-vezérlő konfigurációs beállításai

Az NGINX bejövőforgalom-vezérlőt statikus nyilvános IP-címmel vagy dinamikus nyilvános IP-címmel konfigurálhatja. Ha egyéni tartományt használ, hozzá kell adnia egy A rekordot a DNS-zónához. Ha nem egyéni tartományt használ, konfigurálhat egy teljes tartománynevet (FQDN) a bejövő forgalomvezérlő IP-címéhez.

Statikus vagy dinamikus nyilvános IP-cím létrehozása

Statikus nyilvános IP-cím használata

A bejövőforgalom-vezérlőt statikus nyilvános IP-címmel konfigurálhatja. A statikus nyilvános IP-cím megmarad, ha törli a bejövőforgalom-vezérlőt. Az IP-cím nem marad meg, ha törli az AKS-fürtöt.

A bejövőforgalom-vezérlő frissítésekor egy paramétert kell átadnia a Helm-kiadásnak, hogy a bejövőforgalom-vezérlő szolgáltatás értesüljön a terheléselosztóról, amely hozzá lesz rendelve. Ahhoz, hogy a HTTPS-tanúsítványok megfelelően működjenek, egy DNS-címkével konfiguráljon egy teljes tartománynevet a bejövőforgalom-vezérlő IP-címéhez.

  1. Kérje le az AKS-fürt erőforráscsoportjának nevét a az aks show paranccsal.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
  2. Hozzon létre egy nyilvános IP-címet a statikus kiosztási módszerrel a az network public-ip create parancs használatával. Az alábbi példa létrehoz egy myAKSPublicIP nevű nyilvános IP-címet az előző lépésben beszerzett AKS-fürt erőforráscsoportjában.

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

Feljegyzés

Másik lehetőségként létrehozhat egy IP-címet egy másik erőforráscsoportban, amelyet az AKS-fürttől elkülönítve kezelhet. Ha egy másik erőforráscsoportban hoz létre IP-címet, győződjön meg arról, hogy a következők teljesülnek:

  • Az AKS-fürt által használt fürtidentitás delegált engedélyekkel rendelkezik az erőforráscsoporthoz, például a hálózati közreműködőhöz.
  • Adja hozzá a paramétert --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>" . Cserélje le <RESOURCE_GROUP> annak az erőforráscsoportnak a nevét, ahol az IP-cím található.
  1. Adja hozzá a paramétert --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>" . A DNS-címke beállítható a bejövőforgalom-vezérlő első üzembe helyezésekor, vagy később is konfigurálható.

  2. Adja hozzá a paramétert --set controller.service.loadBalancerIP="<STATIC_IP>" . Adja meg az előző lépésben létrehozott saját nyilvános IP-címét.

    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
    

További információ: Statikus nyilvános IP-cím és DNS-címke használata az AKS terheléselosztóval.

Dinamikus nyilvános IP-cím használata

Létrehozáskor létrejön egy Nyilvános Azure IP-cím a bejövőforgalom-vezérlőhöz. A nyilvános IP-cím statikus a bejövőforgalom-vezérlő élettartamához. A nyilvános IP-cím nem marad meg, ha törli a bejövőforgalom-vezérlőt. Ha új bejövőforgalom-vezérlőt hoz létre, az új nyilvános IP-cím lesz hozzárendelve. A kimenetnek az alábbi mintakimenethez hasonlóan kell kinéznie.

  • kubectl get service A parancs használatával lekérheti a bejövőforgalom-vezérlő nyilvános IP-címét.

    # 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
    

A rekord hozzáadása a DNS-zónához

Ha egyéni tartományt használ, hozzá kell adnia egy A rekordot a DNS-zónához. Ha nem egyéni tartományt használ, a nyilvános IP-címet teljes tartománynévvel konfigurálhatja.

  • Adjon hozzá egy A rekordot a DNS-zónához az NGINX szolgáltatás külső IP-címével a használatával 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
    

Teljes tartománynév konfigurálása a bejövőforgalom-vezérlőhöz

Igény szerint egy DNS-címke beállításával konfigurálhat egy teljes tartománynevet a bejövőforgalom-vezérlő IP-címéhez egyéni tartomány helyett. A teljes tartománynévnek a következő űrlapot kell követnie: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com.

Fontos

A DNS-címkének egyedinek kell lennie az Azure-helyén belül.

A teljes tartománynevet az alábbi módszerek egyikével konfigurálhatja:

  • Állítsa be a DNS-címkét az Azure CLI vagy az Azure PowerShell használatával.
  • Állítsa be a DNS-címkét a Helm-diagram beállításaival.

További információ: Nyilvános IP-cím DNS-névfeliratai.

A DNS-címke beállítása az Azure CLI vagy az Azure PowerShell használatával

Mindenképpen cserélje le <DNS_LABEL> az egyedi DNS-címkét.

# 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

A DNS-címke beállítása Helm-diagrambeállítások használatával

A paraméterrel --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name" széljegyzetbeállítást adhat át a Helm-diagram konfigurációjának. Ez a paraméter beállítható a bejövőforgalom-vezérlő első üzembe helyezésekor, vagy később is konfigurálható.

Az alábbi példa bemutatja, hogyan frissítheti ezt a beállítást a vezérlő üzembe helyezése után. Mindenképpen cserélje le <DNS_LABEL> az egyedi DNS-címkét.

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

Tanúsítványkezelő telepítése

A NGINX bejövő vezérlő támogatja a TLS-megszakítást. A HTTPS-tanúsítványok lekérésének és konfigurálásának számos módja van. Ez a cikk a tanúsítványkezelőt használja, amely automatikusan lehetővé teszi a tanúsítványok létrehozásának és kezelésének titkosítását.

A cert-manager vezérlő telepítéséhez használja az alábbi parancsokat.

# 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

A cert-manager konfigurációjáról további információt a cert-manager projektben talál.

Ca-fürtkibocsátó létrehozása

A tanúsítványok kiállítása előtt a tanúsítványkezelőnek az alábbi kiállítók egyikére van szüksége:

További információkért tekintse meg a tanúsítványkezelő kiállítójának dokumentációját.

  1. Hozzon létre egy fürtkibocsátót, például cluster-issuer.yamlaz alábbi példajegyzék használatával. Cserélje le MY_EMAIL_ADDRESS a szervezet érvényes címére.

    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. Alkalmazza a kiállítót a kubectl apply parancs használatával.

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

Bejövő útvonalak frissítése

Frissítenie kell a bejövő útvonalakat a teljes tartományba vagy egyéni tartományba történő forgalom kezeléséhez.

A következő példában a forgalom a következőképpen van irányítva:

  • Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN az aks-helloworld-one szolgáltatáshoz van irányítva.
  • Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN/hello-world-two az aks-helloworld-two szolgáltatáshoz van irányítva.
  • Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN/static a statikus objektumok aks-helloworld-one nevű szolgáltatáshoz vannak irányítva.

Feljegyzés

Ha egyéni tartomány helyett a bejövőforgalom-vezérlő IP-címéhez konfigurált teljes tartománynevet, használja a teljes tartománynevet a hello-world bejövő forgalom helyett . MY_CUSTOM_DOMAIN.

Ha például a teljes tartománynév demo-aks-ingress.eastus.cloudapp.azure.com, cserélje le a hello-world bejövő forgalmat. MY_CUSTOM_DOMAIN demo-aks-ingress.eastus.cloudapp.azure.com behello-world-ingress.yaml.

  1. Hozza létre vagy frissítse a hello-world-ingress.yaml fájlt az alábbi YAML-fájllal. Frissítse az spec.tls.hostsspec.rules.host előző lépésben létrehozott DNS-nevet.

    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. Frissítse a bejövő erőforrást a kubectl apply paranccsal.

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

Tanúsítványobjektum létrehozásának ellenőrzése

Ezután létre kell hozni egy tanúsítványerőforrást. A tanúsítványerőforrás határozza meg a kívánt X.509-tanúsítványt. További információ: tanúsítványkezelői tanúsítványok.

A Tanúsítványkezelő automatikusan létrehoz egy tanúsítványobjektumot az ingress-shim használatával, amelyet a rendszer automatikusan üzembe helyez a cert-managerrel a 0.2.2-s verzió óta. További információkért tekintse meg az ingress-shim dokumentációját.

A tanúsítvány sikeres létrehozásának ellenőrzéséhez használja a kubectl get certificate --namespace ingress-basic parancsot, és ellenőrizze, hogy a READY igaz-e. A kimenet lekérése több percig is eltarthat.

kubectl get certificate --namespace ingress-basic

Az alábbi kimenet a tanúsítvány állapotát mutatja.

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

A bejövő forgalom konfigurációjának tesztelése

Nyisson meg egy webböngészőt a hello-world-ingress szolgáltatáshoz. MY_CUSTOM_DOMAIN vagy a Kubernetes bejövőforgalom-vezérlőjének teljes tartománynevét. Győződjön meg arról, hogy a következők teljesülnek:

  • A rendszer átirányítja a HTTPS használatára.
  • A tanúsítvány megbízható.
  • A bemutató alkalmazás megjelenik a webböngészőben.
  • Adja hozzá a /hello-world-two fájlt a tartomány végéhez, és győződjön meg arról, hogy megjelenik a második demóalkalmazás az egyéni címmel.

Az erőforrások eltávolítása

Ez a cikk a Helm használatával telepítette a bejövő összetevőket, tanúsítványokat és mintaalkalmazásokat. Helm-diagram üzembe helyezésekor számos Kubernetes-erőforrás jön létre. Ezek az erőforrások podokat, üzembe helyezéseket és szolgáltatásokat tartalmaznak. Az erőforrások törléséhez törölheti a teljes mintanévteret vagy az egyes erőforrásokat.

A mintanévtér és az összes erőforrás törlése

A mintanévtér törlése a névtérben lévő összes erőforrást is törli.

  • Törölje a teljes mintanévteret a kubectl delete parancs használatával, és adja meg a névtér nevét.

    kubectl delete namespace ingress-basic
    

Erőforrások törlése egyenként

Azt is megteheti, hogy egyenként törli az erőforrást.

  1. Távolítsa el a fürtkibocsátó erőforrásait.

    kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
    
  2. Sorolja fel a Helm-kiadásokat a helm list paranccsal. Keresse meg az nginx és a cert-manager nevű diagramokat az alábbi példakimenetben látható módon.

    $ 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. Távolítsa el a kiadásokat a helm uninstall paranccsal. Az alábbi példa eltávolítja az NGINX bejövő és a cert-manager üzemelő példányait.

    $ helm uninstall cert-manager nginx --namespace ingress-basic
    
    release "cert-manager" uninstalled
    release "nginx" uninstalled
    
  4. Távolítsa el a két mintaalkalmazást.

    kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic
    kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
    
  5. Távolítsa el azt a bejövő útvonalat, amely a mintaalkalmazások felé irányította a forgalmat.

    kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
    
  6. Törölje saját névterét. Használja a kubectl delete parancsot, és adja meg a névtér nevét.

    kubectl delete namespace ingress-basic
    

Következő lépések

Ez a cikk tartalmazott néhány külső összetevőt az AKS-hez. Az összetevőkkel kapcsolatos további információkért tekintse meg a következő projektoldalakat:

További lehetőségek: