Skip to content

kind使用

Kind

img

目录

[toc]

前言

Kind 是 Kubernetes in Docker的简写,是一个使用 Docker 容器作为 Node 节点,在本地创建和运行Kubernetes 集群的工具。适用于在本机创建 Kubernetes 集群环境进行开发和测试。使用 Kind 搭建的集群无法在生产中使用,但是如果你只是想在本地简单的玩玩 K8s,不想占用太多的资源,那么使用 Kind 是你不错的选择。

Kind 内部也是使用 Kubeadm 创建和启动集群节点,并使用 Containerd 作为容器运行时,所以弃用 dockershim对 Kind 没有什么影响。

Kind 的架构图如下所示,它将 Docker 容器作为 Kubernetes 的 Node 节点,并在该 Node 中安装 Kubernetes组件,包括一个或者多个 Control Plane 和一个或者多个 Work Nodes。这就解决了在本机运行多个 Node 的问题,而不需要虚拟化

img

官方网站

https:kindcreatesandmanageslocalKubernetesclustersusingDockercontainer'nodes'Usage:kind[command]AvailableCommands:buildBuildoneof[node-image]completionOutputshellcompletioncodeforthespecifiedshell(bash,zshorfish)createCreatesoneof[cluster]deleteDeletesoneof[cluster]exportExports one of [kubeconfig,logs]getGetsoneof[clusters,nodes,kubeconfig]helpHelpaboutanycommandloadLoadsimagesintonodesversionPrintsthekindCLIversionFlags:-h,--helphelpforkind--loglevelstringDEPRECATED:see-vinstead-q,--quietsilenceallstderroutput-v,--verbosityint32infologverbosity,highervalueproducesmoreoutput--versionversionforkindUse"kind [command] --help"formoreinformationaboutacommand.

从上面的命令可以看出 kind 工具包含很多可用的命令,比如 build 、create、 delete、load 等等。

其中最重要的应该属于 create 命令了,该命令可以用来创建一个集群,用同样的方式我们可以继续查看 kind create 命令的使用方法:

可以看出只有一个 cluster 子命令可用,但是该子命令后面如何操作呢?

创建集群

可以看到 create cluster 后面没有可用的子命令了,但是有一些 Flags 标志可以传递,但其实不传递任何的参数也可以创建一个 K8s 集群,这属于最简单创建 K8s 的方式,只需要执行如下所示的命令即可创建一个默认的集群(目前最新版本只支持到 K8s v1.25.3 版本):

bash
[root@docker ~]#kind create clusterCreatingcluster"kind"...Ensuringnodeimage(kindest/node:v1.25.3) 🖼 Preparingnodes📦Writingconfiguration📜Startingcontrol-plane🕹️InstallingCNI🔌InstallingStorageClass💾Setkubectlcontextto"kind-kind"Youcannowuseyourclusterwith:kubectlcluster-info--contextkind-kindNotsurewhattodonext?😅Checkouthttps:NAMESTATUSROLESAGEVERSIONkind-control-planeReadycontrol-plane56sv1.25.3[root@docker ~]#kubectl get po -ANAMESPACENAMEREADYSTATUSRESTARTSAGEkube-systemcoredns-565d847f94-k2db51/1Running042skube-systemcoredns-565d847f94-v4vhc1/1Running042skube-systemetcd-kind-control-plane1/1Running056skube-systemkindnet-6599x1/1Running042skube-systemkube-apiserver-kind-control-plane1/1Running056skube-systemkube-controller-manager-kind-control-plane1/1Running056skube-systemkube-proxy-gpf4b1/1Running042skube-systemkube-scheduler-kind-control-plane1/1Running056slocal-path-storagelocal-path-provisioner-684f458cdd-wjlwr1/1Running042s#kind create cluster,kind创建集群的时候从,他会自动去配置kubeconfig文件,所以可直接使用kubectl管理kind创建的集群。#kindnet是kind安装k8s集群是已经默认配置好的cni插件;

创建集群并指定集群名称

默认的集群名称为 kind,在创建的时候我们可以使用参数 --name 指定创建的集群名称,可以创建多个群集:

bash
[root@docker ~]#kind create cluster --name kind-2Creatingcluster"kind-2"...Ensuringnodeimage(kindest/node:v1.25.3) 🖼Preparingnodes📦Writingconfiguration📜Startingcontrol-plane🕹️InstallingCNI🔌InstallingStorageClass💾Setkubectlcontextto"kind-kind-2"Youcannowuseyourclusterwith:kubectlcluster-info--contextkind-kind-2Notsurewhattodonext?😅Checkouthttps:Creatingcluster"kind-3"...Ensuringnodeimage(kindest/node:v1.23.4) 🖼 Preparingnodes📦Writingconfiguration📜Startingcontrol-plane🕹️InstallingCNI🔌InstallingStorageClass💾Setkubectlcontextto"kind-kind-3"Youcannowuseyourclusterwith:kubectlcluster-info--contextkind-kind-3Thanksforusingkind!😊[root@docker ~]#kubectl get nodeNAMESTATUSROLESAGEVERSIONkind-3-control-planeReadycontrol-plane,master4m49sv1.23.4

获取集群列表

然后可以使用 kind get clusters 命令来获取集群列表:

bash
[root@docker ~]#kind get clusterskindkind-2

切换集群

当有多个集群的时候,我们可以使用 kubectl 来切换要管理的集群:

bash
# 切换到集群 `kind`[root@docker ~]#kubectl config use-context kind-kindSwitchedtocontext"kind-kind".# 切换到集群 `kind-2`[root@docker ~]#kubectl config use-context kind-kind-2Switchedtocontext"kind-kind-2".

删除集群

要删除集群也非常简单,比如要删除 kind-2 集群:

bash
[root@docker ~]#kind delete cluster --name kind-2Deletingcluster"kind-2"...

将本机镜像导入到 Kind 集群

Kind 集群中的 Docker 镜像可以从互联网直接拉取,有时候可能比较缓慢,我们可以将本机镜像导入到 Kind 集群中去,比如使用如下命令可以将镜像导入到 kind-control-plane 节点去:

案例:导入本地镜像到kind的k8s集群里的所有节点上(常用)

bash
#或者导入本地镜像到所有节点上!#kind get clusters kindloaddocker-imagek8s.gcr.io/ingress-nginx/controller:v1.2.0--namedevopscluster#或者导入本地镜像到某个节点上!kindloaddocker-imagenginx:mainline-alpine--nodeskind-control-plane

测试过程:

bash
#测试过程:1、宿主机拉取测试镜像[root@docker ~]#docker imagesREPOSITORYTAGIMAGEIDCREATEDSIZEkindest/node<none>d8644f660df05weeksago898MBkindest/nodev1.23.46b76f7b7813a9monthsago1.47GB[root@docker ~]#docker pull nginx:mainline-alpinemainline-alpine:Pullingfromlibrary/nginx59bf1c3509f3:Pullcompletef3322597df46:Pullcompleted09cf91cabdc:Pullcomplete3a97535ac2ef:Pullcomplete919ade35f869:Pullcomplete40e5d2fe5bcd:PullcompleteDigest:sha256:eb05700fe7baa6890b74278e39b66b2ed1326831f9ec3ed4bdc6361a4ac2f333Status:Downloadednewerimagefornginx:mainline-alpinedocker.io/library/nginx:mainline-alpine[root@docker ~]#docker imagesREPOSITORYTAGIMAGEIDCREATEDSIZEkindest/node<none>d8644f660df05weeksago898MBkindest/nodev1.23.46b76f7b7813a9monthsago1.47GBnginxmainline-alpinecc44224bfe2011monthsago23.5MB2、进入到kind节点(容器)[root@docker ~]#kubectl get nodeNAMESTATUSROLESAGEVERSIONkind-control-planeReadycontrol-plane26mv1.25.3[root@docker ~]#docker psCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES24c2e3b39d3bkindest/node:v1.25.3"/usr/local/bin/entr…"27minutesagoUp26minutes127.0.0.1:46202->6443/tcpkind-control-plane[root@docker ~]#docker exec -it kind-control-plane /bin/sh# ctr -n k8s.io i ls -qdocker.io/kindest/kindnetd:v20221004-44d545d1docker.io/kindest/local-path-helper:v20220607-9a4d8d2adocker.io/kindest/local-path-provisioner:v0.0.22-kind.0import-2022-10-25@sha256:0dae4b69c2aa90e6c24691ebbe2e860e2a1ae68463a622c627fb58110153d950import-2022-10-25@sha256:1c35781a4b6011d5c27bedbba7ca130db72c4aaf74d108c60bc77ae49130e5e4import-2022-10-25@sha256:4002c19dafb94b1995fc598fae590f70cac10135f61ca2551bd97aae37ed9c4aimport-2022-10-25@sha256:409b0e81d9aecf59df96df445a3171f43e2ae834ef6c9e77b1492c4d19bfd78dregistry.k8s.io/coredns/coredns:v1.9.3registry.k8s.io/etcd:3.5.4-0registry.k8s.io/kube-apiserver:v1.25.3registry.k8s.io/kube-controller-manager:v1.25.3registry.k8s.io/kube-proxy:v1.25.3registry.k8s.io/kube-scheduler:v1.25.3registry.k8s.io/pause:3.7sha256:221177c6082a88ea4f6240ab2450d540955ac6f4d5454f0e15751b653ebda165sha256:4bc1b1e750e34e3fbb542febefe990232575c949ccc07836125e23f3b1881a56sha256:4c1e997385b8fb4ad4d1d3c7e5af7ff3f882e94d07cf5b78de9e889bc60830e6sha256:5185b96f0becf59032b8e3646e99f84d9655dff3ac9e2605e0dc77f9c441ae4asha256:5225724a11400a83db6efe486e37aeaec871f0e15b19e82c9160b7c3de880875sha256:580dca99efc3bb79350e610acca6242f13442633087f3187f7264adbddfbda07sha256:86063cd68dfc91a931a6e095a0f796643990ce18d7edf0bbc3385c85bc95c1absha256:a8a176a5d5d698f9409dc246f81fa69d37d4a2f4132ba5e62e72a78476b27f66sha256:d2f902e939cc38784e56ec30c102ef01a019e13a3b31d4c23332ffdd0244a632sha256:d6e3e26021b60c625f0ef5b2dd3f9e22d2d398e05bccc4fdd7d59fbbb6a04d3f# ctr -n k8s.io i ls -q|grep nginx#3、导入镜像[root@docker ~]# kind load docker-image --nodes kind-control-plane nginx:mainline-alpineImage:""withID"sha256:cc44224bfe208a46fbc45471e8f9416f66b75d6307573e29634e7f42e27a9268"notyetpresentonnode"kind-control-plane",loading...4、验证# ctr -n k8s.io i ls -q|grep nginxdocker.io/library/nginx:mainline-alpine

