Menginstal dan mengupgrade gateway dengan Istio API

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 dari jala dan menerima koneksi HTTP/TCP masuk atau keluar. Gateway adalah utamanya digunakan untuk mengelola lalu lintas masuk, tetapi Anda juga dapat mengonfigurasi {i>gateway<i} untuk mengelola jenis lalu lintas lainnya.

  • Gateway keluar: Gateway keluar memungkinkan Anda mengonfigurasi node keluar khusus untuk lalu lintas yang meninggalkan mesh, memungkinkan Anda membatasi layanan mana yang dapat atau harus mengakses jaringan eksternal, atau mengaktifkan kontrol lalu lintas keluar yang aman untuk keamanan ke {i>mesh<i} Anda, misalnya.

  • Gateway masuk: Gateway masuk memungkinkan Anda mengonfigurasi pintu masuk khusus untuk menerima koneksi HTTP/TCP yang masuk.

  • Gateway timur-barat: {i>Proxy<i} untuk timur-barat traffic untuk memungkinkan workload layanan berkomunikasi lintas batas cluster dalam {i>mesh multi-primary<i} di jaringan yang berbeda. Secara {i>default<i}, gateway ini publik di Internet.

Halaman ini menjelaskan praktik terbaik untuk men-deploy dan mengupgrade gateway serta contoh konfigurasi istio-ingressgateway dan Proxy gateway istio-egressgateway.

Anda dapat men-deploy gateway dengan berbagai cara dan dapat menggunakan lebih dari satu topologi dalam cluster yang sama. Rujuk ke 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 gateway bidang data terkelola bidang data yang tidak dikelola.

Praktik terbaik untuk bidang data terkelola

  1. Aktifkan bidang data terkelola.
  2. Tambahkan label revisi terkelola ke namespace.
  3. Men-deploy dan mengelola bidang kontrol dan gateway secara terpisah.
  4. Sebagai praktik terbaik keamanan, sebaiknya Anda men-deploy gateway namespace yang berbeda dari bidang kontrol.
  5. Gunakan injeksi file bantuan otomatis (injeksi otomatis) untuk memasukkan konfigurasi proxy bagi gateway yang serupa cara Anda memasukkan {i> proxy<i} file bantuan untuk layanan Anda.

Praktik terbaik berikut:

  • Memastikan gateway terkelola secara otomatis selalu diperbarui dengan informasi terbaru penyempurnaan dan pembaruan keamanan.
  • Memindahkan beban pengelolaan dan pemeliharaan instance gateway ke Cloud Service Mesh bidang data terkelola.

Praktik terbaik untuk bidang data tidak terkelola

  1. Men-deploy dan mengelola bidang kontrol dan gateway secara terpisah.
  2. Sebagai praktik terbaik keamanan, sebaiknya Anda men-deploy gateway namespace yang berbeda dari bidang kontrol.
  3. Gunakan injeksi file bantuan otomatis (injeksi otomatis) untuk memasukkan konfigurasi proxy bagi gateway yang serupa cara Anda memasukkan {i> proxy<i} file bantuan untuk layanan Anda.

Praktik terbaik berikut:

  • Memungkinkan administrator namespace Anda mengelola gateway tanpa perlu hak istimewa yang ditingkatkan ke seluruh cluster Anda.
  • Izinkan administrator Anda menggunakan alat atau mekanisme deployment yang sama yang mereka gunakan untuk mengelola aplikasi Kubernetes gateway.
  • Berikan 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. Ini menjadikan pengalaman pengoperasian Deployment gateway sama dengan yang mengoperasikan {i>proxy<i} file bantuan 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 Istio: IstioOperator, Helm, dan YAML Kubernetes. Setiap metode menghasilkan hasil pengujian tersebut. Meskipun Anda dapat memilih metode yang paling Anda kenal, kami merekomendasikan agar Anda menggunakan metode YAML Kubernetes karena lebih mudah untuk dimodifikasi dan Anda dapat menyimpan manifes terhidrasi di 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 Anda namespace.

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. Mengaktifkan namespace untuk injeksi. Langkah-langkah bergantung pada penerapan 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 sudah menjadi pengguna dengan bidang kontrol Istio Terkelola: Kami menyarankan agar Anda menggunakan 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 satu. Memiliki beberapa saluran bidang kontrol dalam cluster tidak didukung.

      Pada output, nilai pada 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 injeksi default, tetapi injeksi berbasis revisi didukung: Gunakan petunjuk berikut:

    1. Gunakan perintah berikut untuk menemukan label revisi di 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 ini, REVISION_LABEL adalah nilai revisi istiod label yang Anda catat pada 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 dalam direktori yang benar, jalankan perintah ls untuk membuat daftar isi direktori dan lalu konfirmasi bahwa ada direktori gateways (yang akan Anda akses di langkah berikutnya) dan direktori online-boutique.

  5. Men-deploy gateway masuk atau keluar. Solusi tersebut terdapat di samples/gateways/ apa adanya, atau modifikasi 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, pastikan layanan baru berfungsi dengan baik dengan benar:

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    Pastikan outputnya mirip dengan yang 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. Sampel di repositori anthos-service-mesh-packages dimaksudkan untuk panduan dan panduan memulai. Sesuaikan dengan kebutuhan Anda.

