容器和 Serverless 的多样结合
随着容器和 Serverless 概念的普及, 阿里云容器服务团队和弹性计算团队合作推出了多个 Serverless 容器产品和解决方案, 包括 Serverless Kubernetes, 弹性容器实例 ECI,Serverless Addon 功能. 这些不同的产品为用户提供了丰富的无服务器容器应用场景支持.
Serverless Kubernetes
阿里云容器服务的 Serverless Kubernetes 已经公测一段时间, 用户无需管理服务器, 同时能够正常使用 kubernetes 各种 API 操作, 包括创建 pod,service,ingress,job 等. 无服务器的最大价值不仅是免去了服务器运维的负担, 更为应用提供了强大的弹性扩容能力, 弹性不再受限于集群的节点规模, 而且应用仅按资源使用量付费.
Kubernetes Serverless Addon
为了进一步优化容器服务的使用体验和提供更多场景的丰富支持, 我们推出了 Serverless Addon 功能, 为用户的 kubernetes 集群提供极致的弹性扩容的能力.
如上图所示, Serverless Addon 为经典 kubernetes 集群添加了虚拟节点, 集群中真实 worker 节点和虚拟节点同时存在, 通过虚拟节点动态创建 ECI 容器实例. ECI 的 pod 与真实节点上的 pod 互联互通, 都运行在同一个用户 vpc 网络中.
通过 Serverless Addon, 用户无需创建的新的集群, 在原有的 kubernetes 集群中就可以获得 "无限" 的弹性能力, 用户无需创建出很多真实 worker 节点就可以享受到 "无限" 的计算容量. Serverless Addon 可应用在大数据计算, 基因计算, 视频渲染等典型计算场景, 对于在线应用的短时间扩容同样适用.
通过 Serverless Addon, 我们给基于有限节点的 kubernetes 集群赋予了 "无限" 扩容的能力
我们如何使用 Serverless Add 呢? Serverless Addon 底层是基于 ECI 和 Virutal Kubelet 实现, 让我们先了解下背后的实现原理.
弹性容器实例 ECI 和 Virutal Kubelet
弹性容器实例 ECI
弹性容器实例是阿里云弹性计算团队最新推出的一款敏捷安全的 Serverless 容器运行时服务. 弹性容器实例具备如下特点:
无需管理基础设施即可运行容器
灵活按需使用, 按秒计费
借助安全沙箱技术确保应用安全
更多信息请参考产品页: https://www.aliyun.com/product/eci
与 Serverless Kubernetes 容器服务不同的是, ECI 不提供原生的 kubernetes API, 比如无法使用 kubectl 操作 pod/service/ingress/job 资源. 但通过 virtual kubelet 创新性的把 kubernetes 和 ECI 连接在了一起, 实现了通过 kubernetes API 可动态创建 ECI 实例.
Virtual Kubelet
Virtual Kubelet 最初是微软 Azure 发起的开源项目, 目标是让公有云的弹性容器实例类产品能与 kubernetes 更好的集成, 实现 kubernetes 的 serverless 能力. 在实现上 VK 提供了一种机制可以与多家不同的 provider 集成, 目前已支持 Azure 的 ACI,AWS 的 fargate, 华为的 CCI.VK 也被应用在 IoT Edge 场景. 近期我们也提交了 ECI 的 provider 并已被合并:
Virutal Kubelet 向 kubernetes APIServer 注册了一个虚拟节点, 持续监听 pod 变化事件, 并动态创建 ECI 实例.
Virutal Kubelet 通过虚拟节点的方式创新性的连接了 Kubernetes 与 ECI,Virutal Kubelet 和 ECI 是 Serverless Addon 的技术基础设施.
下面将介绍如何在阿里云容器服务中部署 Virtual Kubelet on ECI.
在托管 kubernetes 集群中部署 Virtual Kubelet on ECI
1. 开通 ECI
ECI 目前正在公测, 需要填写邀测申请开通服务: https://page.aliyun.com/form/act171611821/index.htm
2. 创建托管 Kubernetes 集群
进入容器服务控制台创建托管 Kubernetes 集群
https://cs.console.aliyun.com/#/k8s/cluster/create/managed
集群创建成功后, 可以在集群管理或节点页面查看 vswitchid,securitygroup 信息.
3. 使用 kubectl 一键部署 virtual kubelet 虚拟节点
请替换 alicloud-virtual-kubelet.YAML 文件中的 ECI_VSWITCH,ECI_SECURITY_GROUP,ECI_ACCESS_KEY,ECI_SECRET_KEY 环境变量
- # cat alicloud-virtual-kubelet.YAML
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: alicloud-virtual-kubelet
- namespace: kube-system
- ---
- apiVersion: rbac.authorization.k8s.io/v1beta1
- kind: ClusterRoleBinding
- metadata:
- name: alicloud-virtual-kubelet
- namespace: kube-system
- roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: cluster-admin
- subjects:
- - kind: ServiceAccount
- name: alicloud-virtual-kubelet
- namespace: kube-system
- ---
- apiVersion: apps/v1beta2
- kind: Deployment
- metadata:
- name: alicloud-virtual-kubelet
- namespace: kube-system
- labels:
- App: alicloud-virtual-kubelet
- spec:
- replicas: 1
- selector:
- matchLabels:
- App: alicloud-virtual-kubelet
- template:
- metadata:
- labels:
- App: alicloud-virtual-kubelet
- spec:
- serviceAccount: alicloud-virtual-kubelet
- containers:
- - name: alicloud-virtual-kubelet
- image: registry.cn-hangzhou.aliyuncs.com/ask/virtual-kubelet:latest
- imagePullPolicy: Always
- args: ["--provider", "alicloud"]
- 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: "alicloud"
- - name: VKUBELET_TAINT_EFFECT
- value: "NoSchedule"
- - name: ECI_REGION
- value: "cn-hangzhou"
- - name: ECI_VSWITCH
- value: "xxx"
- - name: ECI_SECURITY_GROUP
- value: "xxx"
- - name: ECI_ACCESS_KEY
- value: "xxx"
- - name: ECI_SECRET_KEY
- value: "xxx"
执行 YAML 文件, 然后查看 pod 和节点状态, 可以发现, 集群中已经添加了一个新的 virtual-kubelet 虚拟节点
- # kubectl apply -f ./alicloud-virtual-kubelet.YAML
- serviceaccount "alicloud-virtual-kubelet" created
- clusterrolebinding "alicloud-virtual-kubelet" created
- deployment "alicloud-virtual-kubelet" created
- # kubectl -n kube-system get pod|grep virtual-kubelet
- alicloud-virtual-kubelet-54b748489c-gkcmn 1/1 Running 0 53s
- # kubectl get node
- NAME STATUS ROLES AGE VERSION
- cn-hangzhou.i-bp19cyop0b1skne04djt Ready <none> 10m v1.11.2
- cn-hangzhou.i-bp19cyop0b1skne04dju Ready <none> 10m v1.11.2
- cn-hangzhou.i-bp19cyop0b1skne04djv Ready <none> 10m v1.11.2
- virtual-kubelet Ready agent 55s v1.11.2
通过控制台, 同样可以看到 virtual-kubelet 虚拟节点的存在.
4. 部署 Pod 到虚拟节点上
虚拟节点已经存在, 我们需要为即将运行的 pod 设置 nodeSelector 和 tolerations, 让 pod 调度到 virtual-kubelet 虚拟节点上.
- # cat nginx.YAML
- apiVersion: v1
- kind: Pod
- metadata:
- name: nginx
- spec:
- containers:
- - image: nginx
- imagePullPolicy: Always
- name: nginx
- nodeSelector:
- kubernetes.io/role: agent
- beta.kubernetes.io/os: Linux
- type: virtual-kubelet
- tolerations:
- - key: virtual-kubelet.io/provider
- operator: Exists
- - key: alibabacloud.com/eci
- effect: NoSchedule
- # kubectl get pod
- NAME READY STATUS RESTARTS AGE
- nginx 1/1 Running 0 1m
我们可以看到, nginx pod 被调度到虚拟节点中, 没有运行在集群中任何一个 worker 节点之上. 通过这种 virtual-kubelet 的方式, 实现了容器应用的无服务器化部署和弹性扩容, 用户无需再为集群的节点规格选择和容量规划而烦劳.
总结
通过上面的步骤, 我们可以快速部署 Virutal kubelet on ECI, 但上述配置过程还是略显繁琐, 用户需要配置 AK 和集群的 vswitch / 安全组信息, 未来我们将会在阿里云容器服务控制台支持一键部署 Serverless Addon 插件, 让用户免于 virtual-kubelet 配置的过程, 轻松让用户的集群拥有强大的弹性扩容能力. 请持续关注阿里云容器服务最新产品动态.
来源: https://yq.aliyun.com/articles/647119