Menginstal dan mengupgrade gateway dengan Istio API

<0x0

Cloud Service Mesh memberi Anda opsi untuk men-deploy dan mengelola gateway sebagai bagian dari mesh layanan Anda. Gateway menjelaskan load balancer yang beroperasi di edge mesh dan menerima koneksi HTTP/TCP masuk atau keluar. Gateway terutama digunakan untuk mengelola traffic masuk, tetapi Anda juga dapat mengonfigurasi gateway untuk mengelola jenis traffic lainnya.

  • Gateway keluar: Gateway keluar memungkinkan Anda mengonfigurasi node keluar khusus untuk traffic yang keluar dari mesh, sehingga Anda dapat membatasi layanan yang dapat atau harus mengakses jaringan eksternal, atau mengaktifkan kontrol yang aman atas traffic keluar untuk menambahkan keamanan ke mesh Anda, misalnya.

  • Gateway ingress: Gateway ingress memungkinkan Anda mengonfigurasi node masuk khusus untuk menerima koneksi HTTP/TCP masuk.

  • Gateway east-west: Proxy untuk traffic east-west agar workload layanan dapat berkomunikasi di seluruh batas cluster dalam mesh multi-primer di jaringan yang berbeda. Secara default, gateway ini akan bersifat publik di Internet.

Halaman ini menjelaskan praktik terbaik untuk men-deploy dan mengupgrade proxy gateway serta contoh mengonfigurasi proxy gateway istio-ingressgateway dan istio-egressgateway Anda sendiri.

Anda dapat men-deploy gateway dengan berbagai cara dan menggunakan lebih dari satu topologi dalam cluster yang sama. Lihat Topologi deployment gateway dalam dokumentasi Istio untuk mempelajari topologi ini lebih lanjut.

Praktik terbaik untuk men-deploy gateway

Praktik terbaik untuk men-deploy gateway bergantung pada apakah Anda menggunakan managed data plane atau unmanaged data plane.

Praktik terbaik untuk managed data plane

  • Aktifkan bidang data terkelola.
  • Tambahkan label revisi terkelola ke namespace.
  • Deploy dan kelola bidang kontrol dan gateway secara terpisah.
  • Sebagai praktik terbaik keamanan, deploy gateway di namespace yang berbeda dari bidang kontrol.
  • Gunakan injeksi sidecar otomatis (injeksi otomatis) untuk menyuntikkan konfigurasi proxy untuk gateway dengan cara yang mirip dengan cara Anda menyuntikkan proxy sidecar untuk layanan.

Praktik terbaik ini:

  • Pastikan gateway terkelola Anda selalu diupdate secara otomatis dengan peningkatan dan update keamanan terbaru.
  • Menurunkan pengelolaan dan pemeliharaan instance gateway ke bidang data terkelola Cloud Service Mesh.

Praktik terbaik untuk bidang data yang tidak dikelola

  • Deploy dan kelola bidang kontrol dan gateway secara terpisah.
  • Sebagai praktik terbaik keamanan, deploy gateway di namespace yang berbeda dari bidang kontrol.
  • Gunakan injeksi sidecar otomatis (injeksi otomatis) untuk menyuntikkan konfigurasi proxy untuk gateway dengan cara yang mirip dengan cara Anda menyuntikkan proxy sidecar untuk layanan.

Praktik terbaik ini:

  • Izinkan administrator namespace Anda mengelola gateway tanpa memerlukan hak istimewa yang ditingkatkan untuk seluruh cluster Anda.
  • Izinkan administrator Anda menggunakan alat atau mekanisme deployment yang sama yang mereka gunakan untuk mengelola aplikasi Kubernetes guna men-deploy dan mengelola gateway.
  • Memberi administrator kontrol penuh atas Deployment gateway, dan juga menyederhanakan operasi. Saat upgrade baru tersedia atau konfigurasi telah berubah, administrator akan mengupdate Pod gateway dengan memulai ulang Pod tersebut. Hal ini membuat pengalaman mengoperasikan Deployment gateway sama dengan mengoperasikan proxy sidecar untuk layanan Anda.

Men-deploy gateway contoh

Untuk mendukung pengguna dengan alat deployment yang ada, Cloud Service Mesh mendukung cara yang sama untuk men-deploy gateway seperti Istio: IstioOperator, Helm, dan Kubernetes YAML. Setiap metode menghasilkan hasil yang sama. Meskipun Anda dapat memilih metode yang paling Anda kuasai, sebaiknya Anda menggunakan metode YAML Kubernetes karena lebih mudah dimodifikasi dan Anda dapat menyimpan manifes yang di-hydrate dalam kontrol sumber.

Langkah-langkah berikut menunjukkan cara men-deploy gateway contoh.

  1. Buat namespace untuk gateway jika Anda belum memilikinya. Ganti GATEWAY_NAMESPACE dengan nama namespace Anda.

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. Aktifkan namespace untuk injeksi. Langkah-langkahnya bergantung pada implementasi bidang kontrol Anda.

    Terkelola (TD)

    1. Terapkan label injeksi default ke namespace:
    kubectl label namespace GATEWAY_NAMESPACE \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Terkelola (Istiod)

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Jika Anda adalah pengguna lama dengan bidang kontrol Managed Istiod: Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung. Gunakan petunjuk berikut:

    1. Jalankan perintah berikut untuk menemukan saluran rilis yang tersedia:

      kubectl -n istio-system get controlplanerevision
      

      Outputnya mirip dengan hal berikut ini:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      CATATAN: Jika dua revisi bidang kontrol muncul dalam daftar di atas, hapus salah satunya. Memiliki beberapa saluran bidang kontrol di cluster tidak didukung.

      Dalam output, nilai di kolom NAME adalah label revisi yang sesuai dengan saluran rilis yang tersedia untuk versi Cloud Service Mesh.

    2. Terapkan label revisi ke namespace:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    Dalam cluster

    Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:

      kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    Sebaiknya gunakan penyisipan default, tetapi penyisipan berbasis revisi didukung: Gunakan petunjuk berikut:

    1. Gunakan perintah berikut untuk menemukan label revisi pada istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Terapkan label revisi ke namespace. Dalam perintah berikut, REVISION_LABEL adalah nilai label revisi istiod yang Anda catat di langkah sebelumnya.

      kubectl label namespace GATEWAY_NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  3. Salin file konfigurasi untuk gateway contoh dari repositori anthos-service-mesh.

  4. Ubah direktori Anda ke direktori samples. Untuk memastikan Anda berada di direktori yang benar, jalankan perintah ls untuk mencantumkan konten direktori, lalu pastikan ada direktori gateways (yang akan Anda akses pada langkah berikutnya) dan direktori online-boutique.

  5. Deploy gateway ingress atau egress. File ini berada di direktori samples/gateways/ sebagaimana adanya, atau ubah sesuai kebutuhan.

    Masuk

    kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-ingressgateway
    

    Keluar

    kubectl apply -n GATEWAY_NAMESPACE -f samples/gateways/istio-egressgateway
    
  6. Setelah membuat deployment, verifikasi bahwa layanan baru berfungsi dengan benar:

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    Pastikan output-nya mirip dengan berikut ini:

    NAME                                      READY   STATUS    RESTARTS   AGE
    pod/istio-ingressgateway-856b7c77-bdb77   1/1     Running   0          3s
    
    NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
    service/istio-ingressgateway   LoadBalancer   10.24.5.129    34.82.157.6      80:31904/TCP   3s

Kelola resource gateway seperti aplikasi Kubernetes lainnya. Contoh dalam repositori anthos-service-mesh-packages ditujukan sebagai panduan dan untuk memulai cepat. Sesuaikan sesuai kebutuhan Anda.

Pemilih gateway

Anda menerapkan konfigurasi Gateway ke proxy istio-ingressgateway dan istio-egressgateway untuk mengelola traffic masuk dan keluar untuk mesh Anda, sehingga Anda dapat menentukan traffic mana yang ingin masuk atau keluar dari mesh. Label pada Pod deployment gateway digunakan oleh resource konfigurasi Gateway, jadi penting agar pemilih Gateway Anda cocok dengan label ini.

Misalnya, dalam deployment sebelumnya, label istio=ingressgateway ditetapkan pada Pod gateway. Untuk menerapkan konfigurasi Gateway ke deployment ini, Anda harus memilih label yang sama:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
...

Untuk contoh konfigurasi Gateway dan Layanan Virtual, lihat frontend.yaml di aplikasi contoh Online Boutique.

Mengupgrade gateway

Upgrade di tempat

Untuk sebagian besar kasus penggunaan, Anda harus mengupgrade gateway dengan mengikuti pola upgrade di tempat. Karena gateway menggunakan injeksi Pod, Pod gateway baru yang dibuat akan otomatis diinjeksi dengan konfigurasi terbaru, yang mencakup versi.

Jika ingin mengubah revisi bidang kontrol yang digunakan oleh gateway, Anda dapat menyetel label istio.io/rev pada Deployment gateway, yang juga akan memicu mulai ulang bertahap.

Bidang kontrol terkelola

Karena Google mengelola upgrade bidang kontrol untuk bidang kontrol terkelola, Anda cukup memulai ulang Deployment gateway dan pod baru akan otomatis di-inject dengan konfigurasi dan versi terbaru.

kubectl rollout restart deployment istio-ingressgateway \
  -n GATEWAY_NAMESPACE

Bidang kontrol dalam cluster

