Mengamankan Service Kubernetes dengan Istio


Tutorial ini ditujukan bagi pengguna dan administrator Kubernetes yang tertarik menggunakan mesh layanan Istio untuk men-deploy Layanan Kubernetes dengan aman dan mengaktifkan komunikasi TLS (mTLS) bersama.

Mesh Layanan Istio dan Cloud

Istio bukan produk Google yang didukung. Sebaiknya jalankan Cloud Service Mesh terkelola. Untuk mengetahui informasi selengkapnya, lihat Menyediakan Cloud Service Mesh pada cluster GKE Autopilot.

Cloud Service Mesh memberikan manfaat berikut:

  • Anda dapat menyediakan Cloud Service Mesh terkelola menggunakan Fleet API tanpa alat sisi klien seperti istioctl.
  • Cloud Service Mesh secara otomatis memasukkan proxy file bantuan ke dalam workload tanpa memberikan hak istimewa yang ditingkatkan ke container Anda.
  • Anda dapat melihat dasbor yang kaya untuk mesh dan layanan Anda tanpa konfigurasi tambahan, lalu menggunakan metrik ini untuk mengonfigurasi tujuan tingkat layanan (SLO) dan pemberitahuan untuk memantau kondisi aplikasi Anda.
  • Bidang kontrol Cloud Service Mesh terkelola diupgrade secara otomatis untuk memastikan Anda mendapatkan patch dan fitur keamanan terbaru.
  • Bidang data terkelola Cloud Service Mesh otomatis mengupgrade proxy file bantuan dalam workload Anda, sehingga Anda tidak perlu memulai ulang layanan sendiri saat upgrade proxy dan patch keamanan tersedia.
  • Cloud Service Mesh adalah produk yang didukung dan dapat dikonfigurasi menggunakan Istio API open source standar. Untuk informasi selengkapnya, lihat fitur yang didukung.

Tujuan

Tutorial ini mencakup langkah-langkah berikut:

  • Membuat cluster GKE Autopilot.
  • Instal Istio menggunakan alat command line istioctl.
  • Deploy aplikasi contoh untuk menguji autentikasi TLS bersama (mTLS).
  • Konfigurasikan Istio agar menggunakan autentikasi mTLS untuk komunikasi layanan-ke-layanan menggunakan resource kustom PeerAuthentication.
  • Verifikasi autentikasi mTLS menggunakan dasbor Kiali.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Cloud Shell telah diinstal dengan software yang Anda perlukan untuk tutorial ini, termasuk kubectl, gcloud CLI, dan Terraform. Jika tidak menggunakan Cloud Shell, Anda harus menginstal gcloud CLI.

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Menginstal Google Cloud CLI.
  3. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  4. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Enable the GKE API:

    gcloud services enable container.googleapis.com
  7. Menginstal Google Cloud CLI.
  8. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  9. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  10. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  11. Enable the GKE API:

    gcloud services enable container.googleapis.com
  12. Berikan peran ke Akun Google Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • Ganti PROJECT_ID dengan project ID Anda.
    • Ganti EMAIL_ADDRESS dengan alamat email Anda.
    • Ganti ROLE dengan setiap peran individual.

Menyiapkan lingkungan

Untuk menyiapkan lingkungan, ikuti langkah-langkah berikut:

  1. Menetapkan variabel lingkungan:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    

    Ganti PROJECT_ID dengan project ID Google Cloud Anda.

  2. Buat clone repositori GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. Ubah ke direktori kerja:

    cd kubernetes-engine-samples/service-mesh/istio-tutorial
    

Membuat cluster GKE

Mengaktifkan kemampuan Linux yang diperlukan Istio: NET_RAW dan NET_ADMIN. Autopilot GKE tidak mengizinkan NET_ADMIN secara default, tetapi Anda dapat mengaktifkan NET_ADMIN menggunakan perintah --workload-policies=allow-net-admin di GKE versi 1.27 dan yang lebih baru:

gcloud container clusters create-auto istio-cluster \
    --location="us-central1" \
    --workload-policies="allow-net-admin"

Untuk mempelajari lebih lanjut keamanan GKE Autopilot, lihat Konfigurasi keamanan bawaan.

Instal Istio

Anda dapat menginstal Istio di cluster GKE menggunakan Istioctl.

