Yönetilmeyen giriş denetleyicisi oluşturma
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 hizmetlerinde giriş kurallarını ve yolları yapılandırmak için Kubernetes giriş kaynakları kullanılır. Giriş denetleyicisi ve giriş kuralları kullandığınızda, trafiği Kubernetes kümesindeki birden fazla hizmete yönlendirmek için tek bir IP adresi kullanılır.
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ılır ve bunların her biri tek 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.
Not
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 makale Kubernetes topluluk giriş denetleyicisini kullanacaktı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ğrulaması yapma.
- Kubernetes API sistem durumu uç noktası,
healthz
Kubernetes v1.16'da kullanım dışı bırakıldı. Bunun yerine bu uç noktayı vereadyz
uç noktalarıylalivez
değiştirebilirsiniz. Senaryonuz için hangi uç noktanın kullanılacağını belirlemek için bkz . Sistem durumu için Kubernetes API uç noktaları. - 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 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 Az
komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse bkz. Azure PowerShell yükleme.
Temel yapılandırma
Varsayılanları özelleştirmeden temel bir NGINX giriş denetleyicisi oluşturmak için Helm'i kullanacaksınız. Aşağıdaki yapılandırma basitlik için varsayılan yapılandırmayı kullanır. Dağıtımı --set controller.replicaCount=3
özelleştirmek için gibi parametreler ekleyebilirsiniz.
Not
Kümenizdeki kapsayıcılara yönelik istekler için istemci kaynağı IP korumasını etkinleştirmek istiyorsanız Helm yükleme komutuna ekleyin--set controller.service.externalTrafficPolicy=Local
. İ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 olarak service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path
ayarlanıyor /healthz
. Bu, isteklerin /healthz
yanıt kodu değilse 200
giriş denetleyicisinin tamamının devre dışı olacağı anlamına gelir. Kendi senaryonuzda değeri diğer URI'lerde değiştirebilirsiniz. Bu bölümü silemez veya değerin ayarını kaldıramazsınız, aksi takdirde giriş denetleyicisi yine devre dışı kalır.
Kubernetes official tarafından sağlanan bu öğreticide kullanılan paketingress-nginx
, giriş kuralları tarafından üzerine yazılmadığı sürece kullanıcıların hızlı bir başlangıç yapmasına yönelik varsayılan arka uç olarak tasarlandığından, isteğinde /healthz
bulunursa her zaman yanıt kodunu döndürür200
.
Özelleştirilmiş yapılandırma
Yukarıdaki bölümde sunulan temel yapılandırmaya alternatif olarak, sonraki adım kümesi özelleştirilmiş giriş denetleyicisinin nasıl dağıtılacağını gösterir. İç statik IP adresi veya dinamik genel IP adresi kullanma seçeneğiniz vardır.
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 aktarmak istersiniz. 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 NGINX giriş denetleyicisini Linux tabanlı bir düğümde çalıştırmasını söylemek için --set nodeSelector
parametresi kullanılarak bir düğüm seçici belirtilir.
Daha fazla yedeklilik sağlamak için --set controller.replicaCount
parametresiyle iki NGINX giriş denetleyicisi çoğaltması dağıtılır. Giriş denetleyicisinin çalıştırma çoğaltmalarından tam olarak yararlanmak 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 istiyorsanız Helm yükleme komutuna ekleyin--set controller.service.externalTrafficPolicy=Local
. İ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, dinamik bir genel IP adresi atamasıyla bir NGINX giriş denetleyicisi oluşturulur. Yaygın bir yapılandırma gereksinimi iç, özel ağ ve IP adresi kullanmaktır. Bu yaklaşım, hizmetlerinize erişimi dış erişim olmadan iç kullanıcılarla kısıtlamanıza olanak tanır.
--set controller.service.loadBalancerIP
Giriş denetleyicinize bir iç IP adresi atamak için ve --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true
parametrelerini kullanın. Giriş denetleyicisiyle kullanmak 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=""
Yük dengeleyici hizmetini denetleme
kullanarak kubectl get services
yü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 hizmeti oluşturulduğunda, aşağıdaki örnek çıktıda gösterildiği gibi EXTERNAL-IP altında bir IP adresi atanır:
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. Bunun nedeni, sonraki bölümlerde gerçekleştirilen dış IP bağlantısını yine de ayarlamanız gerektiğidir.
Tanıtım uygulamalarını ç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 Hello world uygulamasının iki örneğini dağıtmak için kullanırsınızkubectl apply
.
Aşağıdaki örnek YAML'de bir
aks-helloworld-one.yaml
dosya 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-one
Aşağıdaki örnek YAML'de bir
aks-helloworld-two.yaml
dosya 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
kullanarak
kubectl apply
iki tanıtım uygulamasını ç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ş yolu 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-one
hizmete yönlendirilir. EXTERNAL_IP/hello-world-two trafiği hizmete yönlendiriliraks-helloworld-two
. EXTERNAL_IP/statik trafiği statik varlıklar için adlı aks-helloworld-one
hizmete yönlendirilir.
Adlı
hello-world-ingress.yaml
bir 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: 80
komutunu kullanarak
kubectl apply
giriş kaynağını oluşturun.kubectl apply -f hello-world-ingress.yaml --namespace ingress-basic
Giriş denetleyicisini 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üntülenir:
Ş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-basic
kullanarak
apt-get
pod'a yükleyincurl
.apt-get update && apt-get install -y curl
gibi kullanarak
curl
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.42
Adresle yol sağlanmadığından 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-two
Aş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ş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 tamamını silmek için komutunu kullanın kubectl delete
ve ad alanı adınızı belirtin. Ad alanı içindeki tüm kaynaklar silinir.
kubectl delete namespace ingress-basic
Kaynakları tek tek silme
Alternatif olarak, oluşturulan kaynakları tek tek silmek daha ayrıntılı bir yaklaşımdır.
Helm sürümlerini komutuyla listeleyin
helm list
.helm list --namespace ingress-basic
Aş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.1
komutuyla
helm uninstall
yayınları 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-basic
Trafiği örnek uygulamalara yönlendiren giriş yolunu kaldırın.
kubectl delete -f hello-world-ingress.yaml
komutunu kullanarak
kubectl delete
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 bkz . Giriş denetleyicisiyle TLS kullanma.
AKS kümenizi HTTP uygulama yönlendirmesini kullanacak şekilde yapılandırmak için bkz . HTTP uygulama yönlendirme eklentisini etkinleştirme.
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:
Yardım için bize ulaşın
Sorularınız veya yardıma ihtiyacınız varsa bir destek isteği oluşturun veya Azure topluluk desteği isteyin. Ürün geri bildirimini Azure geri bildirim topluluğuna da gönderebilirsiniz.