Panduan migrasi dari add-on Open Service Mesh (OSM) ke add-on Istio

Penting

Artikel ini memperkenalkan cara mengidentifikasi konfigurasi add-on OSM dan menerjemahkannya ke konfigurasi add-on Istio yang setara. Ini bukan runbook migrasi produksi yang lengkap.

Artikel ini memetakan kebijakan add-on OSM ke kebijakan add-on Istio yang setara. Sumber dan tujuan dalam artikel ini keduanya merupakan add-on Azure Kubernetes Service (AKS) yang dikelola. Ini tidak mencakup migrasi dari Open Service Mesh upstream ke penginstalan Istio yang dikelola sendiri atau sumber terbuka. Ini menggunakan aplikasi sampel OSM Bookstore sebagai referensi untuk pengguna add-on OSM saat ini. Artikel ini memiliki dua bagian independen:

Jika Anda tidak menggunakan OSM dan baru menggunakan add-on Istio terkelola, mulailah dengan Instal add-on Istio. Jika saat ini Anda menggunakan OSM, tinjau panduan aplikasi contoh OSM Bookstore sebelum melanjutkan. Panduan berikut ini tidak menduplikasi dokumentasi OSM dan mereferensikan topik tertentu jika relevan. Pastikan Anda memahami arsitektur aplikasi Bookstore sebelum melanjutkan.

Prasyarat

  • Langganan Azure dengan kluster AKS yang sudah ada yang menjalankan add-on OSM.

  • Azure CLI terpasang.

  • Akses ke kluster AKS tempat Anda dapat mengaktifkan atau menonaktifkan add-on terkelola.

  • kubectl akses ke kluster.

  • Sampel OSM Bookstore sudah di-deploy di namespace bookbuyer, bookthief, bookstore, dan bookwarehouse.

  • Pilih revisi Istio untuk diinstal. Atur LOCATION ke wilayah Azure untuk kluster AKS Anda, lalu cari revisi Istio yang didukung menggunakan az aks mesh get-revisions perintah :

    export LOCATION=<location>
    
    az aks mesh get-revisions --location ${LOCATION} -o table
    
  • Atur variabel yang digunakan di seluruh artikel ini. Atur REVISION ke revisi yang dihasilkan oleh perintah az aks mesh get-revisions:

    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER=<cluster-name>
    export REVISION=<revision>
    export BOOKSTORE_NAMESPACES="bookbuyer bookthief bookstore bookwarehouse"
    

Migrasikan sampel OSM Bookstore ke add-on Istio

Add-on OSM dan add-on Istio tidak dapat berjalan secara bersamaan pada kluster AKS yang sama. Prosedur ini memigrasikan sampel OSM Bookstore tanpa menghapus kluster, namespace layanan, layanan, atau pengontrol beban kerja. Pod yang sedang berjalan tidak diubah secara langsung. Pod yang ada tetap menggunakan sidecar OSM hingga kontrolernya membuat pod pengganti setelah namespace diberi label untuk revisi Istio terkelola.

Warning

Migrasi ini menyebabkan gangguan layanan. Menonaktifkan add-on OSM langsung menghentikan penegakan kebijakan lalu lintas SMI: mTLS dan kontrol akses tidak lagi diterapkan meskipun pod yang ada masih berjalan. Periode antara menonaktifkan OSM dan merampungkan rollout Istio membuat workload tidak memiliki keamanan atau kebijakan perutean pada tingkat mesh. Setiap penggantian pod selama periode ini (restart rollout, peristiwa penskalaan, eviksi node, atau crash loop) menghasilkan pod yang tidak memiliki sidecar OSM maupun sidecar Istio hingga namespace diberi label dan pod dibuat ulang. Rencanakan waktu henti aplikasi atau jendela ketersediaan berkurang untuk beban kerja produksi, dan validasi prosedur penuh dalam kluster non-produksi terlebih dahulu. Pengaturan pemeliharaan terencana AKS tidak menjadwalkan atau mengontrol migrasi manual ini.

