TLS használata bejövőforgalom-vezérlővel az Azure Kubernetes Service-ben (AKS)
A transport layer security (TLS) protokoll tanúsítványokkal biztosítja a kommunikáció, a titkosítás, a hitelesítés és az integritás biztonságát. A TLS és az AKS bejövőforgalom-vezérlővel való használata lehetővé teszi az alkalmazások közötti kommunikáció biztonságossá tételét, és élvezheti a bejövőforgalom-vezérlő előnyeit.
Saját tanúsítványokat hozhat, és integrálhatja őket a Titkos kulcstár CSI-illesztőprogramjával. Másik lehetőségként használhatja a cert-managert, amely automatikusan létrehozza és konfigurálja a Let's Encrypt tanúsítványokat. Két alkalmazás fut az AKS-fürtben, 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.
Fontos
A Microsoft nem kezeli vagy támogatja a tanúsítványkezelőt és a használatából eredő problémákat. A cert-managerrel kapcsolatos problémákért tekintse meg a cert-manager hibaelhárítási dokumentációját .
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 használja.
Mielőtt elkezdené
Ez a cikk feltételezi, hogy be van állítva egy bejövőforgalom-vezérlő és alkalmazások. Ha bejövőforgalom-vezérlőre vagy példaalkalmazásra van szüksége, olvassa el a Bejövőforgalom-vezérlő létrehozása című témakört.
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 a
ingress-nginx
Helm-adattárakhozjetstack
. 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.- A Helm konfigurálásával és használatával kapcsolatos további információkért lásd : Alkalmazások telepítése a Helmrel az AKS-ben. A frissítési utasításokért tekintse meg a Helm telepítési dokumentációját.
Ez a cikk feltételezi, hogy rendelkezik egy meglévő AKS-fürttel egy integrált Azure Container Registryvel (ACR). Az AKS-fürt integrált ACR-sel való létrehozásáról további információt az AKS hitelesítése az AKS-ből című témakörben talál.
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.
A TLS használata saját tanúsítványokkal a Titkos kulcstár CSI-illesztőprogramjával
Ha saját tanúsítványokkal rendelkező TLS-t szeretne használni a Titkos kulcstár CSI-illesztőprogramjával, szüksége van egy AKS-fürtre, amelyen konfigurálva van a Titkos kulcstár CSI-illesztőprogramja és egy Azure Key Vault-példány.
További információ: Titkos kulcstár CSI-illesztőprogram beállítása az NGINX bejövőforgalom-vezérlő TLS-lel való engedélyezéséhez.
TLS használata Let's Encrypt tanúsítványokkal
Ha tLS-t szeretne használni Let's Encrypt-tanúsítványokkal, a tanúsítványkezelőt fogja üzembe helyezni, amely automatikusan létrehozza és konfigurálja a Let's Encrypt tanúsítványokat.
Importálja a Helm-diagram által használt tanúsítványkezelő lemezképeket az ACR-be
A
az acr import
következő képek importálása az ACR-be.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
Feljegyzés
Helm-diagramokat is importálhat az ACR-be. További információ: Helm-diagramok leküldése és lekérése egy ACR-be.
Bejövőforgalom-vezérlő konfigurációs beállításai
Az NGINX bejövőforgalom-vezérlőt statikus nyilvános IP-címmel vagy dinamikus nyilvános IP-címmel konfigurálhatja. Ha egyéni tartományt használ, hozzá kell adnia egy A rekordot a DNS-zónához. Ha nem egyéni tartományt használ, konfigurálhat egy teljes tartománynevet (FQDN) a bejövő forgalomvezérlő IP-címéhez.
Statikus vagy dinamikus nyilvános IP-cím létrehozása
Statikus nyilvános IP-cím használata
A bejövőforgalom-vezérlőt statikus nyilvános IP-címmel konfigurálhatja. A statikus nyilvános IP-cím megmarad, ha törli a bejövőforgalom-vezérlőt. Az IP-cím nem marad meg, ha törli az AKS-fürtöt.
A bejövőforgalom-vezérlő frissítésekor egy paramétert kell átadnia a Helm-kiadásnak, hogy a bejövőforgalom-vezérlő szolgáltatás értesüljön a terheléselosztóról, amely hozzá lesz rendelve. Ahhoz, hogy a HTTPS-tanúsítványok megfelelően működjenek, egy DNS-címkével konfiguráljon egy teljes tartománynevet a bejövőforgalom-vezérlő IP-címéhez.
Kérje le az AKS-fürt erőforráscsoportjának nevét a
az aks show
paranccsal.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
Hozzon létre egy nyilvános IP-címet a statikus kiosztási módszerrel a
az network public-ip create
parancs használatával. Az alábbi példa létrehoz egy myAKSPublicIP nevű nyilvános IP-címet az előző lépésben beszerzett AKS-fürt erőforráscsoportjában.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Feljegyzés
Másik lehetőségként létrehozhat egy IP-címet egy másik erőforráscsoportban, amelyet az AKS-fürttől elkülönítve kezelhet. Ha egy másik erőforráscsoportban hoz létre IP-címet, győződjön meg arról, hogy a következők teljesülnek:
- Az AKS-fürt által használt fürtidentitás delegált engedélyekkel rendelkezik az erőforráscsoporthoz, például a hálózati közreműködőhöz.
- Adja hozzá a paramétert
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
. Cserélje le<RESOURCE_GROUP>
annak az erőforráscsoportnak a nevét, ahol az IP-cím található.
Adja hozzá a paramétert
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
. A DNS-címke beállítható a bejövőforgalom-vezérlő első üzembe helyezésekor, vagy később is konfigurálható.Adja hozzá a paramétert
--set controller.service.loadBalancerIP="<STATIC_IP>"
. Adja meg az előző lépésben létrehozott saját nyilvános IP-címét.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
További információ: Statikus nyilvános IP-cím és DNS-címke használata az AKS terheléselosztóval.
Dinamikus nyilvános IP-cím használata
Létrehozáskor létrejön egy Nyilvános Azure IP-cím a bejövőforgalom-vezérlőhöz. A nyilvános IP-cím statikus a bejövőforgalom-vezérlő élettartamához. A nyilvános IP-cím nem marad meg, ha törli a bejövőforgalom-vezérlőt. Ha új bejövőforgalom-vezérlőt hoz létre, az új nyilvános IP-cím lesz hozzárendelve. A kimenetnek az alábbi mintakimenethez hasonlóan kell kinéznie.
kubectl get service
A parancs használatával lekérheti a bejövőforgalom-vezérlő nyilvános IP-címét.# 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
A rekord hozzáadása a DNS-zónához
Ha egyéni tartományt használ, hozzá kell adnia egy A rekordot a DNS-zónához. Ha nem egyéni tartományt használ, a nyilvános IP-címet teljes tartománynévvel konfigurálhatja.
Adjon hozzá egy A rekordot a DNS-zónához az NGINX szolgáltatás külső IP-címével a használatával
az network dns record-set a add-record
.az network dns record-set a add-record \ --resource-group myResourceGroup \ --zone-name MY_CUSTOM_DOMAIN \ --record-set-name "*" \ --ipv4-address MY_EXTERNAL_IP
Teljes tartománynév konfigurálása a bejövőforgalom-vezérlőhöz
Igény szerint egy DNS-címke beállításával konfigurálhat egy teljes tartománynevet a bejövőforgalom-vezérlő IP-címéhez egyéni tartomány helyett. A teljes tartománynévnek a következő űrlapot kell követnie: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Fontos
A DNS-címkének egyedinek kell lennie az Azure-helyén belül.
A teljes tartománynevet az alábbi módszerek egyikével konfigurálhatja:
- Állítsa be a DNS-címkét az Azure CLI vagy az Azure PowerShell használatával.
- Állítsa be a DNS-címkét a Helm-diagram beállításaival.
További információ: Nyilvános IP-cím DNS-névfeliratai.
A DNS-címke beállítása az Azure CLI vagy az Azure PowerShell használatával
Mindenképpen cserélje le <DNS_LABEL>
az egyedi DNS-címkét.
# 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
A DNS-címke beállítása Helm-diagrambeállítások használatával
A paraméterrel --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
széljegyzetbeállítást adhat át a Helm-diagram konfigurációjának. Ez a paraméter beállítható a bejövőforgalom-vezérlő első üzembe helyezésekor, vagy később is konfigurálható.
Az alábbi példa bemutatja, hogyan frissítheti ezt a beállítást a vezérlő üzembe helyezése után. Mindenképpen cserélje le <DNS_LABEL>
az egyedi DNS-címkét.
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
Tanúsítványkezelő telepítése
A NGINX bejövő vezérlő támogatja a TLS-megszakítást. A HTTPS-tanúsítványok lekérésének és konfigurálásának számos módja van. Ez a cikk a tanúsítványkezelőt használja, amely automatikusan lehetővé teszi a tanúsítványok létrehozásának és kezelésének titkosítását.
A cert-manager vezérlő telepítéséhez használja az alábbi parancsokat.
# 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
A cert-manager konfigurációjáról további információt a cert-manager projektben talál.
Ca-fürtkibocsátó létrehozása
A tanúsítványok kiállítása előtt a tanúsítványkezelőnek az alábbi kiállítók egyikére van szüksége:
- Egy kiállító, amely egyetlen névtérben működik.
- Egy ClusterIssuer-erőforrás , amely minden névtérben működik.
További információkért tekintse meg a tanúsítványkezelő kiállítójának dokumentációját.
Hozzon létre egy fürtkibocsátót, például
cluster-issuer.yaml
az alábbi példajegyzék használatával. Cserélje leMY_EMAIL_ADDRESS
a szervezet érvényes címére.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
Alkalmazza a kiállítót a
kubectl apply
parancs használatával.kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Bejövő útvonalak frissítése
Frissítenie kell a bejövő útvonalakat a teljes tartományba vagy egyéni tartományba történő forgalom kezeléséhez.
A következő példában a forgalom a következőképpen van irányítva:
- Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN az aks-helloworld-one szolgáltatáshoz van irányítva.
- Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN/hello-world-two az aks-helloworld-two szolgáltatáshoz van irányítva.
- Forgalom a hello-world-ingress felé. MY_CUSTOM_DOMAIN/static a statikus objektumok aks-helloworld-one nevű szolgáltatáshoz vannak irányítva.
Feljegyzés
Ha egyéni tartomány helyett a bejövőforgalom-vezérlő IP-címéhez konfigurált teljes tartománynevet, használja a teljes tartománynevet a hello-world bejövő forgalom helyett . MY_CUSTOM_DOMAIN.
Ha például a teljes tartománynév demo-aks-ingress.eastus.cloudapp.azure.com, cserélje le a hello-world bejövő forgalmat. MY_CUSTOM_DOMAIN demo-aks-ingress.eastus.cloudapp.azure.com behello-world-ingress.yaml
.
Hozza létre vagy frissítse a
hello-world-ingress.yaml
fájlt az alábbi YAML-fájllal. Frissítse azspec.tls.hosts
spec.rules.host
előző lépésben létrehozott DNS-nevet.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
Frissítse a bejövő erőforrást a
kubectl apply
paranccsal.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Tanúsítványobjektum létrehozásának ellenőrzése
Ezután létre kell hozni egy tanúsítványerőforrást. A tanúsítványerőforrás határozza meg a kívánt X.509-tanúsítványt. További információ: tanúsítványkezelői tanúsítványok.
A Tanúsítványkezelő automatikusan létrehoz egy tanúsítványobjektumot az ingress-shim használatával, amelyet a rendszer automatikusan üzembe helyez a cert-managerrel a 0.2.2-s verzió óta. További információkért tekintse meg az ingress-shim dokumentációját.
A tanúsítvány sikeres létrehozásának ellenőrzéséhez használja a kubectl get certificate --namespace ingress-basic
parancsot, és ellenőrizze, hogy a READY igaz-e. A kimenet lekérése több percig is eltarthat.
kubectl get certificate --namespace ingress-basic
Az alábbi kimenet a tanúsítvány állapotát mutatja.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
A bejövő forgalom konfigurációjának tesztelése
Nyisson meg egy webböngészőt a hello-world-ingress szolgáltatáshoz. MY_CUSTOM_DOMAIN vagy a Kubernetes bejövőforgalom-vezérlőjének teljes tartománynevét. Győződjön meg arról, hogy a következők teljesülnek:
- A rendszer átirányítja a HTTPS használatára.
- A tanúsítvány megbízható.
- A bemutató alkalmazás megjelenik a webböngészőben.
- Adja hozzá a /hello-world-two fájlt a tartomány végéhez, és győződjön meg arról, hogy megjelenik a második demóalkalmazás az egyéni címmel.
Az erőforrások eltávolítása
Ez a cikk a Helm használatával telepítette a bejövő összetevőket, tanúsítványokat és 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 mintanévtér törlése a névtérben lévő összes erőforrást is törli.
Törölje a teljes mintanévteret a
kubectl delete
parancs használatával, és adja meg a névtér nevét.kubectl delete namespace ingress-basic
Erőforrások törlése egyenként
Azt is megteheti, hogy egyenként törli az erőforrást.
Távolítsa el a fürtkibocsátó erőforrásait.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Sorolja fel a Helm-kiadásokat a
helm list
paranccsal. Keresse meg az nginx és a cert-manager nevű diagramokat az alábbi példakimenetben látható módon.$ 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
Távolítsa el a kiadásokat a
helm uninstall
paranccsal. Az alábbi példa eltávolítja az NGINX bejövő és a cert-manager üzemelő példányait.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
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 --namespace ingress-basic
Törölje saját névterét. Használja a
kubectl delete
parancsot, és adja meg a névtér nevét.kubectl delete namespace ingress-basic
Következő lépések
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:
További lehetőségek: