The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

用 Docker 架設 VMware Tanzu Community Edition 的安裝筆記

這幾天我在嘗試 VMware Tanzu Community Edition,畢竟 VMWare 也是個大廠,現在正在全力衝刺 Kubernetes 市場,我覺得整體上安裝體驗還可以,管理架構也很乾淨,算是非常好上手,文件也寫的不錯。這篇文章是我在實作的過程中的安裝筆記,詳實記錄了一些重要觀念與注意事項。

基礎架構

VMware Tanzu Community Edition (TCE) 是一套由 VMWare 公司推出的 Kubernetes 叢集散佈版本 (Distribution),除了開源免費、功能完整、便於管理外,也非常適合拿來當作學習與開發環境。

TCE 本身包含了四個主要的構成要素:

  1. Tanzu CLI

    這個 tanzu 是 TCE 的命令列管理工具 (CLI),他有許多子命令可以用來管理叢集、應用程式、外掛套件等等。每個子命令其實都連結到不同的執行檔,並位於 ${XDG_DATA_HOME}/tanzu-cli 目錄下,也因此 tanzu CLI 從架構上來說,是非常容易的進行擴充的,你可以透過 plugins 進行新增、移除或更新。

    Linux 作業系統環境預設的 ${XDG_DATA_HOME} 位於 ~/.local/share 目錄。

    image

    大多數 plugins 都位於 Tanzu Framework Repo 下,並共用於多個不同 Tanzu Editions 版本之間。部分 plugins 則位於 Tanzu Community Edition Repo 下,待社群培育成熟之後,可能會移入 Tanzu Framework Repo 底下。不過,即便某些 Plugins 會遷移到 Tanzu Framework Repo,基本上是不影響現有 TCE 用戶的!

  2. Managed Clusters

    你可以使用 tanzu cluster 命令建立兩種不同類型的叢集,其中一種叫做 Managed Clusters (受控叢集),你必須透過 tanzu management-cluster create 命令先建立好一個 Management Cluster (管理叢集),才能在這個叢集底下建立受控叢集,又稱工作負載叢集(Workload Cluster),事實上這就是實際執行應用程式的叢集環境。基本上 VMWare 官方建議用這種方式來管理叢集,建議在生產環境(Production)使用。

  3. Unmanaged Clusters

    你可以使用 tanzu cluster 命令建立兩種不同類型的叢集,另一種就叫做 Unmanaged Clusters (非受控叢集),你必須透過 tanzu unmanaged-cluster create 命令直接建立一個叢集,這種叢集只能部署在單一節點,主要拿來當作開發測試環境之用。TCE 支援在同一台主機上建立多組非受控叢集,管理上十分便利。

  4. Package Management

    你可以用 tanzu CLI 進行套件管理(package management),方便你可以發現、安裝、升級、刪除想要執行在 Tanzu 叢集的軟體。所有的套件皆由 carvel 工具建立,你只要遵循套件封裝流程(packaging process)即可。套件可以被封裝進一個所謂 package repository,並且可以推送到 OCI (Open Container Iinitiative) 相容的儲存庫中。

    在 Tanzu 叢集中,kapp-controller 會不斷監視 package repositories 的變更 (透過 PackageRepository 這個 CRD 來宣告),當叢集被告知有新的版本 (透過 tanzu package repository 命令),這個 kapp-controller 就會拉取這個 package repository 回來,讓這些套件可以使用在叢集內。

    image

    你可以透過 tanzu package install 命令建立一個 PackageInstall (CRD) 資源,kapp-controller 就會幫你下載並安裝到叢集中。

    image

    注意:若你安裝 Tanzu Community Edition (TCE) 的 Unmanaged Clusters 的話,預設會幫你安裝好 tkg-core-repository 這個 package repository (官網文件是寫 tce-repo 這個名稱,應該是文件沒有更新到)。若你安裝的是 Managed Clusters 的話,就要額外安裝 package repository 才行!

