节点网络连接

本主题介绍如何为工作负载集群自定义节点网络连接,包括自定义节点 IP 地址以及配置 vSphere 上的 DHCP 预留、节点 IPAM 和 IPv6。

配置节点 DHCP 预留和端点 DNS 记录(仅限 vSphere)

对于 vSphere 上的新集群,需要为其节点创建 DHCP 预留,并且可能还需要为其控制平面端点创建 DNS 记录:

  • 集群节点的 DHCP 预留

    在多个控制平面节点可能会长时间关闭电源或脱机的环境中,作为安全预防措施,请调整新创建的集群控制平面节点和工作节点的 IP 地址的 DHCP 预留,以便这些地址保持静态且租约永不过期。

    有关如何配置 DHCP 预留的说明,请参见 DHCP 服务器文档。

  • 控制平面端点的 DNS 记录

    如果对控制平面端点使用 NSX Advanced Load Balancer 而不是 Kube-Vip,并将 VSPHERE_CONTROL_PLANE_ENDPOINT 设置为 FQDN 而不是数字 IP 地址,请按以下方式保留这些地址:

    1. 检索分配给集群 NSX ALB 的控制平面 IP 地址:

      kubectl get cluster CLUSTER-NAME -o=jsonpath='{.spec.controlPlaneEndpoint} {"\n"}'
      
    2. 记录在输出中列为 "host" 的 IP 地址,例如 192.168.104.107

    3. 创建 DNS A 记录,该记录将您的 FQDN 与您记录的 IP 地址相关联。

    4. 要测试 FQDN,请创建一个新的 kubeconfig,该配置使用 FQDN,而不是来自 NSX ALB 的 IP 地址:

      1. 生成 kubeconfig:

        tanzu cluster kubeconfig get CLUSTER-NAME --admin --export-file ./KUBECONFIG-TEST
        
      2. 编辑 kubeconfig 文件 KUBECONFIG-TEST 以将 IP 地址替换为 FQDN。例如,将以下地址:

        server: https://192.168.104.107:443
        

        替换为:

        server: https://CONTROLPLANE-FQDN:443
        
      3. 使用修改后的 kubeconfig 检索集群的 Pod:

        kubectl get pods -A --kubeconfig=./KUBECONFIG-TEST
        

        如果输出列出 pod,则 DNS 适用于 FQDN。

自定义集群节点 IP 地址(独立 MC)

您可以为独立管理集群中的节点及其部署的工作负载集群配置集群特定的 IP 地址块。如何执行此操作取决于运行集群的云基础架构:

vSphere

在 vSphere 上,集群配置文件的 VSPHERE_NETWORK 设置 Tanzu Kubernetes Grid 用于集群节点和其他 Kubernetes 对象的虚拟机网络。IP 地址由在此虚拟机网络中运行的 DHCP 服务器分配给节点,该服务器与 Tanzu Kubernetes Grid 分开部署。

如果使用 NSX 网络连接,可以按照 VMware NSX-T Data Center 文档中的在分段上配置 DHCP 静态绑定为集群节点配置 DHCP 绑定。

注意

对于 v4.0+,VMware NSX-T Data Center 被重命名为“VMware NSX”。

AWS

要在 Amazon Web Services (AWS) 上配置集群特定的 IP 地址块,请在集群配置文件中设置以下变量,如《配置文件变量参考》中的 AWS 表中所述。

  • 设置 AWS_PUBLIC_NODE_CIDR,为公用节点设置 IP 地址范围。
    • 通过设置 AWS_PRIVATE_NODE_CIDR_1AWS_PRIVATE_NODE_CIDR_2 使其他范围可用
  • 设置 AWS_PRIVATE_NODE_CIDR,为专用节点设置 IP 地址范围。
    • 通过设置 AWS_PRIVATE_NODE_CIDR_1AWS_PRIVATE_NODE_CIDR_2 使其他范围可用
  • 所有节点 CIDR 范围必须位于集群的 VPC 范围内,默认为 10.0.0.0/16

Microsoft Azure

要在 Azure 上配置集群特定的 IP 地址块,请在集群配置文件中设置以下变量,如《配置文件变量参考》中的 Microsoft Azure 表中所述

  • 设置 AZURE_NODE_SUBNET_CIDR,为工作节点 IP 地址创建具有 CIDR 块的新 VNet。
  • 设置 AZURE_CONTROL_PLANE_SUBNET_CIDR,为控制平面节点 IP 地址创建具有 CIDR 块的新 VNet。
  • 设置 AZURE_NODE_SUBNET_NAME,从现有 VNet 的范围分配工作节点 IP 地址。
  • 设置 AZURE_CONTROL_PLANE_SUBNET_NAME,从现有 VNet 的范围分配控制平面节点 IP 地址。

节点 IPAM

通过节点 IPAM,集群内 IPAM 提供程序在集群创建和扩展期间管理工作负载集群节点的 IP 地址,而无需配置外部 DHCP。

注意

此过程不适用于具有 vSphere with Tanzu 主管或 AWS 或 Azure 上的独立管理集群的 TKG。

为新工作负载集群或现有工作负载集群配置节点 IPAM 时,用户指定 IPAM 提供程序从中分配静态 IP 地址的内部 IP 池以及网关地址。

IP 池配置为 subnet,具有可选的 startend 地址以限制子网 CIDR 中的地址范围。

此图显示节点 IPAM 如何启用 CAPV 以从其 IP 池配置静态节点地址。特定于节点 IPAM 的组件(实线轮廓)和资源定义(虚线轮廓)以绿色显示。

节点 IPAM 框和行

必备条件

  • TKG 独立管理集群
  • 工作负载集群的控制平面和工作节点的名称服务器
    • 必需,因为集群节点不再通过 vCenter 中的 DHCP 解析名称
  • kubectl 和在本地安装的 Tanzu CLI

限制条件

节点 IPAM 在 TKG v2.1 中具有以下限制:

  • 仅适用于由 vSphere 上的管理集群部署的基于类的工作负载集群。
  • 不支持 Windows 节点。
  • 仅适用于 IPv4 环境,不适用于 IPv6 或双堆栈。
  • 仅分配节点地址,而不是集群控制平面端点。
  • 如果为现有集群配置节点 IPAM,不会检查其 IP 池是否与集群已使用的 DHCP 池冲突。
  • 按照设计,IP 池特定于命名空间,不能在多个命名空间之间共享。
    • 跨多个命名空间运行的集群要求每个命名空间中都有一个 IP 池,所有命名空间的地址范围均不重叠。
    • 有关 IP 池的其他限制,请参见下面的池规则

为工作负载集群配置节点 IPAM

要使用节点 IPAM 配置新集群或现有集群,请执行以下操作:

  1. 创建一个 InClusterIPPool 对象定义,以从 TKG 可用于为工作负载集群分配静态 IP 地址的子网中设置 IP 地址范围。例如,要创建一个对象 inclusterippool,该对象将为 default 命名空间中的集群保留 10.10.10.20010.10.10.250

    ---
    apiVersion: ipam.cluster.x-k8s.io/v1alpha1
    kind: InClusterIPPool
    metadata:
      name: inclusterippool
      # the namespace where the workload cluster is deployed
      namespace: default
    spec:
      # replace the IPs below with what works for your environment
      subnet: 10.10.10.0/24
      gateway: 10.10.10.1
      # start and end are optional fields that restrict the allocatable address range
      # within the subnet
      start: 10.10.10.200
      end: 10.10.10.250
    
  2. 创建 InClusterIPPool 对象:

    kubectl apply -f my-ip-pool.yaml
    
  3. 在 Tanzu CLI 配置中启用自定义名称服务器功能:

    tanzu config set features.cluster.custom-nameservers true
    
  4. 将工作负载集群配置为在平面集群配置文件或 Kubernetes 样式对象规范中使用 IP 池,如配置文件中所述。

    例如:

    • 平面配置文件(创建新集群):

      # The name of the InClusterIPPool object specified above
      NODE_IPAM_IP_POOL_NAME: inclusterippool
      CONTROL_PLANE_NODE_NAMESERVERS: 10.10.10.10
      WORKER_NODE_NAMESERVERS: 10.10.10.10
      
    • 对象规范(创建新集群或修改现有集群):

      ---
      apiVersion: cluster.x-k8s.io/v1beta1
      kind: Cluster
      spec:
      topology:
        variables:
        - name: network
          value:
            addressesFromPools:
            - apiGroup: ipam.cluster.x-k8s.io
              kind: InClusterIPPool
              name: inclusterippool
        - name: controlplane
          value:
            network:
              nameservers: [10.10.10.10]
        - name: worker
          value:
            network:
              nameservers: [10.10.10.10]
      

