Nem felügyelt bejövőforgalom-vezérlő létrehozása

A bejövőforgalom-vezérlő olyan szoftver, amely fordított proxyt, konfigurálható forgalomirányítást és TLS-megszakítást biztosít a Kubernetes-szolgáltatásokhoz. A Kubernetes bemeneti erőforrásainak használatával konfigurálhatók az egyes Kubernetes-szolgáltatásokhoz tartozó bejövő szabályok és útvonalak. Bemeneti vezérlő és bemeneti szabályok használatával a forgalom egyetlen IP-címmel irányítható egy Kubernetes-fürt több szolgáltatásához.

Ez a cikk bemutatja, hogyan helyezheti üzembe az NGINX bejövőforgalom-vezérlőt egy Azure Kubernetes Service- (AKS-) fürtben. Ezután két alkalmazás fut az AKS-fürtön, 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.

Feljegyzés

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 fogja használni.

Mielőtt elkezdené

  • 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éssel rendelkezik a bejövő nginx Helm-adattárhoz. 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 integrált ACR-sel rendelkező AKS-fürtök létrehozásáról további információt az Azure Kubernetes Service-ből származó Azure Container Registry-hitelesítés című témakörben talál.
  • A Kubernetes API állapotvégpontja healthz elavult a Kubernetes 1.16-os verzióban. Ezt a végpontot lecserélheti a végpontokra és readyz a livez végpontokra. Tekintse meg a Kubernetes API állapotvégpontjait a forgatókönyvhöz használni kívánt végpont meghatározásához.
  • 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.

Alapszintű konfiguráció

Ha alapszintű NGINX bemeneti vezérlőt szeretne létrehozni az alapértelmezett beállítások testreszabása nélkül, használja a Helmt. Az alábbi konfiguráció az alapértelmezett konfigurációt használja az egyszerűség kedvéért. Az üzembe helyezés testreszabásához paramétereket adhat hozzá, például --set controller.replicaCount=3.

Feljegyzés

Ha engedélyezni szeretné az ügyfélforrás IP-címének megőrzését a fürt tárolóinak kéréseihez, vegye fel --set controller.service.externalTrafficPolicy=Local a Helm telepítési parancsát. Az ügyfél forrás IP-címét a kérelem fejlécében, az X-Forwarded-For területen tárolja a rendszer. Ha bejövő vezérlőt használ, és engedélyezve van az ügyfélforrás IP-címének megőrzése, a TLS-továbbítás nem fog működni.

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

Feljegyzés

Ebben az oktatóanyagban service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path a értékre /healthzvan állítva. Ez azt jelenti, hogy ha a kérések /healthz válaszkódja nem 200, a teljes bejövőforgalom-vezérlő leáll. Az értéket saját forgatókönyvében módosíthatja más URI-ra. Ezt a részt nem törölheti, és nem nyitható meg az érték, vagy a bejövőforgalom-vezérlő továbbra is leáll. Az oktatóanyagban használt csomagingress-nginx, amelyet a Kubernetes hivatalos biztosít, kérés esetén /healthzmindig válaszkódot ad vissza200, mivel alapértelmezett háttérrendszerként van kialakítva a felhasználók számára, hogy gyorsan elinduljanak, kivéve, ha a bejövőforgalom-szabályok felülírják.

Testreszabott konfiguráció

A fenti szakaszban bemutatott alapkonfiguráció alternatívaként a következő lépéskészlet bemutatja, hogyan helyezhet üzembe testreszabott bejövőforgalom-vezérlőt. Használhat belső statikus IP-címet, vagy dinamikus nyilvános IP-címet.

A Helm-diagram által használt képek importálása az ACR-be

A rendszerképverziók szabályozásához importálnia kell őket a saját Azure Container Registry-adatbázisába. Az NGINX bejövőforgalom-vezérlő Helm-diagramja három tárolórendszerképre támaszkodik. Ezeket az acr import a képeket importálhatja az ACR-be.

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

Feljegyzés

A tárolólemezképek ACR-be importálása mellett Helm-diagramokat is importálhat az ACR-be. További információ: Helm-diagramok leküldése és lekérése egy Azure Container Registrybe.

Bejövőforgalom-vezérlő létrehozása

