第 1 章 服务概述

您可以添加用于 Red Hat Advanced Cluster Management for Kubernetes 的服务,这些服务可以提高某些性能。服务在一个受管集群或多个受管集群中运行。

以下小节提供了 Red Hat Advanced Cluster Management 可用的服务概述:

1.1. Submariner 网络服务(技术预览)

submariner-addon 组件是一个技术预览功能。

Submariner 服务是一个开源工具,可与 Red Hat Advanced Cluster Management for Kubernetes 一起使用,用于为您的环境中两个或多个 Kubernetes 集群(内部环境或云)提供 Pod 之间的直接联网。有关 Submariner 的更多信息,请参阅 Submariner 的网站

您可以在以下环境中托管的 OpenShift Container Platform 集群上启用 Submariner:

  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)
  • IBM Cloud
  • Microsoft Azure
  • Red Hat OpenShift Dedicated
  • VMware vSphere

Red Hat Advanced Cluster Management for Kubernetes 提供了一个 Submariner 组件,您可以使用 hub 集群在环境中部署。

1.1.1. 先决条件

在使用 Submariner 前,请确保已满足以下先决条件:

  • 在 Red Hat OpenShift Container Platform 版本 4.6 或更高版本上运行的 Red Hat Advanced Cluster Management hub 集群,Kubernetes 版本 1.19 或更高版本。
  • 使用 cluster-admin 权限访问 hub 集群的凭证。
  • 在 OpenShift Container Platform 版本 4.4 或更高版本上运行的两个或者两个以上 OpenShift Container Platform 受管集群,Kubernetes 版本 1.17 或更高版本,由 Red Hat Advanced Cluster Management hub 集群管理。
  • 集群的非覆盖 pod 和服务无类别间路由(CIDR)范围。注: 名为 Globalnet 的上游功能允许重叠的 CIDR,但目前不支持与 Red Hat Advanced Cluster Management 搭配使用。
  • 在网关节点之间配置了 IP 连接。连接两个集群时,网关节点必须可使用分配给网关节点的公共或私有 IP 地址访问至少一个集群。如需更多信息,请参阅 Submariner NAT Traversal
  • 各个受管集群中所有节点的防火墙配置必须同时允许 4800/UDP。
  • 网关节点上的防火墙配置允许入口 8080/TCP,以便集群中的其他节点可以访问它。
  • 为 4500/UDP 以及网关节点上 IPsec 流量的其他端口打开防火墙配置。

    注:当您的集群部署在 AWS 或 GCP 环境中时,这会自动配置,但必须为其他环境中的集群以及保护私有云的防火墙手动配置。

    表 1.1. Submariner 需要的端口

    名称默认值Customizable

    IPsec NATT

    4500/UDP

    VXLAN

    4800/UDP

    Submariner 指标端口

    8080/TCP

有关先决条件的详情,请参阅 Submariner 的上游先决条件文档

1.1.2. 准备所选主机来部署 Submariner

在 Microsoft Azure、IBM Cloud 或 Red Hat OpenShift Dedicated 上使用 Red Hat Advanced Cluster Management for Kubernetes 部署 Submariner 前,您必须在托管环境中手动为连接准备集群。不同主机环境的要求有所不同,因此请按照您的托管环境说明进行操作。

1.1.2.1. 准备 Microsoft Azure 以部署 Submariner

