Mengamankan Service Kubernetes dengan Istio

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

Istio dan Cloud Service Mesh

Istio bukan produk Google yang didukung. Sebaiknya jalankan Managed Cloud Service Mesh. Untuk mengetahui informasi selengkapnya, lihat Menyediakan Cloud Service Mesh di 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 menyuntikkan proxy sidecar ke dalam beban kerja tanpa memberikan hak istimewa yang ditingkatkan ke container Anda.
  • Anda dapat melihat dasbor lengkap untuk mesh dan layanan 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 secara otomatis mengupgrade proxy sidecar di 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 API Istio open source standar. Untuk mengetahui 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 timbal balik (mTLS).
  • Konfigurasi Istio untuk menggunakan autentikasi mTLS untuk komunikasi service-to-service menggunakan resource kustom PeerAuthentication.
  • Verifikasi autentikasi mTLS menggunakan dasbor Kiali.

Biaya

Di dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru 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, baca bagian 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  4. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the GKE API:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com
  8. Install the Google Cloud CLI.

  9. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  10. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the GKE API:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com
  14. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Replace the following:

    • PROJECT_ID: Your project ID.
    • USER_IDENTIFIER: The identifier for your user account. For example, myemail@example.com.
    • ROLE: The IAM role that you grant to your user account.
  15. Menyiapkan lingkungan

    Untuk menyiapkan lingkungan Anda, 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 Google Cloud project ID 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

    Aktifkan kemampuan Linux yang diperlukan Istio: NET_RAW dan NET_ADMIN. GKE Autopilot 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 keamanan GKE Autopilot lebih lanjut, lihat Konfigurasi keamanan bawaan.

    Instal Istio

    Anda dapat menginstal Istio di cluster GKE menggunakan Istioctl.

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

    1. Instal Istio:

      • Untuk menginstal Istio versi terbaru:

        curl -L https://istio.io/downloadIstio | sh -
        
      • Untuk menginstal Istio versi tertentu:

        export ISTIO_VERSION=VERSION_NUMBER
        curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
        

        Ganti VERSION_NUMBER dengan versi Istio yang ingin Anda instal. Untuk mengetahui informasi tentang rilis Istio, lihat Pengumuman rilis.

    2. Tambahkan alat command line istioctl ke PATH:

      cd istio-*
      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 Pod Istio 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 berstatus Running, kembali ke command line dengan menekan Ctrl+C.

    Men-deploy aplikasi contoh

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

    1. Tambahkan label namespace yang menginstruksikan Istio untuk mengaktifkan injeksi otomatis proxy sidecar 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 dalam status 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 TLS timbal balik (mTLS) diaktifkan secara default di Istio. Artinya, Istio memantau workload server yang telah dimigrasikan ke proxy Istio dan secara otomatis mengonfigurasi proxy klien untuk membuat koneksi mTLS dengan workload ini. Istio juga mengonfigurasi proxy klien agar tidak menggunakan mTLS saat terhubung ke beban kerja tanpa proxy sidecar.

    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 akan 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 Resource 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 bersama.

    Memastikan mTLS diaktifkan

    Kiali adalah dasbor observabilitas berbasis web untuk service mesh Istio yang memberikan tampilan grafis lingkungan microservice Anda, sehingga Anda dapat memantau dan memecahkan masalah aplikasi Anda. Anda dapat menggunakan Kiali untuk memverifikasi bahwa autentikasi mTLS diaktifkan dan berfungsi dengan benar di Istio service mesh. 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. Anotasi 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 workload 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. Mendapatkan 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 membuat traffic antar-microservice.

    Menginstal Kiali

    Sebaiknya instal 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 Kiali.

    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 dalam status 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 di 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

      Delete a Google Cloud project:

      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 --location us-central1 istio-cluster --quiet
      

    Langkah berikutnya