Blog นี้ผมเกิดจากความอยากรู้จัก Istio และ Anthos Service Mesh ให้มากขึ้น เลยลองมาอ่านทำความเข้าใจและเรียบเรียงจาก Qwiklabs: Installing Anthos Service Mesh on Google Kubernetes Engine GSP654 ใช้ 7 credit เวลา 1.30 ชม.ใครสามารถอ่านตัวต้นฉบับภาษาอังกฤษได้ตามลิงค์เลยครับน่าจะเข้าใจได้ง่ายกว่า แปลยังไงไม่รู้ให้คำทับศัพย์เยอะกว่าภาษาไทย 555
ตัวละครตัวแรกเราจะมาเริ่มกันตรง Istio เรือใบสีฟ้าแห่งเมือง Manchester ผ่าง ไม่ใช่… Istio เป็น Open source framework สำหรับจัดการ microservices ให้แต่ละ Service สามารถเชื่อมต่อกันได้ และเพิ่มความปลอดภัยให้กับ microservices ที่เอาไปโฮสอยู่บน Kubernetes ตัว Istio จะทำให้คุณสามารถสร้าง network ให้กับ services ที่เรา deploy ขึ้นโดยสามารถทำ load balancing และจัดการ service-to-service authentication ให้ ทั้งยังคอย monitor service โดยที่คุณไม่ต้องไปเขียนโปรแกรมเพิ่มใน service ของคุณเลย
ยกตัวอย่างใน ระบบที่ออกแบบเป็น Reliable distributed system จะมีการ request ซ้ำอีกครั้งหลังจากที่เกิด failure มีชื่อเป็นทางการว่า exponential backoff delay หมายถึงหาก request ไปแล้วมันตายเราก็ต้องรอ request ใหม่และเพิ่มเวลาการเรียกครั้งใหม่ให้เยอะขึ้นเรื่อยๆจนถึงจำนวนครั้งที่ระบุไว้ ซึ่งวิธีพวกนี้สามารถเขียนเองได้ด้วย Java, Golang หรือ NodeJS ใครใคร่เขียนด้วยภาษาอะไร แบบไหนก็ต้องไปเขียน Handle กันเองเปลืองพลังงานกันไปอีก แต่ถ้าคุณใช้ความสามารถของ Istio sidecar มาจัดการแทนได้ คุณก็ไม่ต้องเขียนโปรแกรมให้เปลือง effort ( เวอร์ไปมั๊ยเนี่ยเค้าว่ามาอีกที )
ตัวละครตัวที่สอง Anthos Service Mesh (ASM) ตัวนี้แรกๆสับสนมากๆ ตอนนี้ก็ยังสับสน มันคืออะไรทำไม Google ถึงเชียร์ออกนอกหน้าขนาดนี้ ถือเป็นวาระแห่ง ชาติของ Google กันเลยทีเดียว ความสามารถเชื่อมจักวาล on-premise เข้ากับ cloud ได้อย่างลงตัว ด้วยตัว Anthos Service Mesh ที่เป็น distribution ของ Istio อีกที งง ใน งง
พอมันยิ่งใหญ่ขนาดที่ config ได้ทั้งบน GKE และ Anthos GKE on-prem ตัวมันก็เลยควรมีความสามารถที่คอยสอดส่อง และจัดการความปลอดภัยให้เป็นทางเดียวกันทั้งหมดไม่งั้นคงวุ่นวายน่าดู ความสามารถคร่าวๆของตัว Anthos Service Mesh มีประมาณนี้
จุดที่ทำให้ Anthos น่าสนใจอีกอย่างคือ ตอนนี้หมดโปร trial แล้วจ้า ใช้แบบ Subscription plan น่าถูกกว่าเดิม ตอน trial เดือนละ 15,000 usd เลยจ้า plan ใหม่ใช้เป็นรายชม.ก็จะ flexible และน่าจะถูกกว่าเดิม
ตัวโฆษณาช่วงแรกแค่เกริ่นนำเพราะ Blog นี้เราจะมาติดตั้ง Anthos Service Mesh บน GKE กัน
คนที่อ่านบทความหรือไปทำ lab จะได้ดูอะไรมั่งหลังจากนี้
Bookinfo Application
หลังจากนี้ผมจะใช้ Cloud Console ที่เป็น Free instance บน Google Cloud เพื่อทำการ setup นะครับใครยังไม่มีสมัคร Google Cloud มาใช้ก่อน Activate credit 300$ มาใช้ด้วยจะดีมาก ปล.ผมใช้บน Qwiklabs มันก็จะฟรีๆแต่ต้องรีบๆทำให้ทันเวลา
1. เข้าไปที่ Cloud Shell แล้ว enable api ที่เกี่ยวข้องตามนี้ เยอะเหมือนกัน
gcloud services enable \
container.googleapis.com \
compute.googleapis.com \
stackdriver.googleapis.com \
meshca.googleapis.com \
meshtelemetry.googleapis.com \
meshconfig.googleapis.com \
iamcredentials.googleapis.com \
anthos.googleapis.com \
gkeconnect.googleapis.com \
gkehub.googleapis.com \
cloudresourcemanager.googleapis.com
2. Config environment variable เอาไว้ใช้ใน step ต่อๆไปด้วย
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} \
— format=”value(projectNumber)”)
export CLUSTER_NAME=central
export CLUSTER_ZONE=us-central1-b
export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog
export MESH_ID=”proj-${PROJECT_NUMBER}”
3. Permission ขั้นต่ำที่ต้องใช้มีตามนี้แต่ถ้าใครมี project owner role อยู่แล้วก็จัดต่อได้เลย ไม่ต้องแคร์ให้เสียเวลา
To complete setup, you need the permissions associated with these roles:
4. Set up GKE cluster สร้างจาก command line หรือจะไปสร้างจาก Cloud Console ก็แล้วแต่สะดวกท่านผู้ชม
gcloud config set compute/
zone ${CLUSTER_ZONE} gcloud beta container clusters create ${CLUSTER_NAME} \
— machine-type=n1-standard-4 \
— num-nodes=4 \
— workload-pool=${WORKLOAD_POOL} \
— enable-stackdriver-kubernetes \
— subnetwork=default \
— labels mesh_id=${MESH_ID}
รอจนกว่าจะได้ cluster ขึ้นมา
5. Register cluster ก็เพราะ Anthos มันยอมให้เราเอา Kubernetes cluster ที่ไหนก็ได้มาต่อเข้ากับ Google Cloud ไม่ว่าจาก on-premise หรือจาก cloud เจ้าอื่นๆ เราเลยต้องเช็คก่อนว่าเรามี RBAC cluster-admin เปล่า เรียก command
kubectl auth can-i ‘*’ ‘*’ — all-namespaces
6. สร้าง Service Account เพื่อเชื่อมต่อ GKE
gcloud iam service-accounts create connect-sa
7. Assign gkehub.connect role ให้ service account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
— member=”serviceAccount:connect-sa@${PROJECT_ID}.iam.gserviceaccount.com” \
— role=”roles/gkehub.connect”
8. Create service account key เราก็จะได้ key เอามาไว้ในครอบครอง
gcloud iam service-accounts keys create connect-sa-key.json \
— iam-account=connect-sa@${PROJECT_ID}.iam.gserviceaccount.com
9. ใช้ key ที่ได้มา register cluster
gcloud container hub memberships register ${CLUSTER_NAME}-connect \
— gke-cluster=${CLUSTER_ZONE}/${CLUSTER_NAME} \
— service-account-key-file=./connect-sa-key.json
ถึงจุดนี้เราได้ทำการสร้าง GKE cluster และ grant gkehub.connect role ให้ service account เรียบร้อย
1. Initialize โปรเจ็คสำหรับการติดตั้ง service mesh โดยยิง curl เข้า meshconfig api
curl — request POST \ — header “Authorization: Bearer $(gcloud auth print-access-token)” \ — data ‘’ \ https://meshconfig.googleapis.com/v1alpha1/projects/${PROJECT_ID}:initialize
2. Download istio installation file
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.7-asm.0-linux.tar.gz
3. Download signature file และตรวจสอบ signature
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.7-asm.0-linux.tar.gz.1.sig openssl dgst -verify — -signature istio-1.4.7-asm.0-linux.tar.gz.1.sig istio-1.4.7-asm.0-linux.tar.gz <<’EOF’ — — -BEGIN PUBLIC KEY — — — MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== — — -END PUBLIC KEY — — — EOF
4. แตกไฟล์ tar istio
tar xzf istio-1.4.7-asm.0-linux.tar.gz
5. เข้าไป folder istio-1.4.7-asm.0
cd istio-1.4.7-asm.0
6. Export /bin ไปที่ PATH
export PATH=$PWD/bin:$PATH
ถึงตรงนี้เราจะสามารถเรียกใช้ istioctl กับ asmctl command line ได้แล้วลองเลย เช็ค version กันก่อน
การ install ASM เราทำได้ 2 วิธี แบบ Permissive หรือ Strict mTLS ในที่นี้จะทำแบบ Permissive
1. ใช้ istioctl install ASM
istioctl manifest apply — set profile=asm \
— set values.global.trustDomain=${WORKLOAD_POOL} \
— set values.global.sds.token.aud=${WORKLOAD_POOL} \
— set values.nodeagent.env.GKE_CLUSTER_URL=https://container.googleapis.com/v1/projects/${PROJECT_ID}/locations/${CLUSTER_ZONE}/clusters/${CLUSTER_NAME} \
— set values.global.meshID=${MESH_ID} \
— set values.global.proxy.env.GCP_METADATA=”${PROJECT_ID}|${PROJECT_NUMBER}|${CLUSTER_NAME}|${CLUSTER_ZONE}”
2. เช็คความเรียบร้อยกันหน่อยติดตั้ง ASM สำเร็จหรือไม่
kubectl wait — for=condition=available — timeout=600s deployment \ — all -n istio-system
3. ถ้า Condition ตรงหมดแล้วก็เช็ค Pods ติด status running หรือยัง
kubectl get pod -n istio-system
4. ใช้ asmctl validate การติดตั้ง
asmctl validate — with-testing-workloads
เราสามารถใช้ asmctl วิเคราะห์และตรวจสอบว่าเราติดตั้งสมบูรณ์หรือไม่ ตัว asmctl ติดมากับ Anthos Service Mesh ซึ่งมันจะถูก install ไว้ที่ bin folder ที่เรา add PATH ไว้ก่อนหน้านี้น่ะ
asmctl จะ validate การสื่อสารของ mTLS และ service จำเป็นตัวอื่น ตัวมันจะ deploy test workload ไปที่ test namespace และจะ run mTLS มาตรวจการสื่อสารแล้วค่อยลบ namespace test ทิ้งเป็นอันจบการ validate
ตอนนี้ ASM ก็ config เรียบร้อยแล้ว ตรวจสอบเรียบร้อยแล้ว เราก็จะมา deploy app กัน application นี้ มี microservices 4 ตัว ทั้งหมดเราจะจัดการมันด้วย Istio ที่ดูสุดจัดเข้าไปอีกคือแต่ละ services เขียนกันคนละภาษากันเลย เราเลยจะได้ดู demo ที่ใช้ Istio จัดการ service คนละภาษา ทั้งไม่ต้องแก้ code ซักบรรทัด ( ปล.แต่กว่าจะได้ก็เหนื่อยอยู่เหมือนกัน )
Microservices แต่ละตัวมีอะไรมั่ง:
ลองมาเจาะที่ reviews services:
ใครอยากดู code ไปส่องที่นี่นะครับ samples/bookinfo
cat samples/bookinfo/platform/kube/bookinfo.yaml
โฟกัสตรง containers จะเห็นว่าในแต่ละ Deployment จะมีแค่ 1 container
2. ตอนที่เรา apply bookstore.yaml sidecar proxy จะถูก inject เข้าไปให้ทำงานคู่กับ application Pod แต่ละตัวด้วย
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
Istio ใช้การ extend Project Open source Envoy proxy ที่เป็น high-performance proxy เขียนด้วยภาษา C++ มาทำหน้าที่เป็นตัวกลางระหว่าง traffic inbound/outbound ของ service ทุกตัวใน service mesh
Istio เลยหยิบ feature เด่นๆของ Envoy มาใช้งานอย่าง dynamic service discovery, load balancing, TLS termination, HTTP/2 & gRPC proxying, circuit breakers, health checks, staged rollout ด้วย %-based traffic, fault injection และ rich metrics เยอะจริงๆ ถามว่าตอนนี้เคยใช้ทั้งหมดมั๊ยก็ต้องตอบว่าไม่
ถึงจุดนี้เรา deploy Bookinfo application เข้า cluster ไปเรียบร้อยแล้วแต่ยังขาดทางเข้าไปหา application ของเรา ดังนั้นขั้นต่อไปเราก็จะสร้าง Istio Ingress Gateway เพื่อเข้าใช้งาน application จาก browser ได้
cat samples/bookinfo/networking/bookinfo-gateway.yaml
ลองดูที่ Gateway และ VirtualService mesh resources สิ ตัว Gatewayทำการ exposes services ให้ users ภายนอก service mesh และอนุญาตให้ Istio features อย่าง monitoring และ route rules จัดการ traffic ส่วนของทางเข้า cluster
2. Run command เพื่อ apply gateway สำหรับเข้า cluster ซึ่งตอนนี้เราจะยังไม่เห็น external IP
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl get services
2. Review application Pods ต้องมีทั้งหมด 6 pods และต้องติด status Runing
kubectl get pods
3. ลอง request ไปที่ Pod ratings เพื่อดูว่าหน้า page ขึ้นหรือยัง
kubectl exec -it $(kubectl get pod -l app=ratings \ -o jsonpath=’{.items[0].metadata.name}’) \ -c ratings — curl productpage:9080/productpage | grep -o “<title>.*</title>”
4. Confirm ว่า ingress gateway ว่าถูกสร้างแล้ว
kubectl get gateway
5. ดู external IP ของ ingress gateway
kubectl get svc istio-ingressgateway -n istio-system
6. สร้าง Environment parameter GATEWAY_URL
export GATEWAY_URL=[EXTERNAL-IP]
7. เช็คว่า Bookinfo app มันขึ้นแล้วส่ง curl ไปซิ
ถึงเวลามาลองเรียกใช้จาก browser กันแล้ว
Reiews v1
Review v2
Review v3
ได้เวลายิงโหลดเพื่อจำลองการใช้งาน และเอาไปดู monitor
1. ติดตั้งอาวุธ
sudo apt install siege
2. ระดมยิง
siege http://${GATEWAY_URL}/productpage
มาลองดูพลังการ monitor ของ Anthos กันเลย
2. Click View Service Mesh. แล้ว Click ที่ productpage และ ดูรายละเอียด ณ จุดนี้เราจะสามารถดู requests/second, error rates, latencies และ resource usage ได้เลย
3. ไปต่อกันที่เมนูด้านซ้ายที่ชื่อ Metric จะเห็น dashboard แสดง pre-build metric ต่างผม capture มาให้ดูบางส่วนอาจไม่ได้เรียงลำดับตามจริงนะครับ แต่จะได้เห็นว่าเราไม่ต้องสร้าง dashboard เองให้ยุ่งยากติดตั้งเสร็จมีให้ใช้งานเลย
4. ไปต่อไม่รอแล้วจ้าไปที่ Connected Services สิ่งที่น่าตื่นเต้นสำหรับผมประการแรก เราสามารถเห็นว่ามี traffic INBOUND ชื่อ rating เข้ามาที่ productpage และมี traffic outbound ไปหา details และ reviews แสดงรายละเอียด port และ ข้อมูลต่างๆพร้อม
INBOUND
OUTBOUND
5. ถ้ากลับไปที่ Anthos Service Mesh dashboard เราจะเห็นปุ่ม CREATE AND SLO กดเลย สาย SRE ตั้ง objective กันตรงนี้ได้ง่ายๆเลย
6. ตื่นเต้นประการสุดท้ายถ้าดูแบบตารางไม่จุใจเปิด Topology มาดูเลยจ้า
Default เรียงตัวยังไม่งาม ลากๆจัดๆให้มันสวยงามดูง่ายๆได้เลย ขอ copy รูปจากใน lab นะครับ part หลัง capture เองไม่ทันแล้ว
ถ้า click แต่ละ node ก็จะเห็น detail เช่นกัน
เอา mouse ไปจิ้มๆดู จำนวน request/sec ที่ Inbound / Outbound ผ่าน service แต่ละตัวได้
Drill down เข้าไปถึง workload ดู replica set ดู pods เลย
จบละ Lab Installing Anthos Service Mesh on Google Kubernetes Engine ชม.ครึ่ง ทำไปเขียน blog ไป ทำไม่ทันตอนหลังๆ ต้อง copy จาก lab มาใส่อธิบายเพิ่มให้ อยากให้ได้ลองไปทำเองด้วยนะครับจะเห็นรายละเอียดบางอย่างที่ผมไม่ได้กล่าวมาใน blog นี้ แต่ทำให้เข้าใจความสามารถของ Anthos , Istio ได้ดีทีเดียว จากคนที่เคยได้ยินแค่ชื่อ Anthos, Istio, Service Mesh ทำ lab นี้จบเข้าใจการใช้งานมันได้มากขึ้นเยอะ
สุดท้ายต้องเข้าใจกันอย่างหนึ่งนะครับว่าทั้งหมดทั้งปวงถ้าอยากจะใช้ Anthos Service Mesh บน GKE คุณต้องทำ service ของคุณให้เป็น microservice และมี deployment ที่ทำบน Kubenetes แล้วถึงจะติดตั้ง Anthos Service Mesh เพิ่มเติมเข้าไปได้ เส้นทาง microservice ต้องเจ็บอีกเยอะสู้ๆนะครับทุกคน บ๊ายบาย ปู๊นๆๆ
Written by Paripol Toopiroh (Technical Director)
Cloud Ace Thailand
หากคุณสนต้องการคำปรึกษา Cloud Ace Thailand พร้อมให้บริการที่จะสนับสนุนคุณตั้งแต่ การให้คำปรึกษา จนถึงการออกแบบระบบ ติดตั้งระบบ ย้ายระบบ ในฐานะ Google Cloud Partner ที่มีความเชี่ยวชาญ และได้รับรางวัล Service partner of the year ในปี 2019
ติดต่อเรา
Thank you for subscribing!
Have a great day!