全部产品

自建Kubernetes集群使用ECI

如果您在阿里云ECS上自建了Kubernetes集群,需要部署Virtual Kubelet来使用ECI。本文为您介绍如何部署Virtual Kubelet。

准备工作

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

参数

描述

获取方式

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的模板文件vk.yaml。

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

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: virtual-node-sa
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: virtual-node-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: virtual-node-sa
        namespace: kube-system
    ---
    apiVersion: apps/v1
    kind:  Deployment
    metadata:
      name: virtual-node-controller
      namespace: kube-system
      labels:
        app: virtual-node-controller
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: virtual-node-controller
      template:
        metadata:
          labels:
            app: virtual-node-controller
        spec:
          serviceAccount: virtual-node-sa
          containers:
          - name: alicloud-virtual-kubelet
           # 部署Virtual Kubelet所需的镜像及版本
            image: registry.cn-beijing.aliyuncs.com/acs/virtual-nodes-eci:v2.0.0.34-252556a33-aliyun
            imagePullPolicy: Always
            args: ["--provider", "alibabacloud"]
            env:
            - name: KUBELET_PORT
              value: "10250"
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  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_REGION
              value: ${aliyun_region_name}
            - name: ECI_VPC
              value: ${aliyun_vpc_id}
            - name: ECI_VSWITCH
              value: ${aliyun_vswitch_id}
            - name: ECI_SECURITY_GROUP
              value: ${aliyun_sg_id}
            - name: ECI_ACCESS_KEY
              value: ${aliyun_access_key}
            - name: ECI_SECRET_KEY
              value: ${aliyun_secret_key}
            - name: ALIYUN_CLUSTERID
              value: ${custom_define_cluster_id} 
  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节点,且状态为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>

验证结果

您可以指定在虚拟节点下创建Pod,来验证是否部署成功。

  1. 创建指定节点的yaml文件。

    vim test-pod.yaml

    yaml文件的内容示例如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: centos
        image: centos:latest
        args:
        - /bin/sh
        - -c
        - date; sleep 6000h
      nodeName: virtual-kubelet
  2. 创建Pod。

    kubectl create -f test-pod.yaml
  3. 查看Pod的创建情况。

    kubectl get pod/test-pod -o wide

    返回示例如下:

    NAME       READY   STATUS    RESTARTS   AGE   IP                    NODE                  NOMINATED NODE   READINESS GATES
    test-pod   1/1         Running   0                 95s   192.168.*.*   virtual-kubelet   <none>                      <none>
  4. 查看Pod的yaml文件。

    kubectl  get pod -o yaml test-pod

    Virtual Kubelet会为运行在虚拟节点的Pod添加annotations,示例如下:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        ProviderCreate: done
        k8s.aliyun.com/eci-instance-id: eci-2ze428yrni34mggb****
  5. 在ECI控制台查看Pod。

    Pod创建成功后,在ECI控制台显示为相应的容器组,该容器组的ID为yaml中的k8s.aliyun.com/eci-instance-id对应的值,且名称使用Pod的namespace和name拼接而成。自建k8s

升级Virtual Kubelet

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

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

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