Bagikan melalui


Ingress eksternal atau internal Azure Kubernetes Service (AKS) untuk penyebaran add-on jala layanan Istio

Artikel ini menunjukkan cara menyebarkan ingress eksternal atau internal untuk add-on jala layanan Istio untuk kluster Azure Kubernetes Service (AKS).

Catatan

Saat melakukan peningkatan revisi kecil add-on Istio, penyebaran lain untuk gateway eksternal / internal akan dibuat untuk revisi sarana kontrol baru.

Prasyarat

Panduan ini mengasumsikan Anda mengikuti dokumentasi untuk mengaktifkan add-on Istio pada kluster AKS, menyebarkan aplikasi sampel, dan mengatur variabel lingkungan.

Mengaktifkan gateway ingress eksternal

Gunakan az aks mesh enable-ingress-gateway untuk mengaktifkan ingress Istio yang dapat diakses secara eksternal pada kluster AKS Anda:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type external

Gunakan kubectl get svc untuk memeriksa layanan yang dipetakan ke gateway ingress:

kubectl get svc aks-istio-ingressgateway-external -n aks-istio-ingress

Amati dari output bahwa alamat IP eksternal layanan adalah alamat IP eksternal yang dapat diakses publik:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-external   LoadBalancer   10.0.10.249   <EXTERNAL_IP>   15021:30705/TCP,80:32444/TCP,443:31728/TCP   4m21s

Catatan

Kustomisasi ke alamat IP di gateway internal dan eksternal belum didukung. Kustomisasi alamat IP pada spesifikasi ingress dikembalikan oleh add-on Istio. Direncanakan untuk memungkinkan penyesuaian ini dalam implementasi GATEWAY API untuk add-on Istio di masa mendatang.

Aplikasi tidak dapat diakses dari luar kluster secara default setelah mengaktifkan gateway ingress. Untuk membuat aplikasi dapat diakses, petakan contoh ingress penyebaran ke gateway masuk Istio menggunakan manifes berikut:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway-external
spec:
  selector:
    istio: aks-istio-ingressgateway-external
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-external
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway-external
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Catatan

Pemilih yang digunakan dalam objek Gateway menunjuk ke istio: aks-istio-ingressgateway-external, yang dapat ditemukan sebagai label pada layanan yang dipetakan ke ingress eksternal yang diaktifkan sebelumnya.

Atur variabel lingkungan untuk host dan port ingress eksternal:

export INGRESS_HOST_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_EXTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-external -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_EXTERNAL=$INGRESS_HOST_EXTERNAL:$INGRESS_PORT_EXTERNAL

Ambil alamat eksternal aplikasi sampel:

echo "http://$GATEWAY_URL_EXTERNAL/productpage"

Navigasikan ke URL dari output perintah sebelumnya dan konfirmasikan bahwa halaman produk aplikasi sampel ditampilkan. Atau, Anda juga dapat menggunakan curl untuk mengonfirmasi aplikasi sampel dapat diakses. Contohnya:

curl -s "http://${GATEWAY_URL_EXTERNAL}/productpage" | grep -o "<title>.*</title>"

Konfirmasikan bahwa halaman produk aplikasi sampel dapat diakses. Output yang diharapkan adalah:

<title>Simple Bookstore App</title>

Mengaktifkan gateway ingress internal

Gunakan az aks mesh enable-ingress-gateway untuk mengaktifkan ingress Istio internal pada kluster AKS Anda:

az aks mesh enable-ingress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER --ingress-gateway-type internal

Gunakan kubectl get svc untuk memeriksa layanan yang dipetakan ke gateway ingress:

kubectl get svc aks-istio-ingressgateway-internal -n aks-istio-ingress

Amati dari output bahwa alamat IP eksternal layanan bukan alamat IP yang dapat diakses publik dan sebaliknya hanya dapat diakses secara lokal:

NAME                                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                      AGE
aks-istio-ingressgateway-internal   LoadBalancer   10.0.182.240  <IP>      15021:30764/TCP,80:32186/TCP,443:31713/TCP   87s

Setelah mengaktifkan gateway ingress, aplikasi perlu diekspos melalui gateway dan aturan perutean perlu dikonfigurasi dengan sesuai. Gunakan manifes berikut untuk memetakan ingress penyebaran sampel ke gateway masuk Istio:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-internal-gateway
spec:
  selector:
    istio: aks-istio-ingressgateway-internal
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo-vs-internal
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-internal-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

Catatan

Pemilih yang digunakan dalam objek Gateway menunjuk ke istio: aks-istio-ingressgateway-internal, yang dapat ditemukan sebagai label pada layanan yang dipetakan ke ingress internal yang diaktifkan sebelumnya.

Atur variabel lingkungan untuk host dan port ingress internal:

export INGRESS_HOST_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT_INTERNAL=$(kubectl -n aks-istio-ingress get service aks-istio-ingressgateway-internal -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL_INTERNAL=$INGRESS_HOST_INTERNAL:$INGRESS_PORT_INTERNAL

Ambil alamat aplikasi sampel:

echo "http://$GATEWAY_URL_INTERNAL/productpage"

Navigasikan ke URL dari output perintah sebelumnya dan konfirmasikan bahwa halaman produk aplikasi sampel TIDAK ditampilkan. Atau, Anda juga dapat menggunakan curl untuk mengonfirmasi aplikasi sampel TIDAK dapat diakses. Contohnya:

curl -s "http://${GATEWAY_URL_INTERNAL}/productpage" | grep -o "<title>.*</title>"

Gunakan kubectl exec untuk mengonfirmasi aplikasi dapat diakses dari dalam jaringan virtual kluster:

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS  "http://$GATEWAY_URL_INTERNAL/productpage"  | grep -o "<title>.*</title>"

Konfirmasikan bahwa halaman produk aplikasi sampel dapat diakses. Output yang diharapkan adalah:

<title>Simple Bookstore App</title>

Menghapus sumber daya

Jika Anda ingin membersihkan gateway ingress eksternal atau internal Istio, tetapi biarkan jala diaktifkan pada kluster, jalankan perintah berikut:

az aks mesh disable-ingress-gateway --ingress-gateway-type <external/internal> --resource-group ${RESOURCE_GROUP}

Jika Anda ingin membersihkan jala layanan Istio dan ingress (meninggalkan kluster), jalankan perintah berikut:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Jika Anda ingin membersihkan semua sumber daya yang dibuat dari dokumen panduan Istio, jalankan perintah berikut:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

Langkah berikutnya

Catatan

Jika ada masalah yang dihadapi dengan penyebaran gateway masuk Istio atau mengonfigurasi perutean lalu lintas masuk, lihat artikel tentang pemecahan masalah gateway ingress add-on Istio