Migrasi di bawah ini menggunakan urutan pembersihan berikut:

  1. Simpan sumber daya SMI sebelum menonaktifkan add-on OSM.
  2. Nonaktifkan add-on OSM sebelum mengaktifkan add-on Istio terkelola.
  3. Hapus webhook admission OSM yang kedaluwarsa sebelum memberi label ulang pada namespace atau memulai ulang workload.
  4. Biarkan CRD OSM dan SMI tetap ada selama pengaktifan Istio terkelola dan peluncuran beban kerja, kecuali jika validasi Anda sendiri menunjukkan bahwa CRD tersebut menghambat pengaktifan, admission, atau peluncuran.
  5. Hapus penanda namespace basi openservicemesh.io/* selama pertukaran label.
  6. Beri label pada ruang nama beban kerja dengan istio.io/rev=<revision>.
  7. Terapkan dan verifikasi sumber daya Istio hasil terjemahan yang aman digunakan dengan nama beban kerja dan selektor yang sudah ada.
  8. Gulung pengontrol beban kerja yang ada sehingga pod pengganti dibuat dengan sidecar Istio.
  9. Hapus hanya CRD OSM dan SMI yang tersisa setelah pod yang dimigrasikan siap.

Verifikasi status OSM Bookstore

Verifikasi bahwa add-on OSM diaktifkan dan add-on Istio terkelola tidak diaktifkan:

az aks show \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --query "{openServiceMesh:addonProfiles.openServiceMesh.enabled, serviceMeshProfile:serviceMeshProfile}"

Nilai openServiceMesh.enabled harus berupa true. Nilai serviceMeshProfile harus null atau ditampilkan mode: disabled sebelum migrasi dimulai.

Verifikasi bahwa sarana kontrol OSM sudah siap:

kubectl wait -n kube-system --for=condition=Ready pod -l app=osm-controller --timeout=10m
kubectl wait -n kube-system --for=condition=Ready pod -l app=osm-injector --timeout=10m
kubectl wait -n kube-system --for=condition=Ready pod -l app=osm-bootstrap --timeout=10m

Pastikan bahwa pod Bookstore sedang berjalan dan memiliki beberapa kontainer yang siap. Pod yang diinjeksi OSM mencakup kontainer init osm-init dan kontainer sidecar envoy.

kubectl get pods -A -o wide | grep -E '^(bookbuyer|bookstore|bookthief|bookwarehouse)'

Contoh singkat berikut menunjukkan pod Bookstore dengan beberapa kontainer yang siap digunakan:

bookbuyer       bookbuyer-58c7699cb7-fxzvz       2/2   Running   0   51s   10.224.0.20   aks-nodepool1-32739176-vmss000002   <none>   <none>
bookstore       bookstore-7696584686-6zdkn       2/2   Running   0   50s   10.224.0.71   aks-nodepool1-32739176-vmss000001   <none>   <none>
bookthief       bookthief-77bf8c9b76-vswxz       2/2   Running   0   50s   10.224.0.15   aks-nodepool1-32739176-vmss000002   <none>   <none>
bookwarehouse   bookwarehouse-6b94d668f7-vksf4   2/2   Running   0   49s   10.224.0.82   aks-nodepool1-32739176-vmss000001   <none>   <none>
bookwarehouse   mysql-0                          3/3   Running   0   48s   10.224.0.17   aks-nodepool1-32739176-vmss000002   <none>   <none>

Pastikan bahwa pod yang diinjeksikan menyertakan kontainer OSM:

for NAMESPACE in ${BOOKSTORE_NAMESPACES}; do
  kubectl get pods -n ${NAMESPACE} \
    -o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\tinit="}{range .spec.initContainers[*]}{.name}{","}{end}{"\tcontainers="}{range .spec.containers[*]}{.name}{","}{end}{"\n"}{end}'
done

Verifikasi sumber daya SMI yang digunakan oleh sampel:

kubectl get traffictargets.access.smi-spec.io,httproutegroups.specs.smi-spec.io,tcproutes.specs.smi-spec.io,trafficsplits.split.smi-spec.io -A

Periksa log Bookbuyer sebelum mengubah mesh:

kubectl logs -n bookbuyer deploy/bookbuyer -c bookbuyer --tail=20

Secara opsional, mulai aliran log Bookbuyer berkelanjutan untuk memantau ketersediaan aplikasi. Pertahankan aliran tetap berjalan selama pelabelan ulang namespace dan peluncuran workload jika Anda ingin log mencakup seluruh periode migrasi.

BOOKBUYER_LOG=bookbuyer-migration.log
kubectl logs -n bookbuyer deploy/bookbuyer -c bookbuyer --timestamps --since=10s -f > ${BOOKBUYER_LOG} 2>&1 &
BOOKBUYER_LOG_PID=$!

Menyimpan konfigurasi kebijakan SMI

Simpan sumber daya SMI sebelum pembersihan akhir OSM dan API SMI. Gunakan berkas-berkas ini untuk merencanakan penerjemahan dan pengembalian.

mkdir -p osm-smi-backup

kubectl get traffictargets.access.smi-spec.io -A -o yaml > osm-smi-backup/traffic-targets.yaml
kubectl get httproutegroups.specs.smi-spec.io -A -o yaml > osm-smi-backup/http-route-groups.yaml
kubectl get tcproutes.specs.smi-spec.io -A -o yaml > osm-smi-backup/tcp-routes.yaml
kubectl get trafficsplits.split.smi-spec.io -A -o yaml > osm-smi-backup/traffic-splits.yaml

Jangan mengandalkan webhook OSM, CRD, label, atau anotasi yang tersisa sebagai status rollback setelah add-on dinonaktifkan.

Terjemahkan sumber daya SMI yang disimpan ke sumber daya Istio menggunakan contoh kebijakan nanti di artikel:

Sumber daya atau perilaku OSM Padanan Istio
Proses orientasi namespace OSM istio.io/rev=<revision> label ruang nama
Injeksi sidecar OSM Injeksi sidecar Istio untuk revisi yang dipilih
TrafficTarget, HTTPRouteGroup, dan TCPRoute AuthorizationPolicy
TrafficSplit VirtualService dan DestinationRule
Kebijakan lalu lintas permisif OSM dan pengaturan mTLS PeerAuthentication dan AuthorizationPolicy

Terapkan dan verifikasi resource Istio hasil konversi untuk beban kerja Anda sebelum menganggap migrasi telah selesai. Langkah-langkah Bookstore in-place di bagian ini memverifikasi perubahan control plane dan rollout sidecar. Mereka tidak secara otomatis menerapkan contoh kebijakan di bagian referensi, dan manifes sampel bersih nanti dalam artikel ini harus disesuaikan sebelum Anda menerapkannya ke namespace yang ada.

Menonaktifkan add-on OSM

Nonaktifkan add-on OSM:

az aks disable-addons \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --addons open-service-mesh

Verifikasi bahwa add-on OSM dinonaktifkan:

az aks show \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --query "{openServiceMesh:addonProfiles.openServiceMesh.enabled, serviceMeshProfile:serviceMeshProfile}"

Nilainya openServiceMesh.enabled harus false atau null. Nilai serviceMeshProfile harus tetap tidak berubah sampai Istio terkelola diaktifkan.

Verifikasi bahwa pod Bookstore yang ada masih berjalan:

kubectl get pods -n bookbuyer
kubectl get pods -n bookthief
kubectl get pods -n bookstore
kubectl get pods -n bookwarehouse

Pod yang ada mungkin masih menyertakan sidecar OSM setelah OSM dinonaktifkan. Ini diharapkan. Mereka diganti ketika kontrolernya diproses pada tahap berikutnya dalam prosedur.

Hapus sisa hambatan persetujuan OSM

Periksa apakah penerimaan OSM residu masih memengaruhi namespace beban kerja:

kubectl run osm-admission-probe \
  --namespace bookbuyer \
  --image mcr.microsoft.com/oss/nginx/nginx:1.25.5 \
  --restart Never \
  --dry-run=server \
  -o yaml

Hapus konfigurasi webhook add-on AKS OSM. Jika eksekusi kering gagal karena Kubernetes tidak dapat memanggil osm-injector layanan, pembersihan ini akan menghapus pemblokir penerimaan.

kubectl delete mutatingwebhookconfiguration aks-osm-webhook-osm --ignore-not-found
kubectl delete validatingwebhookconfiguration aks-osm-validator-mesh-osm --ignore-not-found

Hapus konfigurasi webhook ini sebelum memberi label ulang pada namespace atau memulai ulang beban kerja. Webhook OSM sisa yang bermasalah dapat memblokir pembuatan pod untuk verifikasi, rollout workload, atau pengujian rollback.

Konfirmasikan bahwa penerimaan pod sisi server berhasil setelah pembersihan webhook:

kubectl run osm-admission-probe \
  --namespace bookbuyer \
  --image mcr.microsoft.com/oss/nginx/nginx:1.25.5 \
  --restart Never \
  --dry-run=server \
  -o yaml

Verifikasi bahwa tidak ada webhook penerimaan OSM yang tersisa:

kubectl get mutatingwebhookconfiguration,validatingwebhookconfiguration | grep -i osm || true

Inventarasikan OSM dan CRD SMI yang tersisa sebelum mengaktifkan Istio terkelola. Biarkan CRD ini diberlakukan kecuali validasi menunjukkan mereka memblokir pengaktifan, penerimaan, atau peluncuran.

kubectl get crd | grep -E 'openservicemesh.io|smi-spec.io' || true

Mengaktifkan add-on Istio dan memindahkan beban kerja

Aktifkan add-on Istio yang dikelola:

az aks mesh enable \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --revision ${REVISION}

Verifikasi status add-on Istio terkelola:

az aks show \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --query "{mode:serviceMeshProfile.mode, revisions:serviceMeshProfile.istio.revisions}"

Nilainya mode harus Istio, dan daftar revisi harus menyertakan revisi yang dipilih.

Tunggu bidang kontrol Istio dan webhook injektor:

kubectl wait -n aks-istio-system --for=condition=Ready pod -l app=istiod --timeout=10m
kubectl get mutatingwebhookconfiguration | grep istio-sidecar-injector

Hapus penanda namespace OSM yang kedaluwarsa dan beri label pada namespace Bookstore dengan revisi Istio yang dikelola. Jangan gunakan istio-injection=enabled dengan add-on Istio terkelola AKS.

for NAMESPACE in ${BOOKSTORE_NAMESPACES}; do
  kubectl label namespace ${NAMESPACE} openservicemesh.io/monitored-by- --overwrite
  kubectl annotate namespace ${NAMESPACE} openservicemesh.io/sidecar-injection- --overwrite
  kubectl label namespace ${NAMESPACE} istio.io/rev=${REVISION} --overwrite
done

Terapkan dan verifikasi resource Istio hasil terjemahan yang aman untuk nama workload dan selector yang sudah ada sebelum melakukan rolling update pada controller. File yang tepat bergantung pada sumber daya SMI yang Anda simpan dan terjemahkan.

kubectl apply -f translated-istio-resources.yaml
kubectl get peerauthentication,authorizationpolicy,destinationrule,virtualservice -A

Jangan hapus API OSM atau SMI hingga kebijakan Istio yang setara dan perilaku perutean diverifikasi untuk beban kerja Anda.

Gulung pengontrol yang ada sehingga Kubernetes membuat pod pengganti dengan sidecar Istio. Urutan berikut cocok dengan alur validasi sampel:

kubectl rollout restart -n bookwarehouse deployment/bookwarehouse
kubectl rollout status -n bookwarehouse deployment/bookwarehouse --timeout=10m

kubectl rollout restart -n bookwarehouse statefulset/mysql
kubectl rollout status -n bookwarehouse statefulset/mysql --timeout=10m

kubectl rollout restart -n bookstore deployment/bookstore
kubectl rollout status -n bookstore deployment/bookstore --timeout=10m

kubectl rollout restart -n bookthief deployment/bookthief
kubectl rollout status -n bookthief deployment/bookthief --timeout=10m

kubectl rollout restart -n bookbuyer deployment/bookbuyer
kubectl rollout status -n bookbuyer deployment/bookbuyer --timeout=10m

Verifikasi bahwa pod pengganti meliputi istio-proxy:

for NAMESPACE in ${BOOKSTORE_NAMESPACES}; do
  kubectl get pods -n ${NAMESPACE} \
    -o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\tinit="}{range .spec.initContainers[*]}{.name}{","}{end}{"\tcontainers="}{range .spec.containers[*]}{.name}{","}{end}{"\n"}{end}'
done

Periksa Bookbuyer setelah peluncuran:

kubectl logs -n bookbuyer deploy/bookbuyer -c bookbuyer --tail=20

Jika aliran log Bookbuyer dimulai, hentikan dan periksa sampel yang dikumpulkan. Pastikan stempel waktu mencakup periode pelabelan ulang dan peluncuran sebelum menggunakan log tersebut sebagai bukti ketersediaan.

kill ${BOOKBUYER_LOG_PID}
wait ${BOOKBUYER_LOG_PID} 2>/dev/null || true

grep "MAESTRO! THIS TEST FAILED!" ${BOOKBUYER_LOG} || true
grep "MAESTRO! THIS TEST SUCCEEDED!" ${BOOKBUYER_LOG} | tail

Setelah pod yang dimigrasikan siap, tinjau inventaris CRD dan hapus CRD OSM dan SMI yang tersisa sebagai langkah pembersihan akhir. Menghapus CRD akan menghapus seluruh resource kustom untuk CRD tersebut di seluruh kluster, bukan hanya contoh Bookstore. Jangan jalankan pembersihan ini sampai Anda mengonfirmasi tidak ada beban kerja yang tersisa tergantung pada sumber daya OSM atau SMI.

kubectl delete crd \
  egresses.policy.openservicemesh.io \
  httproutegroups.specs.smi-spec.io \
  ingressbackends.policy.openservicemesh.io \
  meshconfigs.config.openservicemesh.io \
  meshrootcertificates.config.openservicemesh.io \
  retries.policy.openservicemesh.io \
  tcproutes.specs.smi-spec.io \
  trafficsplits.split.smi-spec.io \
  traffictargets.access.smi-spec.io \
  upstreamtrafficsettings.policy.openservicemesh.io \
  --ignore-not-found

Verifikasi status final add-on dan status residual OSM:

az aks show \
  --resource-group ${RESOURCE_GROUP} \
  --name ${CLUSTER} \
  --query "{openServiceMesh:addonProfiles.openServiceMesh.enabled, serviceMeshProfile:serviceMeshProfile}"
kubectl get mutatingwebhookconfiguration,validatingwebhookconfiguration | grep -i osm || true
kubectl get crd | grep -E 'openservicemesh.io|smi-spec.io' || true

Status akhir AKS harus menampilkan OSM yang dinonaktifkan dan Istio terkelola yang diaktifkan. Jika Anda menghapus CRD OSM dan SMI yang tersisa, pemeriksaan sumber daya OSM yang tersisa seharusnya tidak menampilkan sumber daya apa pun.

Referensi terjemahan kebijakan toko buku

Bagian selanjutnya dari artikel ini menggunakan penerapan contoh Bookstore yang bersih untuk mendemonstrasikan cara menerjemahkan sumber daya OSM SMI dan manifes beban kerja menjadi sumber daya Istio. Dalam migrasi, terapkan jenis perubahan yang sama pada manifes yang ada dan gulung pengontrol beban kerja yang ada alih-alih menghapus dan membuat ulang aplikasi.

Note

Jalankan referensi terjemahan kebijakan di kluster terpisah atau hapus namespace Bookstore yang ada sebelum menjalankan perintah penyebaran sampel. Perintah kubectl create namespace gagal jika namespace sudah ada. Klaster target harus sudah mengaktifkan add-on Istio terkelola.

Untuk memungkinkan Istio mengelola aplikasi Bookstore OSM, perbarui manifes layanan Bookstore dan MySQL yang ada.

Perubahan toko buku

Sebelum Anda menerjemahkan kebijakan lalu lintas OSM, tinjau cara Istio menangani manajemen lalu lintas.

Istio menggunakan kombinasi VirtualService dan DestinationRule untuk perutean lalu lintas. Tinjau konsep layanan virtual dan aturan tujuan sebelum Anda melanjutkan.

Layanan virtual Istio mendefinisikan aturan perutean untuk klien yang meminta host, yang merupakan nama layanan. Aturan tujuan menentukan kebijakan lalu lintas untuk layanan tersebut.

Layanan Istio Bookstore dan perubahan deployment menjaga aplikasi Bookstore tetap berada di belakang layanan bookstore. Versi Istio dari manifes OSM traffic-access-v1.yaml ditampilkan di Membuat pod, layanan, dan akun layanan.

Modifikasi MySQL

Perubahan pada MySQL StatefulSet hanya diperlukan dalam konfigurasi layanan. Di bawah spesifikasi layanan, OSM memerlukan atribut targetPort dan appProtocol. Atribut ini tidak diperlukan untuk Istio. Pertahankan nama layanan sebagai mysql karena sampel Bookstore dan MySQL StatefulSet menggunakan nama tersebut. Layanan yang diperbarui berikut ini terlihat seperti contoh ini:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: bookwarehouse
  labels:
    app: mysql
    service: mysql
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysql
  clusterIP: None

Menyebarkan aplikasi Bookstore yang dimodifikasi

Mirip dengan panduan langkah demi langkah Bookstore OSM, contoh ini dimulai dengan instalasi baru aplikasi toko buku. Penyebaran sampel ini menunjukkan alur terjemahan kebijakan. Untuk beban kerja yang ada, gunakan pola migrasi setempat yang dijelaskan sebelumnya dalam artikel ini.

Buat namespace

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse

Tambahkan label ruang nama untuk injeksi sidecar Istio

Untuk OSM, menggunakan perintah osm namespace add <namespace> membuat anotasi yang diperlukan ke namespace untuk pengontrol OSM untuk menambahkan injeksi sidecar otomatis. Dengan add-on Istio terkelola, beri label pada namespace dengan revisi Istio yang terinstal agar pengontrol Istio dapat menyisipkan proksi sidecar Envoy. Label bawaan istio-injection=enabled tidak mengaktifkan injeksi sidecar untuk add-on Istio.

for NAMESPACE in ${BOOKSTORE_NAMESPACES}; do
  kubectl label namespace ${NAMESPACE} istio.io/rev=${REVISION}
done

Menyebarkan layanan virtual Istio untuk Bookstore

Terapkan layanan virtual untuk layanan bookstore.

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
EOF

Membuat pod, layanan, dan akun layanan

Gunakan satu file manifes yang berisi modifikasi yang dibahas sebelumnya dalam panduan langkah demi langkah untuk menerapkan aplikasi bookbuyer, bookthief, bookstore, bookwarehouse, dan mysql.

kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookbuyer
  namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookbuyer
      version: v1
  template:
    metadata:
      labels:
        app: bookbuyer
        version: v1
    spec:
      serviceAccountName: bookbuyer
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookbuyer
          image: openservicemesh/bookbuyer:latest-main
          imagePullPolicy: Always
          command: ["/bookbuyer"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookthief
  namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookthief
  namespace: bookthief
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookthief
  template:
    metadata:
      labels:
        app: bookthief
        version: v1
    spec:
      serviceAccountName: bookthief
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookthief
          image: openservicemesh/bookthief:latest-main
          imagePullPolicy: Always
          command: ["/bookthief"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
            - name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
              value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
  name: bookstore
  namespace: bookstore
  labels:
    app: bookstore
spec:
  ports:
    - port: 14001
      name: bookstore-port
  selector:
    app: bookstore

---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookstore
  namespace: bookstore

---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v1
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v1
  template:
    metadata:
      labels:
        app: bookstore
        version: v1
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v1

##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
  labels:
    app: bookwarehouse
spec:
  ports:
  - port: 14001
    name: bookwarehouse-port
  selector:
    app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookwarehouse
  template:
    metadata:
      labels:
        app: bookwarehouse
        version: v1
    spec:
      serviceAccountName: bookwarehouse
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookwarehouse
          image: openservicemesh/bookwarehouse:latest-main
          imagePullPolicy: Always
          command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysql
  namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: bookwarehouse
  labels:
    app: mysql
    service: mysql
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: bookwarehouse
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      serviceAccountName: mysql
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
        - name: MYSQL_DATABASE
          value: booksdemo
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /mysql-data
          name: data
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 10
      volumes:
        - name: data
          emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 250M
EOF

Untuk melihat sumber daya ini di kluster Anda, jalankan perintah berikut:

kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief

kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse

Menampilkan UI aplikasi

Mirip dengan panduan OSM asli, jika Anda memiliki repositori OSM yang dikloning, Anda dapat menggunakan skrip penerusan port untuk melihat UI aplikasi. Untuk informasi selengkapnya, lihat Menampilkan UI aplikasi. Untuk saat ini, hanya tampilkan antarmuka bookbuyer dan bookthief.

cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF

Di browser, buka URL berikut:

http://localhost:8080 - pembeli buku

http://localhost:8083 - pencuri buku

Mengonfigurasi kebijakan lalu lintas Istio

Untuk menjaga terjemahan Istio tetap selaras dengan panduan langkah demi langkah Bookstore OSM yang asli, mulailah dengan mode kebijakan lalu lintas permisif OSM. Mode kebijakan lalu lintas permisif OSM mengizinkan atau menolak lalu lintas dalam mesh ketika tidak ada aturan SMI Traffic Access Control tertentu yang diterapkan. Mode ini memungkinkan pengguna melakukan onboarding aplikasi ke dalam jala dan mendapatkan enkripsi mTLS sebelum mereka menentukan aturan izin eksplisit. Anda dapat mengatur nilai ini ke true atau false melalui MeshConfig OSM.

Istio menangani penegakan mTLS secara berbeda. Tidak seperti OSM, mode permisif Istio secara otomatis mengonfigurasi proksi sidecar untuk menggunakan mTLS dan memungkinkan layanan untuk menerima lalu lintas teks biasa dan mTLS. Gunakan pengaturan Istio PeerAuthentication sebagai yang setara dengan konfigurasi mode permisif OSM. Anda dapat mengonfigurasi PeerAuthentication untuk namespace atau untuk seluruh mesh. Untuk informasi selengkapnya, baca artikel Migrasi TLS Bersama Istio.

Menerapkan mode ketat Istio pada namespace Bookstore

Ingatlah bahwa, seperti mode permisif OSM, konfigurasi Istio PeerAuthentication hanya berlaku untuk penegakan mTLS. Istio menangani kebijakan layer-7, seperti yang digunakan dalam HTTPRouteGroups OSM, dengan konfigurasi AuthorizationPolicy.

Atur namespace bookbuyer, bookthief, bookstore, dan bookwarehouse ke mode mTLS ketat Istio.

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookthief
  namespace: bookthief
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookstore
  namespace: bookstore
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  mtls:
    mode: STRICT
EOF

Menyebarkan kebijakan kontrol akses Istio

OSM menggunakan resource SMI Traffic Target dan SMI Traffic Specs untuk menetapkan kontrol akses dan kebijakan perutean bagi komunikasi aplikasi. Istio menyediakan kontrol terperinci yang serupa melalui konfigurasi AuthorizationPolicy.

Contoh berikut menerjemahkan kebijakan bookstore TrafficTarget, yang memungkinkan bookbuyer untuk berkomunikasi dengan bookstore dengan menggunakan jalur, header, dan metode layer-7 tertentu. Konten ini adalah bagian dari manifes traffic-access-v1.yaml .

kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
  name: bookstore
  namespace: bookstore
spec:
  destination:
    kind: ServiceAccount
    name: bookstore
    namespace: bookstore
  rules:
    - kind: HTTPRouteGroup
      name: bookstore-service-routes
      matches:
        - buy-a-book
        - books-bought
  sources:
    - kind: ServiceAccount
      name: bookbuyer
      namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

Dalam kebijakan TrafficTarget, spec.destination menentukan layanan tujuan dan spec.sources menentukan layanan sumber yang diotorisasi. Dalam contoh ini, bookbuyer dapat berkomunikasi dengan bookstore. Istio AuthorizationPolicy yang setara terlihat seperti contoh ini:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: bookstore
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer"]

Dalam Istio AuthorizationPolicy, layanan tujuan TrafficTarget OSM dipetakan ke namespace kebijakan dan kecocokan label selektor. Layanan sumber dipetakan ke atribut source.serviceAccounts di bawah rules.from.

Selain konfigurasi sumber dan tujuan di OSM TrafficTarget, OSM mengikat HTTPRouteGroup untuk menentukan otorisasi layer-7 untuk sumber. HTTPRouteGroup berikut ini mencakup dua matches untuk layanan sumber yang diizinkan.

apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

Pencocokan books-bought memungkinkan sumber mengakses path /books-bought dengan menggunakan metode GET dengan informasi header user-agent dan client-app. Pencocokan buy-a-book menggunakan ekspresi reguler untuk jalur yang berisi .*a-book.*new dengan metode GET.

Tentukan konfigurasi HTTPRouteGroup OSM ini di bagian aturan Istio AuthorizationPolicy. Pastikan kondisi sumber, operasi, dan header tetap berada dalam aturan yang sama agar tidak memungkinkan permintaan terpisah secara sendiri-sendiri. Kolom string pada Istio AuthorizationPolicy mendukung pencocokan tepat, awalan, akhiran, dan keberadaan, bukan ekspresi reguler SMI sembarang. Contoh berikut menggunakan path yang persis dan awalan user-agent klien HTTP Go yang sesuai dengan contoh Bookstore. Untuk beban kerja Anda, terjemahkan setiap SMI pathRegex dan regex header ke kecocokan Istio eksplisit yang mempertahankan akses yang Anda maksudkan.

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/books-bought"]
      when:
        - key: request.headers[user-agent]
          values: ["Go-http-client/*"]
        - key: request.headers[client-app]
          values: ["bookbuyer"]
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/buy-a-book/new"]

Sebarkan manifes traffic-access-v1.yaml yang dimigrasikan OSM sebagai Istio AuthorizationPolicy. Tidak ada AuthorizationPolicy untuk bookthief, sehingga UI bookthief harus berhenti menambah jumlah buku dari bookstore v1:

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/books-bought"]
      when:
        - key: request.headers[user-agent]
          values: ["Go-http-client/*"]
        - key: request.headers[client-app]
          values: ["bookbuyer"]
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/buy-a-book/new"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookstore/bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookwarehouse/bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

Mengizinkan aplikasi Bookthief mengakses Bookstore

Belum ada AuthorizationPolicy yang saat ini memungkinkan bookthief berkomunikasi dengan bookstore. Terapkan berikut AuthorizationPolicy untuk memungkinkan bookthief berkomunikasi dengan bookstore. Perhatikan aturan tambahan dalam kebijakan toko buku yang mengizinkan pencuri buku mengaksesnya.

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer", "bookthief/bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/books-bought"]
      when:
        - key: request.headers[user-agent]
          values: ["Go-http-client/*"]
        - key: request.headers[client-app]
          values: ["bookbuyer"]
    - from:
        - source:
            serviceAccounts: ["bookbuyer/bookbuyer", "bookthief/bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["/buy-a-book/new"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookstore/bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            serviceAccounts: ["bookwarehouse/bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

UI bookthief sekarang seharusnya menambahkan jumlah buku dari bookstore.

Ringkasan

Panduan ini menunjukkan cara memigrasikan kebijakan OSM ke kebijakan Istio. Untuk mempelajari cara menyebarkan dan mengoperasikan add-on Istio terkelola di AKS, lihat Menginstal add-on Istio. Tinjau konsep Istio upstream saat Anda memerlukan latar belakang pada API Istio dan perilaku manajemen lalu lintas.