使用kind快速搭建本地k8s集群
Kind是什么?
k8s集群的组成比较复杂,如果纯手工部署的话易出错且时间成本高。而本文介绍的Kind工具,能够快速的建立起可用的k8s集群,降低初学者的学习门槛。
Kind是Kubernetes In Docker的缩写,顾名思义,看起来是把k8s放到docker的意思。没错,kind创建k8s集群的基本原理就是:提前准备好k8s节点的镜像,通过docker启动容器,来模拟k8s的节点,从而组成完整的k8s集群。需要注意,kind创建的集群仅可用于开发、学习、测试等,不能用于生产环境。
Github 地址:https://github.com/kubernetes-sigs/kind
kind 能在 1 分钟之内就启动一个非常轻量级的 k8s 集群。之所以如此之快,得益于其基于其把整个 k8s 集群用到的组件都封装在了 Docker 容器里,构建一个 k8s 集群就是启动一个 Docker 容器,如此简单,正如下面图片描述一样:
kind有什么特点?
创建、启动k8s集群非常快速,资源消耗较低。
支持创建多节点的k8s集群,包括高可用模式。
kind 支持 Linux, macOS and Windows
它是CNCF认证的k8s集群安装方式之一
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 vs Minikube
Kind 不是打包一个虚拟化镜像,而是直接将 K8S 组件运行在 Docker。
不需要运行 GuestOS 占用资源更低。
不基于虚拟化技术,可以在 VM 中使用。
文件更小,更利于移植。
支持多节点 K8S 集群和 HA
Kind 支持多角色的节点部署,你可以通过配置文件控制你需要几个 Master 节点,几个 Worker 节点,以更好的模拟生产中的实际环境。
如何安装kind?
kind表现上就是一个二进制程序,下载对应版本并增加执行权限即可:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64 chmod +x ./kind mv ./kind /usr/bin/kind kind version
使用 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新建k8s集群?
kubectl是与k8s交互的客户端命令工具,因此需要先安装此工具。
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl kubectl version --client
然后通过一行命令就能够快速的创建k8s集群:
[root@localhost ~]# kind create cluster --name myk8s-01
若出错,重启Docker。
至此已得到一个可用的k8s集群了:
[root@localhost ~]# kubectl get nodes
kind创建k8s集群的内幕
先查看多出来的docker镜像和容器:
[root@localhost ~]# docker images
[root@localhost ~]# docker ps
创建过程大概是:
先获取镜像kindest/node:v1.21.1,然后启动容器myk8s-01-control-plane,启动的容器就是这个k8s集群的master节点,显然此集群只有master节点。
同时,kind create cluster命令还是将此新建的k8s集群的连接信息写入当前用户(root)的kubectl配置文件中,从而让kubectl能够与集群交互。
[root@localhost ~]# cat .kube/config
配置文件内容如下:
[root@localhost ~]# cat .kube/config apiVersion: v1 clusters: - cluster: certificate-authority-data: xxxx server: https://127.0.0.1:42267 name: kind-myk8s-01 contexts: - context: cluster: kind-myk8s-01 user: kind-myk8s-01 name: kind-myk8s-01 current-context: kind-myk8s-01 kind: Config preferences: {} users: - name: kind-myk8s-01 user: client-certificate-data: xxxx client-key-data: xxxx
kind创建k8s集群的架构图为:
kind 配置
我们可以对要创建的集群进行一些定制化配置,kind 支持的配置见这里:https://kind.sigs.k8s.io/docs/user/configuration/
配置方法:
参照文档,编写配置 kind 配置文件 config.yaml,然后在 kind 创建集群的时候指定配置文件:
kind create cluster --config=/foo/bar/config.yaml
举例:
默认 kind 创建出来的集群 apiserver 监听的地址是:127.0.0.1:[随机端口],我要改成默认监听的地址是:0.0.0.0:6443,编写如下 config.yaml
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: # WARNING: It is _strongly_ recommended that you keep this the default # (127.0.0.1) for security reasons. However it is possible to change this. apiServerAddress: "0.0.0.0" # By default the API server listens on a random open port. # You may choose a specific port but probably don't need to in most cases. # Using a random port makes it easier to spin up multiple clusters. apiServerPort: 6443
创建集群时指定上面配置文件:
kind create cluster --config=config.yaml
kind程序的完整用法
- kind create cluster
- –image 指定node镜像名称,默认是kindest/node
- –name 指定创建集群的名称
- –config kind-example-config.yaml
- –kubeconfig string 指定生成的kubeconfig的文件路径。默认在$KUBECONFIG or $HOME/.kube/config
- 常用:kind create cluster --config=xxxcfg --name=xxxname
- kind delete cluster xxxx
- kind get clusters:查看kind创建所有的k8s集群
- kind get kubeconfig --name 集群name【必须填写–name参数,默认name是kind】
- kind completion
- kind export kubeconfig --name=xxx --kubeconfig=kubeconfigpath 导出kind中的k8s集群的kubeconfig连接配置文件
kind的高级用法
1、通过配置文件创建k8s集群
前面展示的集群创建操作是最简单的单master集群,kind当然可以创建更完整的集群。这就需要用到配置文件模式来创建集群:
[root@localhost ~]# cat kindcfg-tccc.biz.yml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker - role: worker [root@localhost ~]# kind create cluster --name myk8s-02 --config ./kindcfg-tccc.biz.yml
2、设置新建的k8s集群从私有http仓库加载镜像
配置文件如下:
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.xxxx.top:60666"] endpoint = ["http://harbor.xxxx.top:60666"] nodes: - role: control-plane - role: worker
3、完整的配置文件示例
地址:https://raw.githubusercontent.com/kubernetes-sigs/kind/main/site/content/docs/user/kind-example-config.yaml
# this config file contains all config fields with comments # NOTE: this is not a particularly useful config file kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 # patch the generated kubeadm config with some extra settings kubeadmConfigPatches: - | apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: nodefs.available: "0%" # patch it further using a JSON 6902 patch kubeadmConfigPatchesJSON6902: - group: kubeadm.k8s.io version: v1beta2 kind: ClusterConfiguration patch: | - op: add path: /apiServer/certSANs/- value: my-hostname # 1 control plane node and 3 workers nodes: # the control plane node config - role: control-plane # the three workers - role: worker - role: worker - role: worker
实践创建多节点的集群
默认安装的集群只部署了一个控制节点,如果需要部署多节点集群,我们可以通过配置文件的方式来创建多个容器。这样就可以达到模拟多个节点目的,并以这些节点来构建一个多节点的 Kubernetes 集群。
创建多节点 Kubernetes 集群配置文件
Kind 在创建集群的时候,支持通过 --config 参数传递配置文件给 Kind,配置文件可修改的内容主要有 role 和 节点使用的镜像。
$ vim my-cluster-multi-node.yaml # 一共两个节点,一个主节点,一个从节点。 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker
创建多节点 Kubernetes 集群
配置文件创建完成后,就可以使用下面的命令来完成多节点 Kubernetes 集群搭建。
$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-node
和上面创建的单节点集群一样,我们同样根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。
$ kubectl get nodes
$ kubectl get po -n kube-system
创建高可用 Kubernetes 集群
Kind 也支持搭建高可用的 Kubernetes 集群,创建方式和多节点集群类似,也是通过配置文件来实现。
1. 创建高可用 Kubernetes 集群配置文件
$ vim my-cluster-ha.yaml # 一共六个节点,三个 control-plane 节点,三个 workers 节点 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 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
这里,我们通过直接在配置文件里使用国内容器镜像源的方式解决了官方容器镜像源不可用的问题,同时也达到了加速集群创建的目的。
2. 创建高可用 Kubernetes 集群
配置文件创建完成后,就可以使用下面的命令来完成高可用 Kubernetes 集群搭建。
$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yaml
同样,我们根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。
$ kubectl get nodes
从上面的输出结果,可以看到包含了多个 master 节点,说明高可用的 Kubernetes 集群已经搭建成功。
其它相关知识
Kind 的镜像里的秘密
Kind 镜像一共分为两类,一类是 Base 镜像,另一类是 Node 镜像。
1. Base 镜像
Base 镜像目前使用了 ubuntu:19.04 作为基础镜像,并做了下面的调整:
安装 Systemd 相关的包,并调整一些配置以适应在容器内运行。
安装 Kubernetes 运行时的依赖包,比如: Conntrack、Socat、CNI 等。
安装容器运行环境,比如: Containerd、Crictl 等。
配置自己的 ENTRYPOINT 脚本,以适应和调整容器内运行的问题。
更多具体的构建逻辑可以参考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile
2. Node 镜像
Node 镜像的构建比较复杂,目前是通过运行 Base 镜像并在 Base 镜像内执行操作,再保存此容器内容为镜像的方式来构建的,包含的操作有:
构建 Kubernetes 相关资源,比如:二进制文件和镜像。
运行一个用于构建的容器
把构建的 Kubernetes 相关资源复制到容器里
调整部分组件配置参数,以支持在容器内运行
预先拉去运行环境需要的镜像
通过 docker commit 方式保存当前的构建容器为 Node 镜像
如何快速删除一个集群
如果你不需要本地的集群环境,通过以下命令进行删除:
$ kind delete cluster --name my-cluster-multi-node
如何快速删除所有集群
$ kind delete clusters --all
总结
我们演示完了如何使用 Kind 快速搭建一个 Kubernetes 集群。不过有一个你需要注意的地方,Kind 搭建的集群不适用于生产环境中使用。但是如果你想在本地快速构建一个 Kubernetes 集群环境,并且不想占用太多的硬件资源,那么 Kind 会是你不错的选择。
kind是学习和测试k8s集群时非常有帮助的工具。它启动快速,资源消耗很低,并且它也是CNCF认证兼容的安装工具之一,大家可放心使用。
鸣谢
https://blog.csdn.net/easylife206/article/details/101091751
官方文档:https://kind.sigs.k8s.io/
GitHub主页:https://github.com/kubernetes-sigs/kind/
https://blog.csdn.net/pythonxxoo/article/details/123321193
https://blog.csdn.net/qianghaohao/article/details/108020937
本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16435276.html
欢迎各位大佬们评论指正
QQ讨论群:610129902