Published

- 5 min read

มา install ArgoCD บน GKE Cluster กัน

img of มา install ArgoCD บน GKE Cluster กัน

ต่อจากบทความที่แล้ว ก็จะมาต่อกับการสร้าง GKE Cluster แล้วก็ตามด้วยการ apply ingress-nginx controller แล้วปิดท้ายด้วยการ install ArgoCD ครับ

เริ่มแรกก็ให้ fork repo ของผมของที่ทำ script ไว้เรียบร้อยแล้วมาครับ local-control-plane
หลังจากนั้นก็ทำตาม README เลยครับ โดยขั้นตอนแรกหลังจากที่เราสร้าง Cloud Workstation คือ setup เครื่อง VM ของเราให้สามารถ clone repo ที่ fork ไปมาอยู่ที่บนเครื่อง VM ครับ (ทำแค่ครั้งแรก ครั้งเดียวเท่านั้น)

โดยขั้นตอนผมขอยกมาจากใน README นะครับ

   - Execute `gcloud auth application-default login --no-launch-browser` command to login with application-default
- Execute `gcloud auth login` command to login again
- Execute `gcloud config set project gitops-learning01` to set config project id
- Execute `sudo apt update && sudo apt install openssh-client` command to install ssh client
- Execute `eval $(ssh-agent)` command to start ssh-agent
- Copy the ssh private key from the existing ssh-key which is binding on Bitbucket/GitLab/Github...
  - Execute this command on your local machine `cat id_ed25519 | pbcopy`
- Create a ssh-key secret using ***Google Cloud console UI*** using the previous step as value (paste on `Secret value` field) with a secret key name `SSH_PRIVATE_KEY_LOCAL_CONTROL_PLANE`
- Create a gcp-creds secret using ***Google Cloud console UI*** with a secret key name `GCP_CREDS_LOCAL_CONTROL_PLANE` and `creds.json` that you just downloaded on your local machine from `./local/download-service-account.sh` script
- Run `gcloud secrets versions access 1 --secret="SSH_PRIVATE_KEY_LOCAL_CONTROL_PLANE" --project=gitops-learning01 | ssh-add - >/dev/null` to add ssh-key from Secret Manager
- Run `git clone git@github.com:3ackdoor/local-control-plane.git` to clone the repo # change my git account to your git host/username
- Open `local-control-plane` project from left sidebar of CodeOSS

ผลลัพธ์หลังจากสร้าง secret ที่ Secret Manager

รูปตัวอย่าง UI ของ CodeOSS บนเครื่อง VM


หลังจาก setup เครื่อง VM เรียบร้อยแล้วก็มาถึงขั้นตอนการเตรียมเครื่อง VM ให้พร้อมสำหรับการใช้งานครับ โดยมีขั้นตอนอธิบายดังนี้ครับ

  • start ssh-agent โดยดึงค่า private key (SSH_PRIVATE_KEY_LOCAL_CONTROL_PLANE) มากจาก Secret Manager
  • ดึงค่า service account (GCP_CREDS_LOCAL_CONTROL_PLANE) มาจาก Secret Manager
  • setup git username/email สำหรับ account ของตัวเราที่จะใช้ทำงาน
  • สั่ง minikube cluster ที่ติดมากับ CodeOSS ให้ start เพื่อที่เราจะสามารถดึง kube-config มาจาก GKE cluster ได้ครับ
  • เปิด control plane authorized networks เพื่อที่จะอนุมัติให้ non-GCP source IPs สามารถเข้ามา access Kubernetes control plane ผ่าน HTTPS protocol (ในที่นี้จะเป็น IP ของเครื่อง VM ครับ)

ขั้นตอนการทำข้างต้นจากไฟล์ README จะแบ่งเป็น 2 แบบ คือ ทำผ่าน script หรือ ทำแบบ manual มือครับ

   ## Steps to repeat every startup of VM Workstation (script)

- Run `cd gcloud` to change current directory path
- Run `source ./workstation/on-startup.sh` to automatically run all setup steps
   ## Steps to repeat every startup of VM Workstation (manual)

- Run `cd gcloud`
- Run `eval $(ssh-agent)`
- Run `gcloud secrets versions access 1 --secret="SSH_PRIVATE_KEY_LOCAL_CONTROL_PLANE" --project=gitops-learning01 | ssh-add - >/dev/null`
- Run `gcloud secrets versions access 1 --secret="GCP_CREDS_LOCAL_CONTROL_PLANE" --project=gitops-learning01 --out-file=/home/user/.config/gcloud/root-ca.json >/dev/null`
- Run `git config --global user.email "your_git@email.com"`
- Run `git config --global user.name "Your Name"`
- Run `minikube start`
- Run `./workstation/pull-gke-kubeconfig.sh` or run the following commands manually
  - Run `gcloud auth activate-service-account root-ca@gitops-learning01.iam.gserviceaccount.com --key-file=/home/user/.config/gcloud/root-ca.json`
  - Run `yes | gcloud config set project gitops-learning01`
  - Run `gcloud container clusters get-credentials gl-alpha-private-controller-cluster-0 --zone asia-southeast1-b --project gitops-learning01`
