GSP330 Implement DevOps in Google Cloud

Architecture ที่โจทย์เตรียมไว้ให้

  • จริงในโจทย์จะให้เราพยายามทำงานจากตัว Jump Host (kraken-vpc)
  • ตัว Jenkins มันลงมาให้แล้วนะ เห็นหลาย Link จับลงใหม่ตลอด 5555 (หงุดหงิดเลยว่ามาเขียน Blog ดีกว่าครับ)
  • ใน JumpHost (kraken-vpc) มี Code อยู่แล้วนะ โจทย์บอกมา ว่าอยู่ใน Jump-Host ที่ path /work/sample-app ลอง cd และ ls ดูได้
cd /work/sample-app

ls #ตรวจสอบผลดู

Task 1: Configure a Jenkins pipeline for continuous deployment to Kubernetes Engine

  • มาเอา password admin ของ Jenkins ออกมาครับ
gcloud config set compute/zone us-east1-b

gcloud container clusters get-credentials jenkins-cd

kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}")

kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &

printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
#Jenkin Admin Password
  • Login เข้า Jenkins โดยใช้ user admin และ password ที่ได้จากคำสั่ง
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
  • หลังจากเข้า Jenkins ได้แล้ว ตั้งค่าใน Jenkins กันครับ
  • อย่างแรก - กำหนด credential ให้กับ Jenkins ก่อนเวลาดึง Code / Deploy จะได้ไม่ติดปัญหาครับ โดยเข้าที่เมนู Jenkins -> Manage Jenkins -> Manage Credentials -> Jenkins -> Global Credentials -> Add Credentials
    • กำหนด Kind : Google Service Account from metadata เลือก Project Id ของเราได้เลย
    • และ OK
  • ถัดมาสร้าง Task "sample-app" ใน Jenkins โดยเลือก New Item > Multibranch Pipeline
  • กำหนดค่าใน Task ครับ
    • Branch Source : Git
    • Project Repository : https://source.developers.google.com/p/{PROJECT-ID}/r/sample-app
    • Credentials : เลือก Project Id ที่ได้ Add เพิ่มไปใน Global Credentials ของ Jenkins
  • และอย่าลืม Scan Multibranch Pipeline Trigger , check periodically if not, interval = 1 minute. มันจะได้ Detect Code แล้วทำ CI/CD ครับ
  • รอให้ Trigger Task "sample-app" รอ Build & Deploy ประมาณ 5-10 นาทีครับ
  • มาหา IP Test ว่า Deploy แล้วยังจากคำสั่ง
kubectl get service gceme-frontend -n production
  • ลองไปเรื่อยจนได้ External IP ขึ้นมาครับ
  • จากนั้นลองเข้า Web sample-app จาก External IP ที่ได้มาครับ
  • จากนั้นไป ก็มา ssh จาก Jump Host ต่อแล้วครับ

Task 2: Push an update to the application to a development branch

  • แตก Branch new-feature ขึ้นมา
sudo git checkout -b new-feature
  • แก้ไขตามโจทย์ที่กำหนด ตรงนี้ในแต่ละ Challenge ระบบจะ Random มา ของผมจะได้เรื่องปรับเลขเวอร์ชัน / แก้ไขสีใน Tag DIV ครับ
sudo nano main.go
#From
const version string = "1.0.0"
#To
const version string = "2.0.0"

sudo nano html.go
#From
<div class="card blue">
#To
<div class="card yellow">
  • เพิ่มไฟล์ แล้ว commit & push
sudo git add html.go main.go
sudo git commit -m "Version 2.0.0"
sudo git push origin new-feature
  • รอ Jenkins Detect และ Build
  • เปิดเข้าทดสอบ url (localhost:8001) ได้จากใน localhost (ใช้ได้ใน develop นะ อย่าทำใน production)
kubectl proxy
  • หลังจาก kube มัน deploy เสร็จมาลองตรวจสอบผล
curl http://localhost:8001/api/v1namespaces/new-feature/services/gceme-
frontend:80/proxy/version
#return result
2.0.0

Task 3: Push a Canary deployment to the production namespace

  • Run Shell เพื่อ Merge Code จาก new-feature > canary แล้ว push
sudo git checkout -b canary
sudo git merge new-feature
sudo git push origin canary
  • รอ Jenkins Detect และ Build

Task 4: Promote the Canary Deployment to production

  • Run Shell เพื่อ Merge Code จาก new-feature > master แล้ว push
sudo git checkout master
sudo git merge canary
sudo git push origin master
  • รอ Jenkins Detect และ Build
  • มาหา External IP Test ว่า Deploy แล้วยังจากคำสั่ง
kubectl get service gceme-frontend -n production
  • จบไปกันแล้วนะครับ สำหรับ Challenge นี้ครับ ได้รู้ Feature ของ Jenkins ที่เราไม่เคยใช้ด้วย เห็นภาพของ CI/CD ให้ครบสมบูรณ์ด้วยครับ

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.