Yönetilmeyen giriş denetleyicisi oluşturma

Özet

Giriş denetleyicisi, Kubernetes hizmetleri için ters ara sunucu, yapılandırılabilir trafik yönlendirme ve TLS sonlandırma sağlayan bir yazılım parçasıdır. Tek tek Kubernetes hizmetlerinin giriş kurallarını ve yollarını yapılandırmak için Kubernetes giriş kaynaklarını kullanın. Giriş denetleyicisi ve giriş kuralları kullandığınızda, trafiği bir Kubernetes kümesindeki birden çok hizmete yönlendirmek için tek bir IP adresi kullanabilirsiniz.

Bu makalede, NGINX giriş denetleyicisini bir Azure Kubernetes Service (AKS) kümesinde dağıtma adımları gösterilmektedir. Ardından AKS kümesinde iki uygulama çalıştırırsınız ve her uygulamaya tek IP adresi üzerinden erişilebilir.

Önemli

AKS'de giriş için Uygulama yönlendirme eklentisini kullanın. Daha fazla bilgi için Uygulama yönlendirme eklentisiyle yönetilen nginx Ingress bölümüne bakın.

Not

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

Başlamadan önce

  • 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 ingress-nginx Helm deposuna erişebildiğinizden emin olun. Bu makalede açıklanan adımlar Helm grafiğinin, NGINX giriş denetleyicisinin veya Kubernetes'in önceki sürümleriyle uyumlu olmayabilir.
  • 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. Azure Kubernetes Service'ten Azure Container Registry ile kimlik doğrulama.
  • Kubernetes API sistem durumu uç noktası, healthzKubernetes v1.16'da kullanım dışı bırakıldı. Bunun yerine bu uç noktayı livez ve readyz uç noktalarıyla değiştirebilirsiniz. Senaryonuz için hangi uç noktanın kullanılacağını belirlemek üzere Kubernetes API uç noktaları için sağlık kısmına bakın.
  • 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 gerekiyorsa bkz. [Azure CLI'yi yükleme][azure-cli-install].
  • 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.

Temel giriş denetleyicisi yapılandırması

Varsayılanları özelleştirmeden temel bir NGINX giriş denetleyicisi oluşturmak için Helm'i kullanın. Aşağıdaki yapılandırma basitlik için varsayılan yapılandırmayı kullanır. Dağıtımı özelleştirmek için --set controller.replicaCount=3 gibi parametreler ekleyebilirsiniz.

Not

Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek üzere Helm yükleme komutuna --set controller.service.externalTrafficPolicy=Local ekleyin. İstemci kaynak IP'si, X-Forwarded-For altındaki istek üst bilgisinde depolanır. İstemci kaynağı IP koruması etkinleştirilmiş bir giriş denetleyicisi kullandığınızda TLS geçişi çalışmaz.

NAMESPACE=ingress-basic

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --create-namespace \
  --namespace $NAMESPACE \
  --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
  --set controller.service.externalTrafficPolicy=Local

Not

Bu öğreticide service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path değerini /healthz olarak ayarlayın. Bu ayar, isteklerin /healthz yanıt kodunun 200 olmadığı durumunda, tüm giriş denetleyicisinin duracağı anlamına gelir. Senaryonuza uyacak şekilde değeri başka bir URI ile değiştirebilirsiniz. Bu bölümü silemez veya değerin ayarını kaldıramazsınız ya da giriş denetleyicisi durur. ingress-nginxBu öğreticide kullanılan ve Kubernetes resmî tarafından sunulan paket, 200 için yapılan isteklerde her zaman bir /healthz yanıt kodu döndürür. Kullanıcıların hızla başlayabilmesi için bir varsayılan arka uç olarak tasarlanmıştır, bir giriş kuralı bunu değiştirmediği müddetçe.

Özelleştirilmiş giriş denetleyicisi yapılandırması

Önceki bölümde sunulan temel yapılandırmaya alternatif olarak, sonraki adım kümesi özelleştirilmiş giriş denetleyicisinin nasıl dağıtıldığını gösterir. İç statik IP adresi veya dinamik genel IP adresi kullanabilirsiniz.

Helm grafiği tarafından kullanılan görüntüleri ACR'nize aktarma

Görüntü sürümlerini denetlemek için bunları kendi Azure Container Registry'nize aktarın. NGINX giriş denetleyicisi Helm grafiği üç kapsayıcı görüntüsüne dayanır. Bu görüntüleri ACR'nize aktarmak için kullanın az acr import .

REGISTRY_NAME=<REGISTRY_NAME>
SOURCE_REGISTRY=registry.k8s.io
CONTROLLER_IMAGE=ingress-nginx/controller
CONTROLLER_TAG=v1.8.1
PATCH_IMAGE=ingress-nginx/kube-webhook-certgen
PATCH_TAG=v20230407
DEFAULTBACKEND_IMAGE=defaultbackend-amd64
DEFAULTBACKEND_TAG=1.5

az acr import --name $REGISTRY_NAME --source $SOURCE_REGISTRY/$CONTROLLER_IMAGE:$CONTROLLER_TAG --image $CONTROLLER_IMAGE:$CONTROLLER_TAG
az acr import --name $REGISTRY_NAME --source $SOURCE_REGISTRY/$PATCH_IMAGE:$PATCH_TAG --image $PATCH_IMAGE:$PATCH_TAG
az acr import --name $REGISTRY_NAME --source $SOURCE_REGISTRY/$DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG --image $DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG

Not

Kapsayıcı görüntülerini ACR'nize aktarmanın yanı sıra Helm grafiklerini de ACR'nize aktarabilirsiniz. Daha fazla bilgi için bkz . Helm grafiklerini Azure Container Registry'ye gönderme ve çekme.

Giriş denetleyicisi oluşturma

Giriş denetleyicisini oluşturmak için Helm'i kullanarak ingress-nginx'i yükleyin. Giriş denetleyicisinin bir Linux düğümünde zamanlanması gerekir. Giriş denetleyicisi, Windows Server düğümlerinde çalıştırılmamalıdır. Kubernetes zamanlayıcısına Linux tabanlı bir düğümde NGINX giriş denetleyicisini çalıştırmasını bildirmek için parametresini kullanarak --set nodeSelector bir düğüm seçici belirtin.

Ek yedeklilik sağlamak için --set controller.replicaCount parametresini kullanarak iki NGINX giriş denetleyicisi çoğaltmasını yerleştirin. Giriş denetleyicisinin kopyalarından tam faydalanmak için, AKS kümenizde birden fazla düğüm olduğundan emin olun.

Aşağıdaki örnek, giriş kaynakları için ingress-basic adlı bir Kubernetes ad alanı oluşturur ve bu ad alanı içinde çalışması amaçlanmıştır. Gerektiğinde kendi ortamınız için bir ad alanı belirtin. AKS kümeniz Kubernetes rol tabanlı erişim denetimi etkin değilse Helm komutlarına ekleyin --set rbac.create=false .

Not

Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek üzere Helm yükleme komutuna --set controller.service.externalTrafficPolicy=Local ekleyin. İstemci kaynak IP'si, X-Forwarded-For altındaki istek üst bilgisinde depolanır. İstemci kaynağı IP koruması etkinleştirilmiş bir giriş denetleyicisi kullandığınızda TLS geçişi çalışmaz.

# Add the ingress-nginx repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Set variable for ACR location to use for pulling images
ACR_LOGIN_SERVER=<REGISTRY_LOGIN_SERVER>

# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx \
    --version 4.7.1 \
    --namespace ingress-basic \
    --create-namespace \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.image.registry=$ACR_LOGIN_SERVER \
    --set controller.image.image=$CONTROLLER_IMAGE \
    --set controller.image.tag=$CONTROLLER_TAG \
    --set controller.image.digest="" \
    --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
    --set controller.service.externalTrafficPolicy=Local \
    --set controller.admissionWebhooks.patch.image.registry=$ACR_LOGIN_SERVER \
    --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \
    --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \
    --set controller.admissionWebhooks.patch.image.digest="" \
    --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
    --set defaultBackend.image.registry=$ACR_LOGIN_SERVER \
    --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \
    --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \
    --set defaultBackend.image.digest=""

İç IP adresi kullanarak giriş denetleyicisi oluşturma

Varsayılan olarak, NGINX giriş denetleyicisi dinamik bir genel IP adresi kullanır. Ancak iç, özel ağ ve IP adresi kullanmak isteyebilirsiniz. Bu yaklaşım, hizmetlerinize erişimi dış erişim olmadan yalnızca iç kullanıcılarla sınırlar.

--set controller.service.loadBalancerIP ve --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true parametrelerini kullanarak giriş denetleyicinize bir iç IP adresi atayın. Giriş denetleyicisi için kendi iç IP adresinizi belirtin. Bu IP adresinin sanal ağınızda zaten kullanımda olmadığından emin olun. Mevcut bir sanal ağ ve alt ağ kullanıyorsanız, AKS kümenizi sanal ağı ve alt ağı yönetmek için doğru izinlerle yapılandırmanız gerekir. Daha fazla bilgi için bkz. Azure Kubernetes Service'te (AKS) kendi IP adresi aralıklarınızla kubenet ağı kullanma veya Azure Kubernetes Service'te (AKS) Azure CNI ağını yapılandırma.

# Add the ingress-nginx repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Set variable for ACR location to use for pulling images
ACR_LOGIN_SERVER=<REGISTRY_LOGIN_SERVER>

# Use Helm to deploy an NGINX ingress controller
helm install ingress-nginx ingress-nginx/ingress-nginx \
    --version 4.7.1 \
    --namespace ingress-basic \
    --create-namespace \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.image.registry=$ACR_LOGIN_SERVER \
    --set controller.image.image=$CONTROLLER_IMAGE \
    --set controller.image.tag=$CONTROLLER_TAG \
    --set controller.image.digest="" \
    --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.service.loadBalancerIP=10.224.0.42 \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
    --set controller.admissionWebhooks.patch.image.registry=$ACR_LOGIN_SERVER \
    --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \
    --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \
    --set controller.admissionWebhooks.patch.image.digest="" \
    --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
    --set defaultBackend.image.registry=$ACR_LOGIN_SERVER \
    --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \
    --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \
    --set defaultBackend.image.digest="" 

Giriş yük dengeleyici hizmetini denetleyin

kullanarak kubectl get servicesyük dengeleyici hizmetini denetleyin.

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

NGINX giriş denetleyicisi için Kubernetes yük dengeleyici hizmetini oluşturduğunuzda, aşağıdaki örnek çıktıda gösterildiği gibi EXTERNAL-IP altında bir IP adresi atar:

NAME                       TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE   SELECTOR
ingress-nginx-controller   LoadBalancer   10.0.65.205   EXTERNAL-IP     80:30957/TCP,443:32414/TCP   1m   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx

Bu aşamada dış IP adresine göz atarsanız, 404 sayfasının görüntülendiğini görürsünüz. Bu yanıt, bağlantıyı sonraki bölümlerde dış IP'ye kurmanız gerektiği için görüntülenir.

Giriş testi için tanıtım uygulamaları çalıştırma

Giriş denetleyicisini çalışır durumda görmek için AKS kümenizde iki tanıtım uygulaması çalıştırın. Bu örnekte, basit bir kubectl apply uygulamasının iki örneğini dağıtmak için kullanın.

  1. Aşağıdaki örnek YAML'de bir aks-helloworld-one.yaml dosya oluşturun ve kopyalayın:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-one  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-one
      template:
        metadata:
          labels:
            app: aks-helloworld-one
        spec:
          containers:
          - name: aks-helloworld-one
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-one  
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-one
    
  2. Aşağıdaki örnek YAML'de bir aks-helloworld-two.yaml dosya oluşturun ve kopyalayın:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-two  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-two
      template:
        metadata:
          labels:
            app: aks-helloworld-two
        spec:
          containers:
          - name: aks-helloworld-two
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "AKS Ingress Demo"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-two  
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-two
    
  3. İki tanıtım uygulamasını kubectl apply kullanarak çalıştırın.

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

Giriş yönlendirme kuralları oluşturma

Her iki uygulama da artık Kubernetes kümenizde çalışıyor. Trafiği her uygulamaya yönlendirmek için bir Kubernetes giriş kaynağı oluşturun. Giriş kaynağı, trafiği iki uygulamadan birine yönlendiren kuralları yapılandırıyor.

Aşağıdaki örnekte, EXTERNAL_IP/hello-world-one trafiği adlı aks-helloworld-onehizmete yönlendirilir. EXTERNAL_IP/hello-world-two adresine gelen trafik aks-helloworld-two hizmetine yönlendirilir. EXTERNAL_IP/statik trafiği statik varlıklar için adlı aks-helloworld-one hizmete yönlendirilir.

  1. Adlı hello-world-ingress.yaml bir dosya oluşturun ve aşağıdaki YAML örneğinde kopyalayın:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-world-ingress
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/use-regex: "true"
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      ingressClassName: nginx
      rules:
      - 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
      rules:
      - http:
          paths:
          - path: /static(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: aks-helloworld-one
                port: 
                  number: 80
    
  2. komutunu kullanarak kubectl apply giriş kaynağını oluşturun.

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

Giriş denetleyicisi yönlendirmesini test etme

Giriş denetleyicisinin yollarını test etmek için iki uygulamaya göz atın. NGINX giriş denetleyicinizin IP adresine EXTERNAL_IP gibi bir web tarayıcısı açın. İlk tanıtım uygulaması, aşağıdaki örnekte gösterildiği gibi web tarayıcısında görünür:

AKS'de yönetilmeyen giriş denetleyicisinin arkasında çalışan ilk tanıtım uygulamasının ekran görüntüsü.

Şimdi IP adresine /hello-world-two yolunu ekleyin, örneğin EXTERNAL_IP/hello-world-two. Özel başlığı olan ikinci tanıtım uygulaması görüntülenir:

AKS'de yönetilmeyen giriş denetleyicisinin arkasında çalışan ikinci tanıtım uygulamasının ekran görüntüsü.

İç IP adresini test edin

  1. Bir test podu oluşturun ve buna bir terminal oturumu ekleyin.

    kubectl run -it --rm aks-ingress-test --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --namespace ingress-basic
    
  2. kullanarak curlpod'a yükleyinapt-get.

    apt-get update && apt-get install -y curl
    
  3. Gibi curlkullanarak http://10.224.0.42Kubernetes giriş denetleyicinizin adresine erişin. Giriş denetleyicisini dağıttığınızda belirtilen kendi iç IP adresinizi belirtin.

    curl -L http://10.224.0.42
    

    Adresi içeren bir yol sağlamadığınız için giriş denetleyicisi varsayılan olarak / yolu kullanır. Aşağıdaki daraltılmış örnek çıktıda gösterildiği gibi ilk tanıtım uygulaması döndürülür:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link rel="stylesheet" type="text/css" href="/static/default.css">
        <title>Welcome to Azure Kubernetes Service (AKS)</title>
    [...]
    
  4. Adrese /hello-world-two yolunu ekleyin, örneğin http://10.224.0.42/hello-world-two.

    curl -L -k http://10.224.0.42/hello-world-two
    

    Aşağıdaki daraltılmış örnek çıktıda gösterildiği gibi, özel başlığa sahip ikinci tanıtım uygulaması döndürülür:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link rel="stylesheet" type="text/css" href="/static/default.css">
        <title>AKS Ingress Demo</title>
    [...]
    

Kaynakları temizleme

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

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

Örnek ad alanının tamamını silmek için komutunu kullanın kubectl delete ve ad alanı adınızı belirtin. Bu komut, ad alanı içindeki tüm kaynakları siler.

kubectl delete namespace ingress-basic

Kaynakları tek tek silme

Alternatif olarak, daha ayrıntılı bir yaklaşım için oluşturulan kaynakları tek tek silebilirsiniz.

  1. helm list komutunu kullanarak Helm sürümlerini listeleyin.

    helm list --namespace ingress-basic
    

    Aşağıdaki örnek çıktıda gösterildiği gibi ingress-nginx ve aks-helloworld adlı grafikleri arayın:

    NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    ingress-nginx           ingress-basic   1               2020-01-06 19:55:46.358275 -0600 CST    deployed        nginx-ingress-1.27.1    0.26.1  
    
  2. helm uninstall komutunu kullanarak sürümleri kaldırın.

    helm uninstall ingress-nginx --namespace ingress-basic
    
  3. İ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
    
  4. Trafiği örnek uygulamalara yönlendiren giriş yolunu kaldırın.

    kubectl delete -f hello-world-ingress.yaml
    
  5. kubectl delete komutunu kullanarak ve ad alanı adınızı belirterek ad alanını silin.

    kubectl delete namespace ingress-basic
    

Sonraki adımlar

TLS'yi mevcut giriş bileşenlerinizle yapılandırmak için Giriş kontrolcüsü ile TLS kullanma bölümüne bakın.

AKS kümenizi uygulama yönlendirmesini kullanacak şekilde yapılandırmak için bkz . Uygulama yönlendirme eklentisi.

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