要准备 Microsoft Azure 上的集群来部署 Submariner 组件,请完成以下步骤:

  1. 在 Microsoft Azure 环境中创建入站和出站防火墙规则,以打开 IP 安全 NAT 遍历端口(默认为 4500/UDP)以启用 Submariner 通信:

    # Create inbound NAT rule
    $ az network lb inbound-nat-rule create --lb-name <lb-name> \
    --resource-group <res-group> \
    --name <name> \
    --protocol Udp --frontend-port <ipsec-port> \
    --backend-port <ipsec-port> \
    --frontend-ip-name <frontend-ip-name>
    
    # Add VM network interface to the just-created inbound NAT rule
    $ az network nic ip-config inbound-nat-rule add \
    --lb-name <lb-name> --resource-group <res-group> \
    --inbound-nat-rule <nat-name> \
    --nic-name <nic-name> --ip-config-name <pipConfig>

    lb-name 替换为您的负载均衡器名称。

    res-group 替换为您的资源组名称。

    使用负载平衡入站 NAT 规则名称替换替换 nat-name

    使用您的 IPsec 端口替换 ipsec-port

    pipConfig 替换为集群前端 IP 配置名称。

    nic-name 替换为您的网卡(NIC)。

  2. 创建一个负载均衡入站 NAT 规则以转发 Submariner 网关指标服务请求:

    # Create inbound NAT rule
    $ az network lb inbound-nat-rule create --lb-name <lb-name> \
    --resource-group <res-group> \
    --name <name> \
    --protocol Tcp --frontend-port 8080 --backend-port 8080 \
    --frontend-ip-name <frontend-ip-name>
    
    # Add VM network interface to the just-created inbound NAT rule
    $ az network nic ip-config inbound-nat-rule add \
    --lb-name <lb-name> --resource-group <res-group> \
    --inbound-nat-rule <nat-name> \
    --nic-name <nic-name> --ip-config-name <pipConfig>

    lb-name 替换为您的负载均衡器名称。

    res-group 替换为您的资源组名称。

    使用负载平衡入站 NAT 规则名称替换替换 nat-name

    pipConfig 替换为集群前端 IP 配置名称。

    nic-name 替换为您的网卡(NIC)。

  3. 在 Azure 上创建网络安全组(NSG)安全规则,为 Submariner 打开 NAT 遍历端口(默认为 4500/UDP):

    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Inbound --access Allow \
    --protocol Udp --destination-port-ranges <ipsec-port>
    
    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Outbound --access Allow \
    --protocol Udp --destination-port-ranges <ipsec-port>

    res-group 替换为您的资源组名称。

    使用您的 NSG 名称替换 nsg-name

    priority 替换为您的规则优先级。

    使用您的规则名称替换 name

    使用您的 IPsec 端口替换 ipsec-port

  4. 创建 NSG 规则以打开 4800/UDP 端口,将来自 worker 和 master 节点的 pod 流量封装到 Submariner 网关节点:

    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Inbound --access Allow \
    --protocol Udp --destination-port-ranges 4800 \
    
    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Outbound --access Allow \
    --protocol Udp --destination-port-ranges 4800

    res-group 替换为您的资源组名称。

    使用您的 NSG 名称替换 nsg-name

    priority 替换为您的规则优先级。

    使用您的规则名称替换 name

  5. 创建 NSG 规则以打开 8080/TCP 端口,从 Submariner Gateway 节点导出指标服务:

    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Inbound --access Allow \
    --protocol Tcp --destination-port-ranges 8080 \
    
    $ az network nsg rule create --resource-group <res-group> \
    --nsg-name <nsg-name> --priority <priority> \
    --name <name> --direction Outbound --access Allow \
    --protocol Udp --destination-port-ranges 8080

    res-group 替换为您的资源组名称。

    使用您的 NSG 名称替换 nsg-name

    priority 替换为您的规则优先级。

    使用您的规则名称替换 name

  6. 使用以下标签 submariner.io/gateway=true 标记集群中的 worker 节点。

1.1.2.2. 准备 IBM Cloud 来部署 Submariner

IBM Cloud 上有两种 Red Hat OpenShift Kubernetes Service(ROKS):经典(classic)集群,以及在虚拟私有云(VPC)中的第二代计算基础架构。因为无法为经典集群配置 IPsec 端口,所以 Submariner无法在典型的 ROKS 集群上运行。

