请参阅以下说明,以基于自定义 ClusterClass 置备 TKG 集群。请注意,这些说明特定于 vSphere 8 U1 环境。
必备条件
从 vSphere 8 U1 版本开始,提供了基于自定义 ClusterClass 置备 TKG 集群的过程。如果使用的是 vSphere 8 U2,请参见 v1beta1 示例:基于自定义 ClusterClass 的集群(vSphere 8 U2 及更高版本工作流)。
请遵循以下必备条件。
- vSphere 8 U1 环境
- 已启用工作负载管理
- 已配置主管
- 安装了 适用于 vSphere 的 Kubernetes CLI 工具 的 Ubuntu 客户端
注意: 根据上游集群 API
文档,自定义 ClusterClass 是一种实验性 Kubernetes 功能。由于自定义 ClusterClass 可用的自定义范围,VMware无法测试或验证所有可能的自定义。客户负责测试、验证其自定义 ClusterClass 集群以及进行故障排除。客户可以提交有关其自定义 ClusterClass 集群的支持请求,VMware 技术支持团队会尽最大努力提供帮助,但无法保证解决针对自定义 ClusterClass 集群提出的每个问题。在生产环境中部署自定义 ClusterClass 集群之前,客户应了解这些风险。
第 1 部分:创建自定义 ClusterClass
第一部分涉及通过克隆名为
tanzukubernetescluster
的默认 ClusterClass 创建自定义 ClusterClass。
- 创建名为 custom-ns 的 vSphere 命名空间。
- 登录到 主管。
- 将上下文切换到名为 custom-ns 的 vSphere 命名空间。
- 获取默认 ClusterClass。
kubectl get clusterclass tanzukubernetescluster -o json
- 克隆默认 ClusterClass,创建一个名为 custom-cc 的自定义 ClusterClass。
kubectl get clusterclass tanzukubernetescluster -o json | jq '.metadata.name="custom-cc"' | kubectl apply -f -
预期结果:clusterclass.cluster.x-k8s.io/custom-cc created
- 获取自定义 ClusterClass。
kubectl get clusterclass custom-cc -o json
如有必要,可以使用 less 查看自定义 ClusterClass。
kubectl get clusterclass custom-cc -o json | less
注: 发出命令“q”可以退出 less。
第 2 部分:创建置备 TKG 集群所需的 主管 对象
下一部分是创建使用自定义 ClusterClass 对自定义 TKG 集群进行初始部署所需的
主管 对象。
注: 默认情况下,使用集群名称“ccc-cluster”。如果要使用不同的集群名称,则需要在相应的字段中进行更改。
- 为自签名扩展证书创建颁发者。
#self-signed-extensions-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: self-signed-extensions-issuer spec: selfSigned: {}
kubectl apply -f self-signed-extensions-issuer.yaml -n custom-ns
预期结果:issuer.cert-manager.io/self-signed-extensions-issuer created
- 为扩展 CA 证书创建密钥。
#extensions-ca-certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-extensions-ca spec: commonName: kubernetes-extensions duration: 87600h0m0s isCA: true issuerRef: kind: Issuer name: self-signed-extensions-issuer secretName: ccc-cluster-extensions-ca usages: - digital signature - cert sign - crl sign
kubectl apply -f extensions-ca-certificate.yaml -n custom-ns
预期结果:certificate.cert-manager.io/ccc-cluster-extensions-ca created
- 为扩展 CA 证书创建颁发者。
#extensions-ca-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ccc-cluster-extensions-ca-issuer spec: ca: secretName: ccc-cluster-extensions-ca
kubectl apply -f extensions-ca-issuer.yaml -n custom-ns
预期结果:issuer.cert-manager.io/ccc-cluster-extensions-ca-issuer created
- 为身份验证服务证书创建密钥。
#auth-svc-cert.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-auth-svc-cert spec: commonName: authsvc dnsNames: - authsvc - localhost - 127.0.0.1 duration: 87600h0m0s issuerRef: kind: Issuer name: ccc-cluster-extensions-ca-issuer secretName: ccc-cluster-auth-svc-cert usages: - server auth - digital signature
kubectl apply -f auth-svc-cert.yaml -n custom-ns
预期结果:certificate.cert-manager.io/ccc-cluster-auth-svc-cert created
- 验证颁发者和证书的创建。
kubectl get issuers -n custom-ns NAME READY AGE ccc-cluster-extensions-ca-issuer True 2m57s self-signed-extensions-issuer True 14m
kubectl get certs -n custom-ns NAME READY SECRET AGE ccc-cluster-auth-svc-cert True ccc-cluster-auth-svc-cert 34s ccc-cluster-extensions-ca True ccc-cluster-extensions-ca 5m
第 3 部分:基于自定义 ClusterClass 创建 TKG 集群
可以使用
集群 v1beta1 API 基于 ClusterClass 创建集群。基于自定义 ClusterClass 的 v1beta1 集群需要以下最少变量集。
变量 | 描述 |
---|---|
vmClass | 请参见对 TKG 服务 集群使用虚拟机类。 |
storageClass | 请参见为 vSphere 命名空间 配置持久存储。 |
ntp | 用于启用 主管 的 NTP 服务器。 |
extensionCert | 在上一部分中创建“扩展 CA 证书”后自动生成。 |
clusterEncryptionConfigYaml | 下面的部分将讲解示范获取此文件的过程 |
- 创建加密密钥。
#encryption-secret.yaml apiVersion: v1 data: key: all3dzZpODFmRmh6MVlJbUtQQktuN2ViQzREbDBQRHlxVk8yYXRxTW9QQT0= kind: Secret metadata: name: ccc-cluster-encryption type: Opaque
kubectl apply -f encryption-secret.yaml -n custom-ns
预期结果:secret/ccc-cluster-encryption created
- 从 主管 收集 NTP 服务器。
kubectl -n vmware-system-vmop get configmap vmoperator-network-config -o jsonpath={.data.ntpservers}
- 构建
cluster-with-ccc.yaml
清单以置备集群。#cluster-with-ccc.yaml apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ccc-cluster spec: clusterNetwork: pods: cidrBlocks: - 193.0.0.0/16 serviceDomain: managedcluster1.local services: cidrBlocks: - 198.201.0.0/16 topology: class: custom-cc version: v1.26.5---vmware.2-fips.1-tkg.1 controlPlane: metadata: {} replicas: 3 workers: machineDeployments: - class: node-pool metadata: { } name: node-pool-workers replicas: 3 variables: - name: vmClass value: guaranteed-medium - name: storageClass value: tkg-storage-profile - name: ntp value: time.acme.com - name: extensionCert value: contentSecret: key: tls.crt name: ccc-cluster-extensions-ca - name: clusterEncryptionConfigYaml value: LS0tCm...Ht9Cg==
在集群清单中,验证或更新以下字段:参数 描述 metadata.name
v1beta1 集群的名称。 spec.topology.class
自定义 ClusterClass 的名称。 spec.topology.version
Tanzu Kubernetes 版本 版本 spec.topology.variables.storageClass.value
连接到将置备集群的 vSphere 命名空间 的 StoragePolicy spec.topology.variables.ntp.value
NTP 服务器地址 spec.topology.variables.extensionCert.value.contentSecret.name
验证 spec.topology.variables.clusterEncryptionConfigYaml.value
填充 ClusterEncryptionConfig 密钥中的 data.key
值 - 根据自定义 ClusterClass 创建集群。
kubectl apply -f cluster-with-ccc.yaml -n custom-ns
预期结果:cluster.cluster.x-k8s.io/ccc-cluster created
使用 vSphere Client,确认集群已创建。
- 登录到 TKG 集群。
kubectl vsphere login --server=xxx.xxx.xxx.xxx --vsphere-username [email protected] --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
第 4 部分:创建管理 TKG 集群所需的 主管 对象
应用基于 CCC 的集群后,各种控制器将尝试置备该集群;但是,底层基础架构资源仍需要正确引导其他对象。
参数 | 值 |
---|---|
身份验证 | 需要收集身份验证值并将其更新到名为 values.yaml 的文件中 |
Base64 编码 | values.yaml 文件将编码为 base64 字符串 |
guest-cluster-auth-service-data-values.yaml | 将此字符串添加到从 CCC_config_yamls.tar.gz 下载的 guest-cluster-auth-service-data-values.yaml 文件中,然后再应用该文件 |
GuestClusterAuthSvcDataValues 密钥 | 最后,必须修改客户机集群引导程序以引用新创建的 GuestClusterAuthSvcDataValues 密钥。 |
- 将上下文切换到置备了集群的 vSphere 命名空间。
kubectl config use-context custom-ns
- 获取
authServicePublicKeys
值。kubectl -n vmware-system-capw get configmap vc-public-keys -o jsonpath="{.data.vsphere\.local\.json}"
将结果复制到名为values.yaml
的文本文件中。authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
- 获取集群 UID 以更新
authServicePublicKeys
。kubectl get cluster -n custom-ns ccc-cluster -o yaml | grep uid
- 在
values.yaml
文件的authServicePublicKeys
部分中,将集群 UID 附加到“client_id
”值。语法:
vmware-tes:vc:vns:k8s:clusterUID
例如:vmware-tes:vc:vns:k8s:7d95b50b-4fd4-4642-82a3-5dbfe87f499c
- 获取证书值(将 ccc-cluster 替换为所选集群名称)。
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.crt}" | base64 -d
- 将证书添加到
values.yaml
。在
authServicePublicKeys
部分下面添加证书内容。注: 证书必须缩进 4 个空格,以避免出现故障。例如:authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}' ceritificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQMibGSjeuJelQoPxCof/+xzANBgkqhkiG9w0BAQsFADAg ... sESk/RDTB1UAvi8PD3zcbEKZuRxuo4IAJqFFbAabwULhjUo0UwT+dIJo1gLf5/ep VoIRJS7j6VT98WbKyZp5B4I= -----END CERTIFICATE-----
- 获取 privateKey 值。
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.key}"
- 验证
values.yaml
文件。authServicePublicKeys: '{"issuer_url":"https://10.197.79.141/openidconnect/vsphere.local","client_id":"vmware-tes:vc:vns:k8s:7d95...499c",...SShrDw=="]}]}}' certificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQWQyXAQDRMhgrGre8ysVN0DANBgkqhkiG9w0BAQsFADAg ... uJSBP49sF0nKz5nf7w+BdYE= -----END CERTIFICATE----- privateKey: LS0tLS1CRUdJTi...VktLS0tLQo=
- 使用 base64 编码对
values.yaml
文件进行哈希处理,以收集guest-cluster-auth-service-data-values.yaml
文件的输出。base64 -i values.yaml -w 0
- 创建
guest-cluster-auth-service-data-values.yaml
文件。以下是密钥的模板。apiVersion: v1 data: values.yaml: YXV0a...ExRbz0K kind: Secret metadata: labels: tkg.tanzu.vmware.com/cluster-name: ccc-cluster tkg.tanzu.vmware.com/package-name: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware name: ccc-cluster-guest-cluster-auth-service-data-values type: Opaque
请参阅下表,填充所需的密钥值。参数 值 data.values.yaml
values.yaml
的 base64 编码字符串metadata.labels.cluster-name
集群的名称,例如
ccc-cluster
metadata.labels.package-name
guest-cluster-auth-service.tanzu.vmware.com.version
要获取此值,请运行命令
kubectl get tkr v1.26.5---vmware.2-fips.1-tkg.1 -o yaml
根据您使用的版本更改 TKR 版本
metadata.name
集群的名称,例如
ccc-cluster
- 创建
guest-cluster-auth-service-data-values.yaml
密钥。kubectl apply -f guest-cluster-auth-service-data-values.yaml -n custom-ns
- 编辑集群引导程序以引用密钥。
kubectl edit clusterbootstrap ccc-cluster -n custom-ns
- 在行
guest-cluster-auth-service.tanzu.vmware.com.version
下方添加以下行。valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
例如:spec: additionalPackages: - refName: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
- 保存并退出以应用 clusterbootstrap 修改。
第 5 部分:配置 Pod 安全
如果使用的是 TKR 版本 1.25 及更高版本,请为名为 custom-ns
的 vSphere 命名空间 配置 Pod 安全。请参见为 TKR 1.25 及更高版本配置 PSA。
如果使用的是 TKR 版本 1.24 及更低版本,则集群中的 Pod 需要绑定到 Pod 安全策略。要在集群级别应用所需的资源对象,请使用以下过程。
- 收集 TKG 集群 kubeconfig 。
kubectl -n custom-ns get secret ccc-cluster-kubeconfig -o jsonpath="{.data.value}" | base64 -d > ccc-cluster-kubeconfig
- 创建
psp.yaml
文件。apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: tanzu-system-kapp-ctrl-restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: MustRunAsNonRoot seLinux: rule: RunAsAny supplementalGroups: rule: MustRunAs ranges: - min: 1 max: 65535 fsGroup: rule: MustRunAs ranges: - min: 1 max: 65535 readOnlyRootFilesystem: false
- 应用 Pod 安全策略。
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f psp.yaml
- 登录到 TKG 集群。
kubectl vsphere login --server=10.197.154.66 --vsphere-username [email protected] --insecure-skip-tls-verify --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
- 列出命名空间。
KUBECONFIG=ccc-cluster-kubeconfig kubectl get ns -A
NAME STATUS AGE default Active 13d kube-node-lease Active 13d kube-public Active 13d kube-system Active 13d secretgen-controller Active 13d tkg-system Active 13d vmware-system-antrea Active 13d vmware-system-cloud-provider Active 13d vmware-system-csi Active 13d vmware-system-tkg Active 13d
第 6 部分:将 vSphere SSO 角色与自定义 TKG 集群同步
必须将在 vSphere 命名空间 中构建的 vCenter Single Sign-On 用户的 rolebinding 从 主管 同步到 TKG 集群,开发人员才能管理集群工作负载。
此过程需要从
主管 导出现有的 rolebinding 列表,收集具有“编辑”角色的 rolebinding,创建文件
sync-cluster-edit-rolebinding.yaml
,然后使用其 KUBECONFIG 应用于 TKG 集群。
- 从 主管 收集现有 rolebinding。
kubectl get rolebinding -n custom-ns -o yaml
- 从返回的 rolebinding 对象列表中,标识
roleRef.name
等于“edit”的对象。例如:apiVersion: v1 items: - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-ccm namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-ccm uid: b5fb9f01-9a55-4f69-8673-fadc49012994 resourceVersion: "108766602" uid: eb93efd4-ae56-4d9f-a745-d2782885e7fb roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-ccm subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-ccm namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-pvcsi uid: d9342f8f-13d2-496d-93cb-b24edfacb5c1 resourceVersion: "108766608" uid: fd1820c7-7993-4299-abb7-bb67fb17f1fd roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-pvcsi subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:06Z" labels: managedBy: vSphere name: wcp:custom-ns:group:vsphere.local:administrators namespace: custom-ns resourceVersion: "108714148" uid: d74a98c7-e7da-4d71-b1d5-deb60492d429 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:21Z" labels: managedBy: vSphere name: wcp:custom-ns:user:vsphere.local:administrator namespace: custom-ns resourceVersion: "108714283" uid: 07f7dbba-2670-4100-a59b-c09e4b2edd6b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: sso:[email protected] kind: List metadata: resourceVersion: ""
- 创建名为
sync-cluster-edit-rolebinding.yaml
的文件,添加除默认 [email protected] 以外的任何其他 rolebinding。例如:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:vsphere.local:administrators roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:SSODOMAIN.COM:testuser roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected]
注: 在metadata.name
字段中,所有用户的用户角色前面都附加有vmware-system-auth-sync-
。对于所有非默认角色,需要修改 metadata.name 和 subjects.name 条目。 - 应用 sync-cluster-edit-rolebinding.yaml 配置以同步 rolebinding。
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml