1. 程式人生 > 其它 >基於容器服務 ACK 發行版打造 CNStack 社群版

基於容器服務 ACK 發行版打造 CNStack 社群版

簡介:本文將介紹如何使用 ACK Distro 作為基礎映象打造 CNStack 社群版以及CNStack 社群版中的容器服務 ACK 敏捷版產品如何幫助使用者更好的使用容器平臺能力。

作者:臨石

CNStack 社群版(CNStack Community Edition, CNStack CE)是阿里云云原生 Stack(CNStack)產品家族中的一員。CNStack 社群版可以免費下載使用,支援在有限的資源上進行部署和執行。CNStack 社群版使用 sealer 進行打包和交付,採用容器服務 ACK 發行版(ACK Distro)作為 Kubernetes 基礎。

本文將介紹:(1)如何使用 ACK Distro 作為基礎映象打造 CNStack 社群版。您可以將這個過程看做是以 ACK Distro 為基礎映象,利用 sealer 打包和交付應用的一個例子(2)CNStack 社群版中的容器服務 ACK 敏捷版產品如何幫助使用者更好的使用容器平臺能力。

容器服務 ACK 敏捷版是第一個整合到 CNStack 社群版的阿里云云原生產品。

基於 ACK Distro 構建 CNStack 社群版

當前 CNStack 社群版釋出的內容包括了“容器服務 ACK 敏捷版”部分,使用 sealer 的叢集映象技術對產品進行打包和交付。ACK Distro 和容器服務 ACK 敏捷版組成的 CNStack 社群版叢集映象結構如下。

基於 ACK Distro 製作 CNStack 社群版叢集映象

CNStack 社群版採用 ACK Distro 作為 Kubernetes 基礎映象,通過 sealer 打包新的叢集映象。

社群版叢集通過叢集映象檔案 Kubefile 完成了以下工作:

  • 在部署 ACK Distro 前對環境進行必要的配置(如建立 CNStack 社群版應用所需的本地目錄)
  • 宣告和部署 CNStack 社群版的元件和配置
  • 對部署完成的 ACK Distro 叢集進行配置

Kubefile 內容如下:

# 採用ack-distro:v1.20.4-ack-2作為基礎映象
FROM ack-agility-registry.cn-shanghai.cr.aliyuncs.com/ecp_builder/ackdistro:v1.20.4-ack-2
COPY imageList manifests
COPY kubeadm-cluster-config.yaml.tmpl etc
# 部署/清理階段的prehook和posthook
COPY plugin_localpv.yaml plugin
COPY plugin_iptables.yaml plugin
COPY plugin_clean.yaml plugin
# 元件的chart和配置檔案
COPY ../component/charts/localpv charts
COPY ../component/charts/aecp-installer-operator charts
COPY ../component/charts/aecp charts
COPY ../component/charts/cluster-addon-configuration charts
COPY ../component/clusterconfig.yaml manifests
# 部署元件
CMD helm install localpv charts/localpv
CMD helm install aecp-installer-operator charts/aecp-installer-operator
CMD helm install aecp charts/aecp
# 基於ACK-Distro部署的叢集,針對ACK敏捷版進行配置
CMD kubectl create ns cluster-local
CMD kubectl -n kube-system scale deploy hybridnet-webhook --replicas=1
CMD kubectl -n kube-system scale deploy hybridnet-manager --replicas=1
CMD kubectl taint nodes $(hostname | tr A-Z a-z) node-role.kubernetes.io/master=:NoSchedule-
CMD kubectl label nodes $(hostname | tr A-Z a-z) lb=nginx
CMD kubectl label nodes $(hostname | tr A-Z a-z) addon-local-repo=true
# 等待元件ready。視機器效能不同,等待時間有差別,在我們的測試場景中,約3min左右結束
CMD for i in `seq 0 1 2000`;do if kubectl get addonconfiguration 2> /dev/null;then helm install cluster-addon-configuration charts/cluster-addon-configuration && break;fi; echo "wait CRD ready ... $i out of 2000 tries" && sleep 1; done
CMD kubectl apply -f manifests/clusterconfig.yaml
# 基礎功能需要適配無資料盤的場景,因此沒有使用本地儲存池功能 opne-local。在後面的Clusterfile部署方式中,可以再次開啟
CMD helm uninstall -n kube-system open-local

這裡介紹一下 CNStack 社群版在基於 ACK Distro 構建叢集映象時使用的幾個主要功能:

  • plugin 外掛
  • 通過 helm 部署元件
  • 對叢集進行配置,例如 label node 等操作

