k8s--kind 搭建 k8s 集群

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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! 😊

查看容器


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
11天前
|
canal Kubernetes Docker
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
|
6天前
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes(K8S) 集群安全机制
Kubernetes(K8S) 集群安全机制
15 2
|
12天前
|
Kubernetes Ubuntu Linux
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
|
14天前
|
Kubernetes API 调度
Airbnb的动态kubernetes集群扩缩容
Airbnb的动态kubernetes集群扩缩容
29 5
|
14天前
|
存储 Kubernetes Java
基于Kubernetes v1.25.0和Docker部署高可用集群(说明篇)
docker与kubernetes的区别是:docker是管理当前主机上的容器,k8s是管理多台主机、跨平台的分布式管理系统。Kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能
|
13天前
|
Prometheus 监控 Kubernetes
|
14天前
|
Prometheus Kubernetes 数据安全/隐私保护
使用kubeseal加密和管理k8s集群的secret
使用kubeseal加密和管理k8s集群的secret
25 2
|
26天前
|
Kubernetes 应用服务中间件 调度
云上应用管理问题之如何在Kubernetes集群中配置跨可用区的Pod调度
云上应用管理问题之如何在Kubernetes集群中配置跨可用区的Pod调度
|
6天前
|
Kubernetes 应用服务中间件 API
Ingress:K8S集群进出流量的总管
【8月更文挑战第14天】创建Ingress时可通过`kubectl create`命令指定所属的Ingress Class及路由规则。部署Ingress Controller时需定制配置文件以适应特定环境需求。
|
1月前
|
Kubernetes API 索引

推荐镜像

更多