Dalam tutorial ini, Anda menginstal Istio dengan profil konfigurasi default yang direkomendasikan untuk deployment produksi.

  1. Instal Istio:

    export ISTIO_VERSION=1.20.2
    curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
    
  2. Tambahkan alat command line istioctl ke PATH:

    cd istio-${ISTIO_VERSION}
    export PATH=$PWD/bin:$PATH
    
  3. Instal Istio di cluster:

    istioctl install --set profile="default" -y
    

    Langkah ini mungkin memerlukan waktu beberapa menit.

  4. Tunggu hingga Istio Pod siap:

    watch kubectl get pods -n istio-system
    

    Outputnya mirip dengan hal berikut ini:

    NAME                                    READY   STATUS        RESTARTS   AGE
    istio-ingressgateway-5c47bff876-wjm96   1/1     Running       0          2m54s
    istiod-5fc7cb65cd-k8cp4                 1/1     Running       0          2m57s
    

    Jika Pod Istio bernilai Running, kembali ke command line dengan menekan Ctrl+C.

Men-deploy aplikasi contoh

Di bagian ini, Anda akan menggunakan contoh aplikasi Bank of Anthos untuk membuat mesh layanan dengan autentikasi mTLS.

  1. Tambahkan label namespace yang menginstruksikan Istio untuk mengaktifkan injeksi otomatis proxy file bantuan Envoy:

    kubectl label namespace default istio-injection=enabled
    
  2. Deploy aplikasi contoh:

    cd ..
    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -f bank-of-anthos/kubernetes-manifests/
    
  3. Tunggu hingga aplikasi siap:

    watch kubectl get pods
    

    Outputnya mirip dengan hal berikut ini:

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    

    Jika Pod adalah Running, kembali ke command line dengan menekan Ctrl+C.

  4. Tinjau manifes berikut:

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: frontend-gateway
    spec:
      selector:
        istio: ingressgateway # use Istio default gateway implementation
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: frontend-ingress
    spec:
      hosts:
      - "*"
      gateways:
      - frontend-gateway
      http:
      - route:
        - destination:
            host: frontend
            port:
              number: 80

    Manifes ini menjelaskan resource Gateway dan VirtualService Istio yang mengekspos aplikasi dan menggunakan Istio sebagai pengontrol Ingress.

  5. Terapkan manifes ke cluster Anda:

    kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    

Mengonfigurasi mTLS

Autentikasi Mutual TLS (mTLS) diaktifkan secara default di Istio. Artinya, Istio memantau beban kerja server yang telah dimigrasikan ke proxy Istio dan otomatis mengonfigurasi proxy klien untuk membuat koneksi mTLS dengan workload tersebut. Istio juga mengonfigurasi proxy klien agar tidak menggunakan mTLS saat terhubung ke workload tanpa proxy file bantuan.

Istio dapat mengonfigurasi mTLS agar berfungsi dalam tiga mode:

  • PERMISSIVE: Workload menerima traffic mTLS dan teks biasa.
  • STRICT: Workload hanya menerima traffic mTLS.
  • DISABLE: mTLS dinonaktifkan. Gunakan mode ini jika Anda ingin menggunakan solusi keamanan Anda sendiri.

Anda dapat menerapkan konfigurasi mTLS secara global, per namespace, atau per beban kerja. Dalam tutorial ini, Anda menerapkan konfigurasi per namespace menggunakan mode mTLS STRICT.

  1. Tinjau manifes berikut:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
          mode: STRICT

    Manifes ini menjelaskan Referensi Kustom Istio Autentikasi Peer.

  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f peer-authentication.yaml
    

Untuk mengetahui informasi selengkapnya tentang mTLS di Istio, lihat autentikasi TLS timbal balik.

Memastikan mTLS diaktifkan

Kiali adalah dasbor kemampuan observasi berbasis web untuk mesh layanan Istio yang memberikan tampilan grafis tentang lingkungan microservice Anda, sehingga Anda dapat memantau dan memecahkan masalah aplikasi. Anda dapat menggunakan Kiali untuk memverifikasi bahwa autentikasi mTLS diaktifkan dan berfungsi dengan benar di mesh layanan Istio. Kiali memerlukan Prometheus sebagai sumber data telemetri. Tutorial ini menggunakan Google Cloud Managed Service for Prometheus.

