通過 Flow 流水線自動化任務,將Java應用構建鏡像推送至鏡像倉庫,并部署到了ACK(Kubernetes版集群)中,完成研發流程的協同自動化。
背景信息
如果您的業務是以下場景,那么本文檔可以幫助您實現研發流程的協同自動化。
使用Java進行開發。
使用容器鏡像的制品形式進行交付。
制品最終會運行在阿里云ACK或者其他K8s集群上。
用戶訴求
一般來說,使用K8s部署場景如下:
對源代碼進行一定的質量檢測,比如單元測試,代碼掃描。
將源代碼構建成為可交付的制品,也就是容器鏡像。
對制品進行測試環境驗證。
使用完成驗證的制品進行線上部署。
使用基礎設施即代碼的方式,在代碼庫中管理與應用相關的所有YAML文件。使用這種方式,將K8s的編排能力完全交給開發,比較靈活,也更加利于DevOps的實施。
上述活動需要有不同角色的參與:開發、測試、運維。如何保證不同參與者可以使用統一的交付流程來進行協作,是云效Flow交付流水線要解決的主要問題。
云效解決方案
通過云效持續交付流水線和阿里云K8s很好的結合在一起,為應用的持續交付提供了很好的基礎保障,如下圖:
開發者提交代碼變更到代碼庫,云效在監聽著代碼庫的變動,一旦代碼發生變化,將自動觸發云效持續部署流水線一次構建任務的運行,包括代碼檢查、構建、測試部署、測試驗證和生產部署等過程。
在構建完之后,生成Docker鏡像,并自動上傳至應用鏡像倉庫,在部署階段(測試環境的部署和生產環境的部署)時,獲取當前流水線實例構建出來的鏡像版本,通過K8s進行容器編排部署。而這一切,都是通過自動化的手段進行完成。
前提條件
云效操作實踐
一、創建流水線
在云效工作臺,單擊流水線進入云效流水線Flow。
在流水線 Flow控制臺頁面,單擊右上角新建流水線,進入流水線創建向導頁面。
根據需求,選擇相應模板,并單擊創建。
二、配置代碼庫
三、配置鏡像構建任務
您需要先在ACR(容器鏡像服務)上創建個人實例鏡像倉庫。
在構建任務節點區域,單擊任務節點,配置鏡像構建并推送至ACR(個人版)步驟。
在任務步驟配置項中,配置如下參數。
選擇服務連接
添加服務連接,需要授權Flow訪問容器鏡像服務。
地域
選擇鏡像倉庫實例所屬地域。
倉庫
選擇自定義的鏡像倉庫。
標簽
標簽填入
${DATETIME}
表示以流水線觸發時的時間戳作為鏡像的標簽。說明Docker鏡像Tag,支持固定參數例如1.0,或者動態參數例如${DATETIME}
Dockerfile 路徑
Dockerfile鏡像構建指令文件,填寫
Dockerfile2
,相對于代碼庫根目錄所在路徑。配置好鏡像構建并推送至阿里云鏡像倉庫任務,下方任務輸出的變量是后續的任務中引用,其中有鏡像公網地址和鏡像VPC地址。
說明推薦將鏡像倉庫和ACK集群放在同一個集群,然后在后續的部署任務中選擇VPC地址,以加速部署過程
四、配置部署任務
在部署任務節點區域,單擊“Kubernetes 發布”任務,進入任務配置面板。
集群連接:單擊新建連接,連接到自定義Kubernetes或者阿里云容器服務集群,具體操作請參見Kubernetes 服務連接,進行ACK集群授權,完成阿里云授權及集群選取。
YAML 路徑:填寫YAML對象資源文件所屬目錄路徑,在源碼倉庫中的相對路徑。
變量:配置Kubectl 發布任務所需的變量參數值。
IMAGE
添加上游任務制品或鏡像下載地址類型的變量,填入IMAGE變量名,選擇鏡像公網地址作為變量值。在Flow運行時,將Deployment對象資源的占位符變量
${IMAGE}
替換成鏡像的地址。HOST
添加自定義參數類型變量自定義變量名,設置變量值為自定義域名,用于Ingress對象資源中的域名配置。
說明根據需求自定義域名,本文為演示使用本地hosts文件解析測試。
ACR_SECRET
添加自定義參數類型變量自定義變量名,設置變量值為ACR個人實例鏡像倉庫訪問憑證的
Base64
編碼字符串,用于Secret對象資源的.dockerconfigjson
認證信息。說明以下是ACR個人實例鏡像倉庫地址、賬號和密碼信息,使用JSON格式進行base64編碼。
# 鏡像倉庫訪問憑證用戶名和密碼,進行base64編碼。 echo -n "username:password" | base64 # 將用戶名和密碼的base64編碼字符串作為auth鍵的值。 # 再將鏡像倉庫地址也進行base64編碼,輸出最后編碼字符串作為ACR_SECRET值。 echo -n '{"auths":{"xxxxx.com":{"auth":"xxxxx"}}}' | base64
示例代碼庫中的 app.yaml 文件內容如下。
# Secret
apiVersion: v1
kind: Secret
metadata:
name: acr-registry-private
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ${ACR_SECRET}
---
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: spring-boot-sample
name: spring-boot-sample
spec:
replicas: 2
selector:
matchLabels:
run: spring-boot-sample
template:
metadata:
labels:
run: spring-boot-sample
spec:
imagePullSecrets:
- name: acr-registry-private
containers:
- image: ${IMAGE}
name: app
---
# Service
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service
labels:
test: test
labele2: label
spec:
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
- name: https
port: 443
protocol: TCP
targetPort: 443
selector:
run: spring-boot-sample
sessionAffinity: None
type: ClusterIP
---
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-boot-route
spec:
rules:
- host: ${HOST} # 訪問此內容的域名
http:
paths:
- backend:
service:
name: spring-boot-service
port:
number: 8080 # 訪問的端口
path: / # 匹配規則
pathType: Prefix # 匹配類型,這里為前綴匹配
五、添加人工卡點
以下演示了如何添加一個進入測試環境的卡點,添加生產環境的卡點也是類似的,這里不再贅述,可以類似的進行配置。
為了保證經過審批的制品才能進入部署環境,需要添加一個人工卡點,這里假設這個環境是測試環境,需要有測試管理員來審批才能進入。
在云效控制臺頁面,選擇進入“企業管理后臺”,選擇導航菜單
,單擊右上方添加角色,添加角色“測試管理員”。選擇導航菜單
,并將企業用戶“張三”的角色設置為“測試管理員”角色。回到流水線繼續進行配置,在部署節點區域,任務“Kubernetes 發布”前面添加一個任務,搜索“人工卡點”,參考如下配置。
以上演示了如何添加一個進入測試環境的卡點,添加生產環境的卡點也是類似的,這里不再贅述,可以進行類似的配置。
六、運行流水線
人工卡點任務配置完畢,單擊“保存并運行”觸發流水線。
掃描、單測及構建上傳的任務自動完成,并停在了卡點上,普通人員無權限通過。
在右上角選擇圖標,單擊設置流水線信息,選擇菜單成員管理,單擊新增成員,添加張三用戶,開通訪問目標流水線的權限。切換到張三的賬戶之后,可以操作通過或者拒絕。
如果張三用戶驗證通過后,流水線會進入Kubectl 發布的任務。
在Ingress對象資源中配置的域名,因此可以通過自定義的域名訪問服務。
說明關于使用的自定義域名是本地測試域名,需要在本地環境配置hosts解析,測試訪問服務
http://www.testflow.com/
。
七、回滾
如果發布完成之后發現線上服務有問題,則需要快速回滾。云效Flow提供了通過歷史版本直接進行回滾的能力。
在流水線運行頁面點擊“部署歷史”,然后選擇相應的部署任務,便可以看到該部署任務所有的成功部署記錄
單擊版本#16,進行“回滾”,即可回滾到#15版本。
八、通知
為了更好的進行協作,Flow提供了通知能力在流水線不同的生命周期節點上進行通知。一般來講開發團隊會關心部署的成功和失敗,那么可以將該事件推送到團隊的釘釘群中,配置方式如下,單擊“添加插件”,選擇釘釘機器人通知,填入webhook地址,運行時機選擇“失敗”、“成功”。
再次運行之后,就會收到相應的通知:
總結
通過以上的操作流程,就可以建立起來一個協同多角色的流水線。接下來你可能想再了解其中的一些細節:
如果不希望管理K8s YAML文件,只需要更新某個pod的某個容器的鏡像,則可以把部署環境改成鏡像升級的任務。