Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Özet
Giriş denetleyicisi, Kubernetes hizmetleri için ters ara sunucu, yapılandırılabilir trafik yönlendirme ve TLS sonlandırma sağlayan bir yazılım parçasıdır. Tek tek Kubernetes hizmetlerinin giriş kurallarını ve yollarını yapılandırmak için Kubernetes giriş kaynaklarını kullanın. Giriş denetleyicisi ve giriş kuralları kullandığınızda, trafiği bir Kubernetes kümesindeki birden çok hizmete yönlendirmek için tek bir IP adresi kullanabilirsiniz.
Bu makalede, NGINX giriş denetleyicisini bir Azure Kubernetes Service (AKS) kümesinde dağıtma adımları gösterilmektedir. Ardından AKS kümesinde iki uygulama çalıştırırsınız ve her uygulamaya tek IP adresi üzerinden erişilebilir.
Önemli
AKS'de giriş için Uygulama yönlendirme eklentisini kullanın. Daha fazla bilgi için Uygulama yönlendirme eklentisiyle yönetilen nginx Ingress bölümüne bakın.
Not
Kubernetes için iki açık kaynak giriş denetleyicisi NGINX'i temel alır: biri Kubernetes topluluğu (kubernetes/ingress-nginx) ve biri NGINX, Inc. (nginxinc/kubernetes-ingress) tarafından korunur. Bu makalede Kubernetes topluluk giriş denetleyicisi kullanılır.
Başlamadan önce
- 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 ingress-nginx Helm deposuna erişebildiğinizden emin olun. Bu makalede açıklanan adımlar Helm grafiğinin, NGINX giriş denetleyicisinin veya Kubernetes'in önceki sürümleriyle uyumlu olmayabilir.
- 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. Azure Kubernetes Service'ten Azure Container Registry ile kimlik doğrulama.
- Kubernetes API sistem durumu uç noktası,
healthzKubernetes v1.16'da kullanım dışı bırakıldı. Bunun yerine bu uç noktayılivezvereadyzuç noktalarıyla değiştirebilirsiniz. Senaryonuz için hangi uç noktanın kullanılacağını belirlemek üzere Kubernetes API uç noktaları için sağlık kısmına bakın. - 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 --versionkomutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekiyorsa bkz. [Azure CLI'yi yükleme][azure-cli-install]. - 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 Azkomutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse bkz. Azure PowerShell yükleme.
Temel giriş denetleyicisi yapılandırması
Varsayılanları özelleştirmeden temel bir NGINX giriş denetleyicisi oluşturmak için Helm'i kullanın. Aşağıdaki yapılandırma basitlik için varsayılan yapılandırmayı kullanır. Dağıtımı özelleştirmek için --set controller.replicaCount=3 gibi parametreler ekleyebilirsiniz.
Not
Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek üzere Helm yükleme komutuna --set controller.service.externalTrafficPolicy=Local ekleyin. İstemci kaynak IP'si, X-Forwarded-For altındaki istek üst bilgisinde depolanır. İstemci kaynağı IP koruması etkinleştirilmiş bir giriş denetleyicisi kullandığınızda TLS geçişi çalışmaz.
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
Not
Bu öğreticide service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path değerini /healthz olarak ayarlayın. Bu ayar, isteklerin /healthz yanıt kodunun 200 olmadığı durumunda, tüm giriş denetleyicisinin duracağı anlamına gelir. Senaryonuza uyacak şekilde değeri başka bir URI ile değiştirebilirsiniz. Bu bölümü silemez veya değerin ayarını kaldıramazsınız ya da giriş denetleyicisi durur.
ingress-nginxBu öğreticide kullanılan ve Kubernetes resmî tarafından sunulan paket, 200 için yapılan isteklerde her zaman bir /healthz yanıt kodu döndürür. Kullanıcıların hızla başlayabilmesi için bir varsayılan arka uç olarak tasarlanmıştır, bir giriş kuralı bunu değiştirmediği müddetçe.
Özelleştirilmiş giriş denetleyicisi yapılandırması
Önceki bölümde sunulan temel yapılandırmaya alternatif olarak, sonraki adım kümesi özelleştirilmiş giriş denetleyicisinin nasıl dağıtıldığını gösterir. İç statik IP adresi veya dinamik genel IP adresi kullanabilirsiniz.
Helm grafiği tarafından kullanılan görüntüleri ACR'nize aktarma
Görüntü sürümlerini denetlemek için bunları kendi Azure Container Registry'nize aktarın.
NGINX giriş denetleyicisi Helm grafiği üç kapsayıcı görüntüsüne dayanır. Bu görüntüleri ACR'nize aktarmak için kullanın az acr import .
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
Not
Kapsayıcı görüntülerini ACR'nize aktarmanın yanı sıra Helm grafiklerini de ACR'nize aktarabilirsiniz. Daha fazla bilgi için bkz . Helm grafiklerini Azure Container Registry'ye gönderme ve çekme.
Giriş denetleyicisi oluşturma
Giriş denetleyicisini oluşturmak için Helm'i kullanarak ingress-nginx'i yükleyin. Giriş denetleyicisinin bir Linux düğümünde zamanlanması gerekir. Giriş denetleyicisi, Windows Server düğümlerinde çalıştırılmamalıdır. Kubernetes zamanlayıcısına Linux tabanlı bir düğümde NGINX giriş denetleyicisini çalıştırmasını bildirmek için parametresini kullanarak --set nodeSelector bir düğüm seçici belirtin.
Ek yedeklilik sağlamak için --set controller.replicaCount parametresini kullanarak iki NGINX giriş denetleyicisi çoğaltmasını yerleştirin. Giriş denetleyicisinin kopyalarından tam faydalanmak için, AKS kümenizde birden fazla düğüm olduğundan emin olun.
Aşağıdaki örnek, giriş kaynakları için ingress-basic adlı bir Kubernetes ad alanı oluşturur ve bu ad alanı içinde çalışması amaçlanmıştır. Gerektiğinde kendi ortamınız için bir ad alanı belirtin. AKS kümeniz Kubernetes rol tabanlı erişim denetimi etkin değilse Helm komutlarına ekleyin --set rbac.create=false .
Not
Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek üzere Helm yükleme komutuna --set controller.service.externalTrafficPolicy=Local ekleyin. İstemci kaynak IP'si, X-Forwarded-For altındaki istek üst bilgisinde depolanır. İstemci kaynağı IP koruması etkinleştirilmiş bir giriş denetleyicisi kullandığınızda TLS geçişi çalışmaz.
# 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=""
İç IP adresi kullanarak giriş denetleyicisi oluşturma
Varsayılan olarak, NGINX giriş denetleyicisi dinamik bir genel IP adresi kullanır. Ancak iç, özel ağ ve IP adresi kullanmak isteyebilirsiniz. Bu yaklaşım, hizmetlerinize erişimi dış erişim olmadan yalnızca iç kullanıcılarla sınırlar.
--set controller.service.loadBalancerIP ve --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true parametrelerini kullanarak giriş denetleyicinize bir iç IP adresi atayın. Giriş denetleyicisi için kendi iç IP adresinizi belirtin. Bu IP adresinin sanal ağınızda zaten kullanımda olmadığından emin olun. Mevcut bir sanal ağ ve alt ağ kullanıyorsanız, AKS kümenizi sanal ağı ve alt ağı yönetmek için doğru izinlerle yapılandırmanız gerekir. Daha fazla bilgi için bkz. Azure Kubernetes Service'te (AKS) kendi IP adresi aralıklarınızla kubenet ağı kullanma veya Azure Kubernetes Service'te (AKS) Azure CNI ağını yapılandırma.
# 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=""
Giriş yük dengeleyici hizmetini denetleyin
kullanarak kubectl get servicesyük dengeleyici hizmetini denetleyin.
kubectl get services --namespace ingress-basic -o wide -w ingress-nginx-controller
NGINX giriş denetleyicisi için Kubernetes yük dengeleyici hizmetini oluşturduğunuzda, aşağıdaki örnek çıktıda gösterildiği gibi EXTERNAL-IP altında bir IP adresi atar:
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
Bu aşamada dış IP adresine göz atarsanız, 404 sayfasının görüntülendiğini görürsünüz. Bu yanıt, bağlantıyı sonraki bölümlerde dış IP'ye kurmanız gerektiği için görüntülenir.
Giriş testi için tanıtım uygulamaları çalıştırma
Giriş denetleyicisini çalışır durumda görmek için AKS kümenizde iki tanıtım uygulaması çalıştırın. Bu örnekte, basit bir kubectl apply uygulamasının iki örneğini dağıtmak için kullanın.
Aşağıdaki örnek YAML'de bir
aks-helloworld-one.yamldosya oluşturun ve kopyalayın: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-oneAşağıdaki örnek YAML'de bir
aks-helloworld-two.yamldosya oluşturun ve kopyalayın: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İki tanıtım uygulamasını
kubectl applykullanarak çalıştırın.kubectl apply -f aks-helloworld-one.yaml --namespace ingress-basic kubectl apply -f aks-helloworld-two.yaml --namespace ingress-basic
Giriş yönlendirme kuralları oluşturma
Her iki uygulama da artık Kubernetes kümenizde çalışıyor. Trafiği her uygulamaya yönlendirmek için bir Kubernetes giriş kaynağı oluşturun. Giriş kaynağı, trafiği iki uygulamadan birine yönlendiren kuralları yapılandırıyor.
Aşağıdaki örnekte, EXTERNAL_IP/hello-world-one trafiği adlı aks-helloworld-onehizmete yönlendirilir.
EXTERNAL_IP/hello-world-two adresine gelen trafik aks-helloworld-two hizmetine yönlendirilir.
EXTERNAL_IP/statik trafiği statik varlıklar için adlı aks-helloworld-one hizmete yönlendirilir.
Adlı
hello-world-ingress.yamlbir dosya oluşturun ve aşağıdaki YAML örneğinde kopyalayın: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: 80komutunu kullanarak
kubectl applygiriş kaynağını oluşturun.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Giriş denetleyicisi yönlendirmesini test etme
Giriş denetleyicisinin yollarını test etmek için iki uygulamaya göz atın. NGINX giriş denetleyicinizin IP adresine EXTERNAL_IP gibi bir web tarayıcısı açın. İlk tanıtım uygulaması, aşağıdaki örnekte gösterildiği gibi web tarayıcısında görünür:
Şimdi IP adresine /hello-world-two yolunu ekleyin, örneğin EXTERNAL_IP/hello-world-two. Özel başlığı olan ikinci tanıtım uygulaması görüntülenir:
İç IP adresini test edin
Bir test podu oluşturun ve buna bir terminal oturumu ekleyin.
kubectl run -it --rm aks-ingress-test --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --namespace ingress-basickullanarak
curlpod'a yükleyinapt-get.apt-get update && apt-get install -y curlGibi
curlkullanarak http://10.224.0.42Kubernetes giriş denetleyicinizin adresine erişin. Giriş denetleyicisini dağıttığınızda belirtilen kendi iç IP adresinizi belirtin.curl -L http://10.224.0.42Adresi içeren bir yol sağlamadığınız için giriş denetleyicisi varsayılan olarak / yolu kullanır. Aşağıdaki daraltılmış örnek çıktıda gösterildiği gibi ilk tanıtım uygulaması döndürülür:
<!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> [...]Adrese /hello-world-two yolunu ekleyin, örneğin http://10.224.0.42/hello-world-two.
curl -L -k http://10.224.0.42/hello-world-twoAşağıdaki daraltılmış örnek çıktıda gösterildiği gibi, özel başlığa sahip ikinci tanıtım uygulaması döndürülür:
<!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> [...]
Kaynakları temizleme
Bu makalede giriş bileşenlerini ve örnek uygulamaları yüklemek için Helm kullanılmıştır. Helm grafiği dağıttığınızda birçok Kubernetes kaynağı oluşturursunuz. Bu kaynaklar podları, dağıtımları ve hizmetleri içerir. Bu kaynakları temizlemek için örnek ad alanının tamamını silebilir veya tek tek kaynakları silebilirsiniz.
Örnek ad alanını ve tüm kaynakları silme
Örnek ad alanının tamamını silmek için komutunu kullanın kubectl delete ve ad alanı adınızı belirtin. Bu komut, ad alanı içindeki tüm kaynakları siler.
kubectl delete namespace ingress-basic
Kaynakları tek tek silme
Alternatif olarak, daha ayrıntılı bir yaklaşım için oluşturulan kaynakları tek tek silebilirsiniz.
helm listkomutunu kullanarak Helm sürümlerini listeleyin.helm list --namespace ingress-basicAşağıdaki örnek çıktıda gösterildiği gibi ingress-nginx ve aks-helloworld adlı grafikleri arayın:
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.1helm uninstallkomutunu kullanarak sürümleri kaldırın.helm uninstall ingress-nginx --namespace ingress-basicİ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-basicTrafiği örnek uygulamalara yönlendiren giriş yolunu kaldırın.
kubectl delete -f hello-world-ingress.yamlkubectl deletekomutunu kullanarak ve ad alanı adınızı belirterek ad alanını silin.kubectl delete namespace ingress-basic
Sonraki adımlar
TLS'yi mevcut giriş bileşenlerinizle yapılandırmak için Giriş kontrolcüsü ile TLS kullanma bölümüne bakın.
AKS kümenizi uygulama yönlendirmesini kullanacak şekilde yapılandırmak için bkz . Uygulama yönlendirme eklentisi.
Bu makale AKS'ye yönelik bazı dış bileşenleri içerir. Bu bileşenler hakkında daha fazla bilgi edinmek için aşağıdaki proje sayfalarına bakın: