ติดตั้ง Anthos Service Mesh บน Google Kubernetes Engine แกะจาก Qwiklabs


ติดตั้ง Anthos Service Mesh บน Google Kubernetes Engine แกะจาก Qwiklabs

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 มีประมาณนี้

  • 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 จะได้ดูอะไรมั่งหลังจากนี้

  1. การสร้าง Cluster GKE ด้วย command line
  2. ติดตั้งและ config Anthos Service Mesh
  3. Deploy Bookinfo แบบใช้ Istio ให้ service มันสร้างขึ้นมาหลายๆตัวเอาไว้ทำ load balance
  4. เปิด Istio Ingress Gateway เอาไว้เรียก service จากภายนอก
  5. ลองใช้งาน Bookinfo app
  6. Monitor service performance ด้วย Anthos Service Mesh Dashboard

Bookinfo Application

หลังจากนี้ผมจะใช้ 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

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 Anthos Service Mesh

    การ 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 ไว้ก่อนหน้านี้น่ะ

      • 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

      1. ลองมาดู 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 ได้

      1. ไปดู 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

      1. 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 ไปซิ

      curl -I http://${GATEWAY_URL}/productpage

      Use the Bookinfo application

      ถึงเวลามาลองเรียกใช้จาก browser กันแล้ว

      1. เข้า Browser ไปเรียก url http://[$GATEWAY_URL]/productpage เราก็เห็นผลลัพย์ได้จากการ F5 รัวๆๆๆๆๆ จะเห็นการเปลี่ยนแปลงของดาวที่ review ที่เกิดจากการ round robin ไปหา review service คนละ version กัน

      Reiews v1

      Review v2

      Review v3

      Generate a steady background load

      ได้เวลายิงโหลดเพื่อจำลองการใช้งาน และเอาไปดู monitor

      1. ติดตั้งอาวุธ

        sudo apt install siege

        2. ระดมยิง

        siege http://${GATEWAY_URL}/productpage


        Evaluate service performance using the Anthos Service Mesh dashboard

        มาลองดูพลังการ monitor ของ Anthos กันเลย

        1. ไปที่ 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 Ace Thailand พร้อมให้บริการที่จะสนับสนุนคุณตั้งแต่ การให้คำปรึกษา จนถึงการออกแบบระบบ ติดตั้งระบบ ย้ายระบบ ในฐานะ Google Cloud Partner ที่มีความเชี่ยวชาญ และได้รับรางวัล Service partner of the year ในปี 2019

        ติดต่อเรา

        E. th_sales@cloud-ace.com

        .