Azure Kubernetes Service'te (AKS) giriş denetleyicisiyle TLS kullanma

Aktarım katmanı güvenliği (TLS) protokolü, iletişim, şifreleme, kimlik doğrulaması ve bütünlük için güvenlik sağlamak üzere sertifikaları kullanır. AKS'de bir giriş denetleyicisi ile TLS kullanmak, uygulamalarınız arasındaki iletişimin güvenliğini sağlamanızı ve giriş denetleyicisinin avantajlarını yaşamanızı sağlar.

Kendi sertifikalarınızı getirebilir ve Gizli Dizi Deposu CSI sürücüsüyle tümleştirebilirsiniz. Alternatif olarak, Let's Encrypt sertifikalarını otomatik olarak oluşturan ve yapılandıran cert-manager'ı kullanabilirsiniz. AKS kümesinde iki uygulama çalıştırılır ve bunların her birine tek bir IP adresi üzerinden erişilebilir.

Önemli

AKS'de giriş için Uygulama yönlendirme eklentisi önerilir. Daha fazla bilgi için bkz . Uygulama yönlendirme eklentisiyle yönetilen nginx Girişi.

Önemli

Microsoft , cert-manager'ı ve kullanımından kaynaklanan sorunları yönetmez veya desteklemez. cert-manager ile ilgili sorunlar için cert-manager sorun giderme belgelerine bakın.

Nginx tabanlı Kubernetes için iki açık kaynak giriş denetleyicisi vardır: biri Kubernetes topluluğu (kubernetes/ingress-nginx) tarafından, biri de NGINX, Inc. (nginxinc/kubernetes-ingress) tarafından korunur. Bu makalede Kubernetes topluluk giriş denetleyicisi kullanılır.

Başlamadan önce

  • Bu makalede, bir giriş denetleyicisinin ve uygulamaların ayarlandığı varsayılır. Giriş denetleyicisine veya örnek uygulamalara ihtiyacınız varsa bkz . Giriş denetleyicisi oluşturma.

  • Bu makalede, NGINX giriş denetleyicisini desteklenen bir Kubernetes sürümüne yüklemek için Helm 3 kullanılır. Helm'in en son sürümünü kullandığınızdan ve ve jetstack Helm depolarına ingress-nginx erişiminiz olduğundan emin olun. Bu makalede açıklanan adımlar Helm grafiğinin, NGINX giriş denetleyicisinin veya Kubernetes'in önceki sürümleriyle uyumlu olmayabilir.

    • Helm'i yapılandırma ve kullanma hakkında daha fazla bilgi için bkz . AKS'de Helm ile uygulama yükleme. Yükseltme yönergeleri için helm yükleme belgelerine bakın.
  • Bu makalede, tümleşik Azure Container Registry (ACR) ile mevcut bir AKS kümeniz olduğu varsayılır. Tümleşik ACR ile AKS kümesi oluşturma hakkında daha fazla bilgi için bkz . AKS'den ACR ile kimlik doğrulama.

  • Azure CLI kullanıyorsanız bu makale, Azure CLI 2.0.64 veya sonraki bir sürümünü çalıştırmanızı gerektirir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

  • Azure PowerShell kullanıyorsanız, bu makalede Azure PowerShell sürüm 5.9.0 veya sonraki bir sürümü kullanmanız gerekir. Sürümü bulmak için Get-InstalledModule -Name Az komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse bkz. Azure PowerShell yükleme.

Gizli Dizi Deposu CSI Sürücüsü ile tls'i kendi sertifikalarınızla kullanma

TlS'yi Gizli Dizi Deposu CSI Sürücüsü ile kendi sertifikalarınızla kullanmak için Gizli Dizi Deposu CSI Sürücüsü yapılandırılmış bir AKS kümesine ve bir Azure Key Vault örneğine sahip olmanız gerekir.

Daha fazla bilgi için bkz . TLS ile NGINX Giriş Denetleyicisini etkinleştirmek için Gizli Dizi Deposu CSI Sürücüsünü ayarlama.