Untuk menerapkan pola yang sama ke gateway saat Anda memiliki bidang kontrol dalam cluster, Anda harus mengubah revisi bidang kontrol yang digunakan oleh gateway. Tetapkan label istio.io/rev pada Deployment gateway yang akan memicu mulai ulang bertahap. Langkah-langkah yang diperlukan bergantung pada apakah Anda perlu memperbarui label revisi pada namespace dan/atau pod gateway.

  • Jika Anda memberi label pada namespace untuk injeksi, tetapkan label istio.io/rev pada namespace ke nilai revisi baru:

      kubectl label namespace GATEWAY_NAMESPACE \
        istio-injection- istio.io/rev=REVISION \
        --overwrite
    
  • Jika Anda mengaktifkan injeksi hanya untuk pod gateway, tetapkan label istio.io/rev pada Deployment ke nilai revisi baru seperti file YAML Kubernetes berikut:

    cat <<EOF > gateway-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: istio-ingressgateway
      namespace: GATEWAY_NAMESPACE
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      template:
        metadata:
          annotations:
            # This is required to tell Cloud Service Mesh to inject the gateway with the
            # required configuration.
            inject.istio.io/templates: gateway
          labels:
            istio: ingressgateway
            istio.io/rev: REVISION
        spec:
          containers:
          - name: istio-proxy
            image: auto # The image will automatically update each time the pod starts.
    EOF
    
    kubectl apply -f gateway-deployment.yaml
    

Upgrade canary (lanjutan)

Jika Anda menggunakan bidang kontrol dalam cluster dan ingin mengontrol peluncuran revisi bidang kontrol baru secara lebih lambat, Anda dapat mengikuti pola upgrade canary. Anda dapat menjalankan beberapa versi Deployment gateway dan memastikan semuanya berfungsi seperti yang diharapkan dengan sebagian kecil traffic Anda. Misalnya, jika Anda ingin meluncurkan revisi baru, canary, membuat salinan Deployment gateway dengan label istio.io/rev=REVISION yang ditetapkan ke revisi baru dan nama baru, misalnya istio-ingressgateway-canary:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway-canary
  namespace: GATEWAY_NAMESPACE
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  template:
    metadata:
      annotations:
        inject.istio.io/templates: gateway
      labels:
        istio: ingressgateway
        istio.io/rev: REVISION # Set to the control plane revision you want to deploy
    spec:
      containers:
      - name: istio-proxy
        image: auto

Saat Deployment ini dibuat, Anda akan memiliki dua versi gateway, yang keduanya dipilih oleh Layanan yang sama:

kubectl get endpoints -o "custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"

NAME                   PODS
istio-ingressgateway   istio-ingressgateway-788854c955-8gv96,istio-ingressgateway-canary-b78944cbd-mq2qf

Jika Anda yakin bahwa aplikasi Anda berfungsi seperti yang diharapkan, jalankan perintah ini untuk bertransisi ke versi baru dengan menghapus Deployment dengan setelan label istio.io/rev lama:

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

Jika Anda mengalami masalah saat menguji aplikasi dengan versi gateway baru, jalankan perintah ini untuk bertransisi kembali ke versi lama dengan menghapus Deployment dengan set label istio.io/rev baru:

kubectl delete deploy/istio-ingressgateway-canary -n GATEWAY_NAMESPACE

Konfigurasi lanjutan

Men-deploy Gateway yang menghentikan traffic TLS

Baca dokumen Menyiapkan TLS termination di gateway ingress untuk mengetahui detail selengkapnya.

Mengonfigurasi versi TLS minimum gateway

Untuk Cloud Service Mesh, versi TLS minimum default untuk server gateway adalah 1.2. Anda dapat mengonfigurasi versi TLS minimum menggunakan kolom minProtocolVersion. Untuk mengetahui informasi selengkapnya, lihat ServerTLSSettings.

Fitur yang tidak didukung

Jika Anda memiliki TRAFFIC_DIRECTOR implementasi bidang kontrol, maka kolom atau nilai berikut di Gateway tidak didukung:

  • ServerTLSSettings.TLSmode dengan nilai AUTO_PASSTHROUGH
  • ServerTLSSettings.verifyCertificateSpki
  • ServerTLSSettings.verifyCertificateHash

Memecahkan masalah gateway

Gagal memperbarui gambar halaman masuk dari auto

Saat Anda men-deploy atau mengupgrade gateway, Cloud Service Mesh akan menyisipkan auto sebagai placeholder di kolom image. Setelah panggilan ke webhook mutating, Cloud Service Mesh akan otomatis mengganti placeholder ini dengan image proxy Cloud Service Mesh yang sebenarnya. Jika panggilan ke webhook yang mengubah gagal, placeholder auto akan tetap ada, dan penampung tidak ditemukan. Error ini biasanya disebabkan oleh label namespace yang salah. Pastikan Anda mengonfigurasi namespace yang benar, lalu deploy atau upgrade gateway lagi.