Pemilih gateway

Anda menerapkan Gateway ke proxy istio-ingressgateway dan istio-egressgateway untuk mengelola lalu lintas masuk dan keluar untuk mesh Anda, memungkinkan traffic yang ingin Anda masukkan atau keluar dari mesh. Label di gateway Pod deployment digunakan oleh resource konfigurasi Gateway bahwa pemilih {i>Gateway<i} 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 {i>Gateway<i} dan Layanan Virtual, lihat frontend.yaml dalam aplikasi contoh Boutique Online.

Upgrade gateway

Upgrade di tempat

Untuk sebagian besar kasus penggunaan, Anda harus mengupgrade gateway pola upgrade. Karena gateway menggunakan injeksi Pod, Pod gateway baru akan otomatis dimasukkan dengan konfigurasi terbaru, yang menyertakan versi.

Jika Anda ingin mengubah revisi bidang kontrol yang digunakan oleh {i>gateway<i}, Anda dapat menyetel label istio.io/rev pada Deployment gateway, yang juga akan memicu mulai ulang berkelanjutan.

Bidang kontrol terkelola

Karena Google mengelola upgrade bidang kontrol untuk bidang kontrol terkelola, Anda cukup memulai ulang Deployment gateway dan pod baru akan secara otomatis dimasukkan 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 kontrol dalam cluster bidang kontrol yang digunakan oleh gateway. Menetapkan label istio.io/rev pada Deployment gateway yang akan memicu mulai ulang berkelanjutan. Langkah-langkah yang diperlukan bergantung pada apakah Anda perlu memperbarui label revisi pada namespace dan/atau pod gateway.

  • Jika Anda memberi label 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, setel istio.io/rev label pada Deployment ke nilai revisi baru seperti berikut File YAML Kubernetes:

    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 menggunakan mengontrol peluncuran revisi bidang kontrol baru, Anda dapat mengikuti canary pola upgrade. Anda dapat menjalankan beberapa versi gateway Deployment dan memastikan semuanya berfungsi seperti yang diharapkan pada sebagian traffic. Misalnya, jika ingin meluncurkan revisi baru, canary, buat salinan gateway Anda Deployment dengan label istio.io/rev=REVISION disetel 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

Setelah Deployment ini dibuat, Anda akan memiliki dua versi gateway, 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 puas karena aplikasi Anda berfungsi seperti yang diharapkan, jalankan untuk beralih ke versi baru dengan menghapus Deployment dengan Kumpulan label istio.io/rev:

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

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

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

Konfigurasi lanjutan

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 informasi selengkapnya, lihat ServerTLSSettings.

Fitur yang tidak didukung

Jika Anda memiliki TRAFFIC_DIRECTOR penerapan bidang kontrol kemudian kolom atau nilai berikut di Gateway tidak didukung:

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

Memecahkan masalah gateway

Gagal memperbarui gambar gateway dari auto

Saat Anda men-deploy atau mengupgrade gateway, Cloud Service Mesh menyisipkan auto sebagai placeholder di kolom image. Setelah panggilan untuk mengubah webhook, Cloud Service Mesh otomatis mengganti placeholder ini dengan Gambar proxy Cloud Service Mesh. Jika panggilan untuk mengubah webhook gagal, auto {i>placeholder<i} tetap ada, dan kontainer tidak ditemukan. Hal ini biasanya disebabkan oleh label namespace yang salah. Pastikan Anda mengonfigurasi namespace, lalu men-deploy atau mengupgrade gateway lagi.