TlS'i Let's Encrypt sertifikalarıyla kullanma

TLS'yi Let's Encrypt sertifikalarıyla kullanmak için, otomatik olarak Let's Encrypt sertifikalarını oluşturan ve yapılandıran cert-manager'ı dağıtacaksınız.

Helm grafiği tarafından kullanılan cert-manager görüntülerini ACR'nize aktarma

  • Aşağıdaki görüntüleri ACR'nize aktarmak için kullanın az acr import .

    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
    

Not

Helm grafiklerini ACR'nize de aktarabilirsiniz. Daha fazla bilgi için bkz . Helm grafiklerini ACR'ye gönderme ve çekme.

Giriş denetleyicisi yapılandırma seçenekleri

NGINX giriş denetleyicinizi statik genel IP adresi veya dinamik genel IP adresi kullanarak yapılandırabilirsiniz. Özel etki alanı kullanıyorsanız DNS bölgenize bir A kaydı eklemeniz gerekir. Özel etki alanı kullanmıyorsanız, giriş denetleyicisi IP adresi için tam etki alanı adı (FQDN) yapılandırabilirsiniz.

Statik veya dinamik genel IP adresi oluşturma

Statik genel IP adresi kullanma

Giriş denetleyicinizi statik genel IP adresiyle yapılandırabilirsiniz. Giriş denetleyicinizi silerseniz statik genel IP adresi kalır. AKS kümenizi silerseniz IP adresi kalmaz.

Giriş denetleyicinizi yükselttiğinizde, giriş denetleyicisi hizmetinin ona ayrılacak yük dengeleyiciyi tanımasını sağlamak için Helm sürümüne bir parametre geçirmeniz gerekir. HTTPS sertifikalarının düzgün çalışması için, giriş denetleyicisi IP adresi için bir FQDN yapılandırmak üzere bir DNS etiketi kullanırsınız.

  1. komutuyla az aks show AKS kümesinin kaynak grubu adını alın.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
  2. komutunu kullanarak az network public-ip create statik ayırma yöntemiyle bir genel IP adresi oluşturun. Aşağıdaki örnek, önceki adımda elde edilen AKS kümesi kaynak grubunda myAKSPublicIP adlı bir genel IP adresi oluşturur.

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

Not

Alternatif olarak, AKS kümenizden ayrı olarak yönetebileceğiniz farklı bir kaynak grubunda bir IP adresi oluşturabilirsiniz. Farklı bir kaynak grubunda IP adresi oluşturursanız, aşağıdakilerin doğru olduğundan emin olun:

  • AKS kümesi tarafından kullanılan küme kimliği, ağ katkıda bulunanı gibi kaynak grubu için temsilci izinlerine sahiptir.
  • parametresini --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>" ekleyin. değerini, IP adresinin bulunduğu kaynak grubunun adıyla değiştirin <RESOURCE_GROUP> .
  1. parametresini --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>" ekleyin. DNS etiketi, giriş denetleyicisi ilk dağıtıldığında ayarlanabilir veya daha sonra yapılandırılabilir.

  2. parametresini --set controller.service.loadBalancerIP="<STATIC_IP>" ekleyin. Önceki adımda oluşturulan kendi genel IP adresinizi belirtin.

    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
    

Daha fazla bilgi için bkz . AKS yük dengeleyici ile statik genel IP adresi ve DNS etiketi kullanma.

Dinamik genel IP adresi kullanma

Oluşturma işleminden sonra giriş denetleyiciniz için bir Azure genel IP adresi oluşturulur. Genel IP adresi, giriş denetleyicinizin kullanım ömrü için statiktir. Giriş denetleyicinizi silerseniz genel IP adresi kalmaz. Yeni bir giriş denetleyicisi oluşturursanız, bu denetleyiciye yeni bir genel IP adresi atanır. Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır.

  • kubectl get service Giriş denetleyicinizin genel IP adresini almak için komutunu kullanın.

    # 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
    

DNS bölgenize A kaydı ekleme

