全部产品
云市场

kubernetes接入ECI

更新时间:2019-12-18 16:55:14

本文演示如何在kubernetes集群,部署virtual-kubelet,为集群增加虚拟节点,以下简称:VK节点;使kubenetes集群通过VK节点接入ECI平台,在ECI平台上创建Pod。

kubernetes集群分类:

  • 自建kuberenetes集群:
    • 可以是基于阿里云ECS搭建的kubenetes集群
    • 可以是基于其他云平台搭建的kubenetes集群
    • 可以是基于机房搭建的kubenetes集群
    • 可以是基于台式机或笔记本搭建的kubernetes集群
  • 阿里云容器服务kubernetes集群
    • 专有版 Kubernetes(Dedicated Kubernetes)
    • 托管版 Kubernetes(Managed Kubernetes)
    • Serverless Kubernetes

下面我们,针对不同的kubernetes集群,介绍如何部署virtual-kubeket;由于阿里云Serverless Kubernetes,默认部署virtual-kubelet,是由系统管理员统一管理,本文不涉及阿里云Serverless Kubernetes集群部署virtual-kubelet。

前提条件

  • 您需要开通阿里云弹性容器实例 ECI 服务,登录弹性容器实例控制台开通服务
  • kubernetes集群上创建的Pod具有访问外网能力,因为virtual-kubelet是Pod形式部署,需要访问阿里云公网ECI服务。

部署virtual-kubelet

容器服务kubernetes集群

通过安装ack-virtual-node插件,部署vitual-kubelet

执行部署

  1. 登陆容器服务管理控制台
  2. 在Kubernetes 菜单下,单击左侧导航栏中的市场 > 应用目录,在右侧选中ack-virtual-nodeack_virtual_node
  3. 应用目录-ack-virtual-node页面,单击参数,配置虚拟节点参数
参数 参数含义 获取路径
ECI_ACCESS_KEY 用户AccessKey 请参见如何获取AccessKey ID和AccessKey Secre
ECI_SECRET_KEY 用户SecretKey 请参见如何获取AccessKey ID和AccessKey Secre
ALIYUN_CLUSTERID 集群ID 您可以在集群基本信息基本信息区域中,获取集群ID的值
ECI_REGION 地域名称 您可以在集群基本信息基本信息区域中,获取地域的值
ECI_VPC 集群的VPC 您可以在集群基本信息的集群资源区域中,获取虚拟专有网络 VPC的值
ECI_VSWITCH 虚拟交换机 您可以在节点列表单击某个节点,在实例详情页签的配置信息区域中,获取虚拟交换机的值
ECI_SECURITY_GROUP 安全组ID 您可以在节点列表单击某个节点,在本实例安全组页签的安全组列表区域中,获取安全组ID的值

4.配置完成后,在右侧的创建页面,选择对应的集群,可以看到命名空间已设定为kube-system,发布名称已设定为ack-virtual-node,单击创建deploy_vk

验证

检查节点列表

安装完成后,您可以通过集群 > 节点,在节点列表页面可以看到添加了一个节点virtual-kubeletnode_list您可以通过 kubectl 命令,查看节点列表信息

  1. $ kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. cn-beijing.192.168.0.238 Ready <none> 66d v1.14.6-aliyun.1
  4. cn-beijing.192.168.0.239 Ready <none> 66d v1.14.6-aliyun.1
  5. cn-beijing.192.168.0.240 Ready <none> 66d v1.14.6-aliyun.1
  6. virtual-kubelet Ready agent 19d v1.11.2

创建Pod到VK节点

当集群中存在虚拟节点时,您可以把Pod调度到虚拟节点上,Virtual Kubelet将会创建出相应的ECI Pod

  1. 在 Kubernetes 菜单下,单击左侧导航栏中的应用 > 无状态,选择选择集群命名空间,单击右上角的使用模板创建deploy_pod
  2. 选择样例模板或自定义,然后单击创建,您可以使用如下 yaml 示例模板创建Pod:
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: nginx
    5. spec:
    6. containers:
    7. - image: nginx
    8. imagePullPolicy: Always
    9. name: nginx
    10. nodeSelector:
    11. type: virtual-kubelet
    12. tolerations:
    13. - key: virtual-kubelet.io/provider
    14. operator: Exists
  3. 应用 > 容器组中,当出现如下界面时,表示 Pod 部署完成create_pod_success

自建kubernetes集群

采用yaml的方式部署virtual-kubelet

准备工作

部署virtual-kubelet准备工作,需要通过阿里云获取信息:

参数 参数含义 获取路径
ECI_ACCESS_KEY 用户AccessKey 请参见如何获取AccessKey ID和AccessKey Secre
ECI_SECRET_KEY 用户SecretKey 请参见如何获取AccessKey ID和AccessKey Secre
ALIYUN_CLUSTERID 集群ID 用户自定义一个唯一标示,作为集群ID
ECI_REGION 地域名称 登陆弹性容器实例控制台,获取Region信息,例如:华北2,对应RegionID cn-beijing
ECI_VPC 集群的VPC 登陆专有网络,根据已选Region,获取合适VPC ID
ECI_VSWITCH 虚拟交换机 登陆专有网络>交换机,根据已选VpcID,获取合适交换机ID

