涉足于 Kubernetes 之初时,必然少不了环境的搭建,你是否因为集群搭建步骤繁琐、个人电脑配置不高、运行集群多个节点有些力不从心。
VMware Fusion 12.0 发布,将 Kind 带入了我们的视野,这是 Google 官方的一个工具,是在单机运行 Kubernetes 群集的最佳方案。笔者在个人电脑上运行 Kind,并基于 Kind 搭建了多套 Kubernetes 集群环境,通过集群切换可以完成不同场景的测试,基本满足所有需求。
kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Nodes 节点,在本地创建和运行 Kubernetes 集群的工具。适用于在本机/单机环境下快速创建 Kubernetes 集群环境进行开发和测试。
优势如下:
包含以下组件:
kind 官方架构图如下,它将 docker 容器作为 kubernetes 的 “node”,并在该 “node” 中安装 kubernetes 组件,包括一个或者多个 Control Plane 和 一个或者多个 Work nodes。因此,解决了在本机运行多个 node 的问题,而不需要虚拟化。
Docker环境
安装 kubectl
kind 不需要 kubectl,但如果没有它,你将无法执行 kubernetes 的测试。
MacOS:
curl -Lo ./kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
Windows 中使用 PowerShel:
curl.exe -Lo kubectl.exe https://storage.googleapis.com/kubernetes-release/release/$(curl.exe -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/windows/amd64/kubectl.exe
Linux:
curl -Lo ./kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
安装 Kind
MacOS:
brew install kind
或者
# for Intel Macs
[ $(uname -m) = x86_64 ]&& curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-amd64
# for M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-arm64
chmod +x ./kind ./kubectl
Windows 中使用 PowerShel:
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.18.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
Linux:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
为创建不同配置的多套集群,建议通过定义不同集群配置文件,来完成集群的创建。
创建 kind 集群配置文件 cluster.conf
例如:
# cluster.conf
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
创建集群
kind create cluster --name <kind-name> --config=cluster.conf --image kindest/node:v1.21.14
参数说明:
开始使用
此时,kubernetes 已成功搭建,可完成所有 Kubernetes功能验证。
# 笔者是创建了一个单节点的K8S集群。K8S集群配置,可通过集群配置文件 cluster.conf 来完成不同集群需求。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
istio-control-plane Ready control-plane,master 10s v1.21.14
如果有多个集群,可通过以下命令快速切换:
kubectl config use-context <kind-name>
子命令 | 说明 |
---|---|
build base-image | 构建节点Base镜像 –image string 制作出的镜像name:tag,默认kindest/base:latest –source string 镜像源码路径,默认自动检测 |
build node-image | 构建节点镜像 –base-image 使用什么作为Base镜像 –image string 制作出的镜像name:tag,默认kindest/node:latest –kube-root string Kubernetes项目的源码目录路径,默认自动检测 –type string 构建方式,docker或bazel,默认docker |
completion bash | Bash自动完成 |
create cluster | 创建一个基于Docker容器“节点”的K8S集群 –image string 用于启动集群的节点镜像 –name string 集群上下文名称,默认kind –retain 如果集群创建失败,保留节点用于诊断 –wait duration 等待控制平面节点可用,默认0s –config path 指定配置文件 |
delete cluster | 删除一个集群 –name string 集群名称,默认kind |
export logs | 导出日志到指定目录,默认导出到临时目录: kind export logs ~/Downloads –name string 集群名称,默认kind |
get clusters | 列出已经创建的kind集群列表 |
get kubeconfig | 打印某个集群的Kubeconfig –name string 集群名称,默认kind |
get kubeconfig-path | 打印某个集群的Kubeconfig的默认路径 |
load docker-image | 从宿主机加载镜像到节点: kind load docker-image name:tag –name string 集群上下文名称,默认kind –nodes strings 目标节点列表,逗号分隔 |
load image-archive | 从归档文件加载镜像到节点:–name string 集群上下文名称,默认kind –nodes strings 目标节点列表,逗号分隔 |
为了满足不同需求,建议创建多个集群,方便不同场景的测试。
创建集群时,只需指定一个配置文件(kind create cluster --name <kind-name> --config=cluster.conf
),并通过 kubectl config use-context <kind-name>
完成集群的切换。
下面列举几个常用的集群配置。
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
可以将容器端口映射到宿主机端口,以支持NodePort类型的服务。
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
extraPortMappings:
- containerPort: 80
hostPort: 80
# 默认0.0.0.0
listenAddress: "0.0.0.0"
# 默认tcp
protocol: udp
可以通过设置 node 的容器镜像版本运行指定版本的 kubernetes 群集。可以在官方Release页面中中查找需要镜像 tag,带上 sha256 shasum(非必须),例如:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
- role: worker
image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
更多个性化配置,参考官网:Configuration
参考文章: