Bagikan melalui


Pengontrol ingress NGINX tingkat lanjut dan konfigurasi ingress dengan add-on perutean aplikasi

Add-on perutean aplikasi mendukung dua cara untuk mengonfigurasi pengontrol ingress dan objek ingress:

Prasyarat

Kluster AKS dengan add-on perutean aplikasi.

Menyambungkan ke kluster AKS Anda

Untuk menyambungkan ke kluster Kubernetes dari komputer lokal, Anda menggunakan kubectl, klien baris perintah Kubernetes. Anda dapat menginstalnya secara lokal menggunakan perintah az aks install-cli . Jika Anda menggunakan Azure Cloud Shell, kubectl sudah terpasang.

Konfigurasikan kubectl untuk terhubung ke kluster Kubernetes menggunakan az aks get-credentials perintah .

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

Konfigurasi pengontrol ingress NGINX

Add-on perutean aplikasi menggunakan definisi sumber daya kustom (CRD) Kubernetes yang dipanggil NginxIngressController untuk mengonfigurasi pengontrol ingress NGINX. Anda dapat membuat lebih banyak pengontrol ingress atau memodifikasi konfigurasi yang ada.

Berikut adalah referensi ke properti yang dapat Anda atur untuk mengonfigurasi NginxIngressController.

Properti Deskripsi
ingressClassName Nama IngressClass yang digunakan untuk Pengontrol Ingress NGINX. Default ke nama NginxIngressController jika tidak ditentukan.
controllerNamePrefix Nama yang digunakan untuk mengawali sumber daya pengontrol ingress NGINX terkelola. Default ke nginx.
loadBalancerAnnotations Sekumpulan anotasi untuk mengontrol perilaku layanan pengontrol ingress NGINX dengan mengatur anotasi load balancer
Scaling Opsi konfigurasi untuk bagaimana Pengontrol Ingress NGINX diskalakan.
scaling.minReplicas Batas bawah untuk jumlah replika Pengontrol Ingress. Ini default ke 2 pod.
scaling.maxReplicas Batas atas untuk jumlah replika Ingress Controller. Ini default ke 100 pod.
scaling.threshold Menentukan seberapa cepat pod Pengontrol Ingress NGINX harus diskalakan berdasarkan beban kerja. Rapid berarti Pengontrol Ingress menskalakan dengan cepat dan agresif untuk menangani lonjakan lalu lintas yang tiba-tiba dan signifikan. Steady memprioritaskan efektivitas biaya dengan lebih sedikit replika yang menangani lebih banyak pekerjaan. Balanced adalah campuran yang baik antara keduanya yang berfungsi untuk sebagian besar kasus penggunaan. Jika tidak ditentukan, bidang ini default ke Balanced.
defaultSSLCertificate Rahasia yang dimaksud oleh properti ini berisi sertifikat default yang akan digunakan saat mengakses layanan backend default. Jika properti ini tidak disediakan, NGINX menggunakan sertifikat yang ditandatangani sendiri. tls: Jika bagian tidak diatur pada Ingress, NGINX menyediakan sertifikat default tetapi tidak akan memaksa pengalihan HTTPS.
defaultSSLCertificate.forceSSLRedirect Memaksa pengalihan untuk Ingresses yang tidak menentukan tls: bagian.
defaultSSLCertificate.keyVaultURI URI Azure Key Vault tempat sertifikat SSL default dapat ditemukan. Add-on perlu dikonfigurasi untuk menggunakan brankas kunci.
defaultSSLCertificate.secret Mengonfigurasi nama dan namespace tempat rahasia SSL default berada di kluster.
defaultSSLCertificate.secret.name Nama rahasia.
defaultSSLCertificate.secret.namespace Namespace rahasia.

Konfigurasi umum

Mengontrol konfigurasi pengontrol ingress NGINX default (pratinjau)

Catatan

Mengontrol konfigurasi pengontrol ingress NGINX saat mengaktifkan add-on tersedia di API 2024-06-02-preview, Kubernetes versi 1.30 atau yang lebih baru, dan versi ekstensi Azure CLI pratinjau aks atau yang 7.0.0b5 lebih baru. Untuk memeriksa versi kluster AKS Anda, lihat Memeriksa peningkatan kluster AKS yang tersedia.

Saat Anda mengaktifkan add-on perutean aplikasi dengan NGINX, itu membuat pengontrol ingress yang app-routing-namespace disebut default dikonfigurasi dengan load balancer Azure yang menghadap publik. Pengontrol ingress itu menggunakan nama kelas ingress .webapprouting.kubernetes.azure.com

Anda juga dapat mengontrol apakah default mendapatkan IP publik atau internal, atau jika dibuat sama sekali saat mengaktifkan add-on.