要将 VPC 上的 ROKS 集群配置为使用 Submariner,请完成以下链接中的步骤:

  1. 在创建集群前,为 pod 和服务指定子网,这样可避免与其他集群重叠的 CIDR。如果使用现有的集群,请确保集群之间没有重叠的 pod 和服务 CIDR。详情请参阅 VPC 子网
  2. 将公共网关附加到集群中使用的子网。详情请参阅公共网关
  3. 通过完成安全组中的步骤,为集群的默认安全组创建入站规则。确保防火墙允许 4500/UDP 和 500/UDP 端口上的入站和出站流量,并为所有其他节点允许入站和出站 UDP/4800。
  4. 将集群中带有公共网关的节点标记为 submariner.io/gateway=true
  5. 参阅 Calico 来配置 Calico CNI,在集群中创建 IPPools。

1.1.2.3. 准备 Red Hat OpenShift Dedicated 来部署 Submariner

Red Hat OpenShift Dedicated 支持由 AWS 和 Google Cloud Platform 置备的集群。

1.1.2.3.1. 准备 Red Hat OpenShift Dedicated 在 AWS 上部署 Submariner

要在 Red Hat OpenShift Dedicated 上配置 AWS 集群,请完成以下步骤:

  1. 向 Red Hat OpenShift Hosted SRE 支持团队提交支持问题单,以便获取 Red Hat OpenShift Dedicated 集群的 cluster-admin 组访问权限。dedicated-admin 的默认访问权限并没有包括创建 MachineSet 所需的权限。
  2. 创建组后,在完成 Red Hat OpenShift Dedicated 文档中的为用户分配 cluster-admin 角色的步骤时创建的 cluster-admin 组中添加用户名。
  3. 配置用户 osdCcsAdmin 的凭证,以便将该用户用作服务帐户。
  4. 将集群导入到 Red Hat Advanced Cluster Management,并按照使用控制台部署 Submariner 中的说明进行操作。
1.1.2.3.2. 准备 Red Hat OpenShift Dedicated 在 Google Cloud Platform 上部署 Submariner

要在 Red Hat OpenShift Dedicated 上配置 Google Cloud Platform 集群,请完成以下步骤:

  1. 配置名为 osd-ccs-admin 的服务帐户,可用于管理部署。
  2. 将集群导入到 Red Hat Advanced Cluster Management,并按照使用控制台部署 Submariner 中的说明进行操作。

1.1.3. 使用控制台部署 Submariner

submariner-addon 组件是一个技术预览功能。

您可以使用 Red Hat Advanced Cluster Management for Kubernetes 控制台,在 Amazon Web Services、Google Cloud Platform 和 VMware vSphere 上部署的 Red Hat OpenShift Container Platform 受管集群上部署 Submariner。要将 Submariner 部署到其他提供程序上,请按照使用 API 部署 Submariner 中的说明操作。完成以下步骤,使用 Red Hat Advanced Cluster Management for Kubernetes 控制台部署 Submariner:

