请参阅此示例,置备使用一个或多个完全限定域名 (FQDN) 的 TKGS 集群。

FQDN 支持

可以使用 v1beta1 API 置备具有完全限定域名 (FQDN) 的 TKG 集群。集群 v1beta1 API 包含一个名为 kubeAPIServerFQDNs 的变量,该变量至少包含一个要在 Kubernetes API 服务器的 TLS 证书中生成的 FQDN 字符串。

当针对配置了 FQDN 的集群发出 kubectl vsphere login 命令时,身份验证服务将选择列表中的第一个 FQDN 条目,并将其添加到 kubeconfig 中,作为与集群交互的首选选项。假设列表中的第一个 FQDN 可解析。不需要对集群登录进行更改。

生成的 Kubernetes API 证书将包含您在 kubeAPIServerFQDNs 变量中指定的所有 FQDN。系统不会尝试使用列表中除第一个 FQDN 以外的任何其他 FQDN。系统不会尝试解析 FQDN。如果要使用列表中的其他 FQDN,可以手动编辑生成的 kubeconfig 文件并添加所需的 FQDN。

FQDN 要求

使用 FQDN 是可选操作。如果不使用 FQDN,功能不会发生更改。此处介绍的功能特定于 TKG 工作负载集群。要对 主管 使用 FQDN,请参阅 主管 文档中的相应主题。

要置备具有 FQDN 的 TKG 集群,请遵循以下要求。
  • vSphere 8.0 U2 P03 及更高版本的环境
  • 主管 更新到最新的修补程序版本
  • 仅支持 v1beta1 API 集群;不支持 v1alpha3 API 集群
  • 配置 DNS 以将所选 FQDN 解析为有效的 IP 地址
重要说明: 仅当使用 v1beta1 API 置备 CAPI 集群时,FQDN 功能才可用。无法使用 v1alpha3 API 置备具有 FQDN 的 TKC。

FQDN 示例

使用集群 v1beta1 API 创建具有 FQDN 的集群。

spec.topology.variables.kupeAPIServerFQDNs 值是一个 FQDN 数组。

系统将选择列表中的第一个 FQDN,在此示例中为 demo.fqdn.com
#cluster-example-fqdn.yaml
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: tkg-cluster-fqdn
  namespace: tkg-ns
spec:
  clusterNetwork:
    services:
      cidrBlocks: ["198.52.100.0/12"]
    pods:
      cidrBlocks: ["192.101.2.0/16"]
    serviceDomain: "cluster.local"
  topology:
    class: tanzukubernetescluster
    version: v1.26.5+vmware.2-fips.1-tkg.1
    controlPlane:
      replicas: 3
    workers:
      machineDeployments:
        - class: node-pool
          name: node-pool-01
          replicas: 3
    variables:
      - name: vmClass
        value: guaranteed-medium
      - name: storageClass
        value: tkgs-storage-class
      - name: defaultStorageClass
        value: tkg-storage-class
      - name: kubeAPIServerFQDNs
        value:
          - demo.fqdn.com
          - explore.fqdn.com

FQDN 验证

完成以下过程,以验证变量列表中的第一个 FQDN 是否包含在 kubeconfig 文件中,以及变量列表中的所有 FQDN 是否包含在 Kubernetes API 服务器的 TLS 证书中。
  1. 使用 Kubectl 登录到 TKG 集群。
    kubectl vsphere login --server=SVCP IP or FQDN --vsphere-username USERNAME --tanzu-kubernetes-cluster-name CLUSTER-NAME --tanzu-kubernetes-cluster-namespace VSPHERE-NS
  2. 查看 kubeconfig 文件中的 FQDN。
    cat ~/.kube/config
  3. 验证列表中的第一个 FQDN 变量是否包含在 kubeconfig 中。
    例如:
    apiVersion: v1
    clusters:
    - cluster:
        insecure-skip-tls-verify: false
        server: https://10.199.155.77:6443
      name: 10.199.155.77
    - cluster:
        certificate-authority-data: LS0tLS1CRUdJTiBDRVJ...DQWRLZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXc
        ...
        CkdiL1pua09rOVVjT3BwSStCTE9ZZDR0RGd2eHo...QUp0SUUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
        server: https://demo.fqdn.com:6443
      name: demo.fqdn.com
    
  4. 使用 vSphere Client,从工作负载管理 > 命名空间 > 计算 > Tanzu Kubernetes 集群 > 控制平面地址获取 TKGS 集群的 IP 地址。
  5. 在本地 /etc/hosts 文件中手动创建包含 IP 地址和 FQDN 的 DNS 条目。
    例如:
    sudo vi /etc/hosts
    127.0.0.1 localhost
    127.0.1.1 ubuntu-client-vm
    10.199.155.77 demo.fqdn.com
    ...
  6. 使用 openssl s_client 命令查看 TLS 证书。
    echo | openssl s_client -servername hostname -connect FQDN:PORT 2>/dev/null | openssl x509 -text

    其中,FQDNkubeAPIServerFQDNs 变量列表中的第一个变量。

    例如:
    echo | openssl s_client -servername hostname -connect demo.fqdn.com:6443 2>/dev/null | openssl x509 -text
  7. Subject Alternative Name 字段中,应包含所有 FQDN。
    X509v3 Subject Alternative Name:
        DNS:demo.fqdn.com, DNS:explore.fqdn.com, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.def

    由于 Kubernetes API 服务器的 TLS 证书包含 kubeAPIServerFQDNs 列表中的所有 FQDN,因此您可以手动更新 kubeconfig 文件以使用列表中的第二个(或第三个等)FQDN,且将起作用(假设 FQDN 可解析)。