A bejövőforgalom-vezérlő létrehozásához a Helm használatával telepítse az ingress-nginx elemet. A bejövőforgalom-vezérlőt Linux-csomóponton kell ütemezni. Windows Server-csomópontok nem futtathatják a bejövő forgalmi vezérlőt. A csomópont-választó --set nodeSelector paraméterrel történő meghatározása arra utasítja a Kubernetes ütemezőt, hogy az NGINX bejövő vezérlőt Linux-alapú csomóponton futtassa.

A magasabb szintű redundancia érdekében az NGINX bejövő forgalmi vezérlő két replikája van telepítve a --set controller.replicaCount paraméterrel. A bejövőforgalom-vezérlő replikáinak teljes kihasználása érdekében győződjön meg arról, hogy az AKS-fürtben több csomópont is található.

Az alábbi példa létrehoz egy Kubernetes-névteret az alapszintű bejövő erőforrásokhoz, és ezen a névtéren belül kíván működni. Szükség szerint adjon meg egy névteret a saját környezetéhez. Ha az AKS-fürt nincs engedélyezve a Kubernetes szerepköralapú hozzáférés-vezérlésében, adja hozzá --set rbac.create=false a Helm-parancsokhoz.

Feljegyzés

Ha engedélyezni szeretné az ügyfélforrás IP-címének megőrzését a fürt tárolóinak kéréseihez, vegye fel --set controller.service.externalTrafficPolicy=Local a Helm telepítési parancsát. Az ügyfél forrás IP-címét a kérelem fejlécében, az X-Forwarded-For területen tárolja a rendszer. Ha bejövő vezérlőt használ, és engedélyezve van az ügyfélforrás IP-címének megőrzése, a TLS-továbbítás nem fog működni.

# 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=""

Bejövőforgalom-vezérlő létrehozása belső IP-címmel

Alapértelmezés szerint egy NGINX bejövőforgalom-vezérlő dinamikus nyilvános IP-címhozzárendeléssel jön létre. Gyakori konfigurációs követelmény egy belső, privát hálózat és IP-cím használata. Ez a megközelítés lehetővé teszi, hogy külső hozzáférés nélkül korlátozza a szolgáltatásokhoz való hozzáférést a belső felhasználók számára.

Az és --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true a --set controller.service.loadBalancerIP paraméterek használatával rendeljen hozzá egy belső IP-címet a bejövőforgalom-vezérlőhöz. Adja meg saját belső IP-címét a bejövőforgalom-vezérlővel való használathoz. Győződjön meg arról, hogy ez az IP-cím még nincs használatban a virtuális hálózaton belül. Ha meglévő virtuális hálózatot és alhálózatot használ, konfigurálnia kell az AKS-fürtöt a megfelelő engedélyekkel a virtuális hálózat és az alhálózat kezeléséhez. További információ: Kubenet-hálózatkezelés használata saját IP-címtartományokkal az Azure Kubernetes Service-ben (AKS) vagy Az Azure CNI-hálózatkezelés konfigurálása az Azure Kubernetes Service-ben (AKS).

# 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="" 

A terheléselosztó szolgáltatás ellenőrzése

Ellenőrizze a terheléselosztó szolgáltatást a következő használatával kubectl get services: .

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

Amikor létrejön a Kubernetes terheléselosztó szolgáltatása az NGINX bejövőforgalom-vezérlőhöz, a külső IP-cím alatt egy IP-cím lesz hozzárendelve, ahogyan az alábbi példakimenetben látható:

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

Ha ebben a szakaszban a külső IP-címet böngészi, megjelenik egy 404 oldal. Ennek az az oka, hogy továbbra is be kell állítania a külső IP-címhez való kapcsolatot, amely a következő szakaszokban történik.

Bemutatóalkalmazások futtatása

A bejövőforgalom-vezérlő működés közbeni megtekintéséhez futtasson két bemutató alkalmazást az AKS-fürtön. Ebben a példában egy egyszerű Hello világalkalmazás két példányát fogja kubectl apply üzembe helyezni.

  1. Hozzon létre egy aks-helloworld-one.yaml fájlt, és másolja a következő YAML-példában:

    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. Hozzon létre egy aks-helloworld-two.yaml fájlt, és másolja a következő YAML-példában:

    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. Futtassa a két bemutató alkalmazást a következővel kubectl apply:

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