需要的访问权限:集群管理员

  1. 在控制台导航菜单中选择 Infrastructure > Clusters
  2. Clusters 页面上,选择 Cluster sets 选项卡。要使用 Submariner 启用的集群必须位于同一集群集合中。
  3. 如果要在其上部署 Submariner 的集群已位于同一集群集中,请跳至第 5 步来部署 Submariner。
  4. 如果要在其上部署 Submariner 的集群不在同一个集群集中,请完成以下步骤为它们创建一个集群集:

    1. 选择 Create cluster set
    2. 对集群集进行命名,然后选择 Create
    3. 选择 Manage resource assignments 以将集群分配到集群集。
    4. 选择您要与 Submariner 连接的受管集群,将它们添加到集群集合中。
    5. 选择 Review 来查看并确认您选择的集群。
    6. 选择 Save 保存集群集,并查看生成的集群设置页面。
  5. 在集群集页面中,选择 Submariner add-ons 选项卡。
  6. 选择 Install Submariner add-ons
  7. 选择您要在其上部署 Submariner 的集群。
  8. Install Submariner add-ons 编辑器中输入以下信息 :

    • AWS Access Key ID - 此字段仅在导入 AWS 集群时可见。
    • AWS Secret Access Key - 此字段仅在导入 AWS 集群时可见。
    • Google Cloud Platform service account JSON key - 此字段仅在导入 Google Cloud Platform 集群时可见。
    • Instance type - 在受管集群中创建的网关节点的 Amazon Web Services EC2 实例类型。默认值为 c5d.large。只有在受管集群环境是 AWS 时,此字段才可见。
    • IPsec NAT-T port - IPsec NAT 遍历端口的默认值是 4500。如果您的受管集群环境是 VMware vSphere,请确保在防火墙中打开此端口。
    • 网关数 - 用于在受管集群中部署 Submariner 网关组件的 worker 节点数量。默认值为 1。如果值大于 1,则会自动启用 Submariner 网关高可用性(HA)。
    • Cable driver - 维护跨集群隧道的 Submariner 网关电缆引擎组件。默认值为 Libreswan IPsec
  9. 在编辑器末尾选择 Next 以移动到下一个集群的编辑器,并为您选择的每个剩余的集群完成这个步骤。
  10. 验证每个受管集群的配置。
  11. Install 在所选受管集群上部署 Submariner。

    安装和配置完成可能需要几分钟时间。您可以在 Submariner add-ons 选项卡中的列表中检查 Submariner 状态:

    • 连接状态指示在受管集群中建立多少个 Submariner 连接。
    • 代理状态代表 Submariner 是否成功部署到受管集群中。控制台可能会报告 Degraded 状态,直到安装和配置为止。
    • Gateway nodes labeled 表示有多少个 worker 节点使用 Submariner 网关标签:submariner.io/gateway=true

Submariner 现在在集群中部署。

1.1.4. 使用 API 部署 Submariner

在使用 Red Hat Advanced Cluster Management for Kubernetes 部署 Submariner 前,您必须在托管环境中为连接准备集群。目前,您可以使用 SubmarinerConfig API 在 Amazon Web Services、Google Cloud Platform 和 VMware vSphere 上自动准备集群。对于其他平台,您需要手动进行准备,请参阅准备主机以部署 Submariner 的步骤。

1.1.4.1. 准备主机来部署 Submariner

在使用 Red Hat Advanced Cluster Management 部署 Submariner 前,您必须在托管环境中为连接准备集群。不同主机环境的要求各不相同,因此请按照您的托管环境说明进行操作。

1.1.4.1.1. 准备 Amazon Web Services 以部署 Submariner

