全部产品
Search
文档中心

自建Kubernetes集群使用ECI

更新时间: 2021-09-18

如果您在阿里云ECS上自建了Kubernetes集群,您需要在集群中部署虚拟节点(Virtual Kubelet)来使用ECI。本文为您介绍在阿里云ECS上自建的集群如何对接ECI,包括将自建集群接入阿里云注册集群并部署虚拟节点,或者在自建集群中直接部署Virtual Kubelet。

背景信息

基于Kubernetes社区的Virtual Kubelet技术,ECI通过虚拟节点与Kubernetes实现无缝对接,使得Kubernetes集群可以轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。如果您的Kubernetes集群是自建的,可以通过以下两种方式来使用ECI:

  • 方式一:将自建集群接入注册集群并部署虚拟节点

  • 方式二:在自建集群中直接部署Virtual Kubelet

说明

推荐您使用方式一,该方式便于您及时升级Virtual Kubelet的版本(即ack-virtual-node的版本),以使用相关的新功能。关于如何升级VK,请参见升级Virtual Kubelet

准备工作

操作前,您需要准备好以下信息:

参数

描述

获取方式

ECI_ACCESS_KEY、ECI_SECRET_KEY

AccessKey ID和对应的AccessKey Secret。虚拟节点操作ECI的凭证。

请参见获取AccessKey

ALIYUN_CLUSTERID

集群ID,集群的唯一标识。

  • 如果采用接入注册集群的方式,集群ID将由系统自动生成。

  • 如果采用部署Virtual Kubelet的方式,您需要自定义集群ID,ID由字母和数字组成,需确保设置的ID在本阿里云账号下是唯一的。

ECI_REGION

地域ID。ECI实例将部署在该地域下。

您可以通过弹性容器实例控制台或者调用DescribeRegions获取ECI支持的地域信息。

ECI_VPC

专有网络VPC ID。ECI实例将部署在该VPC下。

您可以在专有网络控制台专有网络页面创建并查看VPC。

ECI_VSWITCH

虚拟交换机ID。ECI实例将部署在该交换机下。

您可以在专有网络控制台交换机页面创建并查看交换机,根据已选的VPC来选择对应的交换机。

ECI_SECURITY_GROUP

安全组ID。ECI实例将部署在该安全组下。

您可以在ECS管理控制台安全组页面创建并查看安全组,根据已选的VPC来选择对应的安全组。

方式一:接入注册集群并部署虚拟节点

您可以将自建集群通过接入注册集群的方式接入到阿里云容器服务管理平台,然后部署虚拟节点,以便使用ECI。相关操作步骤如下:

  1. 登录容器服务管理控制台

  2. 在左侧导航栏单击集群

  3. 创建注册集群。

    1. 集群列表页面,单击创建集群

    2. 选择注册集群页签,完成集群相关配置,然后单击创建集群

      需要注意的配置项如下表所示。更多信息,请参见创建注册集群

      参数

      描述

      地域、专有网络、虚拟交换机

      根据准备信息,选择所需的地域、专有网络和虚拟交换机。

      API Server访问

      默认为API Server创建一个内网SLB实例,您可以根据需要选择SLB实例规格。

      绑定EIP

      设置是否创建并绑定EIP,可用于建立集群链接。

      安全组

      自动创建一个安全组,用于划分安全域,统一控制网络流量。

      日志服务

      设置是否启用阿里云日志服务,可用于快速采集容器日志。

      集群删除保护

      设置是否启用集群删除保护,可防止通过控制台或API误释放集群。

  4. 将自建集群接入到注册集群中。

    1. 集群列表页面,找到新创建的集群,单击集群名称。

    2. 集群信息页面,单击连接信息页签。

    3. 在自建集群中创建ConfigMap。

      根据网络情况,选择公网页签或者私网页签,复制内容到YAML配置文件中(假设为agent.yaml),然后在自建集群中执行kubectl apply -f agent.yaml命令创建ConfigMap。

    4. 在自建集群中执行以下命令查看接入情况。

      kubectl -n kube-system get pod |grep ack-cluster-agent

      预期返回:

      ack-cluster-agent-5f7d568f6-6fc4k              1/1     Running   0          9s
      ack-cluster-agent-5f7d568f6-tf6fp              1/1     Running   0          9s
  5. 部署虚拟节点。

    1. 集群列表页面,单击目标集群的名称。

    2. 在集群管理页的左侧导航栏中,选择运维管理>组件管理

    3. 单击其他页签,找到ack-virtual-node组件,单击安装

方式二:直接部署Virtual Kubelet

您可以在集群内直接部署Virtual Kubelet(VK)来使用ECI。部署前,您需要先获取最新的VK版本。更多信息,请参见Virtual Kubelet版本记录

部署Virtual Kubelet的操作步骤如下:

  1. 准备部署Virtual Kubelet的配置文件vk.yaml。

    配置文件的内容示例如下,您需要根据之前准备的信息,替换配置文件中对应的参数值,并去除注释信息。

    注意

    Virtual Kubelet版本必须为v2.0.0.121-eff0e01c0-aliyun及以后版本。

    apiVersion: v1
    kind: Secret
    metadata:
      name: vk-accesskey
      namespace: kube-system
    type: Opaque
    data:
      # AK,需要Base64编码后填写到这里
      accesskey.id: {{ ECI_ACCESS_KEY Base64 Encoding }}
      # SK,需要Base64编码后填写到这里
      accesskey.secret: {{ ECI_SECRET_KEY Base64 Encoding }}
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: eci-profile
      namespace: kube-system
    data:
      # ECI无法连接到API Server时需要设置为"true"
      # 例如:线下自建的K8s集群没有与云上vpc打通时,需要设置为"true";自建集群的API Server与ECI归属于不同VPC时,需要设置为"true"
      enableHybridMode: "false"
      # 需要使用K8s的Cluster IP特性时设置为"true"
      enableClusterIp: "true"
      # 是否开启PrivateZone,需要开启时设置为"true"
      enablePrivateZone: "false"
      # 资源组ID,需要指定时填写,不需要指定时设置为""即可
      resourceGroupId: ""
      # 安全组ID,必须指定
      securityGroupId: "sg-2ze**********"
      # 调度选择器,用于设置哪些Pod将自动调度到ECI上,具体请参见ECI Profile
      selectors: ""
      # 交换机ID,必须指定
      vSwitchIds: "vsw-2zeq***********"
      # VPC ID,必须指定
      vpcId: "vpc-2ze0z************"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        role: webhook
      name: vk-webhook
      namespace: kube-system
    spec:
      ports:
      - port: 443
        targetPort: 443
      selector:
        app: virtual-kubelet
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: virtual-kubelet
      namespace: kube-system
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: virtual-kubelet
    subjects:
    - kind: ServiceAccount
      name: virtual-kubelet
      namespace: kube-system
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ack-virtual-node-controller
      namespace: kube-system
      labels:
        app: virtual-kubelet
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: virtual-kubelet
      template:
        metadata:
          labels:
            app: virtual-kubelet
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: type
                    operator: NotIn
                    values:
                    - virtual-kubelet
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - virtual-node-eci
                  topologyKey: kubernetes.io/hostname
                weight: 100
          containers:
          - name: vk
            # 按照实际情况替换region-id,在VK版本记录中查找最新的VK版本替换vk-tag
            # 注意:部署后应该关注vk版本发布,及时升级vk以获得阿里云的持续支持
            image: registry-vpc.{{ region-id }}.aliyuncs.com/acs/virtual-nodes-eci:{{ vk-tag }}
            imagePullPolicy: IfNotPresent
            args:
            - --provider
            - alibabacloud
            - --nodename
            - virtual-kubelet
            resources:
              requests:
                memory: 30M
                cpu: 100m
            env:
             # 必须指定集群类型,基于阿里云ECS自建集群请设置为CLOUD,线下自建集群请设置为IDC
            - name: CLUSTER_TYPE
              value: {{ cluster-type }}
            - name: WEBHOOK
              value: "true"
            - name: VKUBELET_TAINT_KEY
              value: "virtual-kubelet.io/provider"
            - name: VKUBELET_TAINT_VALUE
              value: "alibabacloud"
            - name: VKUBELET_TAINT_EFFECT
              value: "NoSchedule"
              # 必须填写region-id,为实际的地域ID,如cn-beijing
            - name: ECI_REGION
              value: {{ region-id }}
            - name: ECI_QUOTA_CPU
              value: "1000000"
            - name: ECI_QUOTA_MEMORY
              value: 6400Ti
            - name: ECI_QUOTA_POD
              value: "10000"
            - name: ECI_KUBE_PROXY
              value: "true"
            - name: ECI_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: vk-accesskey
                  key: accesskey.id
            - name: ECI_SECRET_KEY
              valueFrom:
                secretKeyRef:
                  name: vk-accesskey
                  key: accesskey.secret
            - name: ALIYUN_CLUSTERID
              # 自建K8s集群的集群ID,必须设置,账号下每个K8s集群的ID必须唯一
              value: {{ cluster-id }}
            - name: KUBELET_PORT
              value: "10250"
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
          terminationGracePeriodSeconds: 60
          serviceAccountName: virtual-kubelet
  2. 部署Virtual Kubelet。

    kubectl apply -f vk.yaml
  3. 查看部署情况。

    kubectl get deploy/virtual-node-controller -n kube-system

    部署完成的返回示例如下:

    NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
    virtual-node-controller   1/1         1                      1                  161m
  4. 查看部署Virtual Kubelet后的节点信息。

    kubectl get node -o wide

    部署Virtual Kubelet后生成的虚拟节点名称为virtual-kubelet。如果能查询到virtual-kubelet节点,且状态为Ready,则表示部署成功。返回示例如下:

    NAME                  STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                     KERNEL-VERSION                CONTAINER-RUNTIME
    k8s-master01      Ready    <none>   50d    v1.14.2      192.168.*.*     <none>           CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.9.6
    k8s-master02      Ready    <none>   50d    v1.14.2      192.168.*.*     <none>           CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.9.6
    k8s-master03      Ready    <none>   50d    v1.14.2      192.168.*.*     <none>           CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.9.6
    virtual-kubelet    Ready     agent      82m   v1.11.2      172.30.*.*     <none>           <unknown>                  <unknown>                         <unknown>

相关文档

接入ECI后,您可能需要调度Pod到ECI上运行,或者使用ECI相关功能。关于如何使用ECI,请参见使用概述