叢集部署開始前、部署結束後、清理後執行的 hook 可以通過 plugin 外掛實現。以 plugin_localpv.yaml 為例,通過.spec.action: PreInit 宣告上述動作是在叢集部署開始前執行,動作內容描述在 data 中。data 描述中所建立的目錄是為 CNStack 社群版不使用額外資料盤場景下使用的,供應用容器掛載 hostpath 的 volume 使用。注意這些目錄僅會在使用者沒有使用 open-local 元件時使用,如果使用 open-local ,CNStack 社群版的元件將使用 open-local 提供的動態儲存資源池中的本地儲存(後續章節會介紹如何使用)。plugin_localpv.yaml 內容如下:

apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
  name: prepare_local_dir # Specify this plugin name,will dump in $rootfs/plugin dir.
spec:
  type: SHELL
  action: PreInit # PreInit PreInstall PostInstall
  data: |
    rm -rf /var/lib/cnstackce
    rm -rf /opt/aecp
    vgremove open-local-pool-0 --force || echo "No vg: open-local-pool-0 found. OK"
    mkdir -p /var/lib/cnstackce/data/storage-loki-0
    mkdir -p /var/lib/cnstackce/data/addon-package-standard-pv
    mkdir -p /var/lib/cnstackce/data/caas-api-pv
    mkdir -p /var/lib/cnstackce/data/caas-core-pv
    mkdir -p /var/lib/cnstackce/data/caas-db-caas-db-0
    mkdir -p /var/lib/cnstackce/data/grafana-pv
    mkdir -p /var/lib/cnstackce/data/prometheus-k8s-db-prometheus-k8s-0
    touch /var/lib/cnstackce/data/checker

容器服務 ACK 敏捷版的所有元件都是以 helm 形式部署的,在 Kubefile 中僅需要體現為(1)將 helm chart 拷貝到 charts 目錄;(2)在部署時執行 helm install。由 ecp-installer 根據 manifests/clusterconfig.yaml 中宣告的引數自動部署其它容器服務 ACK 敏捷版元件。

最後,在 Kubefile 中通過 CMD 宣告在叢集部署完成後對叢集進行一些配置,例如節點打標(幫助容器服務 ACK 敏捷版選擇 LB 節點和 ingress 入口)、去掉汙點等操作。

CNStack 社群版的 build 工程目錄如下,整個目錄可在文末獲取。

[root@cnstackcebuilder]~# tree charts -L 3
charts
├── build-cnstack-ce
│   ├── build.sh
│   ├── imageList
│   ├── kubeadm-cluster-config.yaml.tmpl
│   ├── Kubefile
│   ├── plugin_clean.yaml
│   ├── plugin_iptables.yaml
│   ├── plugin_localpv.yaml
│   └── readme.md
└── component
    ├── charts
    │   ├── aecp
    │   ├── aecp-installer-operator
    │   ├── cluster-addon-configuration
    │   └── localpv
    └── clusterconfig.yaml

在 charts/build-cnstack-ce 下直接執行 bash build.sh test001(test001是 tag 名稱),sealer 工具將自動被下載和打包叢集映象,可以通過 sealer images 查詢構建結果。

通過 Clusterfile 進行靈活的配置

前一個章節介紹生成的叢集映象,可以在單機版環境上直接一鍵部署:

# 獲取sealer工具
wget -c "http://sealer.oss-cn-beijing.aliyuncs.com/sealers/sealer-v0.5.2-linux-amd64.tar.gz" && tar -xvf sealer-v0.5.2-linux-amd64.tar.gz -C /usr/bin

sealer run registry.cn-qingdao.aliyuncs.com/sealer-apps/cnstack-ce:1.1.0 -m `hostname -i` -p $passwd

上述叢集映象直接部署得到的叢集,包括 CNStack 社群版的基礎功能集。專有云產品的使用者,根據自身需求不同,可能對產品使用體驗有著不同的要求:

  • 有的使用者打算先行體驗最基礎的功能,檢視功能列表、管理介面風格等。這些使用者期望的是部署十分簡單,最好一鍵就能完成,並且快速看到結果。
  • 有的使用者希望在提供必要資源的條件下,體驗儘可能多的功能,例如進行 PoC
  • 有的使用者希望通過細緻的配置和資源規劃將容器平臺服務與自己的生產環境適配。

回到我們剛剛製作的叢集映象,基礎功能集僅需要使用者準備一個 8C12G 的虛擬機器,無需額外的資料盤,即可完成部署。(基礎功能集不包括監控、日誌、彈性等高階功能。)ACK Distro 強大的地方在於,可以通過 sealer 配置 Clusterfile,開啟 ACK Distro 中 open-local 動態儲存池管理的能力,並在修改叢集映象中預設的容器服務 ACK 敏捷版配置,部署出具備監控、日誌、彈性等高階能力的全功能集版本。

當前 CNStack 社群版提供了 3 種部署規格,如下表格:

表格:CNStack 社群版當前的部署規模。

下面我們介紹如何通過修改 Clusterfile 開啟全功能集。

首先為開啟 open-local,需要在各個節點上配置 vg 資源。

apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
  name: prepare_vg # Specify this plugin name,will dump in $rootfs/plugin dir.
spec:
  type: SHELL
  action: PreInit # PreInit PreInstall PostInstall
  # init data disk for open-local-lvm
  # VG_DEV must be set as an available data disk name (lsblk -p), e.g. VG_DEV=/dev/vdb
  data: |
    VG_DEV=#DataDiskDeviceName#
    yum install lvm2 -y
    vgremove open-local-pool-0 --force || echo "no open-local-pool-0 found, volume group Cleaning OK..."
    echo "start vgcreate. device name: $VG_DEV"
    vgcreate open-local-pool-0 $VG_DEV
    if [ $? -ne 0 ];then echo "vgcreate failed" && exit 1;fi
    echo "vg preparation done with success."

在 CNStack 叢集映象中我們關閉了 open-local 並將 StorageClass 配置為 manual,所以需要在 Clusterfile 通過 PostInstall Plugin 重新部署 open-local,以及配置新的 StorageClass。

apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
  name: install-open-local # Specify this plugin name,will dump in $rootfs/plugin dir.
spec:
  type: SHELL
  action: PostInstall # PreInit PreInstall PostInstall
  'on': $MASTER_IP_1
  # install open-local
  data: |
    helm uninstall localpv
    helm install -n kube-system open-local charts/open-local

容器服務 ACK 敏捷版的元件部署開關和引數配置可以通過 Config 物件 overwrite 叢集映象中的對應配置,以將容器服務 ACK 敏捷版元件的 SC 修改為 open-local 為例:

apiVersion: sealer.aliyun.com/v1alpha1
kind: Config
metadata:
  name: cluster-addon-sc
spec:
  path: charts/cluster-addon-configuration/values.yaml
  data: |
      dataStorageClass: open-local-lvm

從上面的例子可以看出,部署規格的靈活性並不是簡單的子功能增加和刪減 —— 不負責任的組合會導致無窮的交付和運維風險。CNStack 社群版提供的規格是經過設計驗證,並且在部署流程、資源規劃方面都進行了優化的方案,您放心使用。

得益於 sealer、ACK Distro、以及上層元件的靈活性,CNStack 社群版還有更多可以定製的維度,比如更加靈活的產品功能組合,適配不同規模業務的產品配置等,會在未來陸續釋出。

基於 ACK Distro 使用 CNStack 社群版的優勢

可以幫助使用者搭建雲原生基礎設施

容器平臺是使用者應用與 IaaS 互動的新介面,對上負責應用的釋出和維護,對下負責基礎設施的資源管理,將使用者資料中心中的異構基礎設施抽象為更有利於雲原生最佳實踐落地的基礎設施。業內種種最佳實踐:觀測、容災、成本優化、微服務管理、AI 等很多先進的 IT 解決方案,都離不開一個“符合預期”、可靠的雲原生基礎設施。

圖:CNStack 產品能力

圖中的容器服務 ACK 敏捷版的能力之一,就是幫助使用者搭建可靠的雲原生基礎設施。經過幾年時間無數客戶的專有云的服務經歷,容器服務 ACK 敏捷版在搭建雲原生基礎設施方面,總結出了一系列關鍵經驗,在 CNStack 社群版中在以下兩個方面進行了著重落實:

  1. 良好的交付體驗
  2. 適配使用者 IaaS

良好的交付體驗

售賣時天花亂墜,交付時一週起步,是專有云裡面困擾使用者的頭等問題之一。繁瑣的操作流程,複雜到只有資深工程師才可能搞清楚的功能依賴,文字很長卻沒有任何資訊量的錯誤提示,以及沒有明確的驗收標準,是我們在專有云交付場景中遇到的主要問題。CNStack 社群版中,我們以 sealer 作為打包和交付工具 ,藉助 ACK Distro 適配多種 IaaS 的能力,明確各階段部署任務的邊界,做到了最小功能集版本一鍵部署,高階特性通過 Clusterfile 一個檔案描述&快一鍵部署。

適配使用者 IaaS

考慮到使用者在 IT 裝置上的投入週期和決策的複雜性,讓 CNStack 社群版能夠執行在主流環境上部署和流暢執行是我們追求的目標。適配使用者 IaaS 包含兩方面含義:

  1. 能夠在使用者存量 IaaS 上部署容器平臺,讓異構 IaaS 能夠被抽象為統一的資源物件
  2. 維持使用者合理的用雲習慣,降低業務改動成本

如果將 ACK Distro 以及其中的儲存、網路元件比作我們提供的工具,在不同的能工巧匠手中可以獨立發揮作用,那麼 CNStack 社群版中的容器服務 ACK 敏捷版就是一個精心打造的工具箱,為使用者提供開箱即用的、能夠適配使用者 IaaS 的容器平臺服務。我們從經典的計算、儲存、網路三個維度,來描述容器服務 ACK 敏捷版在適配 IaaS 方面的工作以為幫助使用者維持用雲習慣的努力:

  • 計算
  • 容器服務 ACK 敏捷版使用與公有云 ACK 相同的 Kubernetes 元件映象,因此在社群合規、安全、版本相容方面,能夠做到最佳適配
  • 儲存(open-local)
  • 部分使用者沒有可靠的商業儲存解決方案,我們可以將使用者用於部署 Kubernetes 的節點儲存以資源池的形式管理起來
  • 為 etcd、docker、kubelet 預留部分資源的前提下,進行交付,並保證執行時的穩定性
  • 網路(hybridnet)
  • 通過提供 overlay/underlay 容器網路平滑共存/轉化的能力,以 overlay 容器網路遮蔽底層基礎設施,以 underlay 容器網路對接底層基礎設施,一定程度上可以做到,在遮蔽底層網路基礎設施的同時,提供高效能的、可對外直通的網路能力
  • 提供網路控制的統一模型和平面,統一管理 overlay/underlay 網路,提供了豐富的地址策略分配、網路資源管理能力

與公有云基礎設施有完善、穩定的 API 不同,使用者 IaaS 因為 IaaS 供應商、版本、合規要求、運維習慣等,有著不同基礎設施呼叫 API 和不同的配置要求。容器服務 ACK 敏捷版截止到目標適配了阿里雲、華為雲、電信雲、易捷行雲 EasyStack、VMWare、ZStack 等(注:社群版中目前僅在 ECS/物理機的 CentOS 上經歷了充分測試,更多適配將在後續版本引入)

可以幫助使用者同時管理基礎設施和應用

CNStack 社群版幫助使用者管理基礎設施以及釋出和運維執行在基礎設施上的應用。容器服務 ACK 敏捷版提供了應用運維、叢集運維、平臺管理三個方面的能力賦能使用者。受限於篇幅,我們將簡單介紹功能列表,未來會有專門的文章為您詳細介紹這些功能。

  • 應用運維:
  • 應用釋出。支援通過多種方式將您的應用釋出到叢集中
  • 製品倉庫。支援對接您自有的製品倉庫,也支援對接阿里雲 ACR
  • 平臺運維:
  • 幫助管理員定義多個組織和租戶,使平臺資源可以被更多使用者使用的同時,提供足夠的隔離性以保障安全
  • 叢集運維:
  • 幫助您詳細的瞭解叢集和應用的執行現狀,包括資源列表、監控大盤、各種服務日誌等

下一篇文章我們會詳細介紹這些功能,敬請期待。

CNStack 社群版未來的發展

通過雲原生技術方案服務企業的數字化轉型是 CNStack 的使命,目前 CNStack 社群版通過 sealer、ACK Distro 和容器服務 ACK 敏捷版,能夠幫助使用者搭建以雲原生底座為核心的基礎設施,並進行平臺和應用的管理。但使用者想享受更多雲原生帶來的便利,還需要更多的中間產品例如 EDAS(應用管理)、訊息佇列、監控,以及更多的解決方案,如邊緣、AI、大資料等。隨著 CNStack 社群版的不斷更新,我們將陸續為使用者帶來更多的能力,方便使用者接觸到我們的產品和服務。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。