您可以使用 SubmarinerConfig API 将 AWS 集群配置为与 Submariner 部署集成。按照适用于您的情况的步骤,准备 AWS 来安装 Submariner:

  1. 如果没有使用 Red Hat Advanced Cluster Management 创建受管集群,则必须在包含 AWS 凭证 secret 的受管集群的命名空间中手动在 hub 集群中创建一个 secret。如果使用 Red Hat Advanced Cluster Management 创建集群,则跳至第 2 步。

    要创建 secret,输入一个包含类似以下示例和 YAML 的信息的命令:运行命令以应用该文件:

    export AWS_ACCESS_KEY_ID=<aws-access-key-id>
    export AWS_SECRET_ACCESS_KEY=<aws-secret-access-key>
    
    cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
        name: <managed-cluster-name>-aws-creds
        namespace: <managed-cluster-namespace>
    type: Opaque
    data:
        aws_access_key_id: $(echo -n ${AWS_ACCESS_KEY_ID} | base64 -w0)
        aws_secret_access_key: $(echo -n ${AWS_SECRET_ACCESS_KEY} | base64 -w0)
    EOF

    managed-cluster-name 替换为受管集群的名称。

    managed-cluster-namespace 替换为受管集群的命名空间。

    使用 AWS 访问密钥 ID 替换 aws-access-key-id

    使用 AWS 访问密钥替换 aws-secret-access-key

  2. 如果您使用 Red Hat Advanced Cluster Management 创建受管集群,或者在上一步中创建 secret 后,输入类似以下示例和 YAML 的命令来准备集群:运行命令以应用该文件:

    cat << EOF | oc apply -f -
    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
        name: submariner
        namespace: <managed-cluster-namespace>
    spec:
        gatewayConfig:
    	    aws:
    	        instanceType: c5d.large
        credentialsSecret:
          name: <managed-cluster-name>-aws-creds
    EOF

    managed-cluster-namespace 替换为受管集群的命名空间。

    managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 AWS 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该名称。

    注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    此配置会自动打开 Submariner 所需的端口:网络地址转换 - 遍历 (NATT) 端口 (4500/UDP)、虚拟可扩展 LAN (VXLAN) 端口 (4800/UCP),以及 AWS 实例上的 Submariner 指标端口 (8080/TCP)。它还创建一个 AWS 实例,作为 AWS 实例类型为 c5d.large 的 Submariner 网关。

    • 如果要自定义 NATT 端口,请输入一个包含类似以下示例和 YAML 信息的命令。运行命令以应用该文件:

      cat << EOF | oc apply -f -
      apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
      kind: SubmarinerConfig
      metadata:
          name: submariner
          namespace: <managed-cluster-namespace>
      spec:
          credentialsSecret:
            name: <managed-cluster-name>-aws-creds
          IPSecNATTPort: <NATTPort>
      EOF

      managed-cluster-namespace 替换为受管集群的命名空间。

      managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 AWS 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该名称。

      NATTPort 替换为您要使用的 NATT 端口。

      注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    • 如果要自定义网关节点的 AWS 实例类型,请输入一个包含类似以下示例的信息的命令。运行命令以应用该文件:

      cat << EOF | oc apply -f -
      apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
      kind: SubmarinerConfig
      metadata:
         name: submariner
         namespace: <managed-cluster-namespace>
      spec:
         credentialsSecret:
           name: <managed-cluster-name>-aws-creds
        gatewayConfig:
            instanceType: <instance-type>
      EOF

      managed-cluster-namespace 替换为受管集群的命名空间。

      managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 AWS 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该名称。

      使用您要使用的 AWS 实例类型替换 instance-type。

      注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    • 如果要自定义网关节点的数量,请输入一个包含类似以下示例的信息的命令。运行命令以应用该文件:

      cat << EOF | oc apply -f -
    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
       name: submariner
       namespace: <managed-cluster-namespace>
    spec:
       credentialsSecret:
         name: <managed-cluster-name>-aws-creds
      gatewayConfig:
          gateways: <gateways>
    EOF

    + 将 managed-cluster-namespace 替换为受管集群的命名空间。

    + 将 managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 AWS 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该名称。

    + 使用您要使用的网关数量替换 gateway。如果值大于 1,则 Submariner 网关会自动启用高可用性。

    + 注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

1.1.4.1.2. 准备 Google Cloud Platform 以部署 Submariner

