K8s叢集一致性測試

語言: CN / TW / HK

一致性定義

“一致性”(Comformance)定義了K8s(Kubernetes)叢集必須支援的一系列叢集互操作特性的集合,用於驗證叢集在不同的環境中能工作在預期的狀態下。我們知道K8s叢集的一個核心特性是“可移植性”,開發者僅需要做少量的變更即可以將應用部署到一個新的環境中。對於企業應用而言,隨著業務的更新需要進行應用的拓展或者新增需求的支援,單一的K8s叢集往往不能滿足業務變更需求,需要多K8s叢集或者混合叢集部署等方式支援。在此背景下,如果K8s叢集未通過一致性測試,那麼K8s叢集的便攜性和自動部署等能力就無法實現,也無法支援企業的多樣化需求,因此我們需要對K8s叢集進行一致性測試。更多K8s官方一致性測試介紹可參考官方介紹:

https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/conformance-tests.md

Sonobuoy是一款K8s叢集診斷工具,通過執行一系列可訪問且非破壞的配置測試來輕鬆獲取獲取叢集的狀態,可以通過定製、可擴充套件的、與叢集無關的方式來生成清晰的、資訊豐富的叢集測試報告。

具有以下幾個主要的功能:

1.一致性測試(Conformance Testing);

2.負載除錯(Workload Debugging);

3.自定義測試和資料收集(Custom Tests and Data Collection);

Sonobuoy工作原理

Sonobuoy主要包含三個主要組成結構:

一個命令列客戶端,用於觸發一致性測試、獲取狀態、檢視活動log、接收和解壓測試結果;

一個執行在K8s叢集內部的聚合器,用於執行測試外掛和收集測試結果;

一個或多個測試外掛,執行在特定名稱空間內,用於執行特定的測試或者測試框架;

測試外掛框架執行原理如下圖。測試外掛可自定義和開發,需要遵循Sonobuoy的標準API來通訊和傳遞狀態,包如 "pending","running" 或者 "complete" 等。

環境安裝

①. 首先安裝依賴環境 “kubectl”

根據執行環境安裝對應的 kubectl 環境( https://kubernetes.io/docs/tasks/tools/ )。確保被測叢集的config檔案配置正確,”kubectl cluster-info“可返回正確叢集資訊。

②. 安裝Sonobuoy診斷工具

可到Github的sSonobuoy主要下載最新的安裝包( https://github.com/vmware-tanzu/sonobuoy/releases ),解壓安裝包後,新增“sonobuoy”到可執行環境變數。執行“sonobuoy version”驗證環境安裝是否成功。

測試執行

這裡以e2e測試外掛為例介紹Sonobuoy測試執行。e2e 外掛 (Kubernetes End-To-End Tests)更多介紹可參考官方主頁( https://github.com/vmware-tanzu/sonobuoy-plugins/tree/main/e2e )。其他支援的測試外掛介紹( https://github.com/vmware-tanzu/sonobuoy-plugins )。

第一步,同步官方映象到本地,解決本地叢集映象下載慢的問題。

這裡推薦用Skopeo工具快速同步映象。注意下載的測試映象的版本應與叢集Kubernetst版本一致,如當前叢集版本是“v1.21.3”,則下載“k8s.gcr.io/conformance:v1.21.3 ”映象。

用Skopeo同步映象到本地倉庫:

skopeo --override-os linux copy docker://k8s.gcr.io/conformance:v1.21.3  docker://r.addops.soft.360.cn/google-containers/conformance:v1.21.3 --insecure-policy --dest-tls-verify=false

第二步,下載e2e測試外掛yaml檔案。

e2e測試外掛官方模板

https://github.com/vmware-tanzu/sonobuoy-plugins/blob/main/e2e/e2e.yaml
odSpec:
  containers: []
  nodeSelector:
    kubernetes.io/os: linux
  restartPolicy: Never
  serviceAccountName: sonobuoy-serviceaccount
  tolerations:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
    operator: Exists
  - key: CriticalAddonsOnly
    operator: Exists
  - key: kubernetes.io/e2e-evict-taint-key
    operator: Exists
sonobuoy-config:
  driver: Job
  plugin-name: e2e
  result-format: junit
  source_url: https://raw.githubusercontent.com/vmware-tanzu/sonobuoy-plugins/main/e2e/e2e.yaml
  description: The end-to-end tests maintained by Kubernetes to test the health of your cluster.
spec:
  command:
  - /run_e2e.sh
  env:
  - name: E2E_EXTRA_ARGS
    value: --progress-report-url=http://localhost:8099/progress
  - name: E2E_FOCUS
    value: \[Conformance\]
  - name: E2E_PARALLEL
    value: "false"
  - name: E2E_SKIP
    value: \[Disruptive\]|NoExecuteTaintManager
  - name: E2E_USE_GO_RUNNER
    value: "true"
  image: k8s.gcr.io/conformance:$SONOBUOY_K8S_VERSION
  imagePullPolicy: IfNotPresent
  name: e2e
  resources: {}
  volumeMounts:
  - mountPath: /tmp/results
    name: results

注意將yaml中的image地址更新為第一步中同步到本地的映象地址。

第二步,執行測試。

執行以下命令,其他測試外掛的執行可按同樣的方式制定到不同外掛的yaml檔案路徑即可。

sonobuoy run --plugin ./plugin/e2e.yaml

測試執行之後,可以看到叢集裡面建立了一些測試相關的pod。

可以看到e2e container執行的log如下。

測試執行過程也可以通過 "sonobuoy status" 檢視執行狀態。

執行大於1-2小時後(取決叢集和測試用例集大小),可以看到測試執行完成。

第三步,測試結果提取。

執行 "sonobuoy retrieve" 即可收集測試結果,可以在當前目錄生成“*.tar.gz”測試結果檔案。

結果檢視

執行 "sonobuoy result <result file > "級可以檢視測試測試結果。

也可以執行直接將該測試結果檔案解壓,用其他IDE檢視測試結果檔案。

測試用例分析

對於某些“failed”狀態的測試用例,需要分析執行失敗的原因。可以到Kubernetes官網檢視測試用例執行原理,進而分析造成執行失敗原因。

如測試用例“'[sig-apps] Daemon set [Serial] should run and stop complex daemon [Conformance]'”,其返回的測試結果如下:

可以根據官方“conformance tests”用例網址

https://github.com/kubernetes/kubernetes/blob/ea0764452222146c47ec826977f49d7001b0ea8c/test/conformance/testdata/conformance.yaml

可以定位到該測試用例,找到測試用例定義檔案路徑:“test/e2e/apps/daemon_set.go”。

從該路徑中可以找到該測試用例的執行方法。

總結

本文主要介紹瞭如何用Sonobuoy診斷工具來對K8s叢集執行一致性測試。K8s叢集一致性測試對於確保元件供應商遵循相同API規範,保持元件間的相容性,確保使用者在使用任何Kubernetes廠商發行版時,都得到的和原生Kuberentes功能幾乎一致的體驗等多個方面具有重要意義。同時也只有經過一致性認證測試,才能獲得CNCF的官方認證,在產品的宣傳上使用Certified Kubernetes的認證商標和Logo。後續工作將結合K8s叢集的架構,重點分析測試用例執行的方法、考察的內容,進一步加深對K8s叢集的認識和了解。