k8s--kind 搭建 k8s 集群

简介: k8s--kind 搭建 k8s 集群

介绍


Kind是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。它主要用于测试 Kubernetes 本身,但也可用于本地开发或CI。顾名思义,就是将 Kubernetes 所需要的所有组件,全部部署在一个 Docker 容器中,可以很方便的搭建 Kubernetes 集群。

将 docker 容器作为一个 kubernetes 的 "node",并在该 "node" 中安装 kubernetes 组件

Kind 使用一个 container 来模拟一个 node,在 container 里面跑了 systemd ,并用 systemd 托管了 kubelet 以及 containerd,然后容器内部的 kubelet 把其他 Kubernetes 组件,比如 kube-apiserver,etcd,cni 等组件跑起来。

可以通过配置文件的方式,来通过创建多个 container 的方式,来模拟创建多个 Node,并以这些 Node 来构建一个多节点的 Kubernetes 集群。

Kind 内部使用了 kubeadm 这个工具来做集群的部署,包括 ha master 的高可用集群,也是借助 kubeadm 提供的aplha特性提供的。同时,在 ha master 下,额外部署了一个 nginx 用来提供负载均衡 vip。

在使用 kind 搭建 k8s 集群时,需要先安装好 docker  和 go


安装 kind


安装 kind

// 安装 kind,这里安装的是 v0.17.0
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 的版本

[root@dce88 ~]# kind --version
kind version 0.17.0


使用 kind 创建集群


使用下面命令就可以创建一个 kind 集群

kind create cluster
[root@dce88 ~]# kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.24.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

上面我们已经安装好了 kind,接下来就可以使用 kind 搭建 k8s 集群了

解析安装过程

  • 检查本地环境是否存在一个基础的安装镜像,默认是 kindest/node:v1.24.0,该镜像里面包含了所有需要安装的东西,包括:kubectl、kubeadm、kubelet 的二进制文件,以及安装对应版本 kubernetes 所需要的镜像
  • 准备 kubernetes 节点,主要就是启动容器,解压镜像这类的操作
  • 建立对应的 kubeadm 的配置,完成之后就通过 kubeadm 进行安装。安装完成后还会做一些清理操作,比如:删除主节点上的污点,否则对于没有容忍的 pod 无法完成部署
  • 上面所有操作都完成后,就成功启动了一个 kubernetes 集群并输出一些操作集群的提示信息

默认情况下,kind 会先下载 kindest/node:v1.24.0 镜像。如果你想指定不同的版本,可以使用 --image 参数。类似于这样:kind create cluster --image=kindest/node:v1.21.1,kindest/node 这个镜像目前托管于 Docker Hub 上,下载时可能会比较慢,可以设置一个镜像加速器

安装完成之后执行 docker ps 查看下,可以看到新起了一个镜像

使用不同的 image 允许您更改创建的集群的 Kubernetes 版本


指定集群名称


默认情况下,集群将被命名为 name kind。使用该--name标志为集群分配不同的上下文名称