您可以使用 SubmarinerConfig API 配置 Google Cloud Platform 集群,使其与 Submariner 部署集成。按照适用于您情况的步骤准备 Google Cloud Platform 以安装 Submariner:

  1. 如果没有使用 Red Hat Advanced Cluster Management 创建受管集群,您必须在包含 Google Cloud Platform 凭证 secret 的受管集群的命名空间中手动在 hub 集群中创建一个 secret。如果使用 Red Hat Advanced Cluster Management 创建集群,则跳至第 2 步。

    要创建 secret,输入一个包含类似以下示例的信息的命令。运行命令以应用该文件。运行命令以应用该文件:

    cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
        name: <managed-cluster-name>-gcp-creds
        namespace: <managed-cluster-namespace>
    type: Opaque
    data:
        osServiceAccount.json: <gcp-os-service-account-json-file-content>
    EOF

    managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 Google Cloud Platform 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该 secret。

    managed-cluster-namespace 替换为受管集群的命名空间。

    gcp-os-service-account-json-file-content 替换为您编码的 Google Cloud Platform osServiceAccount.json: $(base64 -w0) 文件的内容。

  2. 如果您使用 Red Hat Advanced Cluster Management 创建受管集群,或者已在上一步中创建了 secret,请输入类似以下示例的命令来准备集群。运行命令以应用该文件。运行命令以应用该文件:

    cat << EOF | oc apply -f -
    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
        name: submariner
        namespace: <managed-cluster-namespace>
    spec:
        credentialsSecret:
          name: <managed-cluster-name>-gcp-creds
    EOF

    managed-cluster-namespace 替换为受管集群的命名空间。

    managed-cluster-name 替换为受管集群的名称。managed-cluster-name-gcp-creds 的值是 Google Cloud Platform 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该 secret。

    注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    此配置会自动打开 Submariner 所需的端口:网络地址转换 - 遍历 (NATT) 端口 (4500/UDP)、虚拟可扩展 LAN (VXLAN) 端口 (4800/UCP),以及 Google Cloud Platform 实例上的 Submariner 指标端口 (8080/TCP)。它还将一个 worker 节点标记为 Submariner 网关,并在 Google Cloud Platform 集群中启用此节点的公共 IP 地址。

    • 如果要自定义 NATT 端口,请输入包含类似以下示例的信息的命令。运行命令以应用该文件。运行命令以应用该文件:

      cat << EOF | oc apply -f -
      apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
      kind: SubmarinerConfig
      metadata:
          name: submariner
          namespace: <managed-cluster-namespace>
      spec:
          credentialsSecret:
            name: <managed-cluster-name>-gcp-creds
          IPSecNATTPort: <NATTPort>
      EOF

      managed-cluster-namespace 替换为受管集群的命名空间。

      managed-cluster-name 替换为受管集群的名称。managed-cluster-name-gcp-creds 的值是 Google Cloud Platform 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该 secret。

      NATTPort 替换为您要使用的 NATT 端口。

      注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    • 如果要自定义网关节点的数量,请输入一个包含类似以下示例的信息的命令。运行命令以应用该文件。运行命令以应用该文件:
    cat << EOF | oc apply -f -

    +

    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
       name: submariner
       namespace: <managed-cluster-namespace>
    spec:
       credentialsSecret:
         name: <managed-cluster-name>-gcp-creds
      gatewayConfig:
          gateways: <gateways>
    EOF

    + 将 managed-cluster-namespace 替换为受管集群的命名空间。

    + 将 managed-cluster-name 替换为受管集群的名称。managed-cluster-name-aws-creds 的值是 Google Cloud Platform 凭证 secret 名称,您可以在 hub 集群的集群命名空间中找到该 secret。

    + 使用您要使用的网关数量替换 gateway。如果值大于 1,则 Submariner 网关会自动启用高可用性。

1.1.4.1.3. 准备在 VMware vSphere 上部署 Submariner

Submariner 使用 IPsec 在网关节点上的集群之间建立安全隧道。您可以使用默认端口或指定自定义端口。当您运行这个步骤时,没有指定 IPsec NATT 端口,默认端口会自动用于通信。默认端口为 4500/UDP。

Submariner 使用虚拟可扩展 LAN (VXLAN) 在流量从 worker 和 master 节点移动到网关节点时封装流量。VXLAN 端口无法自定义,并且始终是端口 4800/UDP。

Submariner 使用 8080/TCP 在集群中的节点之间发送其指标信息,此端口无法自定义。

在启用 Submariner 前,VMWare vSphere 管理员必须打开以下端口:

表 1.2. VMware vSphere 和 Submariner 端口

名称默认值Customizable

IPsec NATT

4500/UDP

VXLAN

4800/UDP

Submariner 指标

8080/TCP