3、配置集群

配置3节点集群

上面我们介绍的是 kind 命令的一些常用操作,此外我们还可以通过一个文件来配置要创建的 K8s 集群,比如定义一个如下所示的 config.yaml 文件:

[root@docker ~]#vim config.yaml

yaml
# config.yamlkind:ClusterapiVersion:kind.x-k8s.io/v1alpha4name:demonodes:- role:control-plane- role:worker- role:worker

该配置文件表示我们一共要创建 3 个节点,一个控制节点,两个工作节点,在创建集群的时候只需要通过 --config 参数指定该文件即可:

bash
[root@docker ~]#kind create cluster --config config.yamlCreatingcluster"demo"...Ensuringnodeimage(kindest/node:v1.25.3) 🖼Preparingnodes📦📦📦Writingconfiguration📜Startingcontrol-plane🕹️InstallingCNI🔌InstallingStorageClass💾Joiningworkernodes🚜Setkubectlcontextto"kind-demo"Youcannowuseyourclusterwith:kubectlcluster-info--contextkind-demoNotsurewhattodonext?😅Checkouthttps:NAMESTATUSROLESAGEVERSIONdemo-control-planeReadycontrol-plane74sv1.25.3demo-workerReady<none>34sv1.25.3demo-worker2Ready<none>34sv1.25.3[root@docker ~]#kubectl get po -ANAMESPACENAMEREADYSTATUSRESTARTSAGEkube-systemcoredns-565d847f94-8snf41/1Running062skube-systemcoredns-565d847f94-dwdn61/1Running062skube-systemetcd-demo-control-plane1/1Running076skube-systemkindnet-jjj7l1/1Running063skube-systemkindnet-l69rg1/1Running037skube-systemkindnet-sljw71/1Running034skube-systemkube-apiserver-demo-control-plane1/1Running074skube-systemkube-controller-manager-demo-control-plane1/1Running077skube-systemkube-proxy-2rlsr1/1Running063skube-systemkube-proxy-s8cmz1/1Running034skube-systemkube-proxy-sdskq1/1Running037skube-systemkube-scheduler-demo-control-plane1/1Running074slocal-path-storagelocal-path-provisioner-684f458cdd-x97z81/1Running062s

创建一个 HA 模式的控制平面的k8s集群

如果想创建一个 HA 模式的控制平面,那么我们可以定义如下所示的配置文件,只需要指定 3 个(奇数个) control-plane 角色的节点即可:

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane- role:control-plane- role:control-plane- role:worker- role:worker- role:worker# 注意:这里是的HA是用ha-proxy来实现的。

还可以将 Node 的端口映射到宿主机