现在,您可以部署工作负载集群。

池规则

  • IP 池范围不得重叠
    • 重叠的池可能会导致故障,并且 TKG 不会验证池范围或检测重叠。
  • 请勿使用新池更新活动 InClusterIPPool 对象
    • TKG 不会自动更新使用该池的节点的 IP 地址,您将需要重新创建节点以释放其旧 IP 地址

节点 IPAM 故障排除

  • 要查看集群节点是否已分配 IP 地址,请运行 kubectl get 以列出特定于 IaaS 的计算机对象(vspherevms),并检查其 IPAddressClaimed 状态。True 表示节点的地址声明成功,如果状态为 False,则命令输出会报告 Reason,说明状况未就绪的原因:

    kubectl -n CLUSTER-NAMESPACE get vspherevms
    
  • 要查看 IP 地址声明,请列出 ipaddressclaims。对于每台计算机,addressesFromPools 条目会导致创建一个 IPAddressClaim

    kubectl -n CLUSTER-NAMESPACE get ipaddressclaims
    
  • 要查看 IP 地址,请列出 ipaddress。集群内 IPAM 提供程序应检测每个 IPAddressClaim 并创建相应的 IPAddress 对象:

    kubectl -n CLUSTER-NAMESPACE get ipaddress
    
  • 当给定虚拟机的所有声明都与 IP 地址匹配时,CAPV 会将分配的 IP 地址写入虚拟机的 cloud-init 元数据并创建虚拟机。要查看 IP 地址协调步骤,请参见 CAPV 和集群 API IPAM 提供程序 (CAIP) 日志:

    kubectl logs ???n capv-system capv-controller-manager-???
    kubectl logs ???n caip-in-cluster-system capi-in-cluster-controller-manager-???
    

IPv6 网络连接 (vSphere)

您可以使用基于 Ubuntu 的节点,在具有 Kube-Vip 的 vSphere 上的仅 IPv6 但堆栈网络环境中运行管理集群和工作负载集群。

注意无法在 vSphere 8 上创建具有 vSphere with Tanzu 主管集群或独立管理集群的 IPv6 集群。无法向 Tanzu Mission Control 注册 IPv6 集群。当前不支持 NSX Advanced Load Balancer 服务和双堆栈 IPv4/IPv6 网络。

必备条件:

部署 IPv6 管理集群

在引导计算机上执行以下操作以将管理集群部署到 IPv6 网络环境中:

  1. 将 Linux 配置为接受路由器通告,确保 Docker 服务启动时不会从路由表中移除默认 IPv6 路由。有关详细信息,请参见 Docker CE 删除 IPv6 默认路由sudo sysctl net.ipv6.conf.eth0.accept_ra=2

  2. 为引导集群创建伪装规则以从引导集群发送出站流量:sudo ip6tables -t nat -A POSTROUTING -s fc00:f853:ccd:e793::/64 ! -o docker0 -j MASQUERADE 有关伪装规则的详细信息,请参见伪装

  3. 在配置文件中为管理集群设置以下变量。

    • TKG_IP_FAMILY 设置为 ipv6
    • VSPHERE_CONTROL_PLANE_ENDPOINT 设置为静态 IPv6 地址。
    • (可选)设置 CLUSTER_CIDR and SERVICE_CIDR。默认值分别为 fd00:100:64::/48fd00:100:96::/108
  4. 通过运行 tanzu mc create 部署管理集群,如在配置文件中部署管理集群中所述。

    • 要支持 IPv6,您必须在配置文件(而不是安装程序界面)中部署管理集群。

