Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Migrasikan sampel Bookstore OSM ke add-on Istio: Prosedur migrasi di tempat untuk kluster yang ada yang menjalankan add-on OSM.
- Referensi penerjemahan kebijakan Bookstore: Panduan langkah demi langkah sampel bersih yang menunjukkan cara menerjemahkan kebijakan OSM SMI ke padanan Istio pada kluster baru.
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.
Akses ke kluster AKS tempat Anda dapat mengaktifkan atau menonaktifkan add-on terkelola.
kubectlakses ke kluster.Sampel OSM Bookstore sudah di-deploy di namespace
bookbuyer,bookthief,bookstore, danbookwarehouse.Pilih revisi Istio untuk diinstal. Atur
LOCATIONke wilayah Azure untuk kluster AKS Anda, lalu cari revisi Istio yang didukung menggunakanaz aks mesh get-revisionsperintah :export LOCATION=<location>az aks mesh get-revisions --location ${LOCATION} -o tableAtur variabel yang digunakan di seluruh artikel ini. Atur
REVISIONke revisi yang dihasilkan oleh perintahaz 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:
- Simpan sumber daya SMI sebelum menonaktifkan add-on OSM.
- Nonaktifkan add-on OSM sebelum mengaktifkan add-on Istio terkelola.
- Hapus webhook admission OSM yang kedaluwarsa sebelum memberi label ulang pada namespace atau memulai ulang workload.
- 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.
- Hapus penanda namespace basi
openservicemesh.io/*selama pertukaran label. - Beri label pada ruang nama beban kerja dengan
istio.io/rev=<revision>. - Terapkan dan verifikasi sumber daya Istio hasil terjemahan yang aman digunakan dengan nama beban kerja dan selektor yang sudah ada.
- Gulung pengontrol beban kerja yang ada sehingga pod pengganti dibuat dengan sidecar Istio.
- 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.