- Run `gcloud container clusters update gl-alpha-private-controller-cluster-0 --zone asia-southeast1-b --enable-master-authorized-networks --master-authorized-networks $(gcloud compute instances describe "$(gcloud compute instances list | grep local-control-plane-ws-config | awk '{print $1}')" --format='get(networkInterfaces[0].accessConfigs[0].natIP)')/32`

ขั้นตอนต่อไปก็จะเป็นการสร้าง GKE cluster ครับ โดยจะมีขั้นตอนดังนี้

  • สร้าง GKE cluster
  • สร้าง firewall rules สำหรับ nginx-ingress เพื่อที่จะ allow ให้ GKE master nodes เข้าถึง worker nodes ผ่าน port 8443/tcp
  • เตรียม reverse external static ip address สำหรับ nginx-ingress เพื่อใช้ในขั้นตอนถัดไป
   ## Setup GKE Cluster

- Run `cd gcloud` to change current directory path
- Run `./workstation/create-gke-cluster.sh` to create GKE Cluster then wait for provisioning process
- Run `./workstation/create-firewall-rules-for-nginx-ingress.sh` to create a firewall rule for nginx-ingress
- Run `./workstation/create-reverse-external-static-ip-address.sh` to create a reverse external static ip address for nginx-ingress

ขั้นตอนถัดไปเราจะต้อง fork repo infra-services-apps มาไว้บนเครื่อง VM เราครับ โดยสามารถทำได้ตามนี้เลย

   ### Clone infra-services-apps repo to VM

- Run `cd ~` to change current directory path
- Run `git clone git@github.com:3ackdoor/infra-services-apps.git` to clone infra-services-apps and follow the instruction in README.md file # change my git account to your git host/username

หลังจากนั้นเราต้องไป clone ArgoCD project มาจาก official repo เพื่อที่จะ install ArgoCD แบบ HA ซึ่งผมจะใช้ version 2.8.4 ครับ

   # Clone argocd project from official repo at the same directory path level as infra-services-apps

git clone -b v2.8.4 https://github.com/argoproj/argo-cd.git

ขั้นตอนสุดท้ายก็จะเป็นการ install NGINX-ingress และ ArgoCD บน GKE cluster โดยผมจะอธิบาย step คร่าวๆ จากใน README ดังนี้ครับ

  • update ค่า YOURDOMAIN_COM ในไฟล์ env-vars.sh โดยใส่ชื่อ domain ของตัวเองครับ เช่น YOURDOMAIN_COM=anewlife.dev
  • replace ค่าต่างๆ ของไฟล์ที่เป็น template โดยในที่นี้เราจะ deploy โดยใช้ NGINX-ingress มาทำหน้าที่เป็น load balancer (ingress controller) ให้กับ ArgoCD
  • ทำการ run script เพื่อ install ArgoCD และ NGINX-ingress โดยใช้ Kustomize มาช่วยจัดการ manifests configuration ครับ
   # Update `./scripts/env-vars.sh` -> `YOURDOMAIN_COM`
vi ./scripts/env-vars.sh

# Create Static IP (skip this if you have already done this before)
gcloud compute addresses create argocd-ingress-static-ip --region asia-southeast1

# Replace env variables with envsubst
./scripts/build-nginx-tmpl-yaml.sh

# Install ArgoCD with NGINX-Ingress
kubectl apply -k module/argo-cd/overlays/alpha/nginx

อธิบายเพิ่มเติมเกี่ยวกับค่า configuration ต่างๆ ของ manifest files โดยเป็นลำดับขั้นตอนดังนี้ครับ

  • setup configuration state ให้ใช้ namespace ชื่อ argocd (อันนี้คือชื่อที่เป็น default namespace จาก argocd ที่เราควรใช้ เนื่องจาก offical เขาใช้ชื่อนี้)
  • ไป import manifest state จาก official repo ที่เราทำการ clone มาลงที่เครื่อง VM
  • patch ConfigMap argocd-cmd-params-cm โดย config server.insecure: "true" ตาม official document ของ ArgoCD
  • install NGINX-ingress
    • เพิ่มสิทธิ์ cluster admin ให้กับ NGINX-ingress (cluster-admin-binding.yaml)
    • เพิ่มคำสั่งที่ใช้ในการ start ingress controller เพื่อที่จะทำให้สามารถ distribute connection จาก client มาที่ server ArgoCD ได้คือ --enable-ssl-passthrough
  • patch Service object ของ NGINX-ingress โดย describe loadBalancerIP เพิ่มเข้าไป ซึ่ง value จะได้มาจากการ run command gcloud compute addresses describe argocd-ingress-static-ip --region asia-southeast1 --format="get(address)"
  • apply ArgoCD Ingress object (argocd-ingress.yaml)

หลังจากทำเสร็จทั้งหมดให้เข้า UI ผ่าน IP Address ของ argocd-ingress-static-ip

ปล. ถ้าเป็น production ควรสร้าง firewall rules ที่ allow source ip address จาก VPN ของบริษัทที่ใช้ หรือ อาจจะ allow แค่ IP Address ของเครื่องที่ต้องการ access เข้า UI ของ ArgoCD server เป็นรายเครื่องไปครับ เพื่อที่จะกันบุคคลภายนอกเข้ามาใช้งานครับ 😁


References

https://argo-cd.readthedocs.io/en/stable/
https://cloud.google.com/sdk/gcloud/reference/
https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
https://kubernetes.github.io/ingress-nginx/deploy/
https://kustomize.io/