穩!上千微服務接入 Zadig 的最佳姿勢(K8s YAML 篇)

語言: CN / TW / HK

雲原生微服務架構下,可以獲得更高的可用性和擴充套件性,以滿足業務快速迭代的需求,然而成百上千個服務的 YAML 配置管理問題成了老大難的事情:不同服務的配置差異極小,但是不得不復制貼上;針對多樣化部署環境(比如有開發環境、測試環境、預釋出環境...)定製的服務配置更是導致 YAML 檔案氾濫成災...

Zadig 提供了幾種高效管理服務配置的姿勢:

  1. 從現有 Kubernetes 批量匯入多個服務,一鍵將已有服務配置平滑遷移
  2. 將多個服務的配置檔案組織在程式碼庫中,從程式碼庫同步現有服務配置,實現服務的批量建立
  3. 將多個服務的配置檔案抽象成服務模板,工程師只需填寫和服務相關的少量引數,使用模板建立服務即可

下面將詳細闡述這幾種場景的具體接入方法。

從現有 Kubernetes 批量匯入服務

適用:K8s YAML 型別專案的場景,可以直接從現有 K8s 叢集的名稱空間批量匯入服務,幾乎無遷移成本。

批量匯入服務

進入專案的服務模組 -> 點選新建按鈕 -> 選擇 從 Kubernetes 匯入

選擇服務所在的叢集和名稱空間 -> 新增服務 -> 選擇配置型別及配置名稱後匯入。

支援匯入 deployment/statefulset/service/ingress/secret/configmap/pvc 資源

匯入成功後,可在 Zadig 平臺中按需修改服務配置。

將服務加入到環境

進入專案的環境 -> 點選 新增服務 -> 選擇從 NS 匯入的服務即可批量將服務加入到已有環境中。

檢視環境

從程式碼庫批量同步

適用:已存在大體量的 K8s YAML 服務,每個服務有單獨的 YAML 配置。

將服務的 YAML 配置按照一定目錄結構組織起來,通過 Zadig 批量同步,下面以 voting-demo 專案為例演示說明:

  • 原始碼:zadig/voting-app [1]
  • 服務:該專案包括 5 個微服務(db/redis/result/vote/worker
  • 服務對應的配置檔案:上述 5 個微服務的 K8s YAML 配置檔案目錄,如下所示:
zadig/examples/voting-app/freestyle-k8s-specifications
├── db
│   ├── db-deployment.yaml
│   └── db-service.yaml
├── redis
│   ├── redis-deployment.yaml
│   └── redis-service.yaml
├── result
│   ├── result-deployment.yaml
│   └── result-service.yaml
├── vote
│   ├── vote-deployment.yaml
│   └── vote-service.yaml
└── worker
    └── worker-deployment.yaml


批量同步服務

進入專案的服務模組 -> 點選 從程式碼庫同步 -> 選擇程式碼庫以及服務配置所在檔案目錄,點選 同步

本例中即為 Zadig 庫的 examples/voting-app/freestyle-k8s-specifications 目錄

將服務加入到環境

批量同步服務配置後系統會自動解析多個服務,效果如下圖左側邊欄所示。

進入專案的環境中 -> 點選 新增服務 -> 選擇從程式碼庫同步的服務即可批量將服務加入到已有環境中。

檢視環境

使用服務模板建立

適用:已存在大體量的 K8s YAML 服務配置,多個服務的配置結構同構,不同服務配置的值存在細微差異(比如:不同服務的埠不同、資料庫連線地址不同、所需 CPU/Memory 資源限制不同...)

下面以 multi-service-demo 專案的 服務配置[2]為例進行實踐。該專案中包括三個服務 service1/ service2/ service3,通過分析這些服務的 K8s YAML 配置,抽象出服務模板,將不同服務有差異的配置提取為模板中的變數,即可得到服務模板 template.yaml[3]。

建立服務模板

在專案預覽頁點選右上角的 模板庫 -> K8s YAML 進入 K8s YAML 模板管理頁面。

點選 + 新建模板 -> 填寫模板名稱 multi-service-demo-template -> 填寫模板內容 -> 填寫自定義變數的值對模板賦預設值 -> 儲存模板。

該例中的模板內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $T-Service$
  labels: 
    app.kubernetes.io/name: $T-Project$
    app.kubernetes.io/instance: $T-Service$
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: $T-Project$
      app.kubernetes.io/instance: $T-Service$
  replicas: 2
  template:
    metadata: 
      labels:
        app.kubernetes.io/name: $T-Project$
        app.kubernetes.io/instance: $T-Service$
    spec:
      containers:
        - name: $T-Service$
          image: ccr.ccs.tencentyun.com/koderover-public/$T-Service$:latest
          imagePullPolicy: Always 
          command:
            - /workspace/$T-Service$
          ports:
            - protocol: TCP
              containerPort: {{.port}}
          resources:
            limits:
              memory: {{.memoryLimit}}
              cpu: {{.cpuLimit}}
---
apiVersion: v1
kind: Service
metadata:
  name: $T-Service$
  labels:
    app.kubernetes.io/name: $T-Project$
    app.kubernetes.io/instance: $T-Service$
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: {{.port}}
      targetPort: {{.port}}



使用模板新建服務

只需要填寫服務名稱,選擇模板,填寫若干變數即可快速建立服務。

進入 multi-service-demo 專案的服務模組,點選 使用模板新建服務。

填寫服務名稱 service1 -> 選擇模板 multi-service-demo-template -> 填寫 service1 服務在模板中的變數配置後新建即可。

重複上述步驟繼續新建服務 service2service3

將服務加入到環境

至此這三個服務都被成功建立,進入專案的環境中 -> 點選 新增服務 -> 選擇服務即可批量將服務加入到已有環境中。

以上三種方式成功將服務接入 Zadig,接下來便可以使用 Zadig 強大的環境治理和工作流能力對服務進行構建部署、測試驗證、持續交付等,推薦閱讀:

結語

秉承著 do not block developers 的理念,Zadig 的批量接入能力及 K8s YAML 服務模板功能,極大程度降低服務 YAML 配置檔案維護的心智負擔,讓工程師從繁瑣的配置管理“髒活累活”中解放出來,進入雲原生持續交付快車道,更多時間創造業務價值。

參考連結:

[1] http://github.com/koderover/zadig/tree/main/examples/voting-app

[2] http://github.com/koderover/zadig/tree/main/examples/multi-service-demo/k8s-yaml/

[3] http://github.com/koderover/zadig/blob/main/examples/multi-service-demo/k8s-yaml/template.yaml

[4] http://docs.koderover.com/zadig/v1.12.0/project/workflow/

[5] http://docs.koderover.com/zadig/v1.12.0/project/env/k8s/

Zadig,讓工程師更專注創造。歡迎加入 開源吐槽群🔥

Zadig on Github
Zadig on Gitee