Berikut adalah opsi konfigurasi yang mungkin:

  • None: Pengontrol ingress Nginx default tidak dibuat dan tidak akan dihapus jika sudah ada. Pengguna harus menghapus sumber daya kustom default NginxIngressController secara manual jika diinginkan.
  • Internal: Pengontrol ingress Nginx default dibuat dengan load balancer internal. Setiap perubahan anotasi pada NginxIngressController sumber daya kustom untuk membuatnya eksternal akan ditimpa.
  • External: Pengontrol ingress Nginx default yang dibuat dengan load balancer eksternal. Setiap perubahan anotasi pada NginxIngressController sumber daya kustom untuk membuatnya internal akan ditimpa.
  • AnnotationControlled (default): Pengontrol ingress Nginx default dibuat dengan load balancer eksternal. Pengguna dapat mengedit sumber daya kustom default NginxIngressController untuk mengonfigurasi anotasi load balancer.

Mengontrol konfigurasi pengontrol ingress default saat membuat kluster

Untuk mengaktifkan perutean aplikasi pada kluster baru, gunakan az aks create perintah , menentukan --enable-app-routing bendera dan --app-routing-default-nginx-controller . Anda perlu mengatur ke <DefaultIngressControllerType> salah satu opsi konfigurasi yang dijelaskan sebelumnya.

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

Memperbarui konfigurasi pengontrol ingress default pada kluster yang ada

Untuk memperbarui konfigurasi pengontrol ingress default perutean aplikasi pada kluster yang ada, gunakan az aks approuting update perintah , yang menentukan --nginx bendera . Anda perlu mengatur ke <DefaultIngressControllerType> salah satu opsi konfigurasi yang dijelaskan sebelumnya.

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

Membuat pengontrol ingress NGINX yang menghadap publik lainnya

Untuk membuat pengontrol ingress NGINX lain dengan Azure Load Balancer yang menghadap publik:

  1. Salin manifes YAML berikut ke dalam file baru bernama nginx-public-controller.yaml dan simpan file ke komputer lokal Anda.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-public
    spec:
      ingressClassName: nginx-public
      controllerNamePrefix: nginx-public
    
  2. Buat sumber daya pengontrol ingress NGINX menggunakan kubectl apply perintah .

    kubectl apply -f nginx-public-controller.yaml
    

    Contoh output berikut menunjukkan sumber daya yang dibuat:

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

Membuat pengontrol ingress NGINX internal dengan alamat IP privat

Untuk membuat pengontrol ingress NGINX dengan Azure Load Balancer yang menghadap internal dengan alamat IP privat:

  1. Salin manifes YAML berikut ke dalam file baru bernama nginx-internal-controller.yaml dan simpan file ke komputer lokal Anda.

    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. Buat sumber daya pengontrol ingress NGINX menggunakan kubectl apply perintah .

    kubectl apply -f nginx-internal-controller.yaml
    

    Contoh output berikut menunjukkan sumber daya yang dibuat:

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

Membuat pengontrol ingress NGINX dengan alamat IP statis

Untuk membuat pengontrol ingress NGINX dengan alamat IP statis di Azure Load Balancer:

  1. Buat grup sumber daya Azure menggunakan az group create perintah .

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Buat alamat IP publik statis menggunakan az network public ip create perintah .

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

    Catatan

    Jika Anda menggunakan load balancer SKU Dasar di kluster AKS Anda, gunakan Dasar untuk --sku parameter saat menentukan IP publik. Hanya IP SKU Dasar yang berfungsi dengan load balancer SKU Dasar dan hanya IP SKU Standar yang berfungsi dengan load balancer SKU Standar.

  3. Pastikan identitas kluster yang digunakan oleh kluster AKS memiliki izin yang didelegasikan ke grup sumber daya IP publik menggunakan az role assignment create perintah .

    Catatan

    Perbarui <ClusterName> dan <ClusterResourceGroup> dengan nama kluster AKS dan nama grup sumber daya Anda.

    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. Salin manifes YAML berikut ke dalam file baru bernama nginx-staticip-controller.yaml dan simpan file ke komputer lokal Anda.

    Catatan

    Anda dapat menggunakan service.beta.kubernetes.io/azure-pip-name untuk nama IP publik, atau menggunakan service.beta.kubernetes.io/azure-load-balancer-ipv4 untuk alamat IPv4 dan service.beta.kubernetes.io/azure-load-balancer-ipv6 untuk alamat IPv6, seperti yang ditunjukkan dalam contoh YAML. service.beta.kubernetes.io/azure-pip-name Menambahkan anotasi memastikan pembuatan LoadBalancer yang paling efisien dan sangat disarankan untuk menghindari potensi pembatasan.

    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. Buat sumber daya pengontrol ingress NGINX menggunakan kubectl apply perintah .

    kubectl apply -f nginx-staticip-controller.yaml
    

    Contoh output berikut menunjukkan sumber daya yang dibuat:

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

Verifikasi bahwa pengontrol ingress telah dibuat

Anda dapat memverifikasi status pengontrol ingress NGINX menggunakan kubectl get nginxingresscontroller perintah .

Catatan

