全部产品

线下Kubernetes集群使用ECI

更新时间:2021-01-18 21:30

如果您在自建机房或者其他线下环境部署了Kubernetes集群,需要部署Virtual Kubelet来使用ECI,本文为您介绍如何部署Virtual Kubelet。

前提条件

使用限制

在该混合云场景下,部分功能无法支持或有条件支持,不支持的功能如下:

  • Annotations更新

  • Labels更新

  • Spec.ActiveDeadlineSeconds更新

  • ConfigMap、Secret更新

  • kubectl logs-f命令(支持logs查询,不支持follow模式)

  • kubectl attach命令

  • kubectl port-forward命令

  • 部分DownwardAPI参数无法引用(如:status.hostIP)

  • ClusterIP

    需要通过阿里云高速通道或者智能接入网关SAG打通网络,更多信息,请参见高速通道或者SAG

准备工作

执行部署前,您需要准备好以下信息:

参数

描述

获取方式

ECI_ACCESS_KEY

用户AccessKey

请参见获取AccessKey

ECI_SECRET_KEY

用户SecretKey

请参见获取AccessKey

ALIYUN_CLUSTERID

集群ID

自定义。集群的唯一标识。

ECI_REGION

地域ID

通过弹性容器实例控制台或者调用DescribeRegions获取地域信息。

ECI_VPC

专有网络VPC ID

专有网络控制台专有网络页面查看。

ECI_VSWITCH

虚拟交换机ID

专有网络控制台交换机页面,根据已选的VPC来获取对应的交换机ID。

ECI_SECURITY_GROUP

安全组ID

专有网络控制台找到已选的VPC,单击ID进入详情页面,然后在下方的资源管理页签下,单击安全组对应的数字,跳转到安全组列表页面获取对应的安全组ID。

部署Virtual Kubelet

  1. 为Virtual Kubelet创建一个服务账号并绑定至集群角色中,用于正常创建Pod资源。

    1. 执行以下命令,创建一个名为vk-admin的服务账号。

      kubectl create serviceaccount vk-admin -n kube-system
    2. 执行以下命令,将vk-admin账号绑定至cluster-admin集群角色中。

      kubectl create clusterrolebinding vk-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:vk-admin
  2. 创建部署Virtual Kubelet的模板文件vk.yaml。

    yaml文件的内容示例如下,您需要根据之前准备的信息,替换yaml文件中对应的参数值。

    注意

    Virtual Kubelet版本必须为v2.0.0.608-0b919e1d2-aliyun及以后版本。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: virtual-node-controller
      name: virtual-node-controller
      namespace: kube-system
    spec:
      serviceName: vk-svc
      replicas: 1
      selector:
        matchLabels:
          app: virtual-node-controller
      template:
        metadata:
          labels:
            app: virtual-node-controller
        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-controller
                  topologyKey: kubernetes.io/hostname
                weight: 100
          containers:
          - name: virtual-node-controller
            # 部署Virtual Kubelet所需的镜像及版本
            image: registry.cn-beijing.aliyuncs.com/acs/virtual-nodes-eci:v2.0.0.34-252556a33-aliyun
            imagePullPolicy: Always
            args:
            - --provider
            - alibabacloud
            - --nodename
            - $(VN_INSTANCE)
            env:
            - name: VN_INSTANCE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: KUBELET_PORT
              value: "10250"
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            - name: VKUBELET_TAINT_KEY
              value: "virtual-kubelet.io/provider"
            - name: VKUBELET_TAINT_VALUE
              value: "alibabacloud"
            - name: VKUBELET_TAINT_EFFECT
              value: "NoSchedule"
            - name: ECI_QUOTA_CPU
              value: "1000000"
            - name: ECI_QUOTA_MEMORY
              value: 6400Ti
            - name: ECI_QUOTA_POD
              value: "3000"
            - name: ECI_KUBE_PROXY
              value: "true"
            # ECI创建的地域
            - name: ECI_REGION
              value: <region-id>
            # ECI创建使用的Access Key
            - name: ECI_ACCESS_KEY
              value: <access-key>
            # ECI创建使用的Secret Key
            - name: ECI_SECRET_KEY
              value: <secret-kty>
            # ECI创建使用的VPC ID
            - name: ECI_VPC
              value: <vpc-id>
            # ECI创建使用的虚拟交换机ID
            - name: ECI_VSWITCH
              value: <vsw-id>
            # ECI创建使用的安全组ID
            - name: ECI_SECURITY_GROUP
              value: <security-group-id>
            # ECI创建自定义的集群ID
            - name: ALIYUN_CLUSTERID
              value: <cluster-id>
            - name: ALIYUN_PRIVATE_ZONE
              value: "false"
            # ECI创建时,混合云场景开关配置
            - name: ECI_HYBRID_MODE
              value: "true"
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          serviceAccount: admin
          serviceAccountName: admin
  3. 部署Virtual Kubelet。

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

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

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

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

    kubectl get nodes

    如果能查询到virtual-kubelet节点,且状态为Ready,表示部署成功。示例如下:

    NAME                STATUS   ROLES    AGE   VERSION
    master-1            Ready    <none>   19d   v1.18.8-aliyun.1
    master-2           Ready    <none>   19d   v1.18.8-aliyun.1
    virtual-kubelet    Ready    agent     18d   v1.18.8-aliyun.1

调度Pod到虚拟节点

当集群中存在虚拟节点时,您可以将Pod调度到虚拟节点上。相关配置如下:

  • 创建容器负载到虚拟节点时,由于虚拟节点有特殊的Taints,Pod需要配置nodeSelector和tolerations后才能指定调度到虚拟节点上。示例如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
      nodeSelector:
        type: virtual-kubelet
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Exists
  • 由于ECI对接Kubernetes集群使用的是Virtual Kubelet,即虚拟节点,没有真实的计算节点存在,因此不支持部署DaemonSet。在创建DaemonSet时,您需要配置反亲和调度策略,防止DaemonSet调度到虚拟节点上。示例如下:

     affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: type
                    operator: NotIn
                    values:
                    - virtual-kubelet

升级Virtual Kubelet

如果您需要使用新功能,可能需要更新vk镜像的版本。

您可以执行以下命令编辑对应的资源,修改image tag到需要升级的版本。

kubectl edit deployment -n kube-system virtual-node-controller