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.

Burada, yapılandırmak için ayarlayabileceğiniz özelliklere yönelik bir NginxIngressControllerbaşvuru bulabilirsiniz.

Özellik Açıklama
ingressClassName NGINX Giriş Denetleyicisi için kullanılan adı IngressClass . Belirtilmezse, varsayılan olarak öğesinin NginxIngressController adını kullanır.
controllerNamePrefix Yönetilen NGINX giriş denetleyicisi kaynaklarına ön ek eklemek için kullanılan ad. varsayılan değeridir nginx.
loadBalancerAnnotations Yük dengeleyici ek açıklamalarını ayarlayarak NGINX giriş denetleyicisinin hizmetinin davranışını denetlemek için bir dizi ek açıklama
Ölçekleme NGINX Giriş Denetleyicisinin ölçeklendirilmesi için yapılandırma seçenekleri.
scaling.minReplicas Giriş Denetleyicisi çoğaltmalarının sayısı için alt sınır. Varsayılan olarak 2 pod olur.
scaling.maxReplicas Giriş Denetleyicisi çoğaltmalarının sayısı için üst sınır. Varsayılan olarak 100 pod olur.
scaling.threshold NGINX Giriş Denetleyicisi podlarının iş yüküne göre ne kadar hızlı ölçeklendirilmesi gerektiğini tanımlar. Rapid Giriş Denetleyicisinin ani ve önemli trafik artışlarını işlemek için hızlı ve agresif bir şekilde ölçeklendirilmesi anlamına gelir. Steady daha az sayıda çoğaltmanın daha fazla işi işlemesiyle maliyet verimliliğini önceliklendirir. Balanced , çoğu kullanım örneğinde çalışan ikisi arasında iyi bir karışımdır. Belirtilmezse, bu alan varsayılan olarak olur Balanced.
defaultSSLCertificate Bu özellik tarafından başvurulan gizli dizi, varsayılan arka uç hizmetine erişirken kullanılacak varsayılan sertifikayı içerir. Bu özellik sağlanmazsa NGINX otomatik olarak imzalanan bir sertifika kullanır. tls: Bölüm girişte ayarlanmadıysa, NGINX varsayılan sertifikayı sağlar ancak HTTPS yeniden yönlendirmesini zorlamaz.
defaultSSLCertificate.forceSSLRedirect Bölüm belirtmeyen Girişler için yeniden tls: yönlendirmeyi zorlar.
defaultSSLCertificate.keyVaultURI Varsayılan SSL sertifikasının bulunabildiği Azure Key Vault URI'si. Eklentinin anahtar kasasını kullanacak şekilde yapılandırılması gerekir.
defaultSSLCertificate.secret Varsayılan SSL gizli dizisinin kümede olduğu adı ve ad alanını yapılandırılır.
defaultSSLCertificate.secret.name Gizli dizinin adı.
defaultSSLCertificate.secret.namespace Gizli dizinin ad alanı.

Ortak yapılandırmalar

Varsayılan NGINX giriş denetleyicisi yapılandırmasını denetleme (önizleme)

Not

Eklentiyi etkinleştirirken NGINX giriş denetleyicisi yapılandırmasını denetleme , Kubernetes sürüm 1.30 veya üzeri ile aks-preview Azure CLI uzantısı veya sonraki sürümlerinde 7.0.0b5 kullanılabilirAPI 2024-06-02-preview. AKS kümesi sürümünüzü denetlemek için bkz . Kullanılabilir AKS kümesi yükseltmelerini denetleme.

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.

Ayrıca, varsayılanın genel ip mi yoksa iç IP mi aldığını veya eklentiyi etkinleştirirken oluşturulup oluşturulmayabileceğini de denetleyebilirsiniz.

Olası yapılandırma seçenekleri şunlardır:

  • None: Varsayılan Nginx giriş denetleyicisi oluşturulmaz ve zaten varsa silinmez. Kullanıcılar, istenirse varsayılan NginxIngressController özel kaynağı el ile silmelidir.
  • Internal: Varsayılan Nginx giriş denetleyicisi bir iç yük dengeleyici ile oluşturulur. Özel kaynakta dış kaynak yapmak için yapılan tüm ek açıklamaların NginxIngressController üzerine yazılır.
  • External: Dış yük dengeleyici ile oluşturulan varsayılan Nginx giriş denetleyicisi. Özel kaynakta yapılan tüm ek açıklamaların NginxIngressController dahili hale getirilecek değişikliklerinin üzerine yazılır.
  • AnnotationControlled (varsayılan): Varsayılan Nginx giriş denetleyicisi bir dış yük dengeleyici ile oluşturulur. Kullanıcılar yük dengeleyici ek açıklamalarını yapılandırmak için varsayılan NginxIngressController özel kaynağı düzenleyebilir.

Kümeyi oluştururken varsayılan giriş denetleyicisi yapılandırmasını denetleme

Yeni bir kümede uygulama yönlendirmeyi az aks create etkinleştirmek için ve --app-routing-default-nginx-controller bayraklarını belirterek --enable-app-routing komutunu kullanın. öğesini <DefaultIngressControllerType> daha önce açıklanan yapılandırma seçeneklerinden birine ayarlamanız gerekir.

az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--app-routing-default-nginx-controller <DefaultIngressControllerType>

Mevcut bir kümede varsayılan giriş denetleyicisi yapılandırmasını güncelleştirme

Mevcut bir kümede uygulama yönlendirme varsayılan giriş denetleyicisi yapılandırmasını güncelleştirmek için bayrağını az aks approuting update--nginx belirterek komutunu kullanın. öğesini <DefaultIngressControllerType> daha önce açıklanan yapılandırma seçeneklerinden birine ayarlamanız gerekir.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --nginx <DefaultIngressControllerType>

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 birimsizdir ve saniyeler içinde olur. Varsayılan zaman aşımını geçersiz kılmak için, geçerli bir 120 saniyelik ara sunucu 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 yapılandırma, aynı etki alanı altında iki farklı web uygulamasına hizmet kullanabileceğ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.