要准备 VMware vSphere 集群以部署 Submariner,请完成以下步骤:

  1. 确保 IPsec NATT、VXLAN 和指标端口已打开。
  2. 输入一个包含类似以下示例信息的命令,以应用 YAML 示例。运行命令以应用该文件:

    cat << EOF | oc apply -f -
    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
        name: submariner
        namespace: <managed-cluster-namespace>
    spec:{}
    EOF

    managed-cluster-namespace 替换为受管集群的命名空间。

    注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    此配置对 Submariner 使用默认的网络地址转换 - 遍历 (NATT) 端口 (4500/UDP),并在 vSphere 集群中使用一个 worker 节点作为 Submariner 网关。

    Submariner 使用 IP 安全 (IPsec) 在网关节点上的集群之间建立安全隧道。您可以使用默认 IPsec NATT 端口,或者指定您配置的不同端口。当您运行这个步骤时,没有指定 IPsec NATT 端口 4500/UDP,将自动用于通信。

    • 如果要自定义 NATT 端口,请输入包含类似以下示例的信息的命令。运行命令以应用该文件:

      cat << EOF | oc apply -f -
    apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
    kind: SubmarinerConfig
    metadata:
        name: submariner
        namespace: <managed-cluster-namespace>
    spec:
        IPSecNATTPort: <NATTPort>
    EOF

    + 将 managed-cluster-namespace 替换为受管集群的命名空间。

    + 将 NATTPort 替换为您要使用的 NATT 端口。

    + 注: SubmarinerConfig 的名称必须是 submariner,如示例中所示。

    • 如果要自定义网关节点的数量,请输入一个包含类似以下示例的信息的命令。运行命令以应用该文件:

      cat << EOF | oc apply -f -
      apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
      kind: SubmarinerConfig
      metadata:
         name: submariner
         namespace: <managed-cluster-namespace>
      spec:
        gatewayConfig:
            gateways: <gateways>
      EOF

      managed-cluster-namespace 替换为受管集群的命名空间。

      使用您要使用的网关数量替换 gateway。如果值大于 1,则 Submariner 网关会自动启用高可用性。

1.1.4.2. 使用 ManagedClusterAddOn API 部署 Submariner

要使用 ManagedClusterAddOn API 部署 Submariner,请完成以下步骤:

  1. 使用 创建和管理 ManagedClusterSets 中的说明在 hub 集群上创建一个 ManagedClusterSet ManagedClusterSet 的条目应类似以下内容:

    apiVersion: cluster.open-cluster-management.io/v1beta1
    kind: ManagedClusterSet
    metadata:
      name: <managed-cluster-set-name>

    managed-cluster-set-name 替换为您要创建的 ManagedClusterSet 的名称。

    注:Kubernetes 命名空间名称的最大长度为 63 个字符,因此 <managed-cluster-set-name> 的最大长度为 56 个字符。如果 <managed-cluster-set-name> 的长度超过 56,则 <managed-cluster-set-name> 将从头截断。

    创建 ManagedClusterSet 后,submariner-addon 会创建一个名为 <managed-cluster-set-name>-broker 的命名空间,并将 Submariner 代理部署到其中。

  2. 输入以下命令在 ManagedClusterSet 中添加一个受管集群:

    oc label managedclusters <managed-cluster-name> "cluster.open-cluster-management.io/clusterset=<managed-cluster-set-name>" --overwrite

    <managed-cluster-name> 替换为您要添加到 ManagedClusterSet 的受管集群的名称。

    <managed-cluster-set-name> 替换为您要添加受管集群的 ManagedClusterSet 的名称。

  3. 输入以下命令在受管集群中部署 Submariner:

    cat << EOF | oc apply -f -
    apiVersion: addon.open-cluster-management.io/v1alpha1
    kind: ManagedClusterAddOn
    metadata:
         name: submariner
         namespace: <managed-cluster-name>
    spec:
         installNamespace: submariner-operator
    EOF

    managed-cluster-name 替换为您要使用 Submariner 的受管集群的名称。

    ManagedClusterAddOn 的 spec 中的 installNamespace 字段是在受管集群上安装 Submariner 的命名空间。目前,Submariner 必须安装到 submariner-operator 命名空间中。

    创建 ManagedClusterAddOn 后,submariner-addon 将 Submariner 部署到受管集群上的 submariner-operator 命名空间。您可以从这个 ManagedClusterAddOn 的状态查看 Submariner 的部署状态。

    注: ManagedClusterAddOn 的名称必须是 submariner

  4. 对要启用 Submariner 的所有受管集群重复步骤 2 和 3。
  5. 在受管集群中部署了 Submariner 后,您可以通过输入以下命令检查 submarinerr ManagedClusterAddOn 的状态来验证 Submariner 部署状态:

    oc -n <managed-cluster-name> get managedclusteraddons submariner -oyaml

    managed-cluster-name 替换为受管集群的名称。

    在 Submariner ManagedClusterAddOn 的状态中,三个条件代表 Submariner 的部署状态:

    • SubmarinerGatewayNodesLabeled 条件代表受管集群中是否存在标记为 Submariner 网关节点。
    • SubmarinerAgentDegraded 条件指示 Submariner 是否成功部署到受管集群中。
    • SubmarinerConnectionDegraded 条件指示受管集群上使用 Submariner 建立多少连接。