# 使用 --name 指定名称
[root@dce88 ~]# kind create cluster --name zouzou
Creating cluster "zouzou" ...
 ✓ Ensuring node image (kindest/node:v1.24.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-zouzou"
You can now use your cluster with:
kubectl cluster-info --context kind-zouzou
Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

默认情况下,如果未设置 $KUBECONFIG 环境变量,则集群访问配置存储在 ${HOME}/.kube/config 中


查看集群


要查看您创建的所有集群,您可以使用该kind get clusters 命令,上面我们已经创建了两个 kind 集群,执行命令看下输出

[root@dce88 ~]# kind get clusters
kind
zouzou


查看集群信息


查看集群我们需要进入到 docker 容器里面

# 查看 容器 id
[root@dce88 ~]# docker ps | grep kind
4793d90956bb   kindest/node:v1.24.0           "/usr/local/bin/entr…"   10 minutes ago   Up 10 minutes   127.0.0.1:45242->6443/tcp                                                                                                                 zouzou-control-plane
e50ae2c69984   kindest/node:v1.24.0           "/usr/local/bin/entr…"   15 minutes ago   Up 15 minutes   127.0.0.1:34334->6443/tcp                                                                                                                 kind-control-plane
# 进入到 docker 容器里面
[root@dce88 ~]# docker exec -it 4793d90956bb /bin/bash
# 查看节点,可以看到,是单节点的
root@zouzou-control-plane:/# kubectl get node
NAME                   STATUS   ROLES           AGE   VERSION
zouzou-control-plane   Ready    control-plane   10m   v1.24.0
# 查看 pod
root@zouzou-control-plane:/# kubectl get pod -n kube-system
NAME                                           READY   STATUS    RESTARTS   AGE
coredns-6d4b75cb6d-fth7d                       1/1     Running   0          10m
coredns-6d4b75cb6d-hcrfm                       1/1     Running   0          10m
etcd-zouzou-control-plane                      1/1     Running   0          10m
kindnet-frkjw                                  1/1     Running   0          10m
kube-apiserver-zouzou-control-plane            1/1     Running   0          10m
kube-controller-manager-zouzou-control-plane   1/1     Running   0          10m
kube-proxy-2wmdx                               1/1     Running   0          10m
kube-scheduler-zouzou-control-plane            1/1     Running   0          10m


切换集群


上面我们是进入到容器里面查看的集群信息,我们可以使用 kubectl 来切换集群,首先要保证你的集群上安装了 kubectl,安装教程:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/

安装完成之后确保输入 kubectl 控制台有输出

上面我们已经搭建好了两个集群

[root@dce88 ~]# kind get clusters
kind
zouzou

以使用如下命令分别切换到集群kindzouzou

# kubectl cluster-info --context kind-kind
# kubectl cluster-info --context kind-zouzou


删除集群


创建了一个集群使用kind create cluster那么删除同样简单,使用

# 删除集群,--name如果未指定标志,则 kind 将使用默认集群上下文名称kind并删除该集群
kind delete cluster

例如删除我们上面创建的集群,删除没有指定名称的

[root@dce88 ~]# docker ps | grep kind
4793d90956bb   kindest/node:v1.24.0           "/usr/local/bin/entr…"   14 minutes ago   Up 14 minutes   127.0.0.1:45242->6443/tcp      zouzou-control-plane
e50ae2c69984   kindest/node:v1.24.0           "/usr/local/bin/entr…"   19 minutes ago   Up 19 minutes   127.0.0.1:34334->6443/tcp      kind-control-plane
# 删除集群
[root@dce88 ~]# kind delete cluster
Deleting cluster "kind" ...
# 在查看,已经被删除了
[root@dce88 ~]# docker ps | grep kind
4793d90956bb   kindest/node:v1.24.0           "/usr/local/bin/entr…"   15 minutes ago   Up 15 minutes   127.0.0.1:45242->6443/tcp     zouzou-control-plane

删除指定名称的集群

[root@dce88 ~]# docker ps | grep kind
4793d90956bb   kindest/node:v1.24.0           "/usr/local/bin/entr…"   18 minutes ago   Up 18 minutes   127.0.0.1:45242->6443/tcp   zouzou-control-plane
# 删除名称为 zouzou 的集群
[root@dce88 ~]# kind delete cluster --name=zouzou
Deleting cluster "zouzou" ...
# 在查看已经没有了
[root@dce88 ~]# docker ps | grep kind


将 docker 镜像 load 到 kind 集群里


kind 提供了将 docker 镜像加载到集群每个 node 节点上的操作命令,加载镜像之后,集群的每个节点都会具备该镜像文件,就不需要再从 docker hub 仓库 pull了,节约了下载带宽资源。当然,你使用 kubectl 命令创建 pod 也能够下载对应镜像,重复拉取镜像会拖慢 pod 创建速度。

创建集群

# 创建个 zouzou 的集群
kind create cluster --name zouzou

查看集群

[root@dce88 ~]# docker ps | grep kind
137642ca3186   kindest/node:v1.24.0                   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes     127.0.0.1:42869->6443/tcp   zouzou-control-plane

查看本地镜像,我本地有个 nginx 的镜像

[root@dce88 ~]# docker images | grep nginx
nginx                                                          latest               55f4b40fe486   2 weeks ago     142MB

先查看 kind 集群里是否有 nginx 镜像,从结果可以看出来是没有 nginx 镜像的

# zouzou-control-plane 这里要使用容器的名称,不能直接写 zouzou,zouzou 是 kind 的,不是 docker 的
[root@dce88 ~]# docker exec -it zouzou-control-plane crictl images
IMAGE                                      TAG                  IMAGE ID            SIZE
docker.io/goharbor/nginx-photon            v2.5.1               c4c8eef437164       45MB
docker.io/kindest/kindnetd                 v20220510-4929dd75   6fb66cd78abfe       45.2MB
docker.io/kindest/local-path-helper        v20220512-507ff70b   64623e9d887d3       2.86MB
docker.io/kindest/local-path-provisioner   v0.0.22-kind.0       4c1e997385b8f       17.4MB
k8s.gcr.io/coredns/coredns                 v1.8.6               a4ca41631cc7a       13.6MB
k8s.gcr.io/etcd                            3.5.3-0              aebe758cef4cd       102MB
k8s.gcr.io/kube-apiserver                  v1.24.0              9ef4b1de3be49       77.3MB
k8s.gcr.io/kube-controller-manager         v1.24.0              efa8a439d1460       65.6MB
k8s.gcr.io/kube-proxy                      v1.24.0              6960c0e47829d       112MB
k8s.gcr.io/kube-scheduler                  v1.24.0              41f5241e3396e       52.3MB
k8s.gcr.io/pause                           3.6                  6270bb605e12e       302kB

然后将 docker 镜像 load 进 kind 集群里面

# 这里使用的是 kind 的名称 zouzou,将 nginx:latest 放到集群里面
[root@dce88 ~]# kind load docker-image nginx:latest --name zouzou
Image: "nginx:latest" with ID "sha256:55f4b40fe486a5b734b46bb7bf28f52fa31426bf23be068c8e7b19e58d9b8deb" not yet present on node "zouzou-control-plane", loading...

在查看 kind 集群里的镜像

# 可以看到有了,crictl 会显示仓库
[root@dce88 ~]# docker exec -it zouzou-control-plane crictl images
IMAGE                                      TAG                  IMAGE ID            SIZE
docker.io/goharbor/nginx-photon            v2.5.1               c4c8eef437164       45MB
docker.io/kindest/kindnetd                 v20220510-4929dd75   6fb66cd78abfe       45.2MB
docker.io/kindest/local-path-helper        v20220512-507ff70b   64623e9d887d3       2.86MB
docker.io/kindest/local-path-provisioner   v0.0.22-kind.0       4c1e997385b8f       17.4MB
docker.io/library/nginx                    latest               55f4b40fe486a       146MB  # 这个
k8s.gcr.io/coredns/coredns                 v1.8.6               a4ca41631cc7a       13.6MB
k8s.gcr.io/etcd                            3.5.3-0              aebe758cef4cd       102MB
k8s.gcr.io/kube-apiserver                  v1.24.0              9ef4b1de3be49       77.3MB
k8s.gcr.io/kube-controller-manager         v1.24.0              efa8a439d1460       65.6MB
k8s.gcr.io/kube-proxy                      v1.24.0              6960c0e47829d       112MB
k8s.gcr.io/kube-scheduler                  v1.24.0              41f5241e3396e       52.3MB
k8s.gcr.io/pause                           3.6                  6270bb605e12e       302kB

crictl 是 CRI 兼容的容器 runtime 命令行工具。在 kind 的 Kubernetes 集群节点上没有安装 docker 命令行工具,而是安装了 Kubernetes 的 crictl 工具。


安装多节点集群


上面我们创建的是单节点的集群,默认安装的集群只部署了一个控制节点,如果需要部署多节点集群,我们可以通过配置文件的方式来创建多个容器。这样就可以达到模拟多个节点的目的,并以这些节点来构建一个多节点的 kubernetes 集群

创建多节点 kubernetes 集群配置文件

kind 在创建集群的时候,支持通过 --config 参数传递配置文件给 kind,配置文件可修改的内容主要有 role 和 节点使用的镜像

创建一个 test1.yaml 的文件,内容如下

kind: Cluster
# 一共两个节点,一个主节点,一个从节点
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane  # 主节点
- role: worker  # 从节点

配置文件创建完成后,就可以使用下面的命令来完成多节点 Kubernetes 集群搭建。

# --config 指定 yaml 文件的路径
[root@dce88 ~]# kind create cluster --config=test1.yaml --name=my-cluster1
Creating cluster "my-cluster1" ...
 ✓ Ensuring node image (kindest/node:v1.24.0) 🖼
 ✓ Preparing nodes 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-my-cluster1"
You can now use your cluster with:
kubectl cluster-info --context kind-my-cluster1
Thanks for using kind! 😊

使用 docker ps 就可以看到有两个容器在运行

进入到控制容器里面,查看节点信息

# 进入到控制节点容器里面
[root@dce88 ~]# docker exec -it da29f8c9c469 /bin/bash
root@my-cluster1-control-plane:/#
# 查看 node
root@my-cluster1-control-plane:/# kubectl get node
NAME                        STATUS   ROLES           AGE     VERSION
my-cluster1-control-plane   Ready    control-plane   6m57s   v1.24.0
my-cluster1-worker          Ready    <none>          6m33s   v1.24.0

删除集群

# 执行后,两个 docker 容器都会被删除
[root@dce88 ~]# kind delete cluster --name=my-cluster1
[root@dce88 ~]# docker ps | grep kind


创建高可用的 k8s 集群


上面创建了一个控制节点,一个 work 节点,我们也可以创建高可用的 k8s 集群,创建一个 test2.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

创建集群

[root@dce88 ~]# kind create cluster --config=test2.yaml --name=my-cluuster2
Creating cluster "my-cluuster2" ...
 ✓ Ensuring node image (kindest/node:v1.24.0) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦 📦 📦
 ✓ Configuring the external load balancer ⚖️
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining more control-plane nodes 🎮
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-my-cluuster2"
You can now use your cluster with:
kubectl cluster-info --context kind-my-cluuster2
Thanks for using kind! 😊

查看容器


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
175 9
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
7月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
639 33
|
7月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
369 19
|
7月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
10月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
7月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
212 0
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
|
9月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
8月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
10月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
724 13

热门文章

最新文章

推荐镜像

更多