NEW WEBSITE IS READY!
Technical blog
ติดตั้ง Anthos Service Mesh บน Google Kubernetes Engine แกะจาก Qwiklabs
โดย Cloud Ace Thailand
Blog นี้ผมเกิดจากความอยากรู้จัก Isio และ 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 มีประมาณนี้
Service metrics and logs สำหรับดู HTTP(S) traffic ภายใน mesh ของ GKE cluster และมันก็จะถูก ingest ไปที่ Google Cloud ด้วย
Preconfigured service dashboards เอาไว้คอยดูข้อมูลของ service ของคุณ ลงเสร็จจะได้ dashboard มาเลยไม่ต้องมานั่งทำเอง
เก็บ Telemetry เชิงลึกตาม matrics และ log สามารถ filter ดึงข้อมูลออกมาดูได้หลากหลาย
Service-to-service relationships ดูได้ว่า services แต่ละตัวมันต่อกันยังไง services ไหน มี dependency กับใครอยู่บ้าง
Service Level Objectives (SLO) จากข้อมูลที่กล่าวมาเราก็จะมาตั้ง Service Level Objective เพื่อกำหนดความต้องการที่จะวัดค่าการให้บริการของระบบของคุณได้
จุดที่ทำให้ Anthos น่าสนใจอีกอย่างคือ ตอนนี้หมดโปร trial แล้วจ้า ใช้แบบ Subscription plan น่าถูกกว่าเดิม ตอน trial เดือนละ 15,000 usd เลยจ้า plan ใหม่ใช้เป็นรายชม.ก็จะ flexible และน่าจะถูกกว่าเดิม
ตัวโฆษณาช่วงแรกแค่เกริ่นนำเพราะ Blog นี้เราจะมาติดตั้ง Anthos Service Mesh บน GKE กัน
คนที่อ่านบทความหรือไปทำ lab จะได้ดูอะไรมั่งหลังจากนี้
การสร้าง Cluster GKE ด้วย command line
ติดตั้งและ config Anthos Service Mesh
Deploy Bookinfo แบบใช้ Istio ให้ service มันสร้างขึ้นมาหลายๆตัวเอาไว้ทำ load balance
เปิด Istio Ingress Gateway เอาไว้เรียก service จากภายนอก
ลองใช้งาน Bookinfo app
Monitor service performance ด้วย Anthos Service Mesh Dashboard
หลังจากนี้ผมจะใช้ Cloud Console ที่เป็น Free instance บน Google Cloud เพื่อทำการ setup นะครับใครยังไม่มีสมัคร Google Cloud มาใช้ก่อน Activate credit 300$ มาใช้ด้วยจะดีมาก ปล.ผมใช้บน Qwiklabs มันก็จะฟรีๆแต่ต้องรีบๆทำให้ทันเวลา
Set up project
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}”
WORKLOAD_POOL will be used to enable Workload Identity, which is the recommended way to safely access Google Cloud services from GKE applications.
MESH_ID will be used to set the mesh_id label on the cluster, which is required for metrics to get displayed on the Anthos Service Mesh Dashboard in the Cloud Console.
3. Permission ขั้นต่ำที่ต้องใช้มีตามนี้แต่ถ้าใครมี project owner role อยู่แล้วก็จัดต่อได้เลย ไม่ต้องแคร์ให้เสียเวลา
To complete setup, you need the permissions associated with these roles:
Project Editor
Kubernetes Engine Admin
Project IAM Admin
GKE Hub Admin
Service Account Admin
Service Account key Admin
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 เรียบร้อย
Prepare to install Anthos Service Mesh
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 Anthos Service Mesh
การ install ASM เราทำได้ 2 วิธี แบบ Permissive หรือ Strict mTLS ในที่นี้จะทำแบบ Permissive
ใช้ 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 ไว้ก่อนหน้านี้น่ะ
Check the enabled APIs on the project for APIs that are required by Anthos Service Mesh.
Check that Node-Agent is properly configured to call Mesh CA.
Check the general health of Istio-Pilot and Istio-Galley.
Check that Istio-Pilot uses a certificate issued by Mesh CA.
asmctl จะ validate การสื่อสารของ mTLS และ service จำเป็นตัวอื่น ตัวมันจะ deploy test workload ไปที่ test namespace และจะ run mTLS มาตรวจการสื่อสารแล้วค่อยลบ namespace test ทิ้งเป็นอันจบการ validate
Enable sidecar injection
Anthos Service Mesh จะใช้ sidecar proxy เพื่อเสริมความสามารถให้ network security, reliability, และ observability ความสามารถนี้มันจะแยกตัวจาก application container แต่จะอยู่ใน Pod เดียวกับ Application
kubectl label namespace default istio-injection=enabled — overwrite
ติดตั้งเสร็จจนได้เพิ่งมาได้ครึ่งทาง Qwiklabs เวลาผมเหลือประมาณ 40 นาทีทั้งทำความเข้าใจทั้งเขียน blog ไปด้วยสงสัยจะต้องทำอีกรอบ ขึ้นตอนต่อไปเราจะมา Deploy Bookinfo ในแบบ Istio-Enable กัน
Deploy Bookinfo, an Istio-enabled multi-service application
ตอนนี้ ASM ก็ config เรียบร้อยแล้ว ตรวจสอบเรียบร้อยแล้ว เราก็จะมา deploy app กัน application นี้ มี microservices 4 ตัว ทั้งหมดเราจะจัดการมันด้วย Istio ที่ดูสุดจัดเข้าไปอีกคือแต่ละ services เขียนกันคนละภาษากันเลย เราเลยจะได้ดู demo ที่ใช้ Istio จัดการ service คนละภาษา ทั้งไม่ต้องแก้ code ซักบรรทัด ( ปล.แต่กว่าจะได้ก็เหนื่อยอยู่เหมือนกัน )
Microservices แต่ละตัวมีอะไรมั่ง:
productpage: service ตัวนี้จะไปเรียกข้อมูลการ review หลังสือจาก review service ทั้งหมด 3 version มาแสดง ซึ่งเขียนด้วย python
details: ข้อมูลรายละเอียดของหนังสือ เขียนด้วย Ruby
reviews: มีข้อมูลการ review และแบ่งสีดาวให้ไม่เหมือนกันแยกเป็น 3 versions เขียนด้วย java
ratings: สุดท้ายคือ service ratings ของหนังสือแต่ละเล่มถูกเรียกด้วย Review อีกทีเขียนด้วย Node.js
ลองมาเจาะที่ reviews services:
Reviews v1 ตัวนี้ไม่มีการเรียกไปที่ Rating service เลยไม่มีดาวกับเค้า
Reviews v2 ตัวนี้เรียก Rating service และใส่ดาวสีดำให้ rating 1–5
Reviews v3 ตัวนี้เรียก Rating service เหมือนกันแต่ใส่ดาวสีแดง rating 1–5 เหมือน v2
ใครอยากดู code ไปส่องที่นี่นะครับ samples/bookinfo
Deploy Bookinfo
ลองมาดู bookInfo.yaml กันก่อน
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 เยอะจริงๆ ถามว่าตอนนี้เคยใช้ทั้งหมดมั๊ยก็ต้องตอบว่าไม่
Enable external access using an Istio Ingress Gateway
ถึงจุดนี้เรา deploy Bookinfo application เข้า cluster ไปเรียบร้อยแล้วแต่ยังขาดทางเข้าไปหา application ของเรา ดังนั้นขั้นต่อไปเราก็จะสร้าง Istio Ingress Gateway เพื่อเข้าใช้งาน application จาก browser ได้
ไปดู bookinfo-gateway.yaml กัน
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
Verify the Bookinfo deployments
Confirm ว่า application ถูก deploy review services,Pods และ ingress gateway เรียบร้อยหรือไม่
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 ไปซิ
Use the Bookinfo application
ถึงเวลามาลองเรียกใช้จาก browser กันแล้ว
เข้า Browser ไปเรียก url http://[$GATEWAY_URL]/productpage เราก็เห็นผลลัพย์ได้จากการ F5 รัวๆๆๆๆๆ จะเห็นการเปลี่ยนแปลงของดาวที่ review ที่เกิดจากการ round robin ไปหา review service คนละ version กัน
Generate a steady background load
ได้เวลายิงโหลดเพื่อจำลองการใช้งาน และเอาไปดู monitor
ติดตั้งอาวุธ
sudo apt install siege
2. ระดมยิง
siege http://${GATEWAY_URL}/productpage
Evaluate service performance using the Anthos Service Mesh dashboard
มาลองดูพลังการ monitor ของ Anthos กันเลย
ไปที่ Navigation menu > Anthos > Dashboard.
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
Make It Now!
หากคุณสนใจโซลูชั่น Cloud Storage และต้องการคำปรึกษา Cloud Ace Thailand พร้อมให้บริการที่จะสนับสนุนคุณตั้งแต่ การให้คำปรึกษา จนถึงการออกแบบระบบ ติดตั้งระบบ ย้ายระบบ ในฐานะ Google Cloud Partner ที่มีความเชี่ยวชาญ และได้รับรางวัล Service partner of the year ในปี 2019
ติดต่อเรา
หรือกรอกแบบฟอร์มด้านล่าง