Aracılığıyla paylaş


Uygulama yönlendirme eklentisiyle gelişmiş NGINX giriş denetleyicisi ve giriş yapılandırmaları

Uygulama yönlendirme eklentisi, giriş denetleyicilerini ve giriş nesnelerini yapılandırmanın iki yolunu destekler:

Önkoşullar

Uygulama yönlendirme eklentisine sahip bir AKS kümesi.

AKS kümenize bağlanma

Yerel bilgisayarınızdan Kubernetes kümesine bağlanmak için Kubernetes komut satırı istemcisini kullanırsınız kubectl. az aks install-cli komutunu kullanarak yerel olarak yükleyebilirsiniz. Azure Cloud Shell'i kullanıyorsanız kubectl zaten yüklüdür.

komutunu kullanarak kubectl'yi Kubernetes kümenize bağlanacak şekilde az aks get-credentials yapılandırın.

az aks get-credentials -resource-group <ResourceGroupName> --name <ClusterName>

NGINX giriş denetleyicisinin yapılandırması

Uygulama yönlendirme eklentisi, NGINX giriş denetleyicilerini yapılandırmak için adlı NginxIngressController bir Kubernetes özel kaynak tanımı (CRD) kullanır. Daha fazla giriş denetleyicisi oluşturabilir veya mevcut yapılandırmayı değiştirebilirsiniz.

NginxIngressControllerCRD, yük dengeleyici ek açıklamalarını ayarlayarak NGINX giriş denetleyicisinin hizmetinin davranışını denetlemeye yönelik bir loadBalancerAnnotations alana sahiptir.

Varsayılan NGINX giriş denetleyicisi

NGINX ile uygulama yönlendirme eklentisini etkinleştirdiğinizde, genel kullanıma yönelik Bir Azure yük dengeleyici ile yapılandırılmış içinde app-routing-namespace adlı default bir giriş denetleyicisi oluşturur. Bu giriş denetleyicisi giriş sınıfı adını webapprouting.kubernetes.azure.comkullanır.

Başka bir genel kullanıma yönelik NGINX giriş denetleyicisi oluşturma

Genel kullanıma yönelik Azure Load Balancer ile başka bir NGINX giriş denetleyicisi oluşturmak için:

  1. Aşağıdaki YAML bildirimini nginx-public-controller.yaml adlı yeni bir dosyaya kopyalayın ve dosyayı yerel bilgisayarınıza kaydedin.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. komutunu kullanarak kubectl apply NGINX giriş denetleyicisi kaynaklarını oluşturun.

    kubectl apply -f nginx-public-controller.yaml
    

    Aşağıdaki örnek çıktı, oluşturulan kaynağı gösterir:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-public created
    

Özel IP adresi olan bir iç NGINX giriş denetleyicisi oluşturma

Özel IP adresine sahip iç kullanıma yönelik Azure Load Balancer ile NGINX giriş denetleyicisi oluşturmak için:

  1. Aşağıdaki YAML bildirimini nginx-internal-controller.yaml adlı yeni bir dosyaya kopyalayın ve dosyayı yerel bilgisayarınıza kaydedin.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. komutunu kullanarak kubectl apply NGINX giriş denetleyicisi kaynaklarını oluşturun.

    kubectl apply -f nginx-internal-controller.yaml
    

    Aşağıdaki örnek çıktı, oluşturulan kaynağı gösterir:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    

Statik IP adresiyle NGINX giriş denetleyicisi oluşturma