此外我们还可以将 Node 的端口映射到宿主机,通过配置文件中的 extraPortMappings 属性可以实现该功能,如下所示配置可以将 control-plane 节点 80 端口映射到宿主机的 80 端口上:

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-planeextraPortMappings:- containerPort:80hostPort:80listenAddress:"0.0.0.0"# Optional,defaults to "0.0.0.0"protocol:udp# Optional,defaults to tcp

img

如果要将端口映射与 NodePort 一起使用,kind 节点的 containerPort 和 Service 的 nodePort 需要相等。

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-planeextraPortMappings:- containerPort:30950hostPort:80

img

然后将 nodePort 设置为 30950。

yaml
kind:PodapiVersion:v1metadata:name:foolabels:app:foospec:containers:- name:fooimage:hashicorp/http-echo:0.2.3args:- "-text=foo"ports:- containerPort:5678""+apiVersion:v1kind:Servicemetadata:name:foospec:type:NodePortports:- name:httpnodePort:30950port:5678selector:app:foo

imgimg

指定k8s镜像

同样我们也可以在配置文件中指定 Node 的容器镜像版本运行指定版本的 Kubernetes 群集。可以在官方 release 页面中中查找需要镜像 tag,带上 sha256 shasum(非必须),例如:

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-planeimage:kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4- role:workerimage:kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4

img

此外还有一些其他定制操作,比如 Kind 创建的集群默认自带一个轻量级的 CNI 插件 kindnetd ,我们也可以禁用默认设置来安装其他 CNI,比如 Calico。

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4networking:# the default CNI will not be installeddisableDefaultCNI:true

img

还可以在 iptables 和 ipvs 之间配置将要使用的 kube-proxy 模式,默认情况下使用 iptables :

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4networking:kubeProxyMode:"ipvs"

img

另外我们可以讲宿主机的路径挂载到某个节点上用于数据持久化等。

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane# add a mount from /path/to/my/files on the host to /files on the nodeextraMounts:- hostPath:/path/to/my/filescontainerPath:/files

img

我们还可以给节点定制不同的标签,这对于节点筛选非常有用,只需要在节点中添加 labels 配置即可。

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane- role:workerextraPortMappings:- containerPort:30950hostPort:80labels:tier:frontend- role:workerlabels:tier:backend

img

Kind 使用 Kubeadm 来配置的集群节点,他会在第一个控制平面节点上运行 kubeadm init 命令,我们可以使用kubeadm InitConfiguration 来进行一些定制。

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-planekubeadmConfigPatches:- |kind:InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels:"my-label=true"

img

如果你想进行更多的定制,那么在 kubeadm init 期间有四种配置类型可用:InitConfiguration 、ClusterConfiguration 、 KubeProxyConfiguration、 KubeletConfiguration。例如,我们可以使用kubeadm ClusterConfiguration 来覆盖 apiserver 标志:

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-planekubeadmConfigPatches:- |kind:ClusterConfigurationapiServer:extraArgs:enable-admission-plugins:NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

img

在 Kind 集群中的 worker 或控制平面(在 HA 模式下)节点上,Kind 会执行 kubeadm join 命令,我们也可以使用JoinConfiguration (spec) 来进行定制:

yaml
kind:ClusterapiVersion:kind.x-k8s.io/v1alpha4nodes:- role:control-plane- role:worker- role:workerkubeadmConfigPatches:- |kind:JoinConfigurationnodeRegistration:kubeletExtraArgs:node-labels:"my-label2=true"- role:control-planekubeadmConfigPatches:- |kind:JoinConfigurationnodeRegistration:kubeletExtraArgs:node-labels:"my-label3=true"

img

此外 Kind 还有很多其他的实践方式,在后续课程中我们也会慢慢接触到。

FAQ

  • Kind 搭建的集群会自动提供一个 local-path-provisioner组件,该组件会自动生成 PV。
bash
[root@docker ~]#kubectl get nodeNAMESTATUSROLESAGEVERSIONdemo-control-planeReadycontrol-plane12dv1.25.3demo-workerReady<none>12dv1.25.3demo-worker2Ready<none>12dv1.25.3[root@docker ~]#kind get clustersdemokind[root@docker ~]#kubectl get scNAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGEstandard(default) rancher.io/local-path Delete WaitForFirstConsumer false 12d[root@docker ~]#kubectl get po -nlocal-path-storageNAMEREADYSTATUSRESTARTSAGElocal-path-provisioner-684f458cdd-x97z81/1Running012d

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

img

🍀 微信公众号

《云原生架构师实战》

img

🍀 语雀

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新