什么是 Kind
Kind
(Kubernetes in Docker) 是一个
Kubernetes
孵化项目,
Kind
是一套开箱即用的
Kubernetes
环境搭建方案。顾名思义,就是将
Kubernetes
所需要的所有组件,全部部署在一个
Docker
容器中,可以很方便的搭建
Kubernetes
集群。
Kind
已经广泛的应用于
Kubernetes
上游及相关项目的
CI
环境中,官方文档中也把
Kind
作为一种本地集群搭建的工具推荐给大家。
项目地址:https://github.com/kubernetes-sigs/kind
Kind 可以做什么?
- 快速创建一个或多个
集群Kubernetes
- 支持部署高可用的
集群Kubernetes
- 支持从源码构建并部署一个
集群Kubernetes
- 可以快速低成本体验一个最新的
集群,并支持Kubernetes
的绝大部分功能Kubernetes
- 支持本地离线运行一个多节点集群
Kind 有哪些优势?
- 最小的安装依赖,仅需要安装
即可Docker
- 使用方法简单,只需
工具即可快速创建集群Kind Cli
- 使用容器来模似
节点Kubernetes
- 内部使用
的官方主流部署工具Kubeadm
- 通过了
官方的CNCF
测试K8S Conformance
Kind 是如何工作的?

