Nối tiếp từ phần 1 https://quyennv.com/thiet-ke-va-trien-khai-thong-cicd-voi-azure-kubernetes-va-azure-devops.html
Nay Quyền sẽ thực hiện tiếp phần hai.
Như chúng ta đã biết
với các hệ thống CICD như Jenkins/Github/Gitlab hay Azure DevOps
luôn cung cấp chúng ta 2 cách tiếp cận cho việc sử dụng hoặc xây dựng agent CI/CD
cụ thể là Public / Share và Self Hosted Agent
Sự khác biệt lớn nhất giữa 2 kiểu agent là:
- với private thì bạn không có giới hạn thời gian sử dụng (quota)
- dữ liệu của các repositories khi đưa lên agent cicd thì luôn được protected ở self hosted agent và đối với public / share agent thì có thể truy cập từ provider hoặc attacker (đã xảy ra 1 số trường hợp tương tự trong quá khứ)
Với nội dung của bài viết thì Quyền sẽ nói về việc 2 kiểu self hosted mà có thể sử dụng sau
- Sử dụng self hosted với VM (windows vm, Ubuntu VM)
- Sử dụng self hosted với Kubernetes ( AKS, EKS ) - đây chính là cái mà mình dùng trong bài viết ( sử dụng cho dockershim)
Vậy cần chuẩn bị những gì
- Cần azure devops ( bạn có thể đăng ký azure devops bằng cách truy cập tới http://dev.azure.com) ( tìm hiểu thêm về các lý thuyết cơ bản của azure devops tools trước khi bước vào phần thực hành)
- Về infra bạn cần có Kubernetes nhé (local cũng được)
Bắt đầu vào làm: - Đầu tiên chúng ta cần xây dựng 1 repository chứa các configruration, build manifest cho agent sử dụng Kaniko (mình đã publish tại: https://github.com/quyennguyenvan/k8s_cicd_build_agents)
Giải thích sơ qua về code:
với file aks-agent.dockerfile thì đây là cái dockerimage dùng cho việc handle các job, request từ AzureDevOps và khi triển khai vào cluster AKS/EKS thì nó sẽ như này
vậy file start.sh có tác dụng gì
đây là file scripts dùng để thực hiện việc kết nối tới azure devops master khi start pod agent-cicd
vậy có 1 câu hỏi là khi mà chạy update/patch các agent thì các agents cũ sẽ như nào ?
rõ ràng các agents cũ sẽ bị xoá nhưng trên hệ thống master (azure devops master) vẫn keep track tuy nhiên với trạng thái kết nối là disconnected. Do đó chúng ta cần triển khai thêm 1 script trong quá trình update/patching.
script (bash)
ORG_URL="${{ parameters.ADO_URI}}"
PAT_TOKEN="${{ parameters.ADO_PAT_TOKEN }}"
# Encode the PAT token as base64 for use in the Authorization header
PAT_TOKEN=$(printf "%s"":$PAT_TOKEN" | base64)
POOL_ID=${{ parameters.POOL_ID}}
API_VERSION="6.0"
# Get a list of all agents in the pool
AGENTS=$(curl -s -H "Authorization: Basic ${PAT_TOKEN}" "${ORG_URL}/_apis/distributedtask/pools/${POOL_ID}/agents?api-version=${API_VERSION}")
# Loop through each agent and delete the offline agents
for AGENT in $(echo $AGENTS | jq -r '.value[].id')
do
STATUS=$(echo $AGENTS | jq -r --arg AGENTID "$AGENT" '.value[] | select(.id == ($AGENTID | tonumber)) | .status')
if [ "$STATUS" == "offline" ]
then
echo "Deleting agent with ID $AGENT"
curl -s -X DELETE -H "Authorization: Basic $PAT_TOKEN" "${ORG_URL}/_apis/distributedtask/pools/${POOL_ID}/agents/${AGENT}?api-version=${API_VERSION}"
fi
done
Phần 3 sẽ có thêm về Kanio và example build