YAML文件

  1. $ cat deployment-vk.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: virtual-node-sa
  6. namespace: kube-system
  7. ---
  8. apiVersion: rbac.authorization.k8s.io/v1beta1
  9. kind: ClusterRoleBinding
  10. metadata:
  11. name: virtual-node-role-binding
  12. roleRef:
  13. apiGroup: rbac.authorization.k8s.io
  14. kind: ClusterRole
  15. name: cluster-admin
  16. subjects:
  17. - kind: ServiceAccount
  18. name: virtual-node-sa
  19. namespace: kube-system
  20. ---
  21. apiVersion: apps/v1beta2
  22. kind: Deployment
  23. metadata:
  24. name: virtual-node-controller
  25. namespace: kube-system
  26. labels:
  27. app: virtual-node-controller
  28. spec:
  29. replicas: 1
  30. selector:
  31. matchLabels:
  32. app: virtual-node-controller
  33. template:
  34. metadata:
  35. labels:
  36. app: virtual-node-controller
  37. spec:
  38. serviceAccount: virtual-node-sa
  39. containers:
  40. - name: alicloud-virtual-kubelet
  41. image: registry.cn-hangzhou.aliyuncs.com/acs/virtual-nodes-eci:v1.0.0.1-aliyun
  42. imagePullPolicy: Always
  43. args: ["--provider", "alibabacloud"]
  44. env:
  45. - name: KUBELET_PORT
  46. value: "10250"
  47. - name: VKUBELET_POD_IP
  48. valueFrom:
  49. fieldRef:
  50. fieldPath: status.podIP
  51. - name: VKUBELET_TAINT_KEY
  52. value: "virtual-kubelet.io/provider"
  53. - name: VKUBELET_TAINT_VALUE
  54. value: "alibabacloud"
  55. - name: VKUBELET_TAINT_EFFECT
  56. value: "NoSchedule"
  57. - name: ECI_REGION
  58. value: ${aliyun_region_name}
  59. - name: ECI_VPC
  60. value: ${aliyun_vpc_id}
  61. - name: ECI_VSWITCH
  62. value: ${aliyun_vswitch_id}
  63. - name: ECI_SECURITY_GROUP
  64. value: ${aliyun_sg_id}
  65. - name: ECI_ACCESS_KEY
  66. value: ${aliyun_access_key}
  67. - name: ECI_SECRET_KEY
  68. value: ${aliyun_secret_key}
  69. - name: ALIYUN_CLUSTERID
  70. value: ${custom_define_cluster_id}

根据之前准备的信息,替换yaml文件中的

  • aliyun_region_name
  • aliyun_vpc_id
  • aliyun_vswitch_id
  • aliyun_sg_id
  • aliyun_access_key
  • aliyun_secret_key

最后,需要给你的集群设置集群ID,替换custom_define_cluster_id

执行部署

  1. # 部署前,集群Node节点信息
  2. [root@k8s-master01 ~]#
  3. [root@k8s-master01 ~]# kubectl get node -o wide
  4. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  5. k8s-master01 Ready <none> 50d v1.14.2 192.168.0.15 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  6. k8s-master02 Ready <none> 50d v1.14.2 192.168.0.16 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  7. k8s-master03 Ready <none> 50d v1.14.2 192.168.0.17 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  8. # 部署
  9. [root@k8s-master01 ~]# kubectl apply -f deployment-vk.yaml
  10. serviceaccount/virtual-node-sa created
  11. clusterrolebinding.rbac.authorization.k8s.io/virtual-node-role-binding created
  12. deployment.apps/virtual-node-controller created
  13. # 查看部署情况
  14. [root@k8s-master01 ~]# kubectl get deploy/virtual-node-controller -n kube-system
  15. NAME READY UP-TO-DATE AVAILABLE AGE
  16. virtual-node-controller 1/1 1 1 161m
  17. # 获取集群Node列表
  18. [root@k8s-master01 ~]# kubectl get node -o wide
  19. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  20. k8s-master01 Ready <none> 50d v1.14.2 192.168.0.15 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  21. k8s-master02 Ready <none> 50d v1.14.2 192.168.0.16 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  22. k8s-master03 Ready <none> 50d v1.14.2 192.168.0.17 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://18.9.6
  23. virtual-kubelet Ready agent 82m v1.11.2 172.30.176.3 <none> <unknown> <unknown> <unknown>

验证

1.指定节点创建pod

  1. $ cat test-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test-pod
  6. spec:
  7. containers:
  8. - name: centos
  9. image: centos:latest
  10. args:
  11. - /bin/sh
  12. - -c
  13. - date; sleep 6000h
  14. nodeName: virtual-kubelet
  15. # 创建Pod
  16. [root@k8s-master01 ~]# kubectl create -f test-pod.yaml
  17. pod/test-pod created

2.检查Pod创建情况

  1. [root@k8s-master01 ~]# kubectl get pod/test-pod -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. test-pod 1/1 Running 0 95s 192.168.6.165 virtual-kubelet <none> <none>
  4. # virtual-kubelet会为运行在VK节点的Pod添加Annotation
  5. [root@k8s-master01 ~]# kubectl get pod -o yaml test-pod
  6. apiVersion: v1
  7. kind: Pod
  8. metadata:
  9. annotations:
  10. ProviderCreate: done
  11. k8s.aliyun.com/eci-instance-id: eci-2zeaak7c7i6xb5uqnw4m

3.通过ECI控制台查看

create_cg