1. 背景:
-
Virtual Kubelet 是什么?
Virtual Kubelet 是 Kubernetes kubelet 的一种实现,它伪装成 kubelet,目的是将 Kubernetes 集群连接到其他 API,这些API的入口被成为Provider。 这就使得 Kubernetes 的Node能够得到其他CaaS平台的支持,例如无服务器容器平台。
-
Virtual Kubelet 不是什么?
不是用来实现集群联邦的手段。它是用来扩展Node 属性到一个容器平台上。
2. Virtual kubelet 工作原理
目前的社区的virtual kubelet 不具备任何生产能力,但是提供了一个library,可以给各家公有云厂商,用来构建自己的virtual kubelet 版本。virtual kubelet 的代码总体比较简单,没太必要详解了。
- virtual kubelet 在启动的时候,会马上创建一个Node 出来
- node 背后的provider 提供接口查询相关node 信息
- 它会同时watch node 和 pod 的事件,也就是要有两个控制器,用于更新node 的信息
- 针对分配到该节点上的pod,增加消息处理
- 消息处理的过程,是把消息放在另一个队列里
- provider的worker 去处理,这里会作深度拷贝
- 处理完以后,更新pod 的status
3. Virtual kubelet 演示
- 从源码构建:
mkdir -p ${GOPATH}/src/github.com/virtual-kubelet
cd ${GOPATH}/src/github.com/virtual-kubelet
git clone https://github.com/virtual-kubelet/virtual-kubelet
cd virtual-kubelet && make build
- 在项目的根目录,启动这个virtual kubelet.
- 修改下vkubelet-mock-0-cfg.jso,把cpu 的数量改成30,这样你就可以随便创建pod了(当然都是mock的)
./bin/virtual-kubelet --nodename vkubelet-mock-0 --provider mock --provider-config ./hack/skaffold/virtual-kubelet/vkubelet-mock-0-cfg.json --startup-timeout 10s
- check
kubectl get node
NAME STATUS ROLES AGE VERSION
vkubelet-mock-0 Ready agent 5h10m v1.15.2-vk-v1.5.0-29-g68347d4e
worker-cluster4-1 Ready control-plane,master 41d v1.21.1
worker-cluster4-2 Ready <none> 41d v1.21.1
worker-cluster4-3 Ready <none> 41d v1.21.1
- 创建一个demo
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: xlm
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: vkubelet-mock-0
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "mock"
effect: "NoSchedule"
- check
[root@worker-cluster4-1 lmxia]# kubectl get po -n xlm
NAME READY STATUS RESTARTS AGE
nginx-deployment-6999766b55-8b54p 1/1 Running 0 5h12m
nginx-deployment-6999766b55-bkdzl 1/1 Running 0 5h12m
nginx-deployment-6999766b55-n2nmv 1/1 Running 0 5h12m
4. 结论
- virtual kubelet 无法支持 downward API,所以如果用pod 直接透传的话,目前看是无法支持istio的。
- 与admiralty 的关系,admiralty 只是借鉴了virtual kubelet 的node 管理的功能。
- 普通集群无法直接使用virtual kubelet 也没人这么做,如果这么做的话,最终会演化成admiralty。
virltual kubelet 被设计用来,扩展类似AWS fargate,阿里的ECI,Azure的ACI,目前腾讯的EKSCI还不支持 virtual kubelet。
目前针对客户的kubernetes集群如果是用virtual kubelet 管理,那么最终还是会变成admiralty的架构。