安裝 Unmanaged Clusters 非受控叢集

這裡我以 Windows 作業系統平台為例進行示範,安裝步驟如下:

  1. 先安裝 Docker Desktop for Windows

  2. 透過 Chocolatey 安裝 tanzu CLI 工具

    choco install tanzu-community-edition -y
    
  3. 建立一個名為 beepboop 的非受控叢集 (Unmanaged Clusters)

    TCE 可以在同一台電腦建立多個叢集,用以區分不同的開發環境,相當便利。建立一個叢集的命令也非常簡單,一個命令就可以完成:

    tanzu unmanaged-cluster create beepboop --cni=calico
    

    注意:Docker for Windows 需要特別加上 --cni=calico 才能順利建立完整的叢集,否則網路部分會出問題!

    你也可以用 uc 當成 unmanaged-cluster 的縮寫:

    tanzu uc create beepboop --cni=calico
    

    注意: 整個叢集都會安裝在 Docker 環境下,不會污染 Windows 目前環境。

    若要在日後切換不同的 Unmanaged Clusters 叢集,只要用 kubectl config use-context kind-<CLUSTER-NAME> 即可:

    kubectl config use-context kind-beepboop
    
  4. 安裝 kubectl 工具

    choco install kubernetes-cli -y
    

    你可以用以下命令查詢已安裝版本:

    kubectl version --short
    
  5. 管理套件

    Tanzu Community Edition (TCE) 的 Unmanaged Clusters 在安裝好之後,預設就會先安裝好名為 tkg-core-repository 的 package repository,你可以用以下命令列出現有的 package repository 清單:

    tanzu package repository list --all-namespaces
    

    將內建的 tkg-core-repository 套件儲存庫更新到最新版 (重要)

    tanzu package repository update tkg-core-repository --url projects.registry.vmware.com/tce/main -n tanzu-package-repo-global
    

    列出所有可安裝的套件:

    tanzu package available list
    

    列出 cert-manager.community.tanzu.vmware.com 套件版本:

    tanzu package available list cert-manager.community.tanzu.vmware.com
    

    安裝 1.6.1 版的 cert-manager 套件:

    tanzu package install cert-manager --package-name cert-manager.community.tanzu.vmware.com --version 1.6.1
    

    確認已安裝的套件清單:

    tanzu package installed list
    

    刪除 cert-manager 套件:

    tanzu package installed delete cert-manager
    
  6. 刪除叢集

    列出 Unmanaged Cluster 非受控叢集清單

    tanzu unmanaged-cluster list
    

    刪除叢集

    tanzu unmanaged-cluster delete beepboop
    

更完整的命令請參考 Unmanaged Clusters Reference 官網文件。

安裝 Managed Clusters 受控叢集

受控叢集的安裝步驟就複雜的多,完整流程請參考 Getting Started with Managed Clusters 官網文件。

這裡最重要的觀念,就是你要先建立 1Management Clusters (管理叢集),然後再透過這個 Management Clusters 安裝 N工作負載叢集(Workload Clusters),所有應用程式都應該安裝到工作負載叢集之中。

你要先在本機安裝一個「啟動叢集」(bootstrap cluster),基本上該叢集是一套以 Kind 為基礎的 Kubernetes 叢集,而且完全跑在 Docker 容器中,你可以透過該叢集來安裝一個「管理叢集」到你指定的目標提供者,目前有支援 Docker, VMware vSphere, Amazon Web Services 與 Microsoft Azure 等等。當「管理叢集」安裝完成後,「啟動叢集」就可以刪除了!

這裡我以 Linux 作業系統平台為例進行示範,搭配 Multipass 快速建立 Ubuntu 虛擬機器,安裝步驟如下:

  1. 使用 Multipass 建立名為 tanzu 虛擬機器 (VM)

    建立 VMware Tanzu 最好要有 4 CPUs6GB RAM 以上,我這邊加上 --bridged 參數是為了讓我可以直接從我的區域網路直接連上這台虛擬機器。

    multipass launch --name 'tanzu' --bridged --disk 50G --cpus 4 --mem 6G
    

    虛擬機器建立完成後就可以直接連進去 Shell 環境進行安裝:

    multipass shell 'tanzu'
    
  2. 下載 tanzu CLI 工具

    wget https://github.com/vmware-tanzu/community-edition/releases/download/v0.10.0/tce-linux-amd64-v0.10.0.tar.gz
    tar zxvf tce-linux-amd64-v0.10.0.tar.gz
    cd tce-linux-amd64-v0.10.0/
    ./install.sh
    tanzu version
    

    這是我本次安裝的 tanzu CLI 版本資訊:

    version: v0.10.1
    buildDate: 2022-02-14
    sha: 401d55b
    
  3. 安裝 Kubectl 工具

    因為我知道 tanzu CLI 會建立 v1.21.5 的 Kubernetes 叢集,所以我才預先安裝好 v1.21.5 版本的 kubectl 工具。

    curl -LO https://dl.k8s.io/release/v1.21.5/bin/linux/amd64/kubectl
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    kubectl version --short --client
    rm -f kubectl
    
  4. 安裝 Docker Engine

    sudo apt update && sudo apt install docker.io -y && sudo usermod -a -G docker ubuntu
    

    這裡的 sudo usermod -a -G docker ubuntu 命令,是為了讓 non-root 身份也可以順利執行 docker 命令,但設定完之後記得要登出再重新登入,所以需要執行 exit 先退出 Shell 環境。

  5. 這次重新登入 tanzu 虛擬機器要用 SSH 並啟用 Port Forwarding 功能 (Port 8080)

    假設我們 VM 的 IP 地址為 192.168.1.13(預設 Multipass 建立的 VM 預設登入帳號為 ubuntu

    ssh -i C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd\ssh-keys\id_rsa -L 8080:localhost:8080 -L 17777:localhost:7777 ubuntu@192.168.1.13
    

    Port 8080 是給 TCE 安裝介面用的,而 Port 17777 則是給 octant 儀表版用的。

  6. 安裝管理叢集 (Management Cluster)

    啟動一個 Tanzu Community Edition 安裝介面 (Web UI),並監聽 8080 Port:

    tanzu management-cluster create --ui -b 0.0.0.0:8080
    

    啟動之後,就可以在本機電腦開啟 http://localhost:8080/ 網頁,這是一個 Web 介面的 Tanzu Community Edition (TCE) 的安裝程式。由於我打算在本機安裝 VMware Tanzu,因此請選擇 Docker 來部署:

    image

    這裡只需要設定管理叢集名稱 tanzumgmt 與 Kubernetes 的網路相關設定:

    image

    確認設定後就可以按下 DEPLOY MANAGEMENT CLUSTER 進行全自動安裝,必要時你可以按 EXPORT CONFIGURATION 匯出設定檔,日後可以用 CLI 自動安裝出完全相同的管理叢集。

    image

    image

    除了透過 Web UI 進行安裝外,你也可以使用 CLI 進行更簡便快速的安裝:

    tanzu management-cluster create -i docker --name 'tanzumgmt' -v 10 --plan dev --ceip-participation=false
    

    安裝完成之後,可以在 Shell 底下執行以下命令,確認管理叢集已經順利啟動:

    tanzu management-cluster get
    

    image

    由於 Management Cluster 也是一個 Kubernetes 叢集,因此你可以用以下命令取得該叢集的 KUBECONFIG 憑證:

    tanzu management-cluster kubeconfig get tanzumgmt --admin
    

    切換 KUBECONFIG 到管理叢集:

    kubectl config get-contexts
    kubectl config use-context tanzumgmt-admin@tanzumgmt
    kubectl get nodes
    

    image

    確認已經有 Nodes 成功運行:

    kubectl get nodes
    

接著我們就要來安裝工作負載叢集(Workload Cluster)了!

  1. 建立一個工作負載叢集,假設名稱為 dev1

    tanzu cluster create 'dev1' --plan dev
    
  2. 確認工作負載叢集已安裝完畢,並取得工作負載叢集KUBECONFIG 憑證

    tanzu cluster list
    

    image

    取得工作負載叢集KUBECONFIG 憑證

    tanzu cluster kubeconfig get 'dev1' --admin
    

    切換到工作負載叢集:

    kubectl config use-context 'dev1-admin@dev1'
    
  3. 查看叢集內所有的 Pods

    kubectl get pods -A
    

    image

  4. 查看 Docker Engine 運行的容器

    此時應該會有 1 個管理叢集與 1 個工作負載叢集,且各有 1 個 control plane node 與 1 個 worker node。而且兩座叢集各有一個 haproxy 容器,可以讓日後 control plane 加入 HA (高可用) 的設定!

    docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}"
    

    image

    你可以直接進入 control plane node 試看看 kubectl 命令 (Continer ID 為 dea):

    docker exec -it 'dea' /bin/bash
    

    或是用 Container 的 Label 直接選到 control plane 節點:

    docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Labels}}\t{{.Status}}"
    docker exec -it $(docker ps --filter 'label=io.x-k8s.kind.cluster=dev1' --filter 'label=io.x-k8s.kind.role=control-plane' --format "{{.ID}}") /bin/bash
    
    kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes
    

    image

    截至今日為止,TCE 安裝好之後,若 Docker 所在的主機重開,叢集會需要重建!這個議題已有 #832 進行追蹤。

  5. 管理套件

    切換到工作負載叢集:

    kubectl config use-context 'dev1-admin@dev1'
    

    安裝 Tanzu Community Edition 官方提供的 tce-repo package repository 到 tanzu-package-repo-global namespace

    tanzu package repository add tce-repo --url projects.registry.vmware.com/tce/main:0.10.0 --namespace tanzu-package-repo-global
    

    注意: 安裝到 tanzu-package-repo-global namespace 的 package repository 預設會套用到整座 Kubernetes 叢集。但你也可以在個別的 namespace 安裝不同的 package repository!

    將內建的 tkg-core-repository 套件儲存庫更新到最新版 (重要)

    tanzu package repository update tkg-core-repository --url projects.registry.vmware.com/tce/main -n tanzu-package-repo-global
    

    列出已安裝的 package repository

    tanzu package repository list --namespace tanzu-package-repo-global
    

    列出所有可安裝的套件:

    tanzu package available list
    

    列出 cert-manager.community.tanzu.vmware.com 套件版本:

    tanzu package available list cert-manager.community.tanzu.vmware.com
    

    安裝 1.6.1 版的 cert-manager 套件到 cert-manager namespace:

    tanzu package install cert-manager --package-name cert-manager.community.tanzu.vmware.com --version 1.6.1
    

    確認已安裝的套件清單:

    tanzu package installed list
    

    刪除 cert-manager 套件:

    tanzu package installed delete cert-manager
    
  6. 安裝精美的 octant 儀表版 (Dashboard)

    https://github.com/vmware-tanzu/octant/releases 找到最新版 (octant_0.25.1_Linux-64bit.tar.gz) 進行安裝:

    curl -LO https://github.com/vmware-tanzu/octant/releases/download/v0.25.1/octant_0.25.1_Linux-64bit.tar.gz
    tar -xzvf octant_0.25.1_Linux-64bit.tar.gz
    ./octant_0.25.1_Linux-64bit/octant
    

    在本機連結 http://localhost:17777/ 即可進入管理介面!

    image

  7. 刪除叢集

    刪除工作負載叢集

    tanzu cluster delete 'dev1'
    

    刪除管理叢集

    tanzu management-cluster get
    tanzu management-cluster delete 'tanzumgmt'
    
  8. 刪除 Multipass 建立的虛擬機器

    multipass delete 'tanzu' ; multipass purge
    

相關連結

留言評論