看了就會的 Zadig 入門教程

Zadig 是 KodeRover 公司基於 Kubernetes 自主設計、研發的開源分佈式持續交付產品,具備靈活易用的高併發工作流、面向開發者的雲原生環境、高效協同的測試管理、強大免運維的模板庫、客觀精確的效能洞察以及雲原生 IDE 插件等重要特性,爲工程師提供統一的協作平面。Zadig 內置了 K8s YAML、Helm Chart、主機等複雜場景最佳實踐,適用大規模微服務、高頻高質量交付等場景。

核心概念

在使用 Zadig 之前我們這裏先來了解下 Zadig 中的幾個核心概念。

安裝

我們這裏選擇使用 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 控制器來暴露服務,會創建一個名爲 zadigvirtualservices 對象,該對象相當於 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 IDClient Secret 記錄下來,切換到 Zadig 系統,管理員依次點擊系統設置 -> 集成管理 -> 代碼源集成頁面,然後點擊添加按鈕,在彈出的對話框中選擇 GitHub 代碼源,填上上面獲取的 Client IDClient Secret 信息。

然後點擊前往授權按鈕,點擊後會自動跳轉到 GitHub 的授權頁面,需要我們進行認證授權,授權後會自動跳轉回 Zadig 系統頁面。

GitLab

如果要集成 GitLab 代碼源,同樣需要去創建一個認證應用,前往 GitLab 應用管理頁面 http://git.k8s.local/-/profile/applications。

這裏我們需要新建一個應用,名稱爲 Zadig,其中 Redirect URIhttp://zadig.k8s.local/api/directory/codehosts/callback,需要勾選 apiread_userread_repository3 個權限。

應用創建成功後,GitLab 會返回應用的相關信息,其中包括 Application IDSecret 信息。

然後一樣的方式前往 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,倉庫就包含一個 Dockerfileindex.html 文件。

from nginx:stable

add index.html /usr/share/nginx/html

代碼源準備好後,接下來我們就可以去創建項目了,Zadig 中的項目包括工作流、環境、服務、構建、測試、版本等資源,用戶在項目中可以進行服務開發、服務部署、集成測試、版本發佈等操作。

前面項目列表開始新建項目,這裏我們選擇 K8s YAML項目類型。

點擊立即新建按鈕,進入項目初始化嚮導,點擊下一步開始創建服務:

點擊下一步開始新建一個服務,Zadig 中的服務可以理解爲一組 Kubernetes 資源,比如 Service、Deployment 等等,也可以是一個 Helm Chart 包。

新建服務提供了 3 種方式:

由於我們這裏的示例非常簡單,就直接使用手工輸入的方式來新建服務。如下所示,我們新建一個名爲 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-devnginx-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