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 ésreadyz
alivez
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 /healthz
van á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 /healthz
mindig 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.
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
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
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-one
szolgá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.
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
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ó:
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:
Belső IP-cím tesztelése
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
Telepítés
curl
a podban a következő használatávalapt-get
: .apt-get update && apt-get install -y curl
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> [...]
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.
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
Távolítsa el a kiadásokat a
helm uninstall
paranccsal.helm uninstall ingress-nginx --namespace ingress-basic
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
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
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: