Aracılığıyla paylaş


Yönetilmeyen giriş denetleyicisi oluşturma

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 hizmetlerinde giriş kurallarını ve yolları yapılandırmak için Kubernetes giriş kaynakları kullanılır. Giriş denetleyicisi ve giriş kuralları kullandığınızda, trafiği Kubernetes kümesindeki birden fazla hizmete yönlendirmek için tek bir IP adresi kullanılır.

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ılır ve bunların her biri tek 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.

Not

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 makale Kubernetes topluluk giriş denetleyicisini kullanacaktı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ğrulaması yapma.
  • Kubernetes API sistem durumu uç noktası, healthz Kubernetes v1.16'da kullanım dışı bırakıldı. Bunun yerine bu uç noktayı ve readyz uç noktalarıyla livez değiştirebilirsiniz. Senaryonuz için hangi uç noktanın kullanılacağını belirlemek için bkz . Sistem durumu için Kubernetes API uç noktaları.
  • 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.

Temel yapılandırma

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

Not

Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek istiyorsanız Helm yükleme komutuna ekleyin--set controller.service.externalTrafficPolicy=Local. İ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 olarak service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path ayarlanıyor /healthz. Bu, isteklerin /healthz yanıt kodu değilse 200giriş denetleyicisinin tamamının devre dışı olacağı anlamına gelir. Kendi senaryonuzda değeri diğer URI'lerde değiştirebilirsiniz. Bu bölümü silemez veya değerin ayarını kaldıramazsınız, aksi takdirde giriş denetleyicisi yine devre dışı kalır. Kubernetes official tarafından sağlanan bu öğreticide kullanılan paketingress-nginx, giriş kuralları tarafından üzerine yazılmadığı sürece kullanıcıların hızlı bir başlangıç yapmasına yönelik varsayılan arka uç olarak tasarlandığından, isteğinde /healthzbulunursa her zaman yanıt kodunu döndürür200.

Özelleştirilmiş yapılandırma

Yukarıdaki bölümde sunulan temel yapılandırmaya alternatif olarak, sonraki adım kümesi özelleştirilmiş giriş denetleyicisinin nasıl dağıtılacağını gösterir. İç statik IP adresi veya dinamik genel IP adresi kullanma seçeneğiniz vardır.

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 aktarmak istersiniz. 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 NGINX giriş denetleyicisini Linux tabanlı bir düğümde çalıştırmasını söylemek için --set nodeSelector parametresi kullanılarak bir düğüm seçici belirtilir.

Daha fazla yedeklilik sağlamak için --set controller.replicaCount parametresiyle iki NGINX giriş denetleyicisi çoğaltması dağıtılır. Giriş denetleyicisinin çalıştırma çoğaltmalarından tam olarak yararlanmak 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 istiyorsanız Helm yükleme komutuna ekleyin--set controller.service.externalTrafficPolicy=Local. İ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, dinamik bir genel IP adresi atamasıyla bir NGINX giriş denetleyicisi oluşturulur. Yaygın bir yapılandırma gereksinimi iç, özel ağ ve IP adresi kullanmaktır. Bu yaklaşım, hizmetlerinize erişimi dış erişim olmadan iç kullanıcılarla kısıtlamanıza olanak tanır.

--set controller.service.loadBalancerIP Giriş denetleyicinize bir iç IP adresi atamak için ve --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true parametrelerini kullanın. Giriş denetleyicisiyle kullanmak 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="" 

Yük dengeleyici hizmetini denetleme

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 hizmeti oluşturulduğunda, aşağıdaki örnek çıktıda gösterildiği gibi EXTERNAL-IP altında bir IP adresi atanır:

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. Bunun nedeni, sonraki bölümlerde gerçekleştirilen dış IP bağlantısını yine de ayarlamanız gerektiğidir.

Tanıtım uygulamalarını ç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 Hello world uygulamasının iki örneğini dağıtmak için kullanırsınızkubectl apply.

  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. kullanarak kubectl applyiki tanıtım uygulamasını ç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ş yolu 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 trafiği hizmete yönlendiriliraks-helloworld-two. 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ş denetleyicisini 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üntülenir:

First app running behind the ingress controller

Ş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:

Second app running behind the ingress controller

İç 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 apt-getpod'a yükleyincurl.

    apt-get update && apt-get install -y curl
    
  3. gibi kullanarak curlhttp://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
    

    Adresle yol sağlanmadığından 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ş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 tamamını silmek için komutunu kullanın kubectl delete ve ad alanı adınızı belirtin. Ad alanı içindeki tüm kaynaklar silinir.

kubectl delete namespace ingress-basic

Kaynakları tek tek silme

Alternatif olarak, oluşturulan kaynakları tek tek silmek daha ayrıntılı bir yaklaşımdır.

  1. Helm sürümlerini komutuyla listeleyin helm list .

    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. komutuyla helm uninstall yayınları 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. komutunu kullanarak kubectl delete 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 bkz . Giriş denetleyicisiyle TLS kullanma.

AKS kümenizi HTTP uygulama yönlendirmesini kullanacak şekilde yapılandırmak için bkz . HTTP uygulama yönlendirme eklentisini etkinleştirme.

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: