部署和配置Terway网络插件

混合集群中的容器网络插件包括本地数据中心中运行的容器网络插件和云上计算节点上运行的容器网络插件两部分。本文将介绍如何在混合集群中部署和配置Terway网络插件。

前提条件

场景一:本地数据中心容器网络模式为覆盖(Overlay)网络

若本地数据中心内的容器网络模式为覆盖网络,则云上计算节点也可以复用此网络模式,只需要保证云上计算节点能够正常拉取容器网络插件守护进程集所使用的容器镜像即可。

例如,常见的覆盖网络模式有:

  • Flannel VXLAN模式。

  • Calico IPIP模式。

  • Cilium VXLAN模式。

场景二:本地数据中心容器网络模式为BGP网络

若本地数据中心内的容器网络模式为BGP网络,那么云上计算节点需要使用Terway网络。关于云上云下容器网络互通,请参见云上边界路由器的BGP配置

在此场景下,需要保证以下条件:

  • 云下容器网络插件(如Calico BGP路由反射模式)的守护进程集不要被调度到云上计算节点。

  • 同时也要保证Terway网络插件的守护进程集不要被调度到云下计算节点。

在注册集群中,通过注册集群节点池扩容的计算节点都会添加一个固定的节点标签:alibabacloud.com/external=true,可以作为区分云上云下节点的过滤条件。

例如,针对云下Calico网络插件,可以使用nodeAffinity设置其不被调度到拥有标签alibabacloud.com/external=true的节点上。其他任何运行于云下且不希望被调度到云上的工作负载,都可以使用这种方式设置。执行以下命令更新Calico网络插件。

cat <<EOF > calico-ds.pactch
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: alibabacloud.com/external
                operator: NotIn
                values:
                - "true"
EOF
kubectl -n kube-system patch ds calico-node -p "$(cat calico-ds.pactch)"

云上Terway网络插件默认只被调度到拥有标签alibabacloud.com/external=true的节点上。

场景三:本地数据中心容器网络为Host网络

由于本地数据中心内的容器网络使用的是Host网络,所以只需保证云上Terway网络插件的守护进程集不被调度到云下即可。云上Terway网络插件默认只调度到拥有节点标签为alibabacloud.com/external=true的云上节点。

安装和配置Terway网络插件

场景二场景三下,需要为混合集群的云上节点安装和配置Terway网络插件。

步骤一:为Terway插件配置RAM权限

通过控制台配置

  1. 创建RAM用户并为其授予以下自定义权限策略。具体操作,请参见使用RAM授予集群及云资源访问权限

    展开查看自定义权限策略内容

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "ecs:CreateNetworkInterface",
                    "ecs:DescribeNetworkInterfaces",
                    "ecs:AttachNetworkInterface",
                    "ecs:DetachNetworkInterface",
                    "ecs:DeleteNetworkInterface",
                    "ecs:DescribeInstanceAttribute",
                    "ecs:AssignPrivateIpAddresses",
                    "ecs:UnassignPrivateIpAddresses",
                    "ecs:DescribeInstances",
                    "ecs:ModifyNetworkInterfaceAttribute"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            },
            {
                "Action": [
                    "vpc:DescribeVSwitches"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            }
        ]
    }
  2. 登录容器服务管理控制台,在左侧导航栏选择集群

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

  4. 保密字典页面,单击使用YAML创建资源,填入以下示例内容,创建一个名称为alibaba-addon-secret的Secret。

    说明

    组件会通过其中保存的AccessKeyID和AccessKeySecret访问云上服务。若已存在alibaba-addon-secret,则忽略。

    apiVersion: v1
    kind: Secret
    metadata:
      name: alibaba-addon-secret
      namespace: kube-system
    type: Opaque
    stringData:
      access-key-id: <RAM用户的AccessKeyID>
      access-key-secret: <RAM用户的AccessKeySecret>