Kind
使用容器来模拟每一个
Kubernetes
节点,并在容器里面运行
Systemd
。 容器里的
Systemd
托管了
Kubelet
和
Containerd
,然后容器内部的
Kubelet
把其它
Kubernetes
组件:
Kube-Apiserver
、
Etcd
、
CNI
等等组件运行起来。
Kind
内部使用了
Kubeadm
这个工具来做集群的部署,包括高可用集群也是借助
Kubeadm
提供的特性来完成的。在高用集群下还会额外部署了一个
Nginx
来提供负载均衡
VIP
。
安装 Kind
安装 Kind 依赖组件
Kind
把部署
Kubernetes
环境的依赖降低到了最小,仅需要机器安装
Docker
即可。
- 安装 Docker
这里以
Linux
系统为例:
$ curl -sSL https://get.daocloud.io/docker | sh
复制
更多平台的安装方法可参考官方文档:https://docs.docker.com/install/
- 安装 Kubectl
如果你需要通过命令行管理集群,则需要安装
Kubectl
。
这里以
Linux
系统为例:
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
复制
更多平台的安装方法可参考官方文档:https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
安装 Kind
Kind
使用
Golang
进行开发,原生支持良好的跨平台特性,通常只需要直接下载构建好的二进制文件就可使用。
- 通过二进制安装
- Linux
$ curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-linux-amd64
$ chmod +x ./kind
$ mv ./kind /usr/local/bin/kind
复制
- Windows
$ curl.exe -Lo kind-windows-amd64.exe https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-windows-amd64
$ mv .\kind-windows-amd64.exe c:\kind.exe
复制
更多平台的安装方法可参考官方文档:https://kind.sigs.k8s.io/docs/user/quick-start/
- 通过源码安装
如果本地环境已经配置好 Golang (1.11+) 的开发环境,你也可以直接通过源码进行安装。
$ go get sigs.k8s.io/[email protected]
复制
运行完上述命令后,会将
Kind
的可执行文件放到
$GOPATH/bin
目录内。为了方便使用,你需要将此目录加入到
$PATH
中。
使用 Kind
安装完成之后,我们可以来看看
Kind
支持哪些命令行操作。
$ kind
kind creates and manages local Kubernetes clusters using Docker container 'nodes'
Usage:
kind [command]
Available Commands:
build Build one of [base-image, node-image]
create Creates one of [cluster]
delete Deletes one of [cluster]
export exports one of [logs]
get Gets one of [clusters, nodes, kubeconfig-path]
help Help about any command
load Loads images into nodes
version prints the kind CLI version
Flags:
-h, --help help for kind
--loglevel string logrus log level [panic, fatal, error, warning, info, debug] (default "warning")
--version version for kind
Use "kind [command] --help" for more information about a command.
复制
简单说下几个比较常用选项的含义:
-
:用来从build
源代码构建一个新的镜像。Kubernetes
-
:创建一个create
集群。Kubernetes
-
:删除一个delete
集群。Kubernetes
-
:可用来查看当前集群、节点信息以及get
配置文件的地址。Kubectl
-
:从宿主机向load
节点内导入镜像。Kubernetes
使用 Kind 创建 Kubernetes 集群
搭建一个单节点集群
搭建单节点集群是
Kind
最基础的功能,当然使用起来也很简单,仅需一条指令即可完成。
$ kind create cluster --name my-cluster
Creating cluster "my-cluster" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ?
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"
kubectl cluster-info
复制
以上命令中是可选参数。如果不指定,默认创建出来的集群名字为
--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
-
这个镜像目前托管于 Docker Hub 上,下载时可能会较慢。同样的问题kindest/node
进行集群的创建也是存在的,Kind
实际使用Kind
进行集群的创建。对Kubeadm
有所了解的同学都知道它默认使用的镜像在国内是不能访问的,所以一样需要自行解决网络问题。Kubeadm
- 如果你存在上面说的网络问题,最好配置一个国内的加速器或者镜像源。如果你还不知道如何配置加速器和镜像源可以参考:「Docker / Kubernetes 镜像源不可用,教你几招搞定它!」和 「 Docker 下使用 DaoCloud / 阿里云镜像加速」两篇文章。
接下来,我们根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。
# 获取指定集群的配置文件所在的路径
$ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"
$ kubectl cluster-info
Kubernetes master is running at https://localhost:34458
KubeDNS is running at https://localhost:34458/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-control-plane Ready master 2m v1.15.3
$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-6g66f 1/1 Running 0 21m
coredns-86c58d9df4-pqcc4 1/1 Running 0 21m
etcd-my-cluster-control-plane 1/1 Running 0 20m
kube-apiserver-my-cluster-control-plane 1/1 Running 0 20m
kube-controller-manager-my-cluster-control-plane 1/1 Running 0 20m
kube-proxy-cjgnt 1/1 Running 0 21m
kube-scheduler-my-cluster-control-plane 1/1 Running 0 21m
weave-net-ls2v8 2/2 Running 1 21m
复制
从上面的输出结果,可以看到单节点的
Kubernetes
已经搭建成功。单节点集群默认方式启动的节点类型是
control-plane
,该节点包含了所有的组件。这些组件分别是:
2*Coredns
、
Etcd
、
Api-Server
、
Controller-Manager
、
Kube-Proxy
、
Sheduler
和网络插件
Weave
,目前默认使用的网络插件也是
Weave
。
创建多节点的集群
默认安装的集群只部署了一个控制节点,如果需要部署多节点集群,我们可以通过配置文件的方式来创建多个容器。这样就可以达到模拟多个节点目的,并以这些节点来构建一个多节点的
Kubernetes
集群。
- 创建多节点 Kubernetes 集群配置文件
Kind
在创建集群的时候,支持通过
--config
参数传递配置文件给
Kind
,配置文件可修改的内容主要有 role 和 节点使用的镜像。
$ vim my-cluster-multi-node.yaml
# 一共两个节点,一个主节点,一个从节点。
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
复制
- 创建多节点 Kubernetes 集群
配置文件创建完成后,就可以使用下面的命令来完成多节点
Kubernetes
集群搭建。
$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-node
Creating cluster "my-cluster-multi-node" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ??
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
✓ Joining worker nodes ?
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-multi-node")"
kubectl cluster-info
复制
和上面创建的单节点集群一样,我们同样根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-multi-node-control-plane Ready master 3m20s v1.15.3
my-cluster-multi-node-worker Ready <none> 3m8s v1.15.3
$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-cnqhc 1/1 Running 0 5m29s
coredns-86c58d9df4-hn9mv 1/1 Running 0 5m29s
etcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24s
kube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17s
kube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21s
kube-proxy-8t4xt 1/1 Running 0 5m27s
kube-proxy-skd5v 1/1 Running 0 5m29s
kube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18s
weave-net-nmfq2 2/2 Running 1 5m27s
weave-net-srdfw 2/2 Running 0 5m29s
复制
创建高可用 Kubernetes 集群
Kind
也支持搭建高可用的
Kubernetes
集群,创建方式和多节点集群类似,也是通过配置文件来实现。
- 创建高可用 Kubernetes 集群配置文件
$ vim my-cluster-ha.yaml
# 一共六个节点,三个 control-plane 节点,三个 workers 节点
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
复制
这里,我们通过直接在配置文件里使用国内容器镜像源的方式解决了官方容器镜像源不可用的问题,同时也达到了加速集群创建的目的。
- 创建高可用 Kubernetes 集群
配置文件创建完成后,就可以使用下面的命令来完成高可用
Kubernetes
集群搭建。
$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yaml
Creating cluster "my-cluster-ha" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ???????
✓ Starting the external load balancer ⚖️
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
✓ Joining more control-plane nodes ?
✓ Joining worker nodes ?
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"
kubectl cluster-info
master $ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"
master $ kubectl cluster-info
Kubernetes master is running at https://localhost:44019
KubeDNS is running at https://localhost:44019/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
复制
同样,我们根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-ha-control-plane Ready master 3m42s v1.15.3
my-cluster-ha-control-plane2 Ready master 3m24s v1.15.3
my-cluster-ha-control-plane3 Ready master 2m13s v1.15.3
my-cluster-ha-worker Ready <none> 96s v1.15.3
my-cluster-ha-worker2 Ready <none> 98s v1.15.3
my-cluster-ha-worker3 Ready <none> 95s v1.15.3
复制
从上面的输出结果,可以看到包含了多个 master 节点,说明高可用的
Kubernetes
集群已经搭建成功。
其它相关知识
Kind 的镜像里的秘密
Kind
镜像一共分为两类,一类是
Base
镜像,另一类是
Node
镜像。
- Base 镜像
Base 镜像目前使用了
ubuntu:19.04
作为基础镜像,并做了下面的调整:
- 安装
相关的包,并调整一些配置以适应在容器内运行。Systemd
- 安装
运行时的依赖包,比如:Kubernetes
、Conntrack
、Socat
等。CNI
- 安装容器运行环境,比如:
、Containerd
等。Crictl
- 配置自己的
脚本,以适应和调整容器内运行的问题。ENTRYPOINT
更多具体的构建逻辑可以参考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile
- Node 镜像
Node
镜像的构建比较复杂,目前是通过运行
Base
镜像并在
Base
镜像内执行操作,再保存此容器内容为镜像的方式来构建的,包含的操作有:
- 构建
相关资源,比如:二进制文件和镜像。Kubernetes
- 运行一个用于构建的容器
- 把构建的
相关资源复制到容器里Kubernetes
- 调整部分组件配置参数,以支持在容器内运行
- 预先拉去运行环境需要的镜像
- 通过
方式保存当前的构建容器为docker commit
镜像Node
如何快速删除一个集群
如果你不需要本地的集群环境,通过以下命令进行删除:
$ kind delete cluster --name my-cluster
Deleting cluster "my-cluster" ...
$KUBECONFIG is still set to use /root/.kube/kind-config-my-cluster even though that file has been deleted, remember to unset it
复制
至此,我们就演示完了如何使用
Kind
快速搭建一个
Kubernetes
集群。不过有一个你需要注意的地方,
Kind
搭建的集群不适用于生产环境中使用。但是如果你想在本地快速构建一个
Kubernetes
集群环境,并且不想占用太多的硬件资源,那么
Kind
会是你不错的选择。
参考文档
- https://www.google.com
- http://t.cn/AiRVBwDS
- https://zhuanlan.zhihu.com/p/60464867
- https://yeya24.github.io/post/kind/
- http://dockerone.com/article/8974
- https://kind.sigs.k8s.io/docs/user/quick-start/
本文参与 腾讯云自媒体分享计划,欢迎热爱写作的你一起参与!
本文章分享自微信公众号
奇妙的Linux世界
作者:iMike
原始发表时间:2019-09-20
如有侵权,请联系 [email protected] 删除。