ติดตั้ง Sonarqube บน Google Kubernetes ครบเซ็ตบน n1-standard-1 node เดียวประหยัดๆ

Pichaya Srifar
3 min readOct 30, 2019

Sonarqube เป็น open-source platform สำหรับ check code quality และวิเคราะห์ code เพื่อหา bugs, code smells, และช่องโหว่ security แบบอัตโนมัติ แก้ปัญหา technical debt รองรับมากกว่า 25 ภาษา (community edition รองรับ Java, JavaScript, C#, TypeScript, Kotlin, Ruby, Go, Scala, Flex, Python, PHP, HTML, CSS, XML และ VB.NET)

อ่านต่อได้ที่นี่ https://www.sonarqube.org/

Sonarqube ค่อนข้างเป็นที่นิยม และใน Google Kubernetes Marketplace ก็มีให้กดคลิกเดียวเสร็จ แต่ version ก็จะเก่า 7.6 (ตอนนี้ 8.0) และประเด็นสำคัญคือมันจะ set ให้กิน Server กับ SQL Service แบบจัดเต็ม สุดท้ายแล้วค่า server จะแพงมากๆๆ ประมาณเดือนละ 2 พันกว่าบาท

ผมคิดว่าสำหรับ Startup ที่ทีมงาน Programmer ไม่เกิน 20 คน ก็ยังไม่จำเป็นต้องลงทุนเยอะขนาดนั้นกับระบบแบบนี้ ถ้าลด spec ลงมาหน่อย เอา volumn, database, engine ทั้งหมดมาไว้บน Kube อาจจะโหลดช้าหน่อย แลกกับราคาถูกลงกว่าก็เป็น trade-off ไป ข้อดีอีกอย่างของการเอาขึ้น Kube คือ ถ้าเราไม่ได้ใช้งานบ่อย หรือใส่ใน CI/CD เราสามารถ scale Pod เฉพาะตอนที่จะใช้งานได้ แล้วเราก็เอา node ไปใช้งานอย่างอื่นก็ได้ (เรียกว่างกสุดๆ)

1. สร้าง cluster

ด้วยความงกของเรานะครับ เราจะใช้แค่ n1-standard-1 แค่ node เดียว (เล็กกว่านี้ลองแล้วไม่ไหว)

สร้าง cluster และ config kubectl ให้ไปชี้ที่ cluster นี้ด้วยคำสั่ง

gcloud container clusters get-credentials [CLUSTER_NAME]

https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl

2. สร้าง secret สำหรับ postgres password

secret เป็นที่เก็บ password ของ Kube เวลาอยากใช้เราก็มาอ้างอิงตัว secret จะได้ไม่ต้องเก็บไว้ในที่ที่อาจจะหลุดได้ง่าย คำสั่งข้างล่างเราสร้าง secret ชื่อ postgres-pwd ใส่ค่า RandomGeneratedPassword เข้าไป

kubectl create secret generic postgres-pwd --from-literal=password=RandomGeneratedPassword
มันจะมาอยู่ในเมนู Configuration

3. สร้าง Google Clound Engine Persistent Disk

Disk ราคาไม่ได้แพงมาก ใครจะเอา ssd ก็ได้ หรือใครคิดว่าโปรเจคอาจจะโตมาก มี code เพิ่มหลายล้านบรรทัดก็จัด 200GB ไปเผื่อๆก็ได้ เนื่องจากเรางก แค่ 10GB ก็พอขำๆ

gcloud compute disks create --size=10GB --zone=asia-southeast1-a sonar-postgres-pd

4. สร้าง PV PVC

เราจะมาสร้าง persistent volume ไว้เก็บ database กัน สร้างไฟล์ sonar-pv-postgres.yaml และ sonar-pvc-postgres.yaml

แล้วใช้คำสั่ง

kubectl apply -f sonar-pv-postgres.yaml     
kubectl apply -f sonar-pvc-postgres.yaml

5. สร้าง Postgresql Deployment และ Service

สร้างตัว deployment ของ database จริงๆ ตั้งชื่อไฟล์ sonar-postgres-deployment.yaml และ sonar-postgres-service.yaml แล้วก็ apply มัน

kubectl apply -f sonar-postgres-deployment.yaml     
kubectl apply -f sonar-postgres-service.yaml

6. สร้าง Sonarqube Deployment และ Service

ทำเหมือนเดิมกับ Sonarqube (เราจะใช้ version 7.7 เพราะตั้งแต่ 7.8 ขึ้นไป มันจะเช็ค vm.max_map_count = 262144 ให้ Elasticsearch ทำให้รัน service ไม่ได้)

kubectl apply -f sonarqube-deployment.yaml   
kubectl apply -f sonarqube-service.yaml

7. สร้าง project

จากนั้นเราจะสามารถเข้าไปดู dashboard ได้ผ่านทาง ip ของ sonarqube service ที่เราสร้างขึ้น แต่ต้อง /sonar ด้วย เช่น http://36.34.87.154/sonar

8. สั่ง scanner ส่งไฟล์ขึ้น server

ติดตั้งตัว scanner ในเครื่องเรา หรือ Jenkins เพื่ออัพ code ขึ้นไปให้ server วิเคราะห์ รายละเอียดตามลิงค์ข้างล่างได้เลย

โดยรวมจากที่ใช้งานแล้วอัพ code ไปหลายสิบ project รวมๆเกือบ 1 ล้านบรรทัด dashboard ก็ยังเร็วอยู่ ไม่มีช้าหรือค้างแต่อย่างใด ในราคาที่ลดลงกว่าครึ่ง

--

--

Pichaya Srifar

CTO & Co-founder @ GetLinks 🚀 Building Great Products has always been my passion ❤️