2019 iT 邦幫忙鐵人賽

DAY 28

15 分鐘學習系列 - 第一次學 Kubernetes 就上手系列 第 28

Day 28 - 整合 AKS 使用 Jenkins 建立 CI/CD pipeline

上一篇筆記我們已經安裝好 Jenkins 了, 這一篇筆記裡, 我們實際來建立一個 CI/CD pipeline 吧!

部署範例程式到 AKS


  1. 首先使用命令 fork 我們先將範例程式 Fork 到你的 GitHub 帳號上
  2. 接著用命令 git clone 再將你的範例程式 clone 下來
  3. 使用命令 docker-compose up -d 將範例程式編譯
PS C:\k8s\azure-voting-app-redis> docker-compose up -d
Recreating azure-vote-front ...
Recreating azure-vote-front ... done
  1. 使用命令 docker tag azure-vote-front 將範例程式image tag 成 acr 的名稱
PS C:\k8s\azure-voting-app-redis> docker tag azure-vote-front
  1. 使用命令 az acr login -n 15maksacr 登入 ACR
PS C:\k8s\azure-voting-app-redis> az acr login -n 15maksacr
Login Succeeded
  1. 使用命令 docker push 將 image push 到 ACR 上
PS C:\k8s\azure-voting-app-redis> docker push
The push refers to repository []
769f904522cd: Pushing  11.78kB
be08e5ebdf1c: Pushing  522.8kB
  1. 使用 az login 登入到 Azure
Note, we have launched a browser for you to login. For old experience with device code, use "az login --use-device-code"
You have logged in. Now let us find all the subscriptions to which you have access...
    "cloudName": "AzureCloud",
    "id": "4424e4b1-fb5f-4ad7-8664-????????????",
    "isDefault": false,
    "name": "Visual Studio Ultimate with MSDN",
    "state": "Enabled",
    "tenantId": "293a593f-cc57-451b-b293-????????????",
    "user": {
      "name": "?????@????.com",
      "type": "user"
  1. 編輯 azure-vote-all-in-one-redis.yaml 指向 ACR image
  2. 使用命令 kubectl apply -f azure-vote-all-in-one-redis.yaml 部署應用程式
PS C:\k8s\azure-voting-app-redis> kubectl apply -f azure-vote-all-in-one-redis.yaml
deployment.apps "azure-vote-back" created
service "azure-vote-back" unchanged
deployment.apps "azure-vote-front" created
service "azure-vote-front" created
  1. 使用命令 kubectl get svc 確認 External IP
PS C:\k8s\azure-voting-app-redis> kubectl get svc
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE
azure-vote-back        ClusterIP   <none>            6379/TCP       3d
azure-vote-front       LoadBalancer     137.116.??.??   80:30143/TCP   3d
  1. 開啟 **http://137.116.??.??**
    以上便完成了部署到 AKS 的範例程式, 接下來我們將介紹如何利用 Jenkins 建立 CI/CD pipeline

整合 AKS 使用 Jenkins 建立 CI/CD pipeline


  1. 開啟 Jenkins 首頁 http://localhost:8080 (登入帳密 admin/password), 進入 管理 Jenkins >> 設定系統 >> 加入環境變數 ACR_Server 值為
  2. 設定 RBAC Service Account Principle
    (1) 使用命令 az ad sp create-for-rbac --skip-assignment
PS C:\k8s\azure-voting-app-redis> az ad sp create-for-rbac --skip-assignment
  "appId": "6f863e77-ff87-492d-8ff9-????????????",
  "displayName": "azure-cli-2018-11-04-16-32-32",
  "name": "http://azure-cli-2018-11-04-16-32-32",
  "password": "bd87ab1d-ee46-4577-????????????",
  "tenant": "293a593f-cc57-451b-b293-????????????"

(2) 使用命令 $acrid = az acr show --name 15maksacr -g 15maksrg
--query "id" --output tsv

PS C:\k8s\azure-voting-app-redis> $acrid = az acr show --name 15maksacr -g 15maksrg
--query "id" --output tsv

(3) 使用命令 az role assignment create --assignee 6f863e77-ff87
-492d-8ff9-???????????? --role Contributor --scope $acrid
assign contributor 角色

PS C:\k8s\azure-voting-app-redis> az role assignment create --assignee 6f863e77-ff87
-492d-8ff9-???????????? --role Contributor --scope $acrid
  "canDelegate": null,
  "id": "/subscriptions/11e5233d-dbe1-4167-ac91-4bb39ad526d3/resourceGroups/15maksrg/providers/Microsoft.ContainerRegistry/registries/15maksacr/providers/Microsoft.Authorization/roleAssignments/bdd26d9e-1999-429c-a305-????????????",
  "name": "bdd26d9e-1999-429c-a305-????????????",
  "principalId": "e7d45a29-7b31-4330-af1f-????????????",
  "resourceGroup": "15maksrg",
  "roleDefinitionId": "/subscriptions/11e5233d-dbe1-4167-ac91-????????????/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-????????????",
  "scope": "/subscriptions/11e5233d-dbe1-4167-ac91-????????????/resourceGroups/15maksrg/providers/Microsoft.ContainerRegistry/registries/15maksacr",
  "type": "Microsoft.Authorization/roleAssignments"
  1. 進入 Jenkins >> Credentials >> System >> Global Credentials (unrestricted) 設定 User name with password credential, 內容填寫 Service Account AppIdPassword, Description 填寫 acr-credential
  2. 進入 Jenkins 首頁, 選取新增項目, 建立 FreeStyle 專案, 專案名稱為 Azure-vote
  3. General 設定, 選取 GitHub project, 內容填寫
  4. 原始碼管理設定中
    (1) 選取 Git, 內容填寫
    (2) Add credential 的部分, 需要填寫 GitHub personal access token (設定與取得可以參考連結)
  5. 建置觸發程序設定部分, 選擇 SCM 輪詢, 這邊為了方便驗證, 設定為每分鐘輪詢一次 */1 * * * *
  6. 建置環境設定:
    (1) 勾選 Use secret text(s) or file(s), 並且在 Bindings新增 Username and password (separated)
    (2) Binding Username VariableACR_ID 以及 Password VariableACR_PASSWORD
  7. 建置設定上依序選擇兩次 執行 Shell, 分別填入以下的 Script
    (1) Step 1
# Build new image and push to ACR.
docker build -t $WEB_IMAGE_NAME ./azure-vote
docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}
docker push $WEB_IMAGE_NAME

(2) Step 2

# Update kubernetes deployment with new image.
kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
10. 設定完成後, 從選單中選取 馬上建置, 驗證結果
11. 建置過程中可以點選建置號碼觀看內容
12. 可以從 Console output 觀察建置結果
13. 接下來測試 Auto CI/CD 的結果, 開啟專案內容 index.html 檔案進行修改
14. 使用命令 git commit -am "make some change to index.html" 將修改完成後檔案 commit

PS C:\k8s\azure-voting-app-redis> git commit -am "make some change to index.html"
[master fd9b1ce] make some change to index.html
 2 files changed, 2 insertions(+), 2 deletions(-)
  1. 使用命令 git push 將 local repository push 到 github
PS C:\k8s\azure-voting-app-redis> git push
fatal: HttpRequestException encountered.
   An error occurred while sending the request.
Username for '': samlintw
Password for 'https://?????':
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 555 bytes | 277.00 KiB/s, done.
Total 7 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
   705e3a4..fd9b1ce  master -> master
  1. 觀察 Jenkins 是否如預期設定每分鐘輪詢 github
  2. 偵測到 Change 後, 便開始自動建置部署


Day 27 - 安裝 Jenkins
Day 29 - 整合 AKS 使用 VSTS 建立 CI/CD pipeline
15 分鐘學習系列 - 第一次學 Kubernetes 就上手30