Použití protokolu TLS s kontrolerem příchozího přenosu dat ve službě Azure Kubernetes Service (AKS)
Protokol TLS (Transport Layer Security) používá certifikáty k zajištění zabezpečení komunikace, šifrování, ověřování a integrity. Použití protokolu TLS s kontrolerem příchozího přenosu dat v AKS umožňuje zabezpečit komunikaci mezi aplikacemi a využívat výhody kontroleru příchozího přenosu dat.
Můžete si přinést vlastní certifikáty a integrovat je s ovladačem CSI úložiště tajných kódů. Alternativně můžete použít nástroj cert-manager, který automaticky generuje a konfiguruje certifikáty Let's Encrypt . V clusteru AKS běží dvě aplikace, z nichž každá je přístupná přes jednu IP adresu.
Důležité
Doplněk Směrování aplikací se doporučuje pro příchozí přenos dat v AKS. Další informace najdete v tématu Spravované příchozí přenosy dat nginx s doplňkem směrování aplikace.
Důležité
Společnost Microsoft nespravuje ani nepodporuje nástroj cert-manager a žádné problémy vyplývající z jejího použití. Informace o problémech s nástrojem cert-manager najdete v dokumentaci k řešení potíží s nástrojem cert-manager.
Existují dva kontrolery příchozího přenosu dat open source pro Kubernetes založené na Nginx: jeden spravuje komunita Kubernetes (kubernetes/ingress-nginx) a jeden spravuje NGINX, Inc. (nginxinc/kubernetes-ingress). Tento článek používá kontroler příchozího přenosu dat komunity Kubernetes.
Než začnete
Tento článek předpokládá, že máte nastavený kontroler příchozího přenosu dat a aplikace. Pokud potřebujete kontroler příchozího přenosu dat nebo ukázkové aplikace, přečtěte si téma Vytvoření kontroleru příchozího přenosu dat.
Tento článek používá Helm 3 k instalaci kontroleru příchozího přenosu dat NGINX do podporované verze Kubernetes. Ujistěte se, že používáte nejnovější verzi Nástroje Helm a máte přístup k
ingress-nginx
úložištím ajetstack
úložištím Helm. Kroky popsané v tomto článku nemusí být kompatibilní s předchozími verzemi chartu Helm, kontrolerem příchozího přenosu dat NGINX nebo Kubernetes.- Další informace o konfiguraci a používání Nástroje Helm najdete v tématu Instalace aplikací pomocí Nástroje Helm v AKS. Pokyny k upgradu najdete v dokumentaci k instalaci Nástroje Helm.
Tento článek předpokládá, že máte existující cluster AKS s integrovanou službou Azure Container Registry (ACR). Další informace o vytvoření clusteru AKS s integrovaným ACR najdete v tématu Ověřování pomocí ACR z AKS.
Pokud používáte Azure CLI, musíte mít Azure CLI verze 2.0.64 nebo novější. Verzi zjistíte spuštěním příkazu
az --version
. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.Pokud používáte Azure PowerShell, musíte mít Azure PowerShell verze 5.9.0 nebo novější. Verzi zjistíte spuštěním příkazu
Get-InstalledModule -Name Az
. Pokud potřebujete provést instalaci nebo upgrade, přečtěte si téma Instalace Azure PowerShellu.
Použití protokolu TLS s vlastními certifikáty s ovladačem CSI úložiště tajných kódů
Pokud chcete používat protokol TLS s vlastními certifikáty s ovladačem CSI úložiště tajných kódů, potřebujete cluster AKS s nakonfigurovaným ovladačem CSI úložiště tajných klíčů a instancí služby Azure Key Vault.
Další informace najdete v tématu Nastavení ovladače CSI úložiště tajných kódů pro povolení kontroleru příchozího přenosu dat NGINX pomocí protokolu TLS.
Použití protokolu TLS s certifikáty Let's Encrypt
Pokud chcete používat protokol TLS s certifikáty Let's Encrypt , nasadíte cert-manager, který automaticky vygeneruje a konfiguruje certifikáty Let's Encrypt.
Import imagí správce certifikátů používaných chartem Helm do ACR
Slouží
az acr import
k importu následujících imagí do služby ACR.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
Poznámka:
Do služby ACR můžete také importovat grafy Helm. Další informace najdete v tématu Vložení a vyžádání chartů Helm do ACR.
Možnosti konfigurace kontroleru příchozího přenosu dat
Kontroler příchozího přenosu dat NGINX můžete nakonfigurovat pomocí statické veřejné IP adresy nebo dynamické veřejné IP adresy. Pokud používáte vlastní doménu, musíte do zóny DNS přidat záznam A. Pokud nepoužíváte vlastní doménu, můžete pro IP adresu kontroleru příchozího přenosu dat nakonfigurovat plně kvalifikovaný název domény (FQDN).
Vytvoření statické nebo dynamické veřejné IP adresy
Použití statické veřejné IP adresy
Kontroler příchozího přenosu dat můžete nakonfigurovat se statickou veřejnou IP adresou. Statická veřejná IP adresa zůstane, pokud odstraníte kontroler příchozího přenosu dat. IP adresa nezůstane , pokud odstraníte cluster AKS.
Při upgradu kontroleru příchozího přenosu dat musíte předat do verze Helm parametr, aby služba kontroleru příchozího přenosu dat věděla o nástroji pro vyrovnávání zatížení, který bude přidělen. Aby certifikáty HTTPS fungovaly správně, pomocí popisku DNS nakonfigurujete plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat.
Pomocí příkazu získejte název skupiny prostředků clusteru
az aks show
AKS.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
Pomocí příkazu vytvořte veřejnou IP adresu se statickou metodou
az network public-ip create
přidělování. Následující příklad vytvoří veřejnou IP adresu s názvem myAKSPublicIP ve skupině prostředků clusteru AKS získanou v předchozím kroku.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Poznámka:
Případně můžete vytvořit IP adresu v jiné skupině prostředků, kterou můžete spravovat odděleně od clusteru AKS. Pokud vytvoříte IP adresu v jiné skupině prostředků, ujistěte se, že platí následující:
- Identita clusteru používaná clusterem AKS má delegovaná oprávnění ke skupině prostředků, jako je přispěvatel sítě.
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
Přidejte parametr. Nahraďte<RESOURCE_GROUP>
názvem skupiny prostředků, ve které se nachází IP adresa.
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
Přidejte parametr. Popisek DNS lze nastavit buď při prvním nasazení kontroleru příchozího přenosu dat, nebo je možné ho nakonfigurovat později.--set controller.service.loadBalancerIP="<STATIC_IP>"
Přidejte parametr. Zadejte vlastní veřejnou IP adresu vytvořenou v předchozím kroku.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
Další informace najdete v tématu Použití statické veřejné IP adresy a popisku DNS s nástrojem pro vyrovnávání zatížení AKS.
Použití dynamické veřejné IP adresy
Při vytváření se pro kontroler příchozího přenosu dat vytvoří veřejná IP adresa Azure. Veřejná IP adresa je statická po dobu životnosti kontroleru příchozího přenosu dat. Pokud odstraníte kontroler příchozího přenosu dat, veřejná IP adresa nezůstane. Pokud vytvoříte nový kontroler příchozího přenosu dat, přiřadí se mu nová veřejná IP adresa. Výstup by měl vypadat podobně jako následující ukázkový výstup.
kubectl get service
Pomocí příkazu získejte veřejnou IP adresu kontroleru příchozího přenosu dat.# 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
Přidání záznamu A do zóny DNS
Pokud používáte vlastní doménu, musíte do zóny DNS přidat záznam A . Pokud nepoužíváte vlastní doménu, můžete veřejnou IP adresu nakonfigurovat pomocí plně kvalifikovaného názvu domény.
Přidejte do zóny DNS záznam A s externí IP adresou služby NGINX pomocí
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
Konfigurace plně kvalifikovaného názvu domény pro kontroler příchozího přenosu dat
Volitelně můžete nakonfigurovat plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat místo vlastní domény nastavením popisku DNS. Plně kvalifikovaný název domény by měl vypadat takto: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Důležité
Popisek DNS musí být jedinečný v rámci svého umístění Azure.
Plně kvalifikovaný název domény můžete nakonfigurovat pomocí jedné z následujících metod:
- Nastavte popisek DNS pomocí Azure CLI nebo Azure PowerShellu.
- Nastavte popisek DNS pomocí nastavení chartu Helm.
Další informace najdete v tématu Popisky názvů DNS veřejné IP adresy.
Nastavení popisku DNS pomocí Azure CLI nebo Azure PowerShellu
Nezapomeňte nahradit <DNS_LABEL>
jedinečným popiskem DNS.
# 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
Nastavení popisku DNS pomocí nastavení chartu Helm
Pomocí parametru můžete do konfigurace chartu --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
Helm předat nastavení poznámek. Tento parametr lze nastavit při prvním nasazení kontroleru příchozího přenosu dat nebo je možné ho později nakonfigurovat.
Následující příklad ukazuje, jak aktualizovat toto nastavení po nasazení kontroleru. Nezapomeňte nahradit <DNS_LABEL>
jedinečným popiskem DNS.
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
Instalace nástroje cert-manager
Kontroler příchozího přenosu dat NGINX podporuje ukončení protokolu TLS. Existuje několik způsobů, jak načíst a nakonfigurovat certifikáty pro protokol HTTPS. Tento článek používá nástroj cert-manager, který poskytuje automatické funkce generování a správy certifikátů Lets Encrypt .
K instalaci kontroleru cert-manager použijte následující příkazy.
# 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
Další informace o konfiguraci nástroje cert-manager naleznete v projektu cert-manager.
Vytvoření vystavitele clusteru certifikační autority
Před vystavením certifikátů vyžaduje cert-manager jeden z následujících vystavitelů:
- Vystavitel, který funguje v jednom oboru názvů.
- Prostředek ClusterIssuer , který funguje ve všech oborech názvů.
Další informace najdete v dokumentaci vystavitele nástroje cert-manager.
Vytvořte vystavitele clusteru, například
cluster-issuer.yaml
pomocí následujícího ukázkového manifestu. NahraďteMY_EMAIL_ADDRESS
platnou adresou vaší organizace.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
Použijte vystavitele pomocí
kubectl apply
příkazu.kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Aktualizace tras příchozího přenosu dat
Abyste mohli zpracovávat provoz do plně kvalifikovaného názvu domény nebo vlastní domény, musíte aktualizovat trasy příchozího přenosu dat.
V následujícím příkladu se provoz směruje takto:
- Přenosy do příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN se směruje do služby aks-helloworld-one .
- Přenosy do příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN/hello-world-two se směruje do služby aks-helloworld-two .
- Přenosy do příchozího přenosu dat hello-world. MY_CUSTOM_DOMAIN/static se směruje do služby s názvem aks-helloworld-one pro statické prostředky.
Poznámka:
Pokud jste nakonfigurovali plně kvalifikovaný název domény pro IP adresu kontroleru příchozího přenosu dat místo vlastní domény, použijte místo příchozího přenosu dat plně kvalifikovaný název domény. MY_CUSTOM_DOMAIN.
Pokud je například plně kvalifikovaný název domény demo-aks-ingress.eastus.cloudapp.azure.com, nahraďte hello-world-ingress. MY_CUSTOM_DOMAIN s demo-aks-ingress.eastus.cloudapp.azure.com v hello-world-ingress.yaml
.
Vytvořte nebo aktualizujte
hello-world-ingress.yaml
soubor pomocí následujícího příkladu souboru YAML.spec.tls.hosts
Aktualizujte název DNS,spec.rules.host
který jste vytvořili v předchozím kroku.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
Pomocí příkazu aktualizujte prostředek příchozího
kubectl apply
přenosu dat.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Ověření vytvoření objektu certifikátu
Dále se musí vytvořit prostředek certifikátu. Prostředek certifikátu definuje požadovaný certifikát X.509. Další informace najdete v tématu Certifikáty nástroje cert-manager.
Cert-manager automaticky vytvoří objekt certifikátu pro vás pomocí ingress-shim, který se automaticky nasadí s nástrojem cert-manager od verze 0.2.2. Další informace najdete v dokumentaci k příchozímu přenosu dat.
K ověření úspěšného vytvoření certifikátu použijte kubectl get certificate --namespace ingress-basic
příkaz a ověřte, že je připraveno true. Získání výstupu může trvat několik minut.
kubectl get certificate --namespace ingress-basic
Následující výstup ukazuje stav certifikátu.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
Testování konfigurace příchozího přenosu dat
Otevřete webový prohlížeč pro hello-world-ingress. MY_CUSTOM_DOMAIN nebo plně kvalifikovaný název domény kontroleru příchozího přenosu dat Kubernetes. Ujistěte se, že jsou splněné následující podmínky:
- Budete přesměrováni na používání protokolu HTTPS.
- Certifikát je důvěryhodný.
- Ukázková aplikace se zobrazí ve webovém prohlížeči.
- Na konec domény přidejte /hello-world-two a ujistěte se, že se zobrazí druhá ukázková aplikace s vlastním názvem.
Vyčištění prostředků
Tento článek použil Helm k instalaci komponent, certifikátů a ukázkových aplikací příchozího přenosu dat. Když nasadíte chart Helm, vytvoří se mnoho prostředků Kubernetes. Mezi tyto prostředky patří pody, nasazení a služby. Pokud chcete tyto prostředky vyčistit, můžete odstranit celý ukázkový obor názvů nebo jednotlivé prostředky.
Odstranění ukázkového oboru názvů a všech prostředků
Odstraněním ukázkového oboru názvů se odstraní také všechny prostředky v oboru názvů.
Pomocí příkazu odstraňte celý ukázkový obor názvů
kubectl delete
a zadejte název vašeho oboru názvů.kubectl delete namespace ingress-basic
Odstranění prostředků jednotlivě
Případně můžete prostředek odstranit jednotlivě.
Odeberte prostředky vystavitele clusteru.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Vypíše verzi Helmu pomocí
helm list
příkazu. Vyhledejte grafy s názvem nginx a cert-manager, jak je znázorněno v následujícím příkladu výstupu.$ 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
Odinstalujte vydané verze pomocí
helm uninstall
příkazu. Následující příklad odinstaluje příchozí přenos dat NGINX a nasazení nástroje cert-manager.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
Odeberte dvě ukázkové aplikace.
kubectl delete -f aks-helloworld-one.yaml --namespace ingress-basic kubectl delete -f aks-helloworld-two.yaml --namespace ingress-basic
Odeberte trasu příchozího přenosu dat, která směrovala provoz do ukázkových aplikací.
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
Odstraňte samotný obor názvů.
kubectl delete
Použijte příkaz a zadejte název oboru názvů.kubectl delete namespace ingress-basic
Další kroky
Tento článek obsahoval některé externí komponenty pro AKS. Další informace o těchto komponentách najdete na následujících stránkách projektu:
Můžete také: