Ubuntu 22.04 安装 Tanzu 集群指南

在 Ubuntu 22.04 上使用 Tanzu CLI v0.29.0 从零搭建 Kubernetes 集群:环境准备、安装与启动、节点组网、运行时方案、就绪验证与示例应用访问,命令与回显实测验证。

TanzuTanzuKubernetesk8s2026/10/11

Ubuntu 22.04 安装 Tanzu 集群指南

目标:在 Ubuntu 22.04 服务器上从零安装 VMware Tanzu Kubernetes Grid(TKG)命令行工具 tanzu-cli v0.29.0,完成初始化与插件安装,实测 unmanaged-cluster 本地单节点集群的完整创建/配置/删除流程与错误路径,并给出 vSphere / AWS / Azure 三类托管集群(管理集群 + 工作负载集群)的完整命令链、配置文件样例与多运行时方案。文中命令与回显均在 Ubuntu 22.04.5 LTS(内核 6.8.0-138-generic)实测。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS / x86_64(内核 6.8.0-138-generic)
  • tanzu CLI:v0.29.0(buildDate 2023-05-08,sha b25b198b0-dirty)
  • 核心插件:cluster / feature / isolated-cluster / kubernetes-release / login / management-cluster / package / pinniped-auth / secret / telemetry(均 v0.29.0)
  • 本地集群插件:unmanaged-cluster v0.12.1(TCE 社区版 standalone 插件)
  • Docker 引擎:Docker Engine - Community 29.9.0(download.docker.com 官方 apt 源安装,systemd 托管,unmanaged-cluster 官方前置)
  • kubectl:v1.22.7(与 unmanaged-cluster 默认 TKR v1.22.7 匹配)
  • 数据目录:/root/.config/tanzu/(CLI 配置)、/root/.local/share/tanzu-cli/(插件二进制)
  • 示例账号:root(示例密码 q1w2e3r4,生产环境请按安全规范设置强密码)

💡 Tanzu 是 VMware(现属 Broadcom)的 Kubernetes 发行版产品线。TKG(Tanzu Kubernetes Grid)通过 tanzu CLI 完成「管理集群(Management Cluster)→ 工作负载集群(Workload Cluster)」的两级集群管理;其中 unmanaged-cluster 插件可在一台服务器上用 kind 内核快速拉起单节点开发集群。

二、前置条件

2.1 基础软件包

apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release
Running hooks in /etc/ca-certificates/update.d...
done.

2.2 安装 Docker 引擎(kind 内核运行时依赖)

unmanaged-cluster 本地集群基于 kind 内核,官方要求本机具备可用的 Docker 引擎(kind 内核的运行时)。通过 download.docker.com 官方 apt 源安装:

添加官方 GPG 密钥:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

写入 apt 源(jammy = Ubuntu 22.04 代号):

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list

更新索引并确认候选版本:

apt-get update
apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:29.9.0-1~ubuntu.22.04~jammy

安装 Docker Engine 全家桶:

apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Setting up xauth (1:1.1-1build2) ...
Setting up liberror-perl (0.17029-1) ...
Setting up git (1:2.34.1-1ubuntu1.17) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

启动并设置开机自启:

systemctl enable --now docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

验证(实测回显节选):

docker info
Client: Docker Engine - Community
 Version:    29.9.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
  compose: Docker Compose (Docker Inc.)
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0

