Menginstal dan mengupgrade gateway

Anthos 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 yang menerima koneksi HTTP/TCP masuk atau keluar. Gateway adalah proxy Envoy yang memberi Anda kontrol terperinci atas traffic yang masuk dan keluar dari mesh. Gateway terutama digunakan untuk mengelola traffic masuk, tetapi Anda juga dapat mengonfigurasi gateway untuk mengelola jenis traffic lainnya. Contoh:

  • Gateway keluar: Gateway keluar memungkinkan Anda mengonfigurasi node keluar khusus untuk traffic yang keluar dari mesh, sehingga Anda dapat membatasi layanan mana yang dapat atau harus mengakses jaringan eksternal, atau untuk memungkinkan kontrol traffic keluar yang aman guna menambah keamanan pada mesh Anda.

  • Gateway timur-barat: Proxy untuk traffic east-west agar beban kerja layanan dapat berkomunikasi melintasi 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 cara mengonfigurasi proxy gateway istio-ingressgateway dan istio-egressgateway Anda sendiri. Hal-hal seperti pemisahan traffic, pengalihan, dan logika percobaan ulang dapat dilakukan dengan menerapkan konfigurasi Gateway ke proxy gateway. Kemudian, daripada menambahkan perutean traffic lapisan aplikasi (L7) ke resource API yang sama, Anda akan mengikat Layanan Virtual ke Gateway. Hal ini memungkinkan Anda mengelola traffic gateway seperti traffic bidang data lainnya di mesh layanan.

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

Praktik terbaik untuk men-deploy gateway

  1. Men-deploy dan mengelola bidang kontrol dan gateway secara terpisah.
  2. Sebagai praktik terbaik keamanan, sebaiknya Anda men-deploy gateway di namespace yang berbeda dari bidang kontrol.
  3. Gunakan injeksi file bantuan otomatis (injeksi otomatis) untuk memasukkan konfigurasi proxy untuk gateway seperti yang Anda gunakan untuk memasukkan proxy file bantuan untuk layanan Anda.

Praktik terbaik ini:

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

Men-deploy gateway

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

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

    kubectl create namespace GATEWAY_NAMESPACE
    
  2. Anda dapat mengaktifkan injeksi otomatis di gateway dengan menerapkan label revisi pada namespace gateway. Label revisi digunakan oleh webhook injektor file bantuan untuk mengaitkan proxy yang dimasukkan dengan revisi bidang kontrol tertentu. Label revisi yang digunakan bergantung pada apakah Anda men-deploy bidang kontrol yang dikelola Google atau bidang kontrol dalam cluster.

    Dikelola Google

    Untuk bidang kontrol yang dikelola Google, label revisi sesuai dengan saluran rilis:

    Label revisi Saluran
    istio.io/rev=asm-managed Reguler
    istio.io/rev=asm-managed-rapid Cepat
    istio.io/rev=asm-managed-stable Stabil

    Namespace gateway Anda dapat berada di saluran rilis yang sama dengan layanan Anda, atau saluran rilis yang berbeda. Sebaiknya gunakan saluran rilis yang sama pada cluster. Untuk melihat saluran rilis yang digunakan namespace:

    kubectl get namespace NAMESPACE -L istio.io/rev
    

    Dalam cluster

    Untuk bidang kontrol dalam cluster, Layanan dan Deployment istiod biasanya memiliki label revisi yang mirip dengan istio.io/rev=asm-1106-2, dengan asm-1106-2 mengidentifikasi versi Anthos Service Mesh. Revisi menjadi bagian dari Nama layanan istiod, misalnya: istiod-asm-1106-2.istio-system

    Gunakan perintah berikut untuk menemukan label revisi pada istiod untuk bidang kontrol dalam cluster:

    kubectl get deploy -n istio-system -l app=istiod -o jsonpath="{.items[*].metadata.labels.'istio\.io\/rev'}"'{"\n"}'
    
  3. Aktifkan namespace untuk injeksi. Ganti dan REVISION dengan nilai untuk label revisi.

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

    Anda dapat mengabaikan pesan "istio-injection not found" di output. Artinya, namespace sebelumnya tidak memiliki label istio-injection, yang akan Anda harapkan dalam penginstalan baru Anthos Service Mesh atau deployment baru. Karena injeksi otomatis gagal jika namespace memiliki istio-injection dan label revisi, semua perintah kubectl label dalam dokumentasi Anthos Service Mesh mencakup penghapusan label istio-injection.

  4. Jika Anda menginstal Anthos Service Mesh menggunakan asmcli, ubah ke direktori yang Anda tentukan di --output_dir, lalu cd ke direktori samples.

    Jika Anda tidak menginstal menggunakan asmcli, salin file konfigurasi untuk gateway dari repositori anthos-service-mesh.

  5. Anda dapat men-deploy contoh konfigurasi gateway yang terletak di direktori samples/gateways/ sebagaimana adanya, atau mengubahnya sesuai kebutuhan.

    Masuk

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

    Traffic Keluar

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

    kubectl get pod,service -n GATEWAY_NAMESPACE
    

    Pastikan outputnya 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

Pemilih gateway

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

Misalnya, dalam deployment di atas, 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 yang diterapkan. Karena gateway menggunakan injeksi Pod, Pod gateway baru yang dibuat akan otomatis dimasukkan dengan konfigurasi terbaru, yang mencakup versinya.

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

Bidang kontrol yang dikelola Google
Karena Google mengelola upgrade bidang kontrol untuk bidang kontrol yang dikelola Google, Anda cukup memulai ulang Deployment gateway dan pod baru akan 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 Anda saat 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 berkelanjutan.

  1. Memperbarui label revisi pada namespace 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

ATAU

  • Jika Anda mengaktifkan injeksi hanya untuk pod gateway:
    • Tetapkan label istio.io/rev pada Deployment ke nilai revisi baru
      • 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 Anthos 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 subset traffic Anda. Misalnya, jika Anda ingin meluncurkan revisi baru, canary, buat salinan Deployment gateway Anda 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 sudah puas karena aplikasi Anda berfungsi seperti yang diharapkan, jalankan perintah ini untuk bertransisi ke versi baru dengan menghapus Deployment dengan kumpulan label istio.io/rev lama:

kubectl delete deploy/istio-ingressgateway -n GATEWAY_NAMESPACE

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

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