Azure Load Balancer'da statik IP adresine sahip bir NGINX giriş denetleyicisi oluşturmak için:

  1. komutunu kullanarak az group create bir Azure kaynak grubu oluşturun.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. komutunu kullanarak az network public ip create statik bir genel IP adresi oluşturun.

    az network public-ip create \
        --resource-group myNetworkResourceGroup \
        --name myIngressPublicIP \
        --sku Standard \
        --allocation-method static
    

    Not

    AKS kümenizde Temel SKU yük dengeleyici kullanıyorsanız genel IP tanımlarken parametresi için --sku Basic kullanın. Yalnızca Temel SKU IP'leri Temel SKU yük dengeleyici ile ve yalnızca Standart SKU IP'leri Standart SKU yük dengeleyicilerle çalışır.

  3. AKS kümesi tarafından kullanılan küme kimliğinin komutunu kullanarak az role assignment create genel IP'nin kaynak grubuna temsilci izinleri olduğundan emin olun.

    Not

    VE'yi <ClusterResourceGroup> AKS kümenizin adı ve kaynak grubu adıyla güncelleştirin<ClusterName>.

    CLIENT_ID=$(az aks show --name <ClusterName> --resource-group <ClusterResourceGroup> --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name myNetworkResourceGroup --query id -o tsv)
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    
  4. Aşağıdaki YAML bildirimini nginx-staticip-controller.yaml adlı yeni bir dosyaya kopyalayın ve dosyayı yerel bilgisayarınıza kaydedin.

    Not

    Genel IP adı için veya service.beta.kubernetes.io/azure-pip-name örnek YAML'de gösterildiği gibi bir IPv4 adresi ve service.beta.kubernetes.io/azure-load-balancer-ipv6 bir IPv6 adresi için kullanabilirsinizservice.beta.kubernetes.io/azure-load-balancer-ipv4. Ek açıklamanın service.beta.kubernetes.io/azure-pip-name eklenmesi en verimli LoadBalancer oluşturma işlemini sağlar ve olası azaltmayı önlemek için kesinlikle önerilir.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-static
    spec:
      ingressClassName: nginx-static
      controllerNamePrefix: nginx-static
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-pip-name: "myIngressPublicIP"
        service.beta.kubernetes.io/azure-load-balancer-resource-group: "myNetworkResourceGroup"
    
  5. komutunu kullanarak kubectl apply NGINX giriş denetleyicisi kaynaklarını oluşturun.

    kubectl apply -f nginx-staticip-controller.yaml
    

    Aşağıdaki örnek çıktı, oluşturulan kaynağı gösterir:

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-static created
    

Giriş denetleyicisinin oluşturulduğunu doğrulayın

komutunu kullanarak kubectl get nginxingresscontroller NGINX giriş denetleyicisinin durumunu doğrulayabilirsiniz.

Not

'NginxIngressController' oluştururken kullandığınız adla güncelleştirin <IngressControllerName> .

kubectl get nginxingresscontroller -n <IngressControllerName>

Aşağıdaki örnek çıktı, oluşturulan kaynağı gösterir. Denetleyicinin kullanılabilir olması birkaç dakika sürebilir:

NAME           INGRESSCLASS   CONTROLLERNAMEPREFIX   AVAILABLE
nginx-public   nginx-public   nginx                  True

Sorunları gidermek için koşulları da görüntüleyebilirsiniz:

kubectl get nginxingresscontroller -n <IngressControllerName> -o jsonpath='{range .items[*].status.conditions[*]}{.lastTransitionTime}{"\t"}{.status}{"\t"}{.type}{"\t"}{.message}{"\n"}{end}'

Aşağıdaki örnek çıktı, iyi durumdaki bir giriş denetleyicisinin koşullarını gösterir:

2023-11-29T19:59:24Z    True    IngressClassReady       Ingress Class is up-to-date
2023-11-29T19:59:50Z    True    Available               Controller Deployment has minimum availability and IngressClass is up-to-date
2023-11-29T19:59:50Z    True    ControllerAvailable     Controller Deployment is available
2023-11-29T19:59:25Z    True    Progressing             Controller Deployment has successfully progressed

Giriş denetleyicisini girişte kullanma

  1. Aşağıdaki YAML bildirimini ingress.yaml adlı yeni bir dosyaya kopyalayın ve dosyayı yerel bilgisayarınıza kaydedin.

    Not

    DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: <IngressClassName>
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. komutunu kullanarak kubectl apply küme kaynaklarını oluşturun.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    Aşağıdaki örnek çıktı, oluşturulan kaynağı gösterir:

    ingress.networking.k8s.io/aks-helloworld created
    

Yönetilen Girişin oluşturulduğunu doğrulama

komutunu kullanarak yönetilen Girişin oluşturulduğunu kubectl get ingress doğrulayabilirsiniz.

kubectl get ingress -n hello-web-app-routing

Aşağıdaki örnek çıktıda, oluşturulan yönetilen Giriş gösterilmektedir. Giriş sınıfı, ana bilgisayar ve IP adresi farklı olabilir:

NAME             CLASS                                HOSTS               ADDRESS       PORTS     AGE
aks-helloworld   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

Giriş denetleyicilerini temizleme

komutunu kullanarak NGINX giriş denetleyicisini kubectl delete nginxingresscontroller kaldırabilirsiniz.

Not

öğesini oluştururken kullandığınız adla güncelleştirin <IngressControllerName> NginxIngressController.

kubectl delete nginxingresscontroller -n <IngressControllerName>

Ek açıklamalar aracılığıyla giriş kaynağı başına yapılandırma