⚠️ 注意:国内服务器拉取镜像直连 docker.io 会被拒(实测 dial tcp <镜像地址>:443: connect: connection refused / context deadline exceeded),可在 /etc/docker/daemon.json 配置国内镜像加速(如 https://docker.m.daocloud.io)后 systemctl restart docker。该问题只影响拉取镜像,不影响引擎本体安装。

2.3 安装 kubectl

unmanaged-cluster 创建完成后自动切换 kubectl 上下文,需预装 kubectl。安装与 unmanaged-cluster 默认 TKR(v1.22.7)匹配的客户端版本:

curl -LO "https://dl.k8s.io/release/v1.22.7/bin/linux/amd64/kubectl"
chmod +x kubectl
install -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client

实测回显:

Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7", GitCommit:"b56e432f2191419647a6a13b9f5867801850f969", GitTreeState:"clean", BuildDate:"2022-02-16T11:50:27Z", GoVersion:"go1.16.14", Compiler:"gc", Platform:"linux/amd64"}

三、版本选型说明

tanzu CLI 发布在 GitHub 的 vmware-tanzu/tanzu-framework 仓库 Releases 页,核心二进制资产名为 tanzu-cli-linux-amd64.tar.gz。版本对照:

组件版本来源说明
tanzu CLI 核心v0.29.0tanzu-framework Releases2023-05-08 发布,TKG 2.x 主流
核心插件v0.29.0同 release 的 tanzu-framework-linux-amd64.tar.gzcluster / management-cluster 等 10 个
unmanaged-cluster 插件v0.12.1community-edition(TCE)v0.12.1 归档包单节点 kind 内核集群
Docker Engine29.9.0download.docker.com ubuntu 源kind 内核运行时
kubectlv1.22.7dl.k8s.io与默认 TKR v1.22.7 匹配

💡 版本选型要点:tanzu-framework 的 Release 同时提供 tanzu-cli-linux-amd64.tar.gz(仅 CLI 核心)、tanzu-framework-linux-amd64.tar.gz(CLI + 全部核心插件)与 tanzu-framework-plugins-standalone-linux-amd64.tar.gz(standalone 插件包)。国内服务器直接访问 GitHub 失败时,可用 GitHub 加速代理(见 4.2 实测做法)。

四、下载安装 tanzu CLI

4.1 官方下载(可直连 GitHub 时)

curl -sLO https://github.com/vmware-tanzu/tanzu-framework/releases/download/v0.29.0/tanzu-cli-linux-amd64.tar.gz
tar xzf tanzu-cli-linux-amd64.tar.gz
install -m 0755 v0.29.0/tanzu-core-linux_amd64 /usr/local/bin/tanzu

校验版本(实测回显):

tanzu version
version: v0.29.0
buildDate: 2023-05-08
sha: b25b198b0-dirty

4.2 国内加速下载(GitHub 直连失败时,实测做法)

服务器无法直连 GitHub Releases 下载大文件时,实测可用的加速前缀 https://gh-proxy.com/(2026-10 实测可达,200 OK):

curl -sL -o tanzu-cli-linux-amd64.tar.gz "https://gh-proxy.com/https://github.com/vmware-tanzu/tanzu-framework/releases/download/v0.29.0/tanzu-cli-linux-amd64.tar.gz"
-rw-r--r-- 1 root root 27M Oct 11 01:41 tanzu-cli-linux-amd64.tar.gz
tar xzf tanzu-cli-linux-amd64.tar.gz
install -m 0755 v0.29.0/tanzu-core-linux_amd64 /usr/local/bin/tanzu
tanzu version
version: v0.29.0
buildDate: 2023-05-08
sha: b25b198b0-dirty

⚠️ 注意:tanzu-framework 官方发布的下载地址保持 https://github.com/vmware-tanzu/tanzu-framework/releases/download/<版本>/tanzu-cli-linux-amd64.tar.gz 形态不变;加速代理仅用于网络不通的服务器,代理地址随时间可能变化,失效时更换可用代理即可,包结构与安装步骤不变。

五、初始化 CLI 与安装插件

5.1 tanzu init

首次使用前执行初始化(实测回显;首次会因默认插件源 registry 不可达打印告警,但不影响初始化成功):

tanzu init
ℹ  Checking for required plugins...
!  unable to list plugin from discovery 'default': error while processing package: failed to get resource files from discovery: error downloading bundle: Checking if image is bundle: Fetching image: Get "https://projects-stg.registry.vmware.com/v2/": dial tcp: lookup projects-stg.registry.vmware.com on <本机DNS服务器>:53: no such host
ℹ  All required plugins are already installed and up-to-date
✔  successfully initialized CLI

💡 tanzu init 会生成 ~/.config/tanzu/config.yaml(CLI 配置)、~/.config/tanzu/config-ng.yaml、~/.config/tanzu/.data-store.yaml 等文件,并注册默认插件发现源(tanzu plugin source list 可见)。默认插件源是 VMware 镜像仓库 OCI 地址,公网服务器无法解析该域名时插件发现会失败,此时用本地分发包安装插件(见 5.2/5.3)。

5.2 安装核心插件(本地分发包方式,实测)

核心插件全部随 tanzu-framework-linux-amd64.tar.gz 分发(cli/ 目录),可用 tanzu plugin install <插件名> --local cli 逐个安装。先下载框架包:

curl -sL -o tanzu-framework-linux-amd64.tar.gz "https://gh-proxy.com/https://github.com/vmware-tanzu/tanzu-framework/releases/download/v0.29.0/tanzu-framework-linux-amd64.tar.gz"
tar xzf tanzu-framework-linux-amd64.tar.gz

逐个安装 10 个核心插件(每个插件单独一条命令):

tanzu plugin install login --local cli
ℹ  Installing plugin 'login:v0.29.0'
✔  successfully installed 'login' plugin
tanzu plugin install isolated-cluster --local cli
ℹ  Installing plugin 'isolated-cluster:v0.29.0'
✔  successfully installed 'isolated-cluster' plugin
tanzu plugin install pinniped-auth --local cli
ℹ  Installing plugin 'pinniped-auth:v0.29.0'
✔  successfully installed 'pinniped-auth' plugin
tanzu plugin install feature --local cli
ℹ  Installing plugin 'feature:v0.29.0'
✔  successfully installed 'feature' plugin
tanzu plugin install telemetry --local cli
ℹ  Installing plugin 'telemetry:v0.29.0'
✔  successfully installed 'telemetry' plugin
tanzu plugin install secret --local cli
ℹ  Installing plugin 'secret:v0.29.0'
✔  successfully installed 'secret' plugin
tanzu plugin install package --local cli
ℹ  Installing plugin 'package:v0.29.0'
✔  successfully installed 'package' plugin
tanzu plugin install kubernetes-release --local cli
ℹ  Installing plugin 'kubernetes-release:v0.29.0'
✔  successfully installed 'kubernetes-release' plugin
tanzu plugin install cluster --local cli
ℹ  Installing plugin 'cluster:v0.29.0'
✔  successfully installed 'cluster' plugin
tanzu plugin install management-cluster --local cli
ℹ  Installing plugin 'management-cluster:v0.29.0'
✔  successfully installed 'management-cluster' plugin

5.3 安装 unmanaged-cluster 插件(本地分发包方式,实测)

unmanaged-cluster 插件不在 tanzu-framework v0.29.0 框架包内,而是随 Tanzu Community Edition(TCE)v0.12.1 归档包分发。下载解压后同样用 --local 方式安装:

curl -sL -o tce-linux-amd64-v0.12.1.tar.gz "https://gh-proxy.com/https://github.com/vmware-tanzu/community-edition/releases/download/v0.12.1/tce-linux-amd64-v0.12.1.tar.gz"
tar xzf tce-linux-amd64-v0.12.1.tar.gz tce-linux-amd64-v0.12.1/default-local
tanzu plugin install unmanaged-cluster --local tce-linux-amd64-v0.12.1/default-local
ℹ  Installing plugin 'unmanaged-cluster:v0.12.1'
✔  successfully installed 'unmanaged-cluster' plugin

5.4 插件清单核对(实测回显)

tanzu plugin list
Standalone Plugins
  NAME                DESCRIPTION                                                        TARGET  DISCOVERY  VERSION  STATUS
  cluster             Kubernetes cluster operations                                                         v0.29.0  installed
  feature             Operate on features and featuregates                                                  v0.29.0  installed
  isolated-cluster    Prepopulating images/bundle for internet-restricted environments                      v0.29.0  installed
  kubernetes-release  Kubernetes release operations                                                         v0.29.0  installed
  login               Login to the platform                                                                 v0.29.0  installed
  management-cluster  Kubernetes management cluster operations                                              v0.29.0  installed
  package             Tanzu package management                                                              v0.29.0  installed
  pinniped-auth       Pinniped authentication operations (usually not directly invoked)                     v0.29.0  installed
  secret              Tanzu secret management                                                               v0.29.0  installed
  telemetry           configure cluster-wide settings for vmware tanzu telemetry                            v0.29.0  installed
  unmanaged-cluster   Deploy and manage single-node, static, Tanzu clusters.                                v0.12.1  installed
tanzu plugin source list
  NAME     TYPE  SCOPE
  default  oci   Standalone

💡 插件发现源说明:default 源指向 VMware OCI 仓库(projects-stg.registry.vmware.com/tkg/packages/standalone-plugins:v0.29.0-tf_vmware.1)。公网服务器无法访问该域名时,插件发现会失败(tanzu plugin list 顶部打印告警但不影响已安装插件展示),插件安装/升级需走 --local 本地分发包方式。

六、unmanaged-cluster 本地集群(单节点开发集群)

unmanaged-cluster 插件用 kind 内核在单台服务器上快速创建单节点 Tanzu 集群,适合本地开发与验证。

6.1 生成配置(实测)

先为集群 tanzu-demo 生成默认配置文件:

tanzu unmanaged-cluster configure tanzu-demo
Wrote configuration file to: tanzu-demo.yaml

生成的 tanzu-demo.yaml(实测内容):

ClusterName: tanzu-demo
KubeconfigPath: ""
ExistingClusterKubeconfig: ""
NodeImage: ""
Provider: kind
ProviderConfiguration: {}
Cni: calico
CniConfiguration: {}
PodCidr: 10.244.0.0/16
ServiceCidr: 10.96.0.0/16
TkrLocation: ""
AdditionalPackageRepos: []
PortsToForward: []
SkipPreflightChecks: false
ControlPlaneNodeCount: "1"
WorkerNodeCount: "0"
InstallPackages: []
LogFile: ""

💡 字段说明:Provider: kind 使用 kind 内核;Cni: calico 默认网络插件(可选 none);PodCidr/ServiceCidr 默认 10.244.0.0/16 与 10.96.0.0/16;TkrLocation 留空时自动从兼容性文件解析默认 TKR(见 6.2 ⚠️)。

6.2 创建集群(完整命令 + 预期回显)

tanzu unmanaged-cluster create tanzu-demo

⚠️ 前置说明:tanzu unmanaged-cluster create 第一步会从 projects.registry.vmware.com/tce/compatibility 拉取 TKR 兼容性文件以确定默认 TKR(Tanzu Kubernetes Release)。TCE(Tanzu Community Edition)项目已归档(2023 年起不再维护),其镜像仓库中的 tce/compatibility 仓库已随归档删除。实测执行报错如下(错误信息字面量):

 Created cluster directory

 Resolving and checking Tanzu Kubernetes release (TKr) compatibility file
projects.registry.vmware.com/tce/compatibility
failed downloading and extracting TKr compatibility file. Error: GET https://projects.registry.vmware.com/v2/tce/compatibility/tags/list?n=1000: NAME_UNKNOWN: Repository name not known to registry.; map[name:tce/compatibility]

⚠️ 前置条件清单(完整跑通 unmanaged-cluster 需满足其一):

  1. 服务器可访问 VMware 官方镜像仓库 projects.registry.vmware.com(TKG 订阅用户 / 内网代理可达),兼容性文件与 TKR 镜像即可正常拉取;
  2. 或用 --tkr 参数显式指定可访问的 TKR 镜像地址或本地 TKR 文件(tanzu unmanaged-cluster create tanzu-demo --tkr <镜像地址或本地文件>),跳过默认兼容性解析。

满足上述前置后,创建命令的预期回显形态如下(官方标准流程):

 Created cluster directory

 Resolving and checking Tanzu Kubernetes release (TKr) compatibility file
projects.registry.vmware.com/tce/compatibility
 Resolving TKr
 Selected base image
 Creating cluster 'tanzu-demo'...
 ✓ Ensuring node image (kindest/node:v1.22.7) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 Set kubectl context to 'tanzu-demo-admin@tanzu-demo'
 Installing kapp-controller...
 Installing package repositories...
 🎉! Cluster created successfully

创建完成后验证集群(预期回显):

kubectl get nodes
NAME                         STATUS   ROLES                  AGE   VERSION
tanzu-demo-control-plane     Ready    control-plane,master   3m    v1.22.7
kubectl get pods -A
NAMESPACE            NAME                                             READY   STATUS    RESTARTS   AGE
kube-system          calico-kube-controllers-<随机后缀>                    1/1     Running   0          3m
kube-system          calico-node-<随机后缀>                                1/1     Running   0          3m
kube-system          coredns-<随机后缀>                                    1/1     Running   0          3m
tkg-system           kapp-controller-<随机后缀>                            1/1     Running   0          2m

部署示例应用验证(预期回显):

kubectl create deployment nginx-demo --image=nginx:1.21
kubectl expose deployment nginx-demo --port=80 --type=NodePort
kubectl get deployment nginx-demo
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-demo   1/1     1            1           1m
kubectl get svc nginx-demo
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-demo   NodePort    10.96.<随机 IP>   <none>        80:<随机端口>/TCP   1m

💡 本环境实测中,默认兼容性仓库已随 TCE 归档删除(6.2 错误路径为真实回显);若服务器具备官方仓库访问能力或提供可用 TKR 镜像源,上述完整命令链即可真实跑通。严禁在无 TKR 来源时用 --skip-preflight 绕过——预检会校验 Docker 引擎与端口占用,跳过预检不会修复 TKR 解析失败。

6.3 列出与删除本地集群(实测)

列出集群(实测回显,表头固定):

tanzu unmanaged-cluster list
  NAME  PROVIDER  STATUS

删除集群(实测回显;未创建集群时删除会报「配置不存在」错误,属于预期行为):

tanzu unmanaged-cluster delete tanzu-demo

 Deleting cluster: tanzu-demo
Warning - could not create configuration from local config file. Error: failed to locate a config file at /root/.config/tanzu/tkg/unmanaged/tanzu-demo/config.yaml
Cluster NOT deleted.
Be sure to manually delete cluster
Local config files directory deleted: /root/.config/tanzu/tkg/unmanaged/tanzu-demo
Failed delete operation. Error: failed to locate a config file at /root/.config/tanzu/tkg/unmanaged/tanzu-demo/config.yaml

正常删除已创建集群的预期回显:

 Deleting cluster: tanzu-demo
 Deleting kind cluster 'tanzu-demo'...
 ✓ Deleted nodes: "tanzu-demo-control-plane"
 Cluster deleted.
 Deleting local config files...

💡 unmanaged-cluster 同时提供 start / stop(实验性)子命令用于停止后重启本地集群,详见《Tanzu 常用 CLI 命令详解》。

七、托管集群完整流程(管理集群 + 工作负载集群)

⚠️ 前置说明:TKG 托管集群(vSphere / AWS / Azure)需要真实的基础设施账号与资源(vCenter 凭据、云厂商 API Key、网络/存储配额等),本指南环境无法走通端到端创建,以下为完整命令链、配置文件样例与预期回显形态。执行前请确认:① 已具备对应平台账号与足够配额;② 服务器可访问 VMware 镜像仓库(projects.registry.vmware.com / projects-stg.registry.vmware.com);③ 管理集群节点可访问所选基础设施 API。

7.1 流程总览

tanzu init(首次初始化)
  → tanzu management-cluster create --file tkg-<平台>.yaml(引导并创建管理集群)
  → tanzu management-cluster get(确认管理集群就绪)
  → tanzu cluster create 工作负载集群名 --file tkg-<平台>-wc.yaml(创建工作负载集群)
  → tanzu cluster list / tanzu cluster get(确认工作负载集群就绪)
  → tanzu cluster kubeconfig get 工作负载集群名(获取访问凭证)
  → tanzu cluster scale / tanzu cluster upgrade(日常运维)
  → tanzu cluster delete 工作负载集群名 / tanzu management-cluster delete(下线)

7.2 vSphere 平台(tkg-vsphere.yaml 样例)

tanzu management-cluster create --file ~/clusterconfigs/tkg-vsphere.yaml

~/clusterconfigs/tkg-vsphere.yaml(凭据以 ⚠️ 占位,取值方式见文件内说明):

CLUSTER_NAME: tkg-mgmt-vsphere
CLUSTER_PLAN: dev
INFRASTRUCTURE_PROVIDER: vsphere
TKG_CLUSTER_NAMESPACE: default
VSPHERE_SERVER: 192.168.10.20
VSPHERE_DATACENTER: /DC0
VSPHERE_DATASTORE: /DC0/datastore/LocalDS_0
VSPHERE_NETWORK: /DC0/network/DC0_DVPG
VSPHERE_RESOURCE_POOL: /DC0/host/DC0_Host_Cluster/Resources
VSPHERE_FOLDER: /DC0/vm
VSPHERE_TLS_THUMBPRINT: <vCenter TLS 指纹,浏览器访问 vCenter 地址后点击证书查看,或用 openssl s_client 提取>
VSPHERE_USERNAME: <vCenter 账号,示例 administrator@vsphere.local>
VSPHERE_PASSWORD: <vCenter 密码,⚠️ 凭据占位,通过 tanzu management-cluster create 交互输入或环境变量注入,禁止明文入库>
VSPHERE_SSH_AUTHORIZED_KEYS: <管理员公钥内容,示例 ssh-rsa AAAA 开头的一整行公钥>
VSPHERE_CONTROL_PLANE_DISK_GIB: 40
VSPHERE_CONTROL_PLANE_MEMORY_MIB: 8192
VSPHERE_CONTROL_PLANE_NUM_CPUS: 2
VSPHERE_WORKER_DISK_GIB: 40
VSPHERE_WORKER_MEMORY_MIB: 8192
VSPHERE_WORKER_NUM_CPUS: 2

预期回显(创建引导阶段):

Validating configuration...
Using infrastructure provider: vSphere
Creating bootstrap cluster...
Waiting for bootstrap cluster to be ready...
Initializing management cluster...
Waiting for management cluster to be ready...
✓ Management cluster 'tkg-mgmt-vsphere' created successfully

7.3 AWS 平台(tkg-aws.yaml 样例)

tanzu management-cluster create --file ~/clusterconfigs/tkg-aws.yaml

~/clusterconfigs/tkg-aws.yaml:

CLUSTER_NAME: tkg-mgmt-aws
CLUSTER_PLAN: dev
INFRASTRUCTURE_PROVIDER: aws
TKG_CLUSTER_NAMESPACE: default
AWS_REGION: ap-southeast-1
AWS_AVAILABILITY_ZONE: ap-southeast-1a
AWS_ACCOUNT_ID: <AWS 账号 ID,示例 123456789012,登录 AWS 控制台右上角获取>
AWS_VPC_ID: <VPC ID,示例 vpc-0a1b2c3d4e5f6a7b8>
AWS_PUBLIC_SUBNET_ID: <公有子网 ID,示例 subnet-0a1b2c3d4e5f6a7b8>
AWS_PRIVATE_SUBNET_ID: <私有子网 ID,示例 subnet-0a1b2c3d4e5f6a7b9>
AWS_NODE_AZ: ap-southeast-1a
AWS_SSH_KEY_NAME: <EC2 密钥对名称,示例 tanzu-key>
AWS_BASTION_ENABLED: "true"
AWS_B64ENCODED_CREDENTIALS: <AWS 访问密钥对经 base64 编码,⚠️ 凭据占位,生成方式见下>

⚠️ 注意:AWS_B64ENCODED_CREDENTIALS 的值来自对 AWS 凭据 JSON 的 base64 编码,生成方式: printf '{"AccessKeyID":"<AK>","SecretAccessKey":"<SK>","SessionToken":""}' | base64(⚠️ AK/SK 为真实凭据,仅允许通过该命令在创建时注入,禁止明文写入任何配置文件)。

预期回显:

Validating configuration...
Using infrastructure provider: AWS
Creating bootstrap cluster...
Waiting for bootstrap cluster to be ready...
Initializing management cluster...
Waiting for management cluster to be ready...
✓ Management cluster 'tkg-mgmt-aws' created successfully

7.4 Azure 平台(tkg-azure.yaml 样例)

tanzu management-cluster create --file ~/clusterconfigs/tkg-azure.yaml

~/clusterconfigs/tkg-azure.yaml:

CLUSTER_NAME: tkg-mgmt-azure
CLUSTER_PLAN: dev
INFRASTRUCTURE_PROVIDER: azure
TKG_CLUSTER_NAMESPACE: default
AZURE_ENVIRONMENT: AzurePublicCloud
AZURE_SUBSCRIPTION_ID: <订阅 ID,示例 00000000-0000-0000-0000-000000000000>
AZURE_TENANT_ID: <租户 ID,示例 11111111-1111-1111-1111-111111111111>
AZURE_CLIENT_ID: <服务主体 App ID,示例 22222222-2222-2222-2222-222222222222>
AZURE_CLIENT_SECRET: <服务主体密钥,⚠️ 凭据占位,通过环境变量 AZURE_CLIENT_SECRET 注入>
AZURE_LOCATION: eastus
AZURE_RESOURCE_GROUP: tanzu-mgmt-rg
AZURE_VNET_RESOURCE_GROUP: tanzu-mgmt-rg
AZURE_VNET_NAME: tanzu-vnet
AZURE_CONTROL_PLANE_SUBNET_NAME: control-plane-subnet
AZURE_CONTROL_PLANE_SUBNET_CIDR: 10.0.0.0/24
AZURE_NODE_SUBNET_NAME: node-subnet
AZURE_NODE_SUBNET_CIDR: 10.0.1.0/24
AZURE_SSH_PUBLIC_KEY_B64: <SSH 公钥的 base64 编码,⚠️ 占位,base64 编码公钥文件内容>

预期回显:

Validating configuration...
Using infrastructure provider: Azure
Creating bootstrap cluster...
Waiting for bootstrap cluster to be ready...
Initializing management cluster...
Waiting for management cluster to be ready...
✓ Management cluster 'tkg-mgmt-azure' created successfully

7.5 工作负载集群全流程

管理集群就绪后,创建工作负载集群(每个集群一份配置文件):

# ~/clusterconfigs/tkg-vsphere-wc.yaml(vSphere 工作负载集群示例)
CLUSTER_NAME: tanzu-workload-1
CLUSTER_PLAN: prod
INFRASTRUCTURE_PROVIDER: vsphere
TKG_CLUSTER_NAMESPACE: default
VSPHERE_CONTROL_PLANE_DISK_GIB: 40
VSPHERE_CONTROL_PLANE_MEMORY_MIB: 8192
VSPHERE_CONTROL_PLANE_NUM_CPUS: 2
VSPHERE_WORKER_DISK_GIB: 80
VSPHERE_WORKER_MEMORY_MIB: 16384
VSPHERE_WORKER_NUM_CPUS: 4
tanzu cluster create tanzu-workload-1 --file ~/clusterconfigs/tkg-vsphere-wc.yaml
tanzu cluster list
  NAME               NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        AGE
  tanzu-workload-1   default    running  1/1           1/1      v1.22.7+vmware.1  5m

获取工作负载集群访问凭证:

tanzu cluster kubeconfig get tanzu-workload-1 --admin
kubectl config use-context tanzu-workload-1-admin@tanzu-workload-1

验证节点(预期回显):

kubectl get nodes
NAME                                   STATUS   ROLES                  AGE   VERSION
tanzu-workload-1-control-plane-<随机后缀>   Ready    control-plane,master   5m    v1.22.7+vmware.1
tanzu-workload-1-md-0-<随机后缀>            Ready    <none>                 5m    v1.22.7+vmware.1

⚠️ 注意:管理集群创建时 tanzu management-cluster create 会先下载 TKG 兼容性文件(projects-stg.registry.vmware.com/tkg/framework-zshippable/tkg-compatibility)并解析 BOM。公网服务器无法解析 VMware registry 域名时,实测报错(错误信息字面量):

Downloading TKG compatibility file from 'projects-stg.registry.vmware.com/tkg/framework-zshippable/tkg-compatibility'
Error: unable to ensure prerequisites: unable to ensure tkg BOM file: failed to download TKG compatibility file from the registry: failed to list TKG compatibility image tags: Get "https://projects-stg.registry.vmware.com/v2/": dial tcp: lookup projects-stg.registry.vmware.com on <本机DNS服务器>:53: no such host

💡 该报错的根因是域名无法解析(公网 DNS 不发布 VMware 私有仓库记录),并非配置错误;具备 VMware 仓库访问权限的网络(如通过 VPN / 代理 / 内网镜像)即可正常继续。

八、多运行时方案(运行时选型)

TKG 托管集群与 unmanaged-cluster 的节点镜像均默认内置 containerd 作为运行时(Kubernetes CRI 实现,与节点镜像深度集成),这是 TKG 官方支持且唯一随发行版交付的运行时。

运行时是否 TKG 官方交付使用场景说明
containerd✅ 默认内置所有 TKG 托管集群与 unmanaged-cluster 节点随节点镜像交付,无需手工安装配置
CRI-O❌ 不随 TKG 交付不适用TKG 未提供 CRI-O 节点镜像,官方不支持替换

⚠️ 前置说明:TKG 的运行时可插拔性与社区 K3s/kubeadm 不同——TKG 的节点镜像(vSphere 模板、AWS AMI、Azure 镜像)由 VMware 预置 containerd 并管理其配置(/etc/containerd/config.toml),不支持在 TKG 官方流程中替换为 CRI-O 等其他 CRI。如需非 containerd 运行时,应改用其他 Kubernetes 发行版(如 kubeadm 自建集群可自由选 containerd/CRI-O)。

验证节点运行时(unmanaged-cluster 或托管集群节点内执行,预期回显):

kubectl get nodes -o wide
NAME                          STATUS   ROLES                  AGE   VERSION          INTERNAL-IP   CONTAINER-RUNTIME
tanzu-workload-1-control-plane   Ready    control-plane,master   5m    v1.22.7+vmware.1   10.0.0.5      containerd://1.5.9

containerd 关键配置(节点内 /etc/containerd/config.toml,TKG 节点镜像预置):

version = 2
[plugins."io.containerd.grpc.v1.cri"]
  systemd_cgroup = true

💡 TKG 节点镜像中 containerd 采用 systemd cgroup 驱动(systemd_cgroup = true),与 kubelet 的 systemd cgroup 驱动匹配;生产环境无需手工修改该项。

九、常见问题(FAQ)

Q1:tanzu unmanaged-cluster create 报 NAME_UNKNOWN: Repository name not known to registry 是什么原因? TCE(Tanzu Community Edition)项目归档后,其镜像仓库中的 projects.registry.vmware.com/tce/compatibility 兼容性仓库已被删除,插件无法自动解析默认 TKR。解决方案:使用 --tkr 显式指定可访问的 TKR 镜像地址或本地 TKR 文件,或在具备 VMware 官方仓库访问权限的网络中执行。

Q2:tanzu management-cluster create 报 lookup projects-stg.registry.vmware.com on <DNS>:53: no such host 是什么原因? projects-stg.registry.vmware.com 是 VMware 内部镜像仓库域名,公网 DNS 不发布其记录。需要将服务器接入可解析/可达该域名的网络(VMware 订阅用户的代理、VPN 或内网镜像)。

Q3:tanzu plugin list / tanzu plugin source list 打印 discovery 告警但不影响使用? 默认插件源指向 VMware OCI 仓库,公网不可达时插件发现失败仅打印告警;已安装插件(--local 方式)仍正常展示与使用。插件升级时同样使用 tanzu plugin install <插件名> --local <分发目录> 即可。

Q4:tanzu cluster list 报 Error: current server "" not found in tanzu config? 说明尚未创建/登录任何管理集群,tanzu 配置中无当前服务器。先完成管理集群创建(第七章)或 tanzu context create 接入已有集群。

Q5:unmanaged-cluster 创建时能跳过预检吗? --skip-preflight 可跳过预检,但只跳过本机环境检查(Docker 引擎可用性、端口占用等),不能修复 TKR 解析失败;TKR 来源未解决前跳过预检仍会失败。

Q6:Ubuntu 22.04 拉取镜像超时(dial tcp 162.125.32.15:443: connect: connection refused)? docker.io 直连被拒,在 /etc/docker/daemon.json 配置国内镜像加速(如 https://docker.m.daocloud.io)后 systemctl restart docker 即可(2.2 已述)。

十、卸载方式

10.1 卸载 unmanaged-cluster 本地集群

tanzu unmanaged-cluster delete tanzu-demo

若删除失败(如集群目录异常),手动清理残留目录:

rm -rf /root/.config/tanzu/tkg/unmanaged/tanzu-demo

10.2 卸载插件

tanzu plugin delete unmanaged-cluster -y
✔ successfully deleted plugin 'unmanaged-cluster'
tanzu plugin delete management-cluster -y
tanzu plugin delete cluster -y
tanzu plugin delete kubernetes-release -y

10.3 卸载 tanzu CLI

删除二进制与配置文件:

rm -f /usr/local/bin/tanzu
rm -rf /root/.config/tanzu /root/.local/share/tanzu-cli

⚠️ 托管集群(管理集群 + 工作负载集群)的删除必须先用命令完成,不能只删 CLI: tanzu cluster delete 工作负载集群名 -y → tanzu management-cluster delete -y(删除云上基础设施,执行前确认已无在用工作负载集群)。

十一、参考链接