Saat menggunakan Service Mesh (ASM) untuk mengelola beberapa kluster, Anda dapat mendistribusikan beban kerja layanan di seluruh kluster tersebut. Secara default, ASM melakukan load-balancing terhadap lalu lintas ke layanan tersebut di semua kluster. Untuk menjaga lalu lintas tetap berada dalam kluster asalnya, gunakan fitur keeping traffic in-cluster. Topik ini menggunakan aplikasi Bookinfo untuk menunjukkan cara mengaktifkan fitur ini dalam lingkungan multi-kluster.
Prasyarat
-
Dua kluster ACK telah dibuat dalam VPC yang sama. Dalam topik ini, kluster tersebut diberi nama m1c1 dan m1c2. Untuk informasi lebih lanjut, lihat Create an ACK dedicated cluster (discontinued).
-
Sebuah instans ASM versi 1.15.3.101 atau yang lebih baru telah dibuat. Dalam topik ini, instans tersebut diberi nama mesh1. Untuk informasi lebih lanjut, lihat Create an ASM instance.
Persiapan
Langkah 1: Konfigurasikan konektivitas antar-kluster
(Opsional) Ganti nama security group
Ganti nama security group untuk kedua kluster agar lebih mudah diidentifikasi. Dalam contoh ini, Security Group Name diatur menjadi m1c1-sg dan m1c2-sg.
Luaskan untuk melihat cara mengganti nama grup keamanan Kluster
-
Masuk ke ECS console. Di panel navigasi sebelah kiri, pilih .
-
Di bilah navigasi atas, pilih wilayah tempat instans ECS target berada.
-
Pada halaman Security Groups, arahkan kursor ke nama security group target, klik ikon
, masukkan nama baru, lalu klik OK.
Tambahkan aturan security group
Tambahkan aturan security group yang memungkinkan kluster saling mengakses satu sama lain. Di pengaturan security group m1c1-sg, tambahkan aturan untuk mengizinkan akses dari m1c2-sg. Demikian pula, untuk security group m1c2-sg, tambahkan aturan untuk mengizinkan akses dari m1c1-sg. Untuk informasi lebih lanjut, lihat Add a security group rule.
Tambahkan aturan dalam arah inbound: atur Authorization Policy ke Allow, Protocol Type ke All, Port Range ke -1/-1, Authorization Type ke Security Group Access, dan Priority ke 1.
Langkah 2: Tambahkan kluster dan sebarkan ingress gateway
Setelah Anda menambahkan kedua kluster ke instans ASM, keduanya mendapatkan akses timbal balik. Oleh karena itu, Anda hanya perlu menyebarkan ingress gateway untuk salah satunya.
-
Tambahkan dua kluster ke instans ASM. Untuk informasi lebih lanjut, lihat Add a cluster to an ASM instance.
-
Sebarkan ingress gateway untuk kluster m1c1. Untuk informasi lebih lanjut, lihat Create an ingress gateway.
Langkah 3: Sebarkan Bookinfo di setiap kluster
Untuk memverifikasi fitur keeping traffic in-cluster, topik ini menggunakan dua aplikasi Bookinfo yang sedikit berbeda. Satu-satunya perbedaan terletak pada versi layanan Reviews: m1c1 menjalankan v1, sedangkan m1c2 menjalankan v2.
-
Gunakan file YAML berikut untuk menyebarkan aplikasi Bookinfo dengan deployment Reviews v1 di kluster m1c1. Untuk informasi lebih lanjut, lihat Deploy an application in a cluster associated with an ASM instance.
Deployment v1 layanan Reviews tidak menampilkan peringkat bintang di bagian ulasan buku.
Klik untuk melihat file YAML aplikasi Bookinfo di m1c1
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.20.1
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
-
Gunakan file YAML berikut untuk menyebarkan aplikasi Bookinfo dengan deployment Reviews v2 di kluster m1c2.
Deployment v2 layanan Reviews menampilkan peringkat sebagai bintang hitam di bagian ulasan buku.
Klik untuk melihat file YAML aplikasi Bookinfo di m1c2
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
cluster: m1c2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.20.1
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
Langkah 4: Buat gateway, virtual service, dan destination rule
-
Gunakan file YAML berikut untuk membuat gateway di namespace default instans ASM. Untuk informasi lebih lanjut, lihat Manage gateways.
Klik untuk melihat file YAML gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
-
Gunakan file YAML berikut untuk membuat virtual service di namespace default instans ASM. Untuk informasi lebih lanjut, lihat Manage virtual services.
Klik untuk melihat file YAML virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-cluster-local
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage1
rewrite:
uri: /productpage
route:
- destination:
host: productpage
port:
number: 9080
subset: m1c1
- match:
- uri:
exact: /productpage2
rewrite:
uri: /productpage
route:
- destination:
host: productpage
port:
number: 9080
subset: m1c2
- match:
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
-
Gunakan file YAML berikut untuk membuat destination rule di namespace default instans ASM. Untuk informasi lebih lanjut, lihat Manage destination rules.
Klik untuk melihat file YAML destination rule
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: productpage-cluster-local
spec:
host: productpage
subsets:
- name: m1c1
labels:
cluster: m1c1
- name: m1c2
labels:
cluster: m1c2
-
Di browser Anda, akses http://{IP address of the ingress gateway}/productpage1 atau http://{IP address of the ingress gateway}/productpage2 dan refresh halaman tersebut.
Jika peringkat bintang muncul secara bergantian di bagian ulasan buku, berarti aplikasi Bookinfo berhasil diterapkan. Halaman tersebut menampilkan productpage aplikasi BookInfo Sample, yang berisi informasi tentang buku The Comedy of Errors. Bagian Book Reviews di sebelah kanan menampilkan ulasan dari Reviewer1 (5 bintang) dan Reviewer2 (4 bintang).
Prosedur
Langkah-langkah berikut menjelaskan cara mengaktifkan fitur keeping traffic in-cluster untuk layanan tertentu, dalam hal ini layanan Reviews. Untuk informasi tentang cara mengaktifkan fitur ini secara global atau di tingkat namespace, lihat Operasi terkait.
-
Masuk ke ASM console. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Base Information, di bagian Config Info, klik Keep traffic in cluster di sebelah kanan edit.
-
Pada kotak dialog Configure services that keep traffic in cluster, aktifkan sakelar Enable Keep traffic in cluster, pilih Select Service, lalu klik Select services.
-
Pada kotak dialog Add services, pilih Service, pilih Namespace dari daftar drop-down Namespace, pilih Select services di bagian Select a service, klik ikon
, lalu klik OK.
-
Setelah konfigurasi selesai, klik Configure services that keep traffic in cluster pada kotak dialog OK.
Di bagian Config Info, Configured ditampilkan di sebelah kanan Keep traffic in cluster, yang menunjukkan bahwa fitur Keep traffic in cluster telah diaktifkan.
-
Verifikasi bahwa fitur keeping traffic in-cluster berfungsi.
-
Di browser Anda, akses http://{IP address of the ingress gateway}/productpage1 dan refresh halaman tersebut.
Bagian ulasan buku secara konsisten tidak menampilkan peringkat, yang mengonfirmasi bahwa fitur keeping traffic in-cluster berfungsi sebagaimana mestinya.
-
Di browser Anda, akses http://{IP address of the ingress gateway}/productpage2 dan refresh halaman tersebut.
Bagian ulasan buku secara konsisten menampilkan ulasan dengan peringkat bintang hitam. Halaman tersebut menampilkan dengan benar detail buku The Comedy of Errors dan konten ulasan di bagian Book Reviews, yang mengonfirmasi bahwa lalu lintas diarahkan dengan benar ke layanan lokal di kluster m1c2.
Analisis hasil
Diagram berikut menunjukkan alur lalu lintas di mesh sebelum dan sesudah fitur keeping traffic in-cluster diaktifkan.
|
Status
|
Deskripsi
|
|
Nonaktif
|
Dalam aplikasi Bookinfo, layanan Productpage memanggil layanan Reviews untuk mendapatkan ulasan buku. Saat Anda mengakses http://{IP address of the ingress gateway}/productpage1 di browser, Anda mengakses layanan Productpage di kluster m1c1. Saat Anda mengakses http://{IP address of the ingress gateway}/productpage2, Anda mengakses layanan Productpage di kluster m1c2.
Beban kerja untuk layanan Reviews ada di kedua kluster, yaitu m1c1 dan m1c2. Secara default, Service Mesh melakukan load-balancing terhadap permintaan ke layanan Reviews di kedua kluster, bahkan ketika traffic berasal dari layanan dalam salah satu kluster tersebut (misalnya, dari layanan Productpage di m1c1). Akibatnya, Anda melihat peringkat bintang muncul dan menghilang secara bergantian di bagian ulasan buku.
|
|
Aktif
|
Saat Anda mengakses layanan Productpage di kluster tertentu, seperti m1c1, Service Mesh tidak lagi melakukan load-balancing permintaan lintas kluster. Sebagai gantinya, semua permintaan diarahkan ke layanan Reviews lokal. Akibatnya, bagian ulasan buku secara konsisten tidak menampilkan peringkat bintang.
Penting
Setelah fitur ini diaktifkan, jika layanan reviews-v1 di kluster m1c1 gagal, layanan Productpage tidak dapat melakukan failover ke layanan reviews-v2 di kluster m1c2.
|
Catatan
Jika Anda mengaktifkan fitur keeping traffic in-cluster untuk suatu layanan, pemanggil hanya dapat mengakses titik akhir layanan tersebut dalam kluster yang sama. Bahkan jika titik akhir dalam kluster tersebut tidak tersedia, mesh tidak akan mengalihkan lalu lintas ke titik akhirnya di kluster lain.
Untuk menjaga lalu lintas tetap dalam kluster untuk suatu layanan sekaligus mengaktifkan failover, Anda dapat menggunakan aturan lalu lintas untuk membuat jalur lalu lintas dan mengaktifkan traffic shifting. Untuk informasi lebih lanjut, lihat Use traffic rules to configure traffic lanes and traffic shifting.
Operasi terkait
Aktifkan traffic in-cluster secara global
-
Pada halaman Base Information, di bagian Config Info, klik Keep traffic in cluster di sebelah kanan edit.
-
Pada kotak dialog Configure services that keep traffic in cluster, aktifkan sakelar Enable Keep traffic in cluster, pilih All Services, lalu klik OK.
Setelah opsi ini diaktifkan, Service Mesh menjaga seluruh lalu lintas tetap berada dalam kluster asalnya.
Aktifkan traffic in-cluster untuk namespace
-
Pada halaman Base Information, di bagian Config Info, klik Keep traffic in cluster di sebelah kanan edit.
-
Pada kotak dialog Configure services that keep traffic in cluster, aktifkan sakelar Enable Keep traffic in cluster, pilih Select Service, lalu klik Select services.
-
Pada kotak dialog Add services, pilih Namespace, pilih namespace target di bagian Select services, klik ikon
, lalu klik OK.
-
Pada kotak dialog Configure services that keep traffic in cluster, klik OK.
Setelah opsi ini diaktifkan, Service Mesh menjaga lalu lintas ke layanan dalam namespace target tetap berada dalam kluster asalnya.