iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
2
Kubernetes

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

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

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

部署範例程式到 AKS

(部分資訊將會遮罩)

  1. 首先使用命令 fork https://github.com/Azure-Samples/azure-voting-app-redis 我們先將範例程式 Fork 到你的 GitHub 帳號上
  2. 接著用命令 git clone https://github.com/samlintw/azure-voting-app-redis.git 再將你的範例程式 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 15maksacr.azurecr.io/azure-vote-front:v1 將範例程式image tag 成 acr 的名稱
PS C:\k8s\azure-voting-app-redis> docker tag azure-vote-front 15maksacr.azurecr.io/azure-vote-front:v1
  1. 使用命令 az acr login -n 15maksacr 登入 ACR
PS C:\k8s\azure-voting-app-redis> az acr login -n 15maksacr
Login Succeeded
  1. 使用命令 docker push 15maksacr.azurecr.io/azure-vote-front:v1 將 image push 到 ACR 上
PS C:\k8s\azure-voting-app-redis> docker push 15maksacr.azurecr.io/azure-vote-front:v1
The push refers to repository [15maksacr.azurecr.io/azure-vote-front]
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
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871a2M5QR2A8G.png
  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      10.0.226.224   <none>            6379/TCP       3d
azure-vote-front       LoadBalancer   10.0.29.70     137.116.??.??   80:30143/TCP   3d
<略...>
  1. 開啟 **http://137.116.??.??**
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871bFtUU38FXO.png
    以上便完成了部署到 AKS 的範例程式, 接下來我們將介紹如何利用 Jenkins 建立 CI/CD pipeline

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

(部分內容將會遮罩)

  1. 開啟 Jenkins 首頁 http://localhost:8080 (登入帳密 admin/password), 進入 管理 Jenkins >> 設定系統 >> 加入環境變數 ACR_Server 值為 15maksacr.azurecr.io
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871g1qP5HRyKM.png
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871NLCobekPwh.pnghttps://ithelp.ithome.com.tw/upload/images/20181105/20111871UkOerCAItO.png
  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
取得 ACR ID

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
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871WQjgnvuqIW.png
  2. 進入 Jenkins 首頁, 選取新增項目, 建立 FreeStyle 專案, 專案名稱為 Azure-vote
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871Uuq6DOspe0.pnghttps://ithelp.ithome.com.tw/upload/images/20181105/201118717gsWrnWiGh.png
  3. General 設定, 選取 GitHub project, 內容填寫 https://github.com/?????/azure-voting-app-redis
    https://ithelp.ithome.com.tw/upload/images/20181105/201118717mxN8VTwlQ.png
  4. 原始碼管理設定中
    (1) 選取 Git, 內容填寫 https://github.com/?????/azure-voting-app-redis.git
    https://ithelp.ithome.com.tw/upload/images/20181105/20111871gCFb6603vQ.png
    (2) Add credential 的部分, 需要填寫 GitHub personal access token (設定與取得可以參考連結)
  5. 建置觸發程序設定部分, 選擇 SCM 輪詢, 這邊為了方便驗證, 設定為每分鐘輪詢一次 */1 * * * *
    https://ithelp.ithome.com.tw/upload/images/20181106/201118711RgJH24rej.png
  6. 建置環境設定:
    (1) 勾選 Use secret text(s) or file(s), 並且在 Bindings新增 Username and password (separated)
    https://ithelp.ithome.com.tw/upload/images/20181106/201118718pL1eWpRQW.png
    (2) Binding Username VariableACR_ID 以及 Password VariableACR_PASSWORD
    https://ithelp.ithome.com.tw/upload/images/20181106/20111871JYJNYYkKii.png
  7. 建置設定上依序選擇兩次 執行 Shell, 分別填入以下的 Script
    https://ithelp.ithome.com.tw/upload/images/20181106/20111871qCxyGwy0fe.png
    (1) Step 1
# Build new image and push to ACR.
WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
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.
WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME

https://ithelp.ithome.com.tw/upload/images/20181106/20111871NhfTJKP1U5.png
10. 設定完成後, 從選單中選取 馬上建置, 驗證結果
https://ithelp.ithome.com.tw/upload/images/20181106/20111871ya4jb5Ucjv.png
11. 建置過程中可以點選建置號碼觀看內容
https://ithelp.ithome.com.tw/upload/images/20181106/20111871JbbYbOnQ1X.png
12. 可以從 Console output 觀察建置結果
https://ithelp.ithome.com.tw/upload/images/20181106/201118719LVThLS0sA.png
https://ithelp.ithome.com.tw/upload/images/20181106/201118719UHiD4nhgo.png
13. 接下來測試 Auto CI/CD 的結果, 開啟專案內容 index.html 檔案進行修改
https://ithelp.ithome.com.tw/upload/images/20181106/20111871JSGSHjcKBT.png
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 'https://github.com': samlintw
Password for 'https://?????@github.com':
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.
To https://github.com/?????/azure-voting-app-redis.git
   705e3a4..fd9b1ce  master -> master
  1. 觀察 Jenkins 是否如預期設定每分鐘輪詢 github
    https://ithelp.ithome.com.tw/upload/images/20181106/20111871fUGEmLkN4V.png
  2. 偵測到 Change 後, 便開始自動建置部署
    https://ithelp.ithome.com.tw/upload/images/20181106/201118710Dq7tGnuUX.png

參考資料:


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

尚未有邦友留言

立即登入留言