Deploy AKS cluster พร้อมกับ Datadog agent ผ่าน Terraform
blog นี้จะมา deploy Azure Kubernetes Service (AKS) บน Azure cloud ซึ่งจะใช้ Datadog เป็น logging / monitoring โดยหลักการคร่าวๆ ของ Datadog คือ เราติดตั้ง agent เพื่อให้ส่ง log และ metrics ต่างๆ ให้กับ Datadog (push model) ซึ่งจะต่างจาก Prometheus ที่จะมี server ไปเก็บ metrics มาจาก service discovery (Pull model)
https://www.datadoghq.com/blog/monitoring-kubernetes-with-datadog/
เราจะต้อง deploy 2 agents ได้แก่
- Node agent สำหรับเก็บ metrics จากแต่ละ node ได้ มาในรูปของ DaemonSet ดังนั้นการันตีว่าจะถูก deploy ในทุกๆ node
- Cluster agent ถูก deploy ใน cluster node ใด node นึง ซึ่งจะเก็บของมาจาก Node agent อีกที
สิ่งที่จะใช้ในบทความนี้
- Datadog subscription พร้อมกับ API key และ Application key
- Azure DevOps ที่มี permission เพียงพอ
- Terraform
- Azure Blob storage account สำหรับเก็บ
tfstate
Source code: https://github.com/raksit31667/tryit-aks-datadog
คำเตือน บทความนี้จะไม่ลงพื้นฐาน Terraform หรือ Azure นะครับ เพื่อความกระชับ
1. สร้าง Azure DevOps pipeline
เราจะติดตั้ง extension บน Azure DevOps ผ่าน Visual Studio Marketplace เพื่อสร้าง service connection โดยจะช่วย
- Setup service principal ที่ใช้ในการเพิ่ม แก้ไข หรือลบ resource บน Terraform ได้โดยที่ไม่ต้อง configure
client_id
หรือclient_secret
ใน source code ผ่าน variable เลย - Setup storage account สำหรับเก็บ
tfstate
file สำหรับใช้ในการ plan ใน build ครั้งถัดๆ ไป โดยที่ไม่ต้อง configurebackend
เลย - ติดตั้ง Terraform CLI มาพร้อมกับ command ในรูปแบบ declarative เข้าใจง่ายกว่า bash script ที่เขียนเองอย่างแน่นอน
เลือก Task เป็น Terraform จาก extension และใส่ข้อมูลลงไป add แล้วจะได้ code มาประมาณนี้
จากนั้นเพิ่ม backend
ใน Terraform แต่ปล่อยเป็น block เปล่าไว้ extension มันจัดการให้
2. เพิ่ม Terraform step init-validate-plan
อิงตาม Terraform life cycle กันเลย เก็บ plan ไว้เป็น file ด้วย
สร้าง Azure resource group ซึ่งจะเก็บ AKS ของเรา ไว้เช็คดูว่า steps มันรันผ่านไหม
3. เพิ่ม step ในการเก็บ Terraform file ไว้
เพราะว่า stage ถัดๆ ไปจะไม่เก็บ file ที่ generate จาก stage ที่แล้ว และการจะเอา apply ไปไว้ใน stage เดียวกับ init-validate-plan ก็ไม่ดีอีก เพราะบางทีเราไม่อยาก apply ทันที อยากให้มี approve ก่อน
กดเพิ่ม task จะได้ code หน้าตาประมาณนี้
เข้าไปเช็ค Artifacts ใน pipeline จะพบว่ามี terraform file เก็บไว้ทั้งหมดเลย
4. เพิ่ม approval stage และ Terraform apply จาก file ที่เราเก็บไว้ในขั้นตอนที่แล้ว
เริ่มจากสร้าง Environment > Approvals and checks ตามรูปเลย
จากนั้นเพิ่ม code สำหรับ approval และ terraform apply
หน้าตาประมาณนี้
พอรันแล้วพบว่าเกิด error ดังนี้
Error: Failed to instantiate provider "azurerm" to obtain schema: fork/exec /home/vsts/work/1/s/.terraform/plugins/linux_amd64/terraform-provider-azurerm_v2.7.0_x5: permission denied
ดังนั้นเราต้อง grant read permission ให้ Azure DevOps agent ในการอ่าน terraform file ด้วย
พอรันถึง Approval ก็สามารถทำ one-clik approval หรือ reject ผ่าน pipeline ได้เลย
พอรัน apply ผ่านแล้ว เข้าไปดู Blob storage account จะพบว่ามี file tfstate เก็บไว้สำหรับ build ครั้งถัดไปแล้ว
5. สร้าง AKS บน resource group จากขั้นตอนที่ 2
เราต้องการ Kubernetes config จาก output AKS เพื่อสร้าง Kubernetes namespace สำหรับ deploy Datadog agent
โดยปกติ Azure resource จะเพิ่ม tag ENV: DEV
มาโดยอัตโนมัติ ถ้าไม่ได้ customize มัน ทีนี้พอเรารัน pipeline มันก็นึกว่าเราเปลี่ยน tag จาก DEV ~> null
เพื่อป้องกันเหตุการณ์นี้ ผมเลยเพิ่ม tag ENV: TEST
ไป
เสร็จแล้วจะยังรันไม่ได้ เพราะ AKS ต้องการ service principal
6. เพิ่ม stage สร้าง Terraform tfvars file สำหรับ assign variable ลงไป
สร้าง Variables
ใน Azure DevOps pipeline สำหรับ AKS เพิ่ม 2 ตัวคือ
- Service principal
client_id
- Service principal
client_secret
จากนั้นเราจะสร้าง tfvars
file จาก Variables
2 อันนี้ ใช้ในการ pass variable เข้า Terraform
อย่าลืม publish tfvars
file สำหรับใช้ใน apply stage ด้วย
เข้าไปดู Artifacts หน้าตาประมาณนี้
7. ติดตั้ง Datadog agents โดยใช้ Helm
สร้าง Kubernetes namespace สำหรับ Datadog cluster agent ด้วย
ผม override configuration ของ values.yaml
โดยเปิด feature ต่างๆ เช่น
- Log ingestion for Docker containers
- APM (tracing)
podLabelsAsTags
สำหรับ search หา metrics ผ่าน keyapp: your-service-name
ได้เลยDD_CHECKS_TAG_CARDINALITY
เป็นorchestrator
เพื่อให้ Datadog เก็บ metrics เก็บ metrics ของ Kubernetes pods สามารถอ้างอิงจาก Datadog helm chart ได้เลย
สร้าง Variables
ใน Azure DevOps pipeline สำหรับ AKS เพิ่ม 2 ตัวคือ
- Datadog
API_KEY
- Datadog
APP_KEY
มาถึงตรงนี้ ก็น่าจะเห็นภาพสำหรับการทำ Infrastructure-as-a-Code กันบ้างแล้ว