Perbarui <IngressControllerName> dengan nama yang Anda gunakan saat membuat 'NginxIngressController''.

kubectl get nginxingresscontroller -n <IngressControllerName>

Contoh output berikut menunjukkan sumber daya yang dibuat. Mungkin perlu waktu beberapa menit agar pengontrol tersedia:

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

Anda juga dapat melihat kondisi untuk memecahkan masalah apa pun:

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

Contoh output berikut menunjukkan kondisi pengontrol ingress yang sehat:

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

Menggunakan pengontrol ingress dalam ingress

  1. Salin manifes YAML berikut ke dalam file baru bernama ingress.yaml dan simpan file ke komputer lokal Anda.

    Catatan

    Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

    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. Buat sumber daya kluster menggunakan kubectl apply perintah .

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

    Contoh output berikut menunjukkan sumber daya yang dibuat:

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

Verifikasi bahwa Ingress terkelola telah dibuat

Anda dapat memverifikasi bahwa Ingress terkelola dibuat menggunakan kubectl get ingress perintah .

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

Contoh output berikut menunjukkan Ingress terkelola yang dibuat. Kelas ingress, host, dan alamat IP mungkin berbeda:

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

Membersihkan pengontrol ingress

Anda dapat menghapus pengontrol ingress NGINX menggunakan kubectl delete nginxingresscontroller perintah .

Catatan

Perbarui <IngressControllerName> dengan nama yang NginxIngressControllerAnda gunakan saat membuat .

kubectl delete nginxingresscontroller -n <IngressControllerName>

Konfigurasi per sumber daya ingress melalui anotasi

Pengontrol ingress NGINX mendukung penambahan anotasi ke objek Ingress tertentu untuk menyesuaikan perilaku mereka.

Anda dapat membuat anotasi objek ingress dengan menambahkan anotasi masing-masing di metadata.annotations bidang .

Catatan

Kunci dan nilai anotasi hanya dapat berupa string. Jenis lain, seperti nilai boolean atau numerik harus dikutip, yaitu "true", , "false""100".

Berikut adalah beberapa contoh anotasi untuk konfigurasi umum. Tinjau dokumentasi anotasi ingress NGINX untuk daftar lengkap.

Ukuran isi maks kustom

Untuk NGINX, kesalahan 413 dikembalikan ke klien ketika ukuran dalam permintaan melebihi ukuran maksimum yang diizinkan dari isi permintaan klien. Untuk mengambil alih nilai default, gunakan anotasi:

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

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Waktu koneksi kustom habis

Anda dapat mengubah waktu habis bahwa pengontrol ingress NGINX menunggu untuk menutup koneksi dengan beban kerja Anda. Semua nilai waktu habis tidak bersatu dan dalam detik. Untuk mengganti waktu habis default, gunakan anotasi berikut untuk mengatur waktu baca proksi 120 detik yang valid:

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

Tinjau batas waktu kustom untuk opsi konfigurasi lainnya.

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Protokol backend

Secara default, pengontrol ingress NGINX menggunakan HTTP untuk menjangkau layanan. Untuk mengonfigurasi protokol backend alternatif seperti HTTPS atau GRPC, gunakan anotasi:

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

or

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

Tinjau protokol backend untuk opsi konfigurasi lainnya.

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Berbagi Sumber Daya Lintas Asal (CORS)

Untuk mengaktifkan Berbagi Sumber Daya Lintas Asal (CORS) dalam aturan Ingress, gunakan anotasi:

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

Tinjau mengaktifkan CORS untuk opsi konfigurasi lainnya.

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Menonaktifkan pengalihan SSL

Secara default, pengontrol mengalihkan (308) ke HTTPS jika TLS diaktifkan untuk ingress. Untuk menonaktifkan fitur ini untuk sumber daya ingress tertentu, gunakan anotasi:

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

Tinjau penerapan HTTPS sisi server melalui pengalihan untuk opsi konfigurasi lainnya.

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Penulisan ulang URL

Dalam beberapa skenario, URL yang diekspos dalam layanan backend berbeda dari jalur yang ditentukan dalam aturan Ingress. Tanpa menulis ulang permintaan apa pun mengembalikan 404. Konfigurasi ini berguna dengan perutean berbasis jalur di mana Anda dapat melayani dua aplikasi web yang berbeda di bawah domain yang sama. Anda dapat mengatur jalur yang diharapkan oleh layanan menggunakan anotasi:

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

Berikut adalah contoh konfigurasi ingress menggunakan anotasi ini:

Catatan

Perbarui <Hostname> dengan nama host DNS Anda. <IngressClassName> adalah salah satu yang Anda tentukan saat membuat NginxIngressController.

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

Langkah berikutnya

Pelajari tentang memantau metrik pengontrol ingress-nginx yang disertakan dengan add-on perutean aplikasi dengan Prometheus di Grafana sebagai bagian dari menganalisis performa dan penggunaan aplikasi Anda.