部署 IPv6 工作负载集群

如果已部署 IPv6 管理集群,请按以下方式部署 IPv6 工作负载集群:

  1. 在配置文件中为工作负载集群设置以下变量。

    • TKG_IP_FAMILY 设置为 ipv6
    • VSPHERE_CONTROL_PLANE_ENDPOINT 设置为静态 IPv6 地址。
    • (可选)设置 CLUSTER_CIDR and SERVICE_CIDR。默认值分别为 fd00:100:64::/48fd00:100:96::/108
  2. 按照创建工作负载集群中所述部署工作负载集群。

双堆栈集群(技术预览版)

注意

此功能处于不受支持的技术预览版状态;请参见 TKG 功能状态

通过双堆栈功能,可以部署具有 IPv4 和 IPv6 IP 系列的集群。但是,主 IP 系列是 IPv4。在试用此功能之前,请将 vCenter Server 配置为同时支持 IPv4 和 IPv6 连接。

以下是此版本中双堆栈功能的限制:

  • 双堆栈功能支持将 vSphere 作为唯一的基础架构即服务 (IaaS) 产品。

  • 无法在具有 Photon OS 节点的集群上配置双堆栈。仅支持配置了 ubuntuOS_NAME 的集群。

  • 无法为 vSphere with Tanzu 主管集群或其创建的工作负载集群配置双堆栈网络连接。

  • 无法使用安装程序界面部署双堆栈管理集群。

  • 您无法在 NSX Advanced Load Balancer (ALB) 提供的负载均衡器服务上使用双堆栈或 IPv6 服务。您可以使用 kube-vip 作为双堆栈集群的控制平面端点提供程序。使用 NSX ALB 作为双堆栈集群的控制平面端点提供程序尚未得到验证。

  • 在此版本中,仅对 Antrea、Calico、CSI、CPI 和 Pinniped 等核心加载项组件进行了双堆栈支持验证。

要在集群上配置双堆栈,请执行以下操作:

  1. 设置双堆栈功能标记:

    a. 要在管理集群上启用该功能,请运行以下命令:

    tanzu config set features.management-cluster.dual-stack-ipv4-primary true
    

    b. 要在工作负载集群上启用该功能,请运行以下命令:

    tanzu config set features.cluster.dual-stack-ipv4-primary true
    
  2. 根据需要部署管理集群创建工作负载集群

    在集群配置文件中:

    • 将 IP 系列配置变量设置为 TKG_IP_FAMILY: ipv4,ipv6
    • (可选)设置服务 CIDR 和集群 CIDR。
    注意

    每个变量有两个 CIDR。这些 CIDR 的 IP 系列遵循配置的 TKG_IP_FAMILY 的顺序。允许用于 IPv4 地址的最大 CIDR 范围是 /12,最大的 IPv6 SERVICE_CIDR 范围为 /108。如果未设置 CIDR,则使用默认值。

    • 如果使用 Antrea 作为集群的 CNI,请设置以下配置文件参数:

      ANTREA_ENDPOINTSLICES: true
      

    这些服务在 PreferDualStackRequireDualStack 规范中指定了 ipFamilyPolicy,现在可以通过 IPv4 或 IPv6 访问。

注意

上游 Kubernetes 中的双堆栈功能的端到端测试可能会失败,因为集群节点仅通告其主 IP 地址(本例中为 IPv4 地址)作为其 IP 地址。

check-circle-line exclamation-circle-line close-line
Scroll to top icon