Özel etki alanı kullanıyorsanız DNS bölgenize bir A kaydı eklemeniz gerekir. Özel etki alanı kullanmıyorsanız, genel IP adresini bir FQDN ile yapılandırabilirsiniz.

  • kullanarak az network dns record-set a add-recordNGINX hizmetinin dış IP adresiyle DNS bölgenize bir A kaydı ekleyin.

    az network dns record-set a add-record \
        --resource-group myResourceGroup \
        --zone-name MY_CUSTOM_DOMAIN \
        --record-set-name "*" \
        --ipv4-address MY_EXTERNAL_IP
    

Giriş denetleyiciniz için FQDN yapılandırma

İsteğe bağlı olarak, dns etiketi ayarlayarak özel bir etki alanı yerine giriş denetleyicisi IP adresi için bir FQDN yapılandırabilirsiniz. FQDN'niz şu formu izlemelidir: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com.

Önemli

DNS etiketinizin Azure konumunda benzersiz olması gerekir.

FQDN'nizi aşağıdaki yöntemlerden birini kullanarak yapılandırabilirsiniz:

  • Azure CLI veya Azure PowerShell kullanarak DNS etiketini ayarlayın.
  • Helm grafiği ayarlarını kullanarak DNS etiketini ayarlayın.

Daha fazla bilgi için bkz . Genel IP adresi DNS adı etiketleri.

Azure CLI veya Azure PowerShell kullanarak DNS etiketini ayarlama

değerini benzersiz DNS etiketinizle değiştirdiğinden <DNS_LABEL> emin olun.

# 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

Helm grafik ayarlarını kullanarak DNS etiketini ayarlama

Parametresini kullanarak --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name" Helm grafiği yapılandırmanıza bir ek açıklama ayarı geçirebilirsiniz. Bu parametre, giriş denetleyicisi ilk dağıtıldığında ayarlanabilir veya daha sonra yapılandırılabilir.

Aşağıdaki örnekte, denetleyici dağıtıldıktan sonra bu ayarın nasıl güncelleştirildiği gösterilmektedir. değerini benzersiz DNS etiketinizle değiştirdiğinden <DNS_LABEL> emin olun.

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 denetleyicisini yükleme

NGINX giriş denetleyicisi, TLS sonlandırmayı destekler. HTTPS için birçok farklı sertifika alma ve yapılandırma yöntemi vardır. Bu makalede, otomatik Lets Encrypt sertifika oluşturma ve yönetim işlevselliği sağlayan cert-manager kullanılır.

cert-manager denetleyicisini yüklemek için aşağıdaki komutları kullanın.

# 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

cert-manager yapılandırması hakkında daha fazla bilgi için cert-manager projesine bakın.

CA kümesi veren oluşturma

Sertifikaların düzenlenebilmesi için önce cert-manager aşağıdaki verenlerden birini gerektirir:

Daha fazla bilgi için cert-manager veren belgelerine bakın.

  1. Aşağıdaki örnek bildirimi kullanarak gibi cluster-issuer.yamlbir küme veren oluşturun. değerini kuruluşunuzdan geçerli bir adresle değiştirin MY_EMAIL_ADDRESS .

    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. komutunu kullanarak vereni kubectl apply uygulayın.

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

Giriş yollarınızı güncelleştirme

FQDN'nize veya özel etki alanınıza giden trafiği işlemek için giriş yollarınızı güncelleştirmeniz gerekir.

Aşağıdaki örnekte trafik şu şekilde yönlendirilir:

  • Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN aks-helloworld-one hizmetine yönlendirilir.
  • Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN/hello-world-two, aks-helloworld-two hizmetine yönlendirilir.
  • Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN/static, statik varlıklar için aks-helloworld-one adlı hizmete yönlendirilir.

Not

Özel etki alanı yerine giriş denetleyicisi IP adresi için bir FQDN yapılandırdıysanız hello-world-ingress yerine FQDN kullanın. MY_CUSTOM_DOMAIN.

Örneğin, FQDN'niz demo-aks-ingress.eastus.cloudapp.azure.com ise hello-world-ingress değerini değiştirin. içinde demo-aks-ingress.eastus.cloudapp.azure.com ile MY_CUSTOM_DOMAINhello-world-ingress.yaml.

  1. Aşağıdaki örnek YAML dosyasını kullanarak dosyayı oluşturun veya güncelleştirin hello-world-ingress.yaml . ve spec.rules.host değerini spec.tls.hosts önceki adımda oluşturduğunuz DNS adına güncelleştirin.

    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. komutunu kullanarak giriş kaynağını güncelleştirin kubectl apply .

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

Sertifika nesnesinin oluşturulduğunu doğrulama

Ardından, bir sertifika kaynağı oluşturulmalıdır. Sertifika kaynağı istenen X.509 sertifikasını tanımlar. Daha fazla bilgi için bkz . cert-manager sertifikaları.

Cert-manager, cert-manager ile v0.2.2'den sonra otomatik olarak dağıtılan ingress-shim kullanarak sizin için otomatik olarak bir sertifika nesnesi oluşturur. Daha fazla bilgi için giriş-dolgu belgelerine bakın.

Sertifikanın başarıyla oluşturulduğunu doğrulamak için komutunu kullanın ve READY değerinin kubectl get certificate --namespace ingress-basic True olduğunu doğrulayın. Çıkışın alınması birkaç dakika sürebilir.

kubectl get certificate --namespace ingress-basic

Aşağıdaki çıkışta sertifikanın durumu gösterilmektedir.

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

Giriş yapılandırmasını test etme

Hello-world-ress için bir web tarayıcısı açın. Kubernetes giriş denetleyicinizin FQDN'sini veya MY_CUSTOM_DOMAIN. Aşağıdakilerin doğru olduğundan emin olun:

  • HTTPS kullanmaya yönlendirilirsiniz.
  • Sertifika güvenilirdir.
  • Tanıtım uygulaması web tarayıcısında gösterilir.
  • Etki alanının sonuna /hello-world-two ekleyin ve özel başlıkla ikinci tanıtım uygulamasının gösterildiğinden emin olun.

Kaynakları temizleme

Bu makalede giriş bileşenlerini, sertifikalarını ve örnek uygulamaları yüklemek için Helm kullanılmıştır. Helm grafiği dağıttığınızda birçok Kubernetes kaynağı oluşturulur. Bu kaynaklar podları, dağıtımları ve hizmetleri içerir. Bu kaynakları temizlemek için örnek ad alanının tamamını veya tek tek kaynakları silebilirsiniz.

Örnek ad alanını ve tüm kaynakları silme

Örnek ad alanının silinmesi, ad alanı içindeki tüm kaynakları da siler.

  • komutunu kullanarak kubectl delete ve ad alanı adınızı belirterek örnek ad alanının tamamını silin.

    kubectl delete namespace ingress-basic
    

Kaynakları tek tek silme

Alternatif olarak, kaynağı tek tek silebilirsiniz.

  1. Küme veren kaynaklarını kaldırın.

    kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
    
  2. Helm sürümlerini komutuyla listeleyin helm list . Aşağıdaki örnek çıktıda gösterildiği gibi nginx ve cert-manager adlı grafikleri arayın.

    $ 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. komutunu kullanarak helm uninstall yayınları kaldırın. Aşağıdaki örnek NGINX girişi ve cert-manager dağıtımlarını kaldırır.

    $ helm uninstall cert-manager nginx --namespace ingress-basic
    
    release "cert-manager" uninstalled
    release "nginx" uninstalled
    
  4. İki örnek uygulamayı kaldırın.

    kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic
    kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
    
  5. Trafiği örnek uygulamalara yönlendiren giriş yolunu kaldırın.

    kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
    
  6. Kendi ad alanını silin. kubectl delete komutunu kullanın ve ad alanı adınızı belirtin.

    kubectl delete namespace ingress-basic
    

Sonraki adımlar

Bu makalede AKS'ye yönelik bazı dış bileşenler yer alır. Bu bileşenler hakkında daha fazla bilgi edinmek için aşağıdaki proje sayfalarına bakın:

Aşağıdakileri de yapabilirsiniz: