通过 Kind 快速构建 k8s 集群

下面 是一份从零开始、适配Ubuntu(腾讯云服务器)、带国内加速方案Kind 完整安装+集群搭建教程,每一步都有命令、解释和验证方法,跟着做就能跑起来。


📋 前置条件

你的服务器/电脑需要:

  • 系统:Ubuntu 20.04 / 22.04(其他Debian系也通用)
  • 内存:至少 2GB 空闲内存(单节点集群),多节点建议 4GB+
  • 已开启Docker(下面会教你装)
  • 网络能访问外网(会配置国内加速解决拉取慢的问题)

一、第一步:安装并配置 Docker(Kind 的底层依赖)

Kind 是基于 Docker 运行的,所以必须先装好 Docker。

1. 安装 Docker(国内加速版)

通过 宝塔 安装 docker 并且 配置 国内 加速源: https://docker.m.daocloud.io

bash 复制代码
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

2. 配置 Docker 免 sudo(必做!否则Kind会报错)

如果 全程使用 root 用户操作, 则可以 跳过 此步骤。

默认只有root用户能操作Docker,每次加sudo很麻烦,把当前用户加入docker组:

bash 复制代码
# 将当前用户加入docker组
sudo usermod -aG docker $USER

# 刷新用户组配置(新会话生效,不想退出的话执行下面这条)
newgrp docker

二、第二步:安装 Kind 工具

推荐用二进制安装(无需Go环境,适合所有用户),也给你Go方式的备选。

方式1:二进制安装(推荐)

bash 复制代码
# 1. 下载对应系统的Kind二进制(amd64架构,服务器通用)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64

# 2. 赋予执行权限
chmod +x ./kind

# 3. 移动到系统目录,全局可用
sudo mv ./kind /usr/local/bin/kind

# 4. 验证安装成功(输出版本号就OK)
kind version

方式2:Go 安装(有Go环境的用户可选)

bash 复制代码
# 确保Go 1.21+已安装,执行下面的命令
go install sigs.k8s.io/kind@v0.24.0

三、第三步:安装 kubectl(管理K8s集群的工具)

我们需要用kubectl来操作Kind创建的集群,同样用国内源安装:

bash 复制代码
# 1. 下载kubectl(阿里云镜像,速度快)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# 2. 赋予执行权限
chmod +x ./kubectl

# 3. 移动到系统目录
sudo mv ./kubectl /usr/local/bin/kubectl

# 4. 验证安装
kubectl version --client

四、第四步:用 Kind 创建你的第一个 K8s 集群

场景1:快速创建单节点集群(适合新手入门)

这是最简单的方式,1条命令就能创建1个单节点的K8s集群(Control Plane和Worker在同一个容器里):

bash 复制代码
# 创建名为my-first-cluster的单节点集群
kind create cluster --name my-first-cluster

成功的输出:

sh 复制代码
root@VM-0-15-ubuntu:~# kind create cluster --name my-first-cluster
Creating cluster "my-first-cluster" ...
 ✓ Ensuring node image (kindest/node:v1.31.0) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-my-first-cluster"
You can now use your cluster with:

kubectl cluster-info --context kind-my-first-cluster

Have a nice day! 👋

测试:

sh 复制代码
# 查看集群节点状态
kubectl get nodes

# 成功结果(你会看到):
NAME                          STATUS   ROLES           AGE   VERSION
my-first-cluster-control-plane Ready    control-plane   xxs   v1.31.0

只要显示 STATUS=Ready,就代表你的 K8s 集群完全可用!
关键说明:
  • 执行后会自动:拉取kindest/node镜像→启动Docker容器作为节点→配置kubectl上下文
  • 首次拉取镜像可能需要1-3分钟,耐心等待即可
  • 成功后会输出类似:Cluster "my-first-cluster" created successfully.

场景2:创建多节点集群(适合学习K8s调度)

如果想体验多节点K8s集群,需要用配置文件定义节点数量。

  1. 新建配置文件kind-multi-node.yaml
yaml 复制代码
# kind-multi-node.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: multi-node-cluster
nodes:
  - role: control-plane  # 控制平面节点(1个)
  - role: worker          # 工作节点1
  - role: worker          # 工作节点2
  1. 用配置文件创建集群:
bash 复制代码
kind create cluster --config kind-multi-node.yaml

五、启动一个 Pod 测试

环境已经完美就绪! 创建 Redis Pod 进行测试。

说明: 新建的 redis pod 是在 my-first-cluster-control-plane 容器中 创建 和 运行的

bash 复制代码
# 创建名为 redis 的 Pod,使用官方 redis 镜像
kubectl run redis --image=redis

# 验证 Pod 是否创建成功
# 查看所有 Pod(STATUS 变成 Running 就是成功)
kubectl get pods

#输出
NAME    READY   STATUS             RESTARTS   AGE
redis   0/1     ImagePullBackOff   0          5m11s

先看懂状态:ImagePullBackOff

这是 K8s 最常见的报错,翻译:镜像拉取失败 → 重试多次还是失败 → 进入等待状态

根本原因:

你用的是腾讯云服务器 ,国内网络直接拉取 Docker 官方的 redis 镜像 超时/失败

Kind 集群的节点容器里,下载不到镜像,所以 Pod 起不来。

Kind 的节点是独立的 Docker 容器,看不到你宿主机的镜像,必须手动把镜像「导入」集群!

sh 复制代码
### ① 先删掉这个失败的 Pod
kubectl delete pod redis


### ② 宿主机拉取 **国内极速 Redis 镜像**
docker pull redis:latest


### ③ 把本地镜像 **加载进 Kind 集群**(核心命令!)
kind load docker-image redis:latest --name my-first-cluster

### ④ 重新创建 Redis Pod
kubectl run redis --image=redis:latest --image-pull-policy=IfNotPresent

通俗讲原理(为什么要这么做)

  1. 你的服务器 → Docker(有 redis 镜像)
  2. Kind 集群 → 是一个独立的 Docker 容器(隔离的,看不见外面的镜像)
  3. 所以必须用 kind load 命令,把镜像强行塞进集群里
  4. 集群有了镜像,Pod 就能直接启动,不用再去国外下载了

重点说明:--image-pull-policy=IfNotPresent

镜像标签是 redis:latest(最新版),K8s 对 latest 标签有强制规则:

无论本地有没有镜像,都会强制去外网重新拉取!

所以哪怕你用 kind load 把镜像装进集群了,它还是会去国外网站下载 → 失败 → ImagePullBackOff

--image-pull-policy=IfNotPresent 意思是: 本地有镜像就用本地的,本地没有才去外网拉

测试:

sh 复制代码
kubectl get pods
# 输出
NAME    READY   STATUS    RESTARTS   AGE
redis   1/1     Running   0          9s

# 进入 Redis 命令行客户端
kubectl exec -it redis -- redis-cli

# 执行后你会进入 127.0.0.1:6379> 交互模式,输入:
set test hello-k8s
get test

exit

六:验证集群是否正常运行

集群创建完成后,用下面的命令验证状态:

bash 复制代码
# 1. 查看当前kubectl指向的集群上下文
kubectl config current-context

# 2. 查看集群节点状态(STATUS显示Ready就是正常)
kubectl get nodes

# 3. 查看集群组件状态
kubectl cluster-info

# 4. 查看集群运行的所有Pod(kube-system命名空间下的组件都Running)
kubectl get pods -n kube-system

同时你可以用docker ps看到Kind创建的节点容器:

bash 复制代码
docker ps | grep kindest/node

七、Kind 常用命令&日常操作

1. 集群管理

bash 复制代码
# 查看所有Kind集群
kind get clusters

# 切换kubectl到指定集群(如果有多个集群)
kubectl config use-context kind-<集群名>

# 删除指定集群
kind delete cluster --name <集群名>

# 删除所有Kind集群(一键清理)
kind delete clusters --all

2. 本地镜像加载(必学!部署应用必备)

你本地构建的Docker镜像,Kind集群默认看不到,需要手动加载进去:

bash 复制代码
# 假设你本地有个叫my-app:v1的镜像
kind load docker-image my-app:v1 --name <你的集群名>

八、常见问题&排错指南

问题1:拉取kindest/node镜像超时/失败

  • 解决:检查Docker镜像加速是否配置成功,或手动拉取国内镜像:

    bash 复制代码
    # 以v1.29.0为例,拉取国内镜像并打tag
    docker pull registry.aliyuncs.com/google_containers/kindest-node:v1.29.0
    docker tag registry.aliyuncs.com/google_containers/kindest-node:v1.29.0 kindest/node:v1.29.0

问题2:集群创建时提示内存不足

  • 解决:单节点集群建议至少2GB空闲内存,多节点建议4GB+,关闭服务器上其他占用内存的进程。

问题3:kubectl 无法连接集群

  • 解决:检查Kind集群是否运行正常,执行kind get clusters确认集群存在,或重新创建集群:

    bash 复制代码
    kind delete cluster --name <集群名>
    kind create cluster --name <集群名>

补充:和其他工具对比

工具 启动速度 资源占用 功能完整性 适合场景
Kind 秒级启动 极低(容器级) 完整K8s集群,支持多节点 快速测试、CI/CD、学习K8s基础
k3s 较快 极低(二进制精简版) 轻量版K8s,部分组件裁剪 低配置机器、边缘设备、长期学习
Minikube 较慢 较高(默认VM级) 功能最全,支持插件 本地开发、需要完整功能的场景

Kind 最大的优势就是轻量、快速、不挑机器

九、Kuboard 面板 可视化 操控 k8s

Kuboard 镜像拉取

sh 复制代码
docker pull swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3

启动 容器

下面这个是 用 kind 创建的 k8s 集群容器 的基本信息:

Kind 集群运行在 Docker 容器内,Kuboard 也运行在 Docker 容器中,默认网络隔离。

因为 Kuboard 能正常工作的前提 就是 能访问到 Kind 集群。

所以 启动 Kuboard 容器 的核心 就是保证 两个容器 的 网络连通性

可以通过 --network 参数 让 Kuboard 容器与 Kind 集群容器在同一网络中

sh 复制代码
# 1. 查看 Kind 集群使用的网络(默认是 kind 网络)
docker network ls | grep kind

# 2. 启动 Kuboard 并加入 kind 网络
docker run -d \
  --name kuboard \
  --restart=unless-stopped \
  --network=kind  # 关键:加入 kind 网络
  -p 80:80 \
  -p 443:443 \
  -v /root/kuboard-data:/data \
  swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3

kuboard 控制面板

step1: 打开 面板
sh 复制代码
http://你的服务器公网IP

初始账号密码为=> 账号:admin 密码:Kuboard123

如果 忘记密码, 可以通过 以下命令 重置密码:

复制代码
# 进入到 kuboard 后执行:
kuboard-admin reset-password

kuboard-admin reset-password 是一个封装好的运维命令,它的设计初衷就是"一键恢复",命令内部硬编码 了默认密码 Kuboard123。它会自动调用加密算法(通常是 bcrypt)对该明文密码进行哈希处理,然后将生成的密文直接覆盖写入到 etcd 中存储 admin 用户信息的键值对里。

step2: 登录成功后,导入你的 Kind 集群

太棒了!你已经成功进入 Kuboard 主界面了,接下来跟着这 5 步,就能一键连接上你的 Kind 集群:


  • 第 1 步:点击「添加集群」按钮
    在当前界面中间,有个带 + 号的「添加集群」卡片,直接点击它,进入集群添加页面。

  • 第 2 步:选择「导入已有 Kubernetes 集群」
    进入添加页面后,你会看到两种方式,选择:

导入已有 Kubernetes 集群

(不用选创建新集群,我们已经有 Kind 集群了)


  • 第 3 步:导出并复制 Kind 集群的 kubeconfig
    回到你的服务器终端,执行下面这条命令,导出 Kind 集群的完整配置文件:
bash 复制代码
kind get kubeconfig --name my-first-cluster

执行后,终端会输出一大段内容(从 apiVersion: v1 开始到最后一行),全选复制所有内容(Ctrl+A → Ctrl+C)。


  • 第 4 步:在 Kuboard 中粘贴并提交
    回到 Kuboard 的添加集群页面,按下面填写:
  1. 集群名称 :随便填一个好记的名字,比如 my-kind-cluster
  2. 导入方式:默认就是「使用 kubeconfig 方式导入」,不用改
  3. kubeconfig 输入框 :把你刚才复制的所有内容,完整粘贴进去

    把刚才复制的所有内容,完整粘贴到 kubeconfig 那个黑色的大输入框里。粘贴完成后,你会发现:
    下面的 Context 下拉框会自动出现一个选项(一般是 kind-my-first-cluster)
    ApiServer 地址 也会自动填充好(比如 https://my-first-cluster-control-plane:6443

此处 的 重点说明:

在的 ApiServer 地址 https://127.0.0.1:38021 是给宿主机上的 kubectl 用的, 通过 宿主机的端口 映射访问 Kind 集群。

但你的 Kuboard 容器运行在 kind 这个 Docker 网络里,它访问 127.0.0.1 指向的是 Kuboard 容器自己,根本访问不到宿主机的 38021 端口,所以直接提交会连接超时 / 失败。

直接把 ApiServer 地址改成下面这个:

复制代码
https://my-first-cluster-control-plane:6443

说明:

  • Kuboard 容器和 Kind 控制平面容器在同一个 kind Docker 网络里,Docker 网络中可以直接用容器名解析,my-first-cluster-control-plane 就是你的 Kind 控制平面容器名。
    6443 是 Kind 集群 ApiServer 的默认端口,容器内部直接监听,同一个网络里的容器可以直接访问,不需要端口映射、也不需要放开安全组。
  • 必须是 HTTPS, 因为:1 Kubernetes 强制规范; 2 kubeconfig 自带证书
step3:接入成功 的 界面
step4: 接下来可以直接玩这些核心功能
  1. 查看节点状态:左侧菜单「Kubernetes 集群」→ 点你的集群 → 「节点」
  2. 查看所有 Pod:进入集群后,左侧「工作负载」→「Pod」
  3. 网页进容器终端:点任意 Pod → 右上角「终端」,直接进入容器内部操作
  4. 部署第一个应用:「工作负载」→「Deployment」→「创建」,可视化部署 Nginx 等应用
相关推荐
Apache RocketMQ1 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
珂玥c3 小时前
kubeadm方式部署 k8s 1.21
云原生·容器·kubernetes
小义_4 小时前
【Kubernetes】(十九)监控与升级
云原生·容器·kubernetes
炸炸鱼.5 小时前
Kubernetes Pod 深度理解:从入门到实战
云原生·容器·kubernetes·pod
云游牧者6 小时前
K8S网络策略全解-NetworkPolicy与GlobalNetworkPolicy实战
网络·容器·kubernetes·cni
宇明一不急6 小时前
k8s 常用的正则表达式
云原生·容器·kubernetes
云游牧者7 小时前
K8S-HPA自动扩缩容实战指南
云原生·容器·kubernetes·hpa·弹性伸缩·hpv
成为你的宁宁7 小时前
【K8S存储管理:PV/PVC动态供应及NFS动态供给实战】
云原生·容器·kubernetes
容器魔方7 小时前
“驾驭工程”下一跳?JiuwenClaw AgentTeam开启“协同工程”全新范式
人工智能·云原生·容器·架构·开源