1.1.4.3. 自定义 Submariner 部署

您可以自定义 Submariner 部署的一些设置。

1.1.4.3.1. 电缆驱动程序

Submariner Gateway Engine 组件为其他集群创建安全隧道。电缆驱动程序组件使用网关引擎组件中的可插拔架构维护隧道。您可以使用 Libreswan 或 VXLAN 实现来 电缆 引擎组件的电缆驱动程序配置。请参见以下示例:

apiVersion: submarineraddon.open-cluster-management.io/v1alpha1
kind: SubmarinerConfig
metadata:
   name: submariner
   namespace: <managed-cluster-namespace>
spec:
   cableDriver: vxlan
   credentialsSecret:
     name: <managed-cluster-name>-<provider>-creds

最佳实践: 不要在公共网络上使用 VXLAN 电缆驱动程序。VXLAN 电缆驱动程序未加密。只有使用 VXLAN 来避免在专用网络上不必要的双加密。例如,一些内部环境可能会使用专用线级硬件设备来处理隧道的加密。

1.1.5. 为 Submariner 启用服务发现

submariner-addon 组件是一个技术预览功能。

在 Submariner 部署到与受管集群相同的环境中后,会将路由配置为 ManagedClusterSet 中的 pod 和服务间的安全 IP 路由。如果要使集群的服务可见,并可以被 ManagedClusterSet 中的其他集群发现,您需要创建一个 ServiceExport 对象。当使用 ServiceExport 对象导出一个服务后,您可以使用以下方式访问该服务: <service>.<namespace>.svc.clusterset.local。如果多个集群导出具有相同名称的服务,并且来自同一命名空间中,则其他集群会把这个服务看作为一个单一的逻辑服务。

在本例在,在 default 命名空间中使用 nginx 服务,但您可以发现任何 Kubernetes ClusterIP 服务或无头服务:

  1. 使用以下命令,在 ManagedClusterSet 中的受管集群中应用 nginx 服务实例:

    oc -n default create deployment nginx --image=nginxinc/nginx-unprivileged:stable-alpine
    oc -n default expose deployment nginx --port=8080
  2. 通过创建一个 ServiceExport 条目来导出服务,该条目类似于 YAML 文件中的以下内容:

    apiVersion: multicluster.x-k8s.io/v1alpha1
    kind: ServiceExport
    metadata:
      name: <service-name>
      namespace: <service-namespace>

    使用您要导出的服务的名称替换 service-name。在本例中是 nginx。将 service-namespace 替换为服务所在命名空间的名称。在本例中,是 default

  3. 在不同的受管集群中运行以下命令,确认它可以访问 nginx 服务:

    oc -n default run --generator=run-pod/v1 tmp-shell --rm -i --tty --image quay.io/submariner/nettest -- /bin/bash curl nginx.default.svc.clusterset.local:8080

nginx 服务发现现在已为 Submariner 配置。