Azure Kubernetes Service'te (AKS) giriş denetleyicisiyle TLS kullanma
Aktarım katmanı güvenliği (TLS) protokolü, iletişim, şifreleme, kimlik doğrulaması ve bütünlük için güvenlik sağlamak üzere sertifikaları kullanır. AKS'de bir giriş denetleyicisi ile TLS kullanmak, uygulamalarınız arasındaki iletişimin güvenliğini sağlamanızı ve giriş denetleyicisinin avantajlarını yaşamanızı sağlar.
Kendi sertifikalarınızı getirebilir ve Gizli Dizi Deposu CSI sürücüsüyle tümleştirebilirsiniz. Alternatif olarak, Let's Encrypt sertifikalarını otomatik olarak oluşturan ve yapılandıran cert-manager'ı kullanabilirsiniz. AKS kümesinde iki uygulama çalıştırılır ve bunların her birine tek bir 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.
Önemli
Microsoft , cert-manager'ı ve kullanımından kaynaklanan sorunları yönetmez veya desteklemez. cert-manager ile ilgili sorunlar için cert-manager sorun giderme belgelerine bakın.
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 makalede Kubernetes topluluk giriş denetleyicisi kullanılır.
Başlamadan önce
Bu makalede, bir giriş denetleyicisinin ve uygulamaların ayarlandığı varsayılır. Giriş denetleyicisine veya örnek uygulamalara ihtiyacınız varsa bkz . Giriş denetleyicisi oluşturma.
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 ve
jetstack
Helm depolarınaingress-nginx
erişiminiz olduğundan emin olun. Bu makalede açıklanan adımlar Helm grafiğinin, NGINX giriş denetleyicisinin veya Kubernetes'in önceki sürümleriyle uyumlu olmayabilir.- Helm'i yapılandırma ve kullanma hakkında daha fazla bilgi için bkz . AKS'de Helm ile uygulama yükleme. Yükseltme yönergeleri için helm yükleme belgelerine bakın.
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 . AKS'den ACR ile kimlik doğrulama.
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.
Gizli Dizi Deposu CSI Sürücüsü ile tls'i kendi sertifikalarınızla kullanma
TlS'yi Gizli Dizi Deposu CSI Sürücüsü ile kendi sertifikalarınızla kullanmak için Gizli Dizi Deposu CSI Sürücüsü yapılandırılmış bir AKS kümesine ve bir Azure Key Vault örneğine sahip olmanız gerekir.
Daha fazla bilgi için bkz . TLS ile NGINX Giriş Denetleyicisini etkinleştirmek için Gizli Dizi Deposu CSI Sürücüsünü ayarlama.
TlS'i Let's Encrypt sertifikalarıyla kullanma
TLS'yi Let's Encrypt sertifikalarıyla kullanmak için, otomatik olarak Let's Encrypt sertifikalarını oluşturan ve yapılandıran cert-manager'ı dağıtacaksınız.
Helm grafiği tarafından kullanılan cert-manager görüntülerini ACR'nize aktarma
Aşağıdaki görüntüleri ACR'nize aktarmak için kullanın
az acr import
.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
Not
Helm grafiklerini ACR'nize de aktarabilirsiniz. Daha fazla bilgi için bkz . Helm grafiklerini ACR'ye gönderme ve çekme.
Giriş denetleyicisi yapılandırma seçenekleri
NGINX giriş denetleyicinizi statik genel IP adresi veya dinamik genel IP adresi kullanarak yapılandırabilirsiniz. Özel etki alanı kullanıyorsanız DNS bölgenize bir A kaydı eklemeniz gerekir. Özel etki alanı kullanmıyorsanız, giriş denetleyicisi IP adresi için tam etki alanı adı (FQDN) yapılandırabilirsiniz.
Statik veya dinamik genel IP adresi oluşturma
Statik genel IP adresi kullanma
Giriş denetleyicinizi statik genel IP adresiyle yapılandırabilirsiniz. Giriş denetleyicinizi silerseniz statik genel IP adresi kalır. AKS kümenizi silerseniz IP adresi kalmaz.
Giriş denetleyicinizi yükselttiğinizde, giriş denetleyicisi hizmetinin ona ayrılacak yük dengeleyiciyi tanımasını sağlamak için Helm sürümüne bir parametre geçirmeniz gerekir. HTTPS sertifikalarının düzgün çalışması için, giriş denetleyicisi IP adresi için bir FQDN yapılandırmak üzere bir DNS etiketi kullanırsınız.
komutuyla
az aks show
AKS kümesinin kaynak grubu adını alın.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
komutunu kullanarak
az network public-ip create
statik ayırma yöntemiyle bir genel IP adresi oluşturun. Aşağıdaki örnek, önceki adımda elde edilen AKS kümesi kaynak grubunda myAKSPublicIP adlı bir genel IP adresi oluşturur.az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
Not
Alternatif olarak, AKS kümenizden ayrı olarak yönetebileceğiniz farklı bir kaynak grubunda bir IP adresi oluşturabilirsiniz. Farklı bir kaynak grubunda IP adresi oluşturursanız, aşağıdakilerin doğru olduğundan emin olun:
- AKS kümesi tarafından kullanılan küme kimliği, ağ katkıda bulunanı gibi kaynak grubu için temsilci izinlerine sahiptir.
- parametresini
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-resource-group"="<RESOURCE_GROUP>"
ekleyin. değerini, IP adresinin bulunduğu kaynak grubunun adıyla değiştirin<RESOURCE_GROUP>
.
parametresini
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="<DNS_LABEL>"
ekleyin. DNS etiketi, giriş denetleyicisi ilk dağıtıldığında ayarlanabilir veya daha sonra yapılandırılabilir.parametresini
--set controller.service.loadBalancerIP="<STATIC_IP>"
ekleyin. Önceki adımda oluşturulan kendi genel IP adresinizi belirtin.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
Daha fazla bilgi için bkz . AKS yük dengeleyici ile statik genel IP adresi ve DNS etiketi kullanma.
Dinamik genel IP adresi kullanma
Oluşturma işleminden sonra giriş denetleyiciniz için bir Azure genel IP adresi oluşturulur. Genel IP adresi, giriş denetleyicinizin kullanım ömrü için statiktir. Giriş denetleyicinizi silerseniz genel IP adresi kalmaz. Yeni bir giriş denetleyicisi oluşturursanız, bu denetleyiciye yeni bir genel IP adresi atanır. Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır.
kubectl get service
Giriş denetleyicinizin genel IP adresini almak için komutunu kullanın.# 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
DNS bölgenize A kaydı ekleme
Özel etki alanı kullanıyorsanız DNS bölgenize bir A kaydı eklemeniz gerekir. Özel etki alanı kullanmıyorsanız, genel IP adresini bir FQDN ile yapılandırabilirsiniz.
kullanarak
az network dns record-set a add-record
NGINX hizmetinin dış IP adresiyle DNS bölgenize bir A kaydı ekleyin.az network dns record-set a add-record \ --resource-group myResourceGroup \ --zone-name MY_CUSTOM_DOMAIN \ --record-set-name "*" \ --ipv4-address MY_EXTERNAL_IP
Giriş denetleyiciniz için FQDN yapılandırma
İsteğe bağlı olarak, dns etiketi ayarlayarak özel bir etki alanı yerine giriş denetleyicisi IP adresi için bir FQDN yapılandırabilirsiniz. FQDN'niz şu formu izlemelidir: <CUSTOM DNS LABEL>.<AZURE REGION NAME>.cloudapp.azure.com
.
Önemli
DNS etiketinizin Azure konumunda benzersiz olması gerekir.
FQDN'nizi aşağıdaki yöntemlerden birini kullanarak yapılandırabilirsiniz:
- Azure CLI veya Azure PowerShell kullanarak DNS etiketini ayarlayın.
- Helm grafiği ayarlarını kullanarak DNS etiketini ayarlayın.
Daha fazla bilgi için bkz . Genel IP adresi DNS adı etiketleri.
Azure CLI veya Azure PowerShell kullanarak DNS etiketini ayarlama
değerini benzersiz DNS etiketinizle değiştirdiğinden <DNS_LABEL>
emin olun.
# 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
Helm grafik ayarlarını kullanarak DNS etiketini ayarlama
Parametresini kullanarak --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"
Helm grafiği yapılandırmanıza bir ek açıklama ayarı geçirebilirsiniz. Bu parametre, giriş denetleyicisi ilk dağıtıldığında ayarlanabilir veya daha sonra yapılandırılabilir.
Aşağıdaki örnekte, denetleyici dağıtıldıktan sonra bu ayarın nasıl güncelleştirildiği gösterilmektedir. değerini benzersiz DNS etiketinizle değiştirdiğinden <DNS_LABEL>
emin olun.
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
cert-manager denetleyicisini yükleme
NGINX giriş denetleyicisi, TLS sonlandırmayı destekler. HTTPS için birçok farklı sertifika alma ve yapılandırma yöntemi vardır. Bu makalede, otomatik Lets Encrypt sertifika oluşturma ve yönetim işlevselliği sağlayan cert-manager kullanılır.
cert-manager denetleyicisini yüklemek için aşağıdaki komutları kullanın.
# 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
cert-manager yapılandırması hakkında daha fazla bilgi için cert-manager projesine bakın.
CA kümesi veren oluşturma
Sertifikaların düzenlenebilmesi için önce cert-manager aşağıdaki verenlerden birini gerektirir:
- Tek bir ad alanında çalışan Bir Veren.
- Tüm ad alanları arasında çalışan bir ClusterIssuer kaynağı.
Daha fazla bilgi için cert-manager veren belgelerine bakın.
Aşağıdaki örnek bildirimi kullanarak gibi
cluster-issuer.yaml
bir küme veren oluşturun. değerini kuruluşunuzdan geçerli bir adresle değiştirinMY_EMAIL_ADDRESS
.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
komutunu kullanarak vereni
kubectl apply
uygulayın.kubectl apply -f cluster-issuer.yaml --namespace ingress-basic
Giriş yollarınızı güncelleştirme
FQDN'nize veya özel etki alanınıza giden trafiği işlemek için giriş yollarınızı güncelleştirmeniz gerekir.
Aşağıdaki örnekte trafik şu şekilde yönlendirilir:
- Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN aks-helloworld-one hizmetine yönlendirilir.
- Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN/hello-world-two, aks-helloworld-two hizmetine yönlendirilir.
- Merhaba dünya girişine trafik. MY_CUSTOM_DOMAIN/static, statik varlıklar için aks-helloworld-one adlı hizmete yönlendirilir.
Not
Özel etki alanı yerine giriş denetleyicisi IP adresi için bir FQDN yapılandırdıysanız hello-world-ingress yerine FQDN kullanın. MY_CUSTOM_DOMAIN.
Örneğin, FQDN'niz demo-aks-ingress.eastus.cloudapp.azure.com ise hello-world-ingress değerini değiştirin. içinde demo-aks-ingress.eastus.cloudapp.azure.com ile MY_CUSTOM_DOMAINhello-world-ingress.yaml
.
Aşağıdaki örnek YAML dosyasını kullanarak dosyayı oluşturun veya güncelleştirin
hello-world-ingress.yaml
. vespec.rules.host
değerinispec.tls.hosts
önceki adımda oluşturduğunuz DNS adına güncelleştirin.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
komutunu kullanarak giriş kaynağını güncelleştirin
kubectl apply
.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Sertifika nesnesinin oluşturulduğunu doğrulama
Ardından, bir sertifika kaynağı oluşturulmalıdır. Sertifika kaynağı istenen X.509 sertifikasını tanımlar. Daha fazla bilgi için bkz . cert-manager sertifikaları.
Cert-manager, cert-manager ile v0.2.2'den sonra otomatik olarak dağıtılan ingress-shim kullanarak sizin için otomatik olarak bir sertifika nesnesi oluşturur. Daha fazla bilgi için giriş-dolgu belgelerine bakın.
Sertifikanın başarıyla oluşturulduğunu doğrulamak için komutunu kullanın ve READY değerinin kubectl get certificate --namespace ingress-basic
True olduğunu doğrulayın. Çıkışın alınması birkaç dakika sürebilir.
kubectl get certificate --namespace ingress-basic
Aşağıdaki çıkışta sertifikanın durumu gösterilmektedir.
NAME READY SECRET AGE
tls-secret True tls-secret 11m
Giriş yapılandırmasını test etme
Hello-world-ress için bir web tarayıcısı açın. Kubernetes giriş denetleyicinizin FQDN'sini veya MY_CUSTOM_DOMAIN. Aşağıdakilerin doğru olduğundan emin olun:
- HTTPS kullanmaya yönlendirilirsiniz.
- Sertifika güvenilirdir.
- Tanıtım uygulaması web tarayıcısında gösterilir.
- Etki alanının sonuna /hello-world-two ekleyin ve özel başlıkla ikinci tanıtım uygulamasının gösterildiğinden emin olun.
Kaynakları temizleme
Bu makalede giriş bileşenlerini, sertifikalarını 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 silinmesi, ad alanı içindeki tüm kaynakları da siler.
komutunu kullanarak
kubectl delete
ve ad alanı adınızı belirterek örnek ad alanının tamamını silin.kubectl delete namespace ingress-basic
Kaynakları tek tek silme
Alternatif olarak, kaynağı tek tek silebilirsiniz.
Küme veren kaynaklarını kaldırın.
kubectl delete -f cluster-issuer.yaml --namespace ingress-basic
Helm sürümlerini komutuyla listeleyin
helm list
. Aşağıdaki örnek çıktıda gösterildiği gibi nginx ve cert-manager adlı grafikleri arayın.$ 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
komutunu kullanarak
helm uninstall
yayınları kaldırın. Aşağıdaki örnek NGINX girişi ve cert-manager dağıtımlarını kaldırır.$ helm uninstall cert-manager nginx --namespace ingress-basic release "cert-manager" uninstalled release "nginx" uninstalled
İ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
Trafiği örnek uygulamalara yönlendiren giriş yolunu kaldırın.
kubectl delete -f hello-world-ingress.yaml --namespace ingress-basic
Kendi ad alanını silin.
kubectl delete
komutunu kullanın ve ad alanı adınızı belirtin.kubectl delete namespace ingress-basic
Sonraki adımlar
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:
Aşağıdakileri de yapabilirsiniz: