看了就會的 Zadig 入門教程
Zadig
是 KodeRover 公司基於 Kubernetes 自主設計、研發的開源分佈式持續交付產品,具備靈活易用的高併發工作流、面向開發者的雲原生環境、高效協同的測試管理、強大免運維的模板庫、客觀精確的效能洞察以及雲原生 IDE 插件等重要特性,爲工程師提供統一的協作平面。Zadig 內置了 K8s YAML、Helm Chart、主機等複雜場景最佳實踐,適用大規模微服務、高頻高質量交付等場景。
核心概念
在使用 Zadig 之前我們這裏先來了解下 Zadig 中的幾個核心概念。
-
項目:Zadig 中的項目包括工作流、環境、服務、構建、測試、版本等資源,用戶在項目中可以進行服務開發、服務部署、集成測試、版本發佈等操作。
-
工作流:典型的軟件開發過程一般包括
編寫代碼 -> 構建 -> 部署 -> 測試 -> 發佈
這幾個步驟,工作流就是 Zadig 平臺對這樣一個開發流程的實現,通過工作流來更新環境中的服務或者配置。 -
工作流組成:Zadig 工作流簡化示意圖如下所示:
目前工作流基本組成部分有: -
構建:拉取代碼,執行構建
-
部署:將構建產物部署到測試環境中
-
測試:執行自動化測試,對部署結果進行驗證
-
分發:完成測試驗證後,將構建產物分發到待發布的倉庫
-
環境:Zadig 環境是一組服務集合及其配置、運行環境的總稱,與 Kubernetes 的 NameSpace 是一對一的對應關係,使用一套服務模板可以創建多套環境。
-
服務:Zadig 中的服務可以理解爲一組 Kubernetes 資源,包括 Ingress、Service、Deployment/Statefulset、ConfigMap 等,也可以是一個完整的 Helm Chart 或者雲主機 / 物理機服務,成功部署後可對外提供服務能力。
-
服務組件:服務組件是 Zadig 中可被更新的最小單元,是使用 Kubernetes 作爲基礎設施的項目中的概念。一個服務中可包括多個服務組件。不同項目中的服務組件信息如下表:
服務組件是服務構建配置中的一部分,爲服務組件配置構建後,運行工作流時可選擇對應的服務組件對其進行更新。 -
構建:Zadig 構建屬於服務配置的一部分,同時在工作流運行階段會被調用,與服務是一對多的對應關係,即一套構建可以支持多個服務共享。
-
測試:Zadig 測試屬於項目的資源,同時也可以作爲一個非必要階段在工作流中調用,支持跨項目。
-
版本管理:Zadig 版本是一個完整的可靠交付物,比如 Helm Chart,或 K8s YAML 完整配置文件。
安裝
我們這裏選擇使用 Helm 的方式來進行安裝。
$ helm repo add koderover-chart https://koderover.tencentcloudcr.com/chartrepo/chart
$ helm repo update
獲取 chart 包:
$ helm pull koderover-chart/zadig --untar
創建如下所示的 values 文件(ci/local-values.yaml
):
# ci/local-values.yaml
tags:
mongodb: true
minio: true
ingressController: false
mysql: true
endpoint:
type: FQDN
FQDN: zadig.k8s.local
dex:
config:
staticClients:
- id: zadig
redirectURIs:
- 'http://zadig.k8s.local/api/v1/callback'
name: 'zadig'
secret: ZXhhbXBsZS1hcHAtc2VjcmV0
zadig 需要依賴 mongodb、minio 以及 mysql 服務,如果你沒有外部的服務可用,則可以使用內置的服務,通過 tags
下面的屬性來配置是否開啓即可,endpoint.FQDN
用來配置 zadig 服務的地址。然後我們就可以使用該 values 文件來部署 zadig 了:
$ kubectl create ns zadig
$ helm upgrade --install zadig . -f ci/local-values.yaml --namespace zadig
NAME: zadig
LAST DEPLOYED: Mon Jul 11 14:21:16 2022
NAMESPACE: zadig
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Zadig has been installed successfully.
An initial account has been generated for your first login:
- Login: zadig.k8s.local
- User: admin
- Password: zadig
Add wechat ID "guotimeme": get FREE Zadig Tech Support, and Join our online community.
部署完成後查看 zadig 相關服務狀態:
$ kubectl get pods -n zadig
NAME READY STATUS RESTARTS AGE
aslan-69d6759654-rtsrn 2/2 Running 0 155m
config-547fb89564-vkj84 1/1 Running 1 (153m ago) 155m
cron-f8544788c-5b8fl 2/2 Running 1 (143m ago) 155m
dind-0 1/1 Running 0 155m
discovery-74945fc6d4-sn8ws 1/1 Running 0 155m
gateway-6bdf56976-gg4nx 1/1 Running 3 (154m ago) 155m
gateway-proxy-f7d46ccb9-bln5j 1/1 Running 0 155m
gloo-66d69d848f-khvfk 1/1 Running 0 155m
hub-server-7fb68b65cb-4c7lp 1/1 Running 0 155m
nsqlookup-0 1/1 Running 0 155m
opa-b5df66445-stjjp 1/1 Running 0 155m
picket-84d4758c5f-kp88l 1/1 Running 0 155m
podexec-57db555984-tgrk8 1/1 Running 0 155m
policy-67f7d4f744-n9g5l 1/1 Running 0 155m
resource-server-bcd7cd7f8-krpg6 1/1 Running 0 155m
user-5c95bb8fb7-z8wg5 1/1 Running 1 (153m ago) 155m
warpdrive-7ffff47d47-n2vwb 2/2 Running 0 155m
warpdrive-7ffff47d47-rwpq4 2/2 Running 0 155m
zadig-dex-c575978d9-n68q9 1/1 Running 1 (150m ago) 155m
zadig-init--1-f98xb 0/1 Completed 0 155m
zadig-minio-fb7fdd6b6-cfjss 1/1 Running 0 155m
zadig-mongodb-5c59975745-4s24h 1/1 Running 0 155m
zadig-mysql-0 1/1 Running 0 155m
zadig-portal-5cdd6d9fdd-6g8ds 1/1 Running 0 155m
可以看到 zadig 的依賴服務還是比較多的,默認情況下 zadig 會使用 gloo
這種 ingress 控制器來暴露服務,會創建一個名爲 zadig
的 virtualservices
對象,該對象相當於 Ingress 的一個高級版本。
$ kubectl get virtualservices zadig -n zadig
NAME AGE
zadig 171m
$ kubectl get svc -n zadig
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
aslan ClusterIP 10.97.27.165 <none> 25000/TCP 172m
config ClusterIP 10.107.241.188 <none> 80/TCP 172m
dind ClusterIP None <none> 2375/TCP 172m
gateway ClusterIP 10.99.26.142 <none> 443/TCP 172m
gateway-proxy LoadBalancer 10.111.109.206 192.168.0.102 80:31600/TCP,443:31572/TCP 172m
gloo ClusterIP 10.103.178.8 <none> 9977/TCP,9976/TCP,9988/TCP,9979/TCP 172m
hub-server ClusterIP 10.109.70.132 <none> 26000/TCP 172m
nsqlookupd ClusterIP None <none> 4160/TCP,4161/TCP 172m
opa ClusterIP 10.111.93.64 <none> 9191/TCP,8181/TCP 172m
picket ClusterIP 10.97.6.111 <none> 80/TCP 172m
podexec ClusterIP 10.100.251.156 <none> 27000/TCP 172m
policy ClusterIP 10.105.50.162 <none> 80/TCP 172m
resource-server ClusterIP 10.111.41.231 <none> 80/TCP 172m
user ClusterIP 10.106.85.172 <none> 80/TCP 172m
warpdrive ClusterIP 10.107.219.101 <none> 25001/TCP 172m
zadig-dex ClusterIP 10.102.181.112 <none> 5556/TCP,5558/TCP 172m
zadig-minio ClusterIP 10.99.45.95 <none> 9000/TCP 172m
zadig-mongodb ClusterIP 10.98.252.235 <none> 27017/TCP 172m
zadig-mysql ClusterIP 10.101.122.76 <none> 3306/TCP 172m
zadig-mysql-headless ClusterIP None <none> 3306/TCP 172m
zadig-portal ClusterIP 10.104.141.49 <none> 80/TCP 172m
我本地集羣部署了 metalb
,會自動爲 gateway-proxy
服務分配一個 LoadBalancer 類型的 IP 地址,我們只需將 zadig.k8s.local
域名解析到該 IP 地址即可,然後我們就可以在瀏覽器中訪問了。
默認的用戶名爲 admin
,密碼爲 zadig
,登錄後即可進入首頁。
基本使用
Zadig 安裝完成後,接下來我們以容器化 Nginx 爲例來說明下 Zadig 的基本使用。
集成代碼源
首先我們要去添加下代碼源,比如常見的 GitHub、GitLab 等。
GitHub
要集成 GitHub 代碼源首先需要進入 https://github.com/settings/developers 頁面新建一個 OAuth Apps
,其中應用名稱可以隨便命名,首頁 URL 我們這裏是 http://zadig.k8s.local
,下面的 callback URL
比較重要,填寫 http://zadig.k8s.local/api/directory/codehosts/callback
。
應用創建成功後,GitHub 會返回應用的基本信息,點擊 Generate a new client secret
生成 Client Secret。
將生成的 Client ID
與 Client Secret
記錄下來,切換到 Zadig 系統,管理員依次點擊系統設置 -> 集成管理 -> 代碼源集成
頁面,然後點擊添加按鈕,在彈出的對話框中選擇 GitHub
代碼源,填上上面獲取的 Client ID
和 Client Secret
信息。
然後點擊前往授權
按鈕,點擊後會自動跳轉到 GitHub 的授權頁面,需要我們進行認證授權,授權後會自動跳轉回 Zadig 系統頁面。
GitLab
如果要集成 GitLab 代碼源,同樣需要去創建一個認證應用,前往 GitLab 應用管理頁面 http://git.k8s.local/-/profile/applications。
這裏我們需要新建一個應用,名稱爲 Zadig
,其中 Redirect URI
爲 http://zadig.k8s.local/api/directory/codehosts/callback
,需要勾選 api
、read_user
、read_repository
3 個權限。
應用創建成功後,GitLab 會返回應用的相關信息,其中包括 Application ID
、Secret
信息。
然後一樣的方式前往 Zadig 添加一個新的代碼源,將 GitLab 相關信息填寫到對話框中。
然後點擊前往授權
按鈕會自動跳轉到 GitLab 頁面進行授權認證。
確認授權後會自動跳轉回 Zadig,正常情況下就可以看到添加的代碼源了。
集成鏡像倉庫
代碼源集成完成後,接下來我們需要添加鏡像倉庫到 Zadig 中,支持集成阿里雲 ACR、騰訊雲 TCR、華爲雲 SWR、Amazon ECR、DockerHub、Harbor 等鏡像倉庫,我們這裏來集成同 K8s 集羣中部署的 Harbor 服務。
首先在 Harbor 中創建一個名爲 zadig
的新項目,用來保存 Zadig 中構建的鏡像。
在 Zadig 系統 http://zadig.k8s.local/v1/system/registry 頁面點擊新建
按鈕,配置上我們的 Harbor 相關信息。
由於我這裏的 Harbor 服務是自簽名的服務,爲了方便我這裏未開啓 SSL 校驗,然後點擊保存
按鈕即可。
新建項目
我們這裏通過一個簡單的 Nginx 應用來進行說明,代碼放置在 GitLab 上面,倉庫地址爲 http://git.k8s.local/course/zadig-nginx-demo,倉庫就包含一個 Dockerfile
和 index.html
文件。
from nginx:stable
add index.html /usr/share/nginx/html
代碼源準備好後,接下來我們就可以去創建項目了,Zadig 中的項目包括工作流、環境、服務、構建、測試、版本等資源,用戶在項目中可以進行服務開發、服務部署、集成測試、版本發佈等操作。
前面項目列表開始新建項目,這裏我們選擇 K8s YAML項目
類型。
點擊立即新建
按鈕,進入項目初始化嚮導,點擊下一步開始創建服務:
點擊下一步
開始新建一個服務,Zadig 中的服務可以理解爲一組 Kubernetes 資源,比如 Service、Deployment 等等,也可以是一個 Helm Chart 包。
新建服務提供了 3 種方式:
-
手工輸入:直接配置 K8s 的資源清單文件
-
從代碼庫導入:從代碼倉庫中同步服務的 K8s 資源清單文件
-
使用模板新建:基於 K8s YAML 模板或者從 K8s 中導入
由於我們這裏的示例非常簡單,就直接使用手工輸入的方式來新建服務。如下所示,我們新建一個名爲 nginx
的服務,在中間的 YAML 區域編寫我們服務的資源清單文件。
這裏我只需要簡單創建一個 Deployment 和 Service 資源即可,對應的資源清單文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
version: "{{.nginxVersion}}"
template:
metadata:
labels:
app: nginx
version: "{{.nginxVersion}}"
spec:
containers:
- name: nginx
image: harbor.k8s.local/zadig/nginx:stable
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
version: "{{.nginxVersion}}"
spec:
labelSelector:
app: nginx
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
然後點擊保存
按鈕,保存後會自動加載除系統變量、YAML 中的自定義變量以及服務組件,上面的 YAML 文件中我們添加了一個 {{.nginxVersion}}
變量,Zadig 會自動讀取到該變量。
接下來在變量區域點擊添加構建
爲我們的服務配置構建方式。
可以根據需要配置構建的環境,同時選擇 GitLab 這個代碼源,並選擇我們前面的項目代碼倉庫以及分支。
然後在下方可以配置通用構建腳本:
cd $WORKSPACE/zadig-nginx-demo
docker build -t $IMAGE -f Dockerfile .
docker push $IMAGE
其中的 $IMAGE
變量就是前面變量中讀取到的當前鏡像版本($IMAGE)
,配置後點擊保存構建
即可。
可以看到已經關聯上了上面創建的構建信息了。
接下來點擊下一步
繼續,在這一步中,系統會自動創建 2 套環境和 3 條工作流。2 套環境可分別用於日常開發環節和測試驗收環節,3 條工作流也會自動綁定對應的環境以達到對不同環境進行持續交付的目的。
Zadig 會在 K8s 集羣中創建兩個名爲 nginx-demo-env-dev
和 nginx-demo-env-qa
的命名空間。
$ kubectl get ns |grep nginx-demo
nginx-demo-env-dev Active 23s
nginx-demo-env-qa Active 23s
繼續下一步
進入工作流執行頁面,在該頁面可以看到創建的 3 條工作流,分別對應着不同的環境。
比如我們現在選擇 nginx-demo-workflow-dev
這條工作流來完成 dev 環境的持續交付,點擊後面的點擊運行
按鈕。
根據實際需求選擇要部署的服務以及對應代碼分支,然後點擊啓動任務即可開始執行構建任務。
任務啓動後我們也可以看到會去自動啓動一個 Pod 來執行構建任務,這點和 Jenkins 的動態 Slave 基本一致的,當任務構建完成後也會自動銷燬該 Pod。
$ kubectl get pods -n zadig
NAME READY STATUS RESTARTS AGE
dind-0 1/1 Running 0 16m
nginx-demo-workflow-dev-2-buildv2-szhrk--1-mn6dd 1/1 Running 0 8s
# ......
任務執行完成後會使用新構建的鏡像 harbor.k8s.local/zadig/nginx:20220711184844-1-main
去替換掉前面我們配置的資源清單中的鏡像地址,自動部署到 nginx-demo-env-dev
命名空間中。
$ kubectl get pods -n nginx-demo-env-dev
NAME READY STATUS RESTARTS AGE
nginx-5d5c7f978-r2vkd 1/1 Running 0 30s
我們可以通過該服務的 NodePort 來訪問 nginx 服務。
$ kubectl get svc -n nginx-demo-env-dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.96.32.211 <none> 80:31675/TCP 6m57s
$ curl 192.168.0.106:31675
<h1>
Hello 優點知識(youdianzhishi.com)!
</h1>
同時 dev
環境中的鏡像信息也自動更新成了上面構建的鏡像信息。
觸發器
其他環境的服務交付和上面都是類似的,接下來我們來配置自動觸發工作流和版本交付。
點擊 dev
工作流配置按鈕,進入工作流配置頁面。
點擊左側的觸發器+
按鈕開始添加觸發器,然後勾選 Webook
來添加一個 Webhook 的觸發器。
點擊添加配置
添加一個觸發器,這裏我們爲 GitLab 代碼庫添加一個觸發器,選擇對應的代碼庫和分支等信息,添加後記得保存。
現在我們去 GitLab 代碼倉庫中創建一個 Pull Request,在處理合併的頁面中會自動關聯上對應的 Zadig 工作流狀態。
點擊任務鏈接可以跳轉到 Zadig 工作流信息頁面。
當然當我們將這個 PR 合併到 main 分支上過後同樣也會觸發一次新的任務。
到這裏我們就使用 Zadig 完成了一個最簡單的應用交付,Zadig 還有更多高級功能實踐未完待續......
k8s 技術圈 專注容器、專注 kubernetes 技術......
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_UVB0qmeowvaj3gHeJ6qmA