Menginstal antarmuka kueri

  1. Buat akun layanan IAM dengan roles/monitoring.viewer untuk mengizinkan antarmuka kueri mengakses metrik:

    gcloud iam service-accounts create monitoring \
        --display-name="Service account for query interface"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \
        --role roles/monitoring.viewer
    gcloud iam service-accounts add-iam-policy-binding \
      monitoring@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"
    
  2. Membuat namespace Kubernetes:

    kubectl create namespace monitoring
    
  3. Anotasikan akun layanan Kubernetes default di namespace untuk mengonfigurasi Workload Identity Federation for GKE:

    kubectl annotate serviceaccount -n monitoring default \
        iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
    
  4. Deploy beban kerja antarmuka kueri:

    kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  5. Tinjau manifes berikut:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: istiod
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istiod
      endpoints:
      - port: 15014
        path: /metrics
        timeout: 30s
        interval: 60s

    Manifes ini menjelaskan resource PodMonitoring yang mengumpulkan metrik Istio dan Envoy Proxy.

  6. Terapkan manifes ke cluster Anda:

    kubectl apply -f pod-monitorings.yaml
    
  7. Dapatkan link ke aplikasi contoh:

    INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  8. Buka link untuk melihat contoh aplikasi. Login dengan nama pengguna dan sandi default untuk menghasilkan traffic antar-microservice.

Instal Kiali

Sebaiknya Anda menginstal Kiali menggunakan Operator Kiali.

  1. Instal Operator Kiali:

    helm repo add kiali https://kiali.org/helm-charts
    helm repo update
    helm install \
        --namespace kiali-operator \
        --create-namespace \
        kiali-operator \
        kiali/kiali-operator
    
  2. Tinjau manifes berikut:

    apiVersion: kiali.io/v1alpha1
    kind: Kiali
    metadata:
      name: kiali
      namespace: istio-system
    spec:
      deployment:
        namespace: istio-system
      auth:
        strategy: anonymous
      external_services:
        custom_dashboards:
          prometheus:
            url: "http://frontend.monitoring:9090/"
            auth:
              type: none
        prometheus:
          url: "http://frontend.monitoring:9090/"
          auth:
            type: none
        tracing:
          enabled: false
        grafana:
          enabled: false

    Manifes ini menjelaskan resource kustom Operator yang menentukan server Kiiali.

  3. Terapkan manifes ke cluster Anda:

    kubectl apply -f kiali.yaml
    
  4. Tunggu hingga server Kiali siap:

    watch kubectl get pods -n istio-system
    

    Outputnya mirip dengan hal berikut ini:

    NAME                                    READY   STATUS    RESTARTS   AGE
    istio-ingressgateway-6845466857-92zp8   1/1     Running   0          9m11s
    istiod-6b47d84cf-4cqlt                  1/1     Running   0          12m
    

    Jika Pod adalah Running, kembali ke command line dengan menekan Ctrl+C.

  5. Siapkan penerusan port di Layanan server Kiali untuk mengakses dasbor:

    kubectl -n istio-system port-forward svc/kiali 8080:20001
    
  6. Buka Pratinjau Web. Di Kiali, buka bagian Graph, lalu pilih opsi Security pada drop-down Display. Tampilan ini menampilkan status keamanan setiap node dalam grafik. Node dengan badge mTLS diaktifkan menunjukkan bahwa mTLS diaktifkan untuk layanan tersebut, dan node tanpa badge menunjukkan bahwa mTLS tidak diaktifkan.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

    Menghapus project Google Cloud:

    gcloud projects delete PROJECT_ID

Menghapus resource satu per satu

Jika Anda telah menggunakan project yang sudah ada dan tidak ingin menghapusnya, hapus resource individual tersebut.

  1. Hapus Kiali:

    kubectl -n istio-system delete kiali kiali
    helm uninstall --namespace kiali-operator kiali-operator
    
  2. Hapus resource pemantauan:

    kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  3. Hapus aplikasi contoh:

    kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    kubectl delete -f bank-of-anthos/kubernetes-manifests
    
  4. Uninstal Istio:

    istioctl uninstall --purge -y
    
  5. Hapus cluster GKE:

    gcloud container clusters delete --region us-central1 istio-cluster --quiet
    

Langkah selanjutnya