NGINX giriş denetleyicisi, davranışlarını özelleştirmek için belirli Giriş nesnelerine ek açıklamalar eklemeyi destekler.

Alana ilgili ek açıklamayı ekleyerek giriş nesnesine metadata.annotations açıklama ekleyebilirsiniz.

Not

Ek açıklama anahtarları ve değerleri yalnızca dizeler olabilir. Boole veya sayısal değerler gibi diğer türler tırnak içine alınmalıdır; örneğin "true", , "false", "100".

Yaygın yapılandırmalar için bazı örnek ek açıklamalar aşağıda verilmiştir. Tam liste için NGINX giriş ek açıklamaları belgelerini gözden geçirin.

Özel maksimum gövde boyutu

NGINX için, bir istekteki boyut istemci istek gövdesinin izin verilen en büyük boyutunu aştığında istemciye 413 hatası döndürülür. Varsayılan değeri geçersiz kılmak için ek açıklamayı kullanın:

nginx.ingress.kubernetes.io/proxy-body-size: 4m

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 4m
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Özel bağlantı zaman aşımı

NGINX giriş denetleyicisinin iş yükünüzle bağlantıyı kapatmak için beklediği zaman aşımını değiştirebilirsiniz. Tüm zaman aşımı değerleri birimsiz ve saniyeler içindedir. Varsayılan zaman aşımını geçersiz kılmak için, geçerli bir 120 saniyelik proxy okuma zaman aşımı ayarlamak için aşağıdaki ek açıklamayı kullanın:

nginx.ingress.kubernetes.io/proxy-read-timeout: "120"

Diğer yapılandırma seçenekleri için özel zaman aşımlarını gözden geçirin.

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Arka uç protokolü

Varsayılan olarak NGINX giriş denetleyicisi hizmetlere ulaşmak için kullanır HTTP . veya GRPCgibi HTTPS alternatif arka uç protokollerini yapılandırmak için ek açıklamayı kullanın:

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

veya

nginx.ingress.kubernetes.io/backend-protocol: "GRPC"

Diğer yapılandırma seçenekleri için arka uç protokollerini gözden geçirin.

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

Çıkış Noktaları Arası Kaynak Paylaşma (CORS)

Giriş kuralında Çıkış Noktaları Arası Kaynak Paylaşımı'nı (CORS) etkinleştirmek için ek açıklamayı kullanın:

nginx.ingress.kubernetes.io/enable-cors: "true"

Diğer yapılandırma seçenekleri için CORS'yi etkinleştirme'yi gözden geçirin.

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

SSL yeniden yönlendirmesini devre dışı bırakma

Varsayılan olarak, TLS giriş için etkinleştirildiyse denetleyici (308) HTTPS'ye yönlendirir. Belirli giriş kaynakları için bu özelliği devre dışı bırakmak için ek açıklamayı kullanın:

nginx.ingress.kubernetes.io/ssl-redirect: "false"

Diğer yapılandırma seçenekleri için yeniden yönlendirme aracılığıyla sunucu tarafı HTTPS zorlamasını gözden geçirin.

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - backend:
          service:
            name: aks-helloworld
            port:
              number: 80
        path: /
        pathType: Prefix

URL yeniden yazma

Bazı senaryolarda, arka uç hizmetindeki kullanıma sunulan URL, Giriş kuralında belirtilen yoldan farklıdır. Yeniden yazma olmadan herhangi bir istek 404 döndürür. Bu, özellikle aynı etki alanı altında iki farklı web uygulamasına hizmet vereebileceğiniz yol tabanlı yönlendirmede kullanışlıdır. Ek açıklamayı kullanarak hizmet tarafından beklenen yolu ayarlayabilirsiniz:

nginx.ingress.kubernetes.io/rewrite-target": /$2

Aşağıda bu ek açıklamayı kullanan bir giriş yapılandırması örneği verilmişti:

Not

DNS ana bilgisayar adınızla güncelleştirin <Hostname> . <IngressClassName>, oluştururken tanımladığınızdırNginxIngressController.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: aks-helloworld
  namespace: hello-web-app-routing
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: <IngressClassName>
  rules:
  - host: <Hostname>
    http:
      paths:
      - path: /app-one(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-one
            port:
              number: 80
      - path: /app-two(/|$)(.*)
        pathType: Prefix 
        backend:
          service:
            name: app-two
            port:
              number: 80

Sonraki adımlar

Uygulamanızın performansını ve kullanımını analiz etme kapsamında Grafana'da Prometheus ile uygulama yönlendirme eklentisine dahil edilen giriş-nginx denetleyicisi ölçümlerini izleme hakkında bilgi edinin.