Bejövő útvonal létrehozása

Mindkét alkalmazás fut a Kubernetes-fürtön. A forgalom minden alkalmazáshoz való átirányításához hozzon létre egy Kubernetes bejövő erőforrást. A bejövő erőforrás konfigurálja azokat a szabályokat, amelyek a forgalmat a két alkalmazás egyikéhez irányítják.

Az alábbi példában a EXTERNAL_IP/hello-world-one felé történő forgalom a névvel ellátott aks-helloworld-oneszolgáltatáshoz lesz irányítva. A EXTERNAL_IP/hello-world-two felé történő forgalom a aks-helloworld-two szolgáltatáshoz lesz irányítva. A EXTERNAL_IP/statikus felé irányuló forgalom a statikus eszközökről elnevezett aks-helloworld-one szolgáltatáshoz lesz irányítva.

  1. Hozzon létre egy fájlt, hello-world-ingress.yaml és másolja a következő YAML-példában:

    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. Hozza létre a bejövő erőforrást a kubectl apply paranccsal.

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

A bejövőforgalom-vezérlő tesztelése

A bejövőforgalom-vezérlő útvonalainak teszteléséhez keresse meg a két alkalmazást. Nyisson meg egy webböngészőt az NGINX bejövőforgalom-vezérlő IP-címére, például EXTERNAL_IP. Az első bemutató alkalmazás megjelenik a webböngészőben, ahogy az alábbi példában is látható:

First app running behind the ingress controller

Most adja hozzá a /hello-world-two elérési utat az IP-címhez, például EXTERNAL_IP/hello-world-two. Megjelenik a második demóalkalmazás az egyéni címmel:

Second app running behind the ingress controller

Belső IP-cím tesztelése

  1. Hozzon létre egy teszt podot, és csatoljon hozzá egy terminál munkamenetet.

    kubectl run -it --rm aks-ingress-test --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --namespace ingress-basic
    
  2. Telepítés curl a podban a következő használatával apt-get: .

    apt-get update && apt-get install -y curl
    
  3. A Kubernetes bejövőforgalom-vezérlőjének címét például http://10.224.0.42a következő használatával curlérheti el: Adja meg a bejövőforgalom-vezérlő üzembe helyezésekor megadott saját belső IP-címet.

    curl -L http://10.224.0.42
    

    A cím nem adott meg elérési utat, ezért a bejövőforgalom-vezérlő alapértelmezés szerint az / útvonalra mutat. Az első demóalkalmazás a következő sűrített példakimenetben látható:

    <!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. Adja hozzá a /hello-world-two elérési utat a címhez, például http://10.224.0.42/hello-world-two.

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

    A második, egyéni címmel rendelkező bemutató alkalmazás lesz visszaadva, ahogy az a következő sűrített példakimenetben is látható:

    <!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>
    [...]
    

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

Ez a cikk a Helm használatával telepítette a bejövő összetevőket és a 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 teljes mintanévtér törléséhez használja a kubectl delete parancsot, és adja meg a névtér nevét. A névtérben lévő összes erőforrás törlődik.

kubectl delete namespace ingress-basic

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

Másik megoldásként részletesebb módszer az egyes létrehozott erőforrások törlése.

  1. Sorolja fel a Helm-kiadásokat a helm list paranccsal.

    helm list --namespace ingress-basic
    

    Keresse meg az ingress-nginx és aks-helloworld nevű diagramokat az alábbi példakimenetben látható módon:

    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. Távolítsa el a kiadásokat a helm uninstall paranccsal.

    helm uninstall ingress-nginx --namespace ingress-basic
    
  3. 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
    
  4. 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
    
  5. Törölje a névteret a kubectl delete parancs használatával, és adja meg a névtér nevét.

    kubectl delete namespace ingress-basic
    

Következő lépések

A TLS meglévő bemeneti összetevőkkel való konfigurálásához tekintse meg a TLS használata bejövőforgalom-vezérlővel című témakört.

Ha az AKS-fürtöt HTTP-alkalmazás-útválasztás használatára szeretné konfigurálni, olvassa el a HTTP-alkalmazás útválasztási bővítményének engedélyezése című témakört.

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: