Kind(kubernetes in docker的缩写), 用于快速地在本地部署kubernetes集群,顾名思义,就是将 Kubernetes
所需要的所有组件,全部部署在一个 Docker
容器中,可以很方便的搭建 Kubernetes
集群。
Kind
已经广泛的应用于 Kubernetes
上游及相关项目的 CI
环境中
优势
- 最小的安装依赖,仅需要安装
Docker
即可 - 使用方法简单,只需
Kind Cli
工具即可快速创建集群 - 使用容器来模似
Kubernetes
节点 - 内部使用
Kubeadm
的官方主流部署工具
架构
Kind
使用容器来模拟每一个 Kubernetes
节点,并在容器里面运行 Systemd
。 容器里的 Systemd
托管了 Kubelet
和 Containerd
,然后容器内部的 Kubelet
把其它 Kubernetes
组件:Kube-Apiserver
、Etcd
、CNI
等等组件运行起来。
Kind内部使用了
Kubeadm这个工具来做集群的部署,包括高可用集群也是借助
Kubeadm提供的特性来完成的。在高用集群下还会额外部署了一个
Nginx来提供VIP
这是官方一张图, 可以很形象的说明上面的观点.
使用
Kind安装
kind是以golang开发的,因此直接下载对应平台的二进制包即可,我是mac,因此直接brew安装即可
1 | $ brew install kind |
可以来看一下kind支持的参数
1 | $ kind -h |
单节点
搭建单节点集群是 Kind
最基础的功能,当然使用起来也很简单,仅需一条指令即可完成。
1 | $ kind create cluster --name my-cluster --image kindest/node:v1.15.3 |
以上命令中 --name
是可选参数。如果不指定,默认创建出来的集群名字为 kind
。
使用默认安装的方式时,我们没有指定任何配置文件。从安装过程的输出来看,一共分为 4 步:
- 检查本地环境是否存在一个基础的安装镜像,默认是
kindest/node:v1.15.3
,该镜像里面包含了所有需要安装的东西,包括:kubectl
、kubeadm
、kubelet
的二进制文件,以及安装对应版本Kubernetes
所需要的镜像。 - 准备
Kubernetes
节点,主要就是启动容器、解压镜像这类的操作。 - 建立对应的
kubeadm
的配置,完成之后就通过kubeadm
进行安装。安装完成后还会做一些清理操作,比如:删掉主节点上的污点,否则对于没有容忍的Pod
无法完成部署。 - 上面所有操作都完成后,就成功启动了一个
Kubernetes
集群并输出一些操作集群的提示信息。
默认情况下,Kind
会先下载 kindest/node:v1.15.3
镜像。如果你想指定不同版本,可以使用 --image
参数,类似这样:kind create cluster --image kindest/node:v1.15.3
kindest/node这个镜像目前托管于 Docker Hub 上,下载时可能会较慢。同样的问题
Kind 进行集群的创建也是存在的,
Kind实际使用
Kubeadm进行集群的创建。对
Kubeadm` 有所了解的同学都知道它默认使用的镜像在国内是不能访问的,所以一样需要自行解决网络问题。
可以来验证一下:
1 | export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")" |
从上面可以看出,对于使用kind部署一个单节点来说,单节点集群默认方式启动的节点类型是 control-plane
,该节点包含了所有的组件。这些组件分别是:2*Coredns
、Etcd
、Api-Server
、Controller-Manager
、Kube-Proxy
、Sheduler
和网络插件 Weave
单节点的只有一个Node容器,如果想部署多个节点呢?
多节点
多节点的集群可以使用配置文件来指定,Kind
在创建集群的时候,支持通过 --config
参数传递配置文件给 Kind
,配置文件可修改的内容主要有 role 和 节点使用的镜像
1 | $ vim my-cluster-multi-node.yaml |
可以发现这个配置文件的形式跟kubeadm的配置文件非常的类似, 更多的参数可以参考这里
验证
1 | kubectl get nodes |
高可用
高可用的集群跟多节点类似, 只不过control-plane
的角色需要至少需要3个Node
1 | $ vim my-cluster-ha.yaml |
验证
1 | $ kubectl get nodes |
删除集群
1 | $ kind delete cluster --name my-cluster |
从集群的部署来看, 使用kind部署出来的集群除了把容器当Node使用之外, 其它的差别并不大
Image
Kind中使用到了两种image, base image以及Node image
baseImage
baseimage主要是安装一些systemd,kubernetes需要的依赖,基于ubuntu.
NodeImage
Node
镜像的构建比较复杂,目前是通过运行 Base
镜像并在 Base
镜像内执行操作,再保存此容器内容为镜像的方式来构建的,包含的操作有:
- 构建
Kubernetes
相关资源,比如:二进制文件和镜像。 - 运行一个用于构建的容器
- 把构建的
Kubernetes
相关资源复制到容器里 - 调整部分组件配置参数,以支持在容器内运行
- 预先拉去运行环境需要的镜像
- 通过
docker commit
方式保存当前的构建容器为Node
镜像
最后再强调一下: kind部署出来的集群是不适用生产环境的,官方推荐只是用于需要一个k8s集群用于ci或者testing.