2>&1 > /dev/null

Self hosted CICD agent với AKS và Azure DevOps – Phần 2

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à:

  1. với private thì bạn không có giới hạn thời gian sử dụng (quota)
  2. 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

  1. Sử dụng self hosted với VM (windows vm, Ubuntu VM)
  2. 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ì

  1. 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)
  2. Về infra bạn cần có Kubernetes nhé (local cũng được)
    Bắt đầu vào làm:
  3. Đầ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

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *