Mengamankan Service Kubernetes dengan Istio


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

Istio dan Cloud Service Mesh

Istio bukan produk Google yang didukung. Sebaiknya jalankan Cloud Service Mesh terkelola. Untuk 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 memasukkan 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 sasaran tingkat layanan (SLOs) 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 yang dikelola Cloud Service Mesh akan otomatis mengupgrade proxy sidecar 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 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.
  • Men-deploy aplikasi contoh untuk menguji autentikasi TLS bersama (mTLS).
  • Konfigurasikan Istio untuk menggunakan autentikasi mTLS untuk komunikasi service-to-service menggunakan resource kustom PeerAuthentication.
  • Verifikasi autentikasi mTLS menggunakan dasbor Kiali.

Biaya

Dalam 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, 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. 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. To initialize the gcloud CLI, run the following command:

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

    • 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the GKE API:

    gcloud services enable container.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

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

    • 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.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the GKE API:

    gcloud services enable container.googleapis.com
  12. 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 PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

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:

    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 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 adalah 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 mesh layanan 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 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 TLS Bersama (mTLS) diaktifkan secara default di Istio. Artinya, Istio memantau beban kerja server yang telah dimigrasikan ke proxy Istio dan secara otomatis mengonfigurasi proxy klien untuk membuat koneksi mTLS dengan beban kerja 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: Beban kerja 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 timbal balik.

Memastikan mTLS diaktifkan

Kiali adalah dasbor visibilitas berbasis web untuk mesh layanan Istio yang memberikan tampilan grafis lingkungan microservice, 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." \
        --role roles/monitoring.viewer
    gcloud iam service-accounts add-iam-policy-binding \
      monitoring@PROJECT_ID. \
        --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. --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 Proxy Envoy.

  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.

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 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 Grafik, lalu pilih opsi Keamanan di menu dropdown Tampilan. 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. Menghapus 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 berikutnya