通过onectl配置

  1. 在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群

  2. 执行以下命令,为Terway插件配置RAM权限。

    onectl ram-user grant --addon terway-eniip

    预期输出:

    Ram policy ack-one-registered-cluster-policy-terway-eniip granted to ram user ack-one-user-ce313528c3 successfully.

步骤二:安装Terway插件

通过控制台安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面单击网络页签,在terway-eniip组件区域单击安装

    说明

    在安装页面可选择是否启用 NetworkPolicy,默认不开启,若您启用此功能,需进行额外配置。更多详细信息,请参见开启Terway组件的NetworkPolicy(可选)

通过onectl安装

执行以下命令,安装Terway插件。

onectl addon install terway-eniip

预期输出:

Addon terway-eniip, version **** installed.

步骤三:配置Terway插件

执行以下命令编辑ConfigMap eni-config并配置eni_conf.access_keyeni_conf.access_secret

kubectl -n kube-system edit cm eni-config

eni-config的示例如下所示。

kind: ConfigMap
apiVersion: v1
metadata:  
 name: eni-config  
 namespace: kube-system
data:  
 eni_conf: |    
  {      
   "version": "1",      
   "max_pool_size": 5,      
   "min_pool_size": 0,      
   "vswitches": {"AZoneID":["VswitchId"]},      
   "eni_tags": {"ack.aliyun.com":"{{.ClusterId}}"},      
   "service_cidr": "{{.ServiceCIDR}}",      
   "security_group": "{{.SecurityGroupId}}",      
   "access_key": "",      
   "access_secret": "",      
   "vswitch_selection_policy": "ordered"    
  }  
 10-terway.conf: |    
  {      
   "cniVersion": "0.3.0",      
   "name": "terway",      
   "type": "terway"    
  }

您可以使用KubeConfig连接注册集群并查看Terway网络插件守护进程集,在混合集群扩容云上节点之前,它将不会被调度到任何一个云下节点上。

执行以下命令查看Terway网络。

kubectl -nkube-system get ds |grep terway

预期输出:

terway-eniip   0         0         0       0            0           alibabacloud.com/external=true      16s

开启Terway组件的NetworkPolicy(可选)

在注册集群中Terway组件默认关闭NetworkPolicy。更多信息,请参见在ACK集群使用网络策略

  • 若您不需要开启NetworkPolicy,请跳过该步骤。

  • 若您已开启NetworkPolicy,则需要根据自身环境确定是否安装CRD,CRD资源示例如下所示。

    重要

    Terway组件的NetworkPolicy功能依赖Calico CRD。若您的集群已经使用了Calico容器网络插件,开启Terway的NetworkPolicy功能时可能导致已有Calico容器网络异常。若有问题,请提交工单咨询。

    展开查看部署CRD资源的YAML示例

    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: felixconfigurations.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: FelixConfiguration
        plural: felixconfigurations
        singular: felixconfiguration
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: bgpconfigurations.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: BGPConfiguration
        plural: bgpconfigurations
        singular: bgpconfiguration
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: ippools.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: IPPool
        plural: ippools
        singular: ippool
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: hostendpoints.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: HostEndpoint
        plural: hostendpoints
        singular: hostendpoint
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: clusterinformations.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: ClusterInformation
        plural: clusterinformations
        singular: clusterinformation
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: globalnetworkpolicies.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: GlobalNetworkPolicy
        plural: globalnetworkpolicies
        singular: globalnetworkpolicy
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: globalnetworksets.crd.projectcalico.org
    spec:
      scope: Cluster
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: GlobalNetworkSet
        plural: globalnetworksets
        singular: globalnetworkset
    
    ---
    
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: networkpolicies.crd.projectcalico.org
    spec:
      scope: Namespaced
      group: crd.projectcalico.org
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              apiVersion:
                type: string
      names:
        kind: NetworkPolicy
        plural: networkpolicies
        singular: networkpolicy