写于 2021-06,背景:K8s 1.21 GA,minikube 1.22 引入 profile 概念,kind 成为 e2e 测试标配。本地学习 K8s 早就不用 kubeadm 起 3 节点了——一台机器就够。
一、单机环境选型
| 场景 | 推荐方案 | 启动时间 |
|---|
| 个人学习 Linux | minikube(docker driver) | 3~5 分钟 |
| 个人学习 Windows | minikube(hyperv driver) | 5~10 分钟 |
| 团队开发统一环境 | kind(多节点) | 30 秒 |
| CI/CD 跑 e2e 测试 | kind + docker | 30 秒 |
| 快速验证 YAML | minikube | 3~5 分钟 |
避坑:
- 不要在笔记本上跑 kubeadm 起 3 节点:耗资源、占内存
- 生产用 kubeadm:minikube 集群不能上生产(单点、无 etcd 高可用)
二、Linux 一键脚本
很多公司内部都维护一套"单机 K8s + Docker + docker-compose"一键脚本,下面是模板。
2.1 CentOS 7 / 8 安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 安装前准备
yum -y install socat conntrack conntrack-tools ebtables ipset ipvsadm
# 下载 kk(kubekey,KubeSphere 出的工具,类似 kubeadm 但更傻瓜)
wget -O /usr/local/bin/kk https://example.com/kk --no-check-certificate
chmod +x /usr/local/bin/kk
# 阿里云环境
export KKZONE=cn
# 一键创建(local-storage 模式,K8s + local path provisioner)
kk create cluster \
--with-local-storage \
--with-kubernetes v1.28.5 \
--container-manager docker \
-y
# 查看状态
kubectl get nodes
kubectl get pods -A
# 卸载
kk delete cluster
|
2.2 Ubuntu 安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 准备
systemctl stop ufw
systemctl disable ufw
apt update
apt install socat conntrack ebtables ipset make g++ openssl libssl-dev \
libpcre3 libpcre3-dev zlib1g-dev libgd-dev -y
wget -O /usr/local/bin/kk https://example.com/kk --no-check-certificate
chmod +x /usr/local/bin/kk
export KKZONE=cn
kk create cluster \
--with-local-storage \
--with-kubernetes v1.28.5 \
--container-manager docker \
-y
|
2.3 镜像预拉取
如果集群装在不能访问外网的环境,要提前把镜像推送到私有仓库:
1
2
3
4
5
6
7
8
9
10
11
12
| # 登录私有仓库
docker login -uadmin -p<密码> <private-registry>:13001
# 拉取镜像
docker pull <private-registry>:13001/base/calico/kube-controllers:v3.26.1
docker pull <private-registry>:13001/base/calico/cni:v3.26.1
docker pull <private-registry>:13001/base/calico/node:v3.26.1
docker pull <private-registry>:13001/base/google_containers/coredns:v1.10.1
docker pull <private-registry>:13001/base/google_containers/pause:3.9
docker pull <private-registry>:13001/base/google_containers/metrics-server:v0.6.4
docker pull <private-registry>:13001/base/google_containers/nginx-ingress-controller:v1.9.5
docker pull <private-registry>:13001/base/atomic/nfs-subdir-external-provisioner:v4.0.2
|
三、Windows minikube 完整流程
3.1 系统要求
- Windows 10/11(64 位)
- 8GB+ 内存
- 虚拟化已开启(BIOS + 系统)
- Hyper-V 启用(推荐)或 VirtualBox
1
2
3
4
| # PowerShell 查看虚拟化
systeminfo
# Hyper-V Requirements: VM Monitor Mode Extensions: Yes
# Virtualization Enabled In Firmware: Yes
|
3.2 下载 minikube
1
2
3
4
5
| # 创建目录
New-Item -Path 'D:\' -Name 'minikube' -ItemType Directory -Force
# 下载(最新稳定版)
Invoke-WebRequest -OutFile 'D:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing
|
3.3 加 PATH
1
2
3
4
5
6
7
8
| # 以管理员运行 PowerShell
$oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
if ($oldPath.Split(';') -inotcontains 'D:\minikube') {
[Environment]::SetEnvironmentVariable('Path', $('{0};D:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine)
}
# 验证
minikube version
|
3.4 启用 Hyper-V
- 控制面板 → 程序 → 启用或关闭 Windows 功能
- 勾选 Hyper-V(含 Hyper-V 管理工具 + Hyper-V 平台)
- 重启电脑
3.5 启动 minikube
国内环境必备:代理 + 镜像加速
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 代理环境变量
$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "https://127.0.0.1:7890"
$env:NO_PROXY = "localhost,127.0.0.1,10.96.0.0/12,192.168.59.0/24,192.168.49.0/24,192.168.39.0/24"
# 启动(hyperv driver)
minikube start `
--driver=hyperv `
--memory=8192m `
--cpus=4 `
--disk-size=20000mb `
--hyperv-virtual-switch="minikube" `
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers `
--kubernetes-version=v1.28.5 `
--docker-env http_proxy=$env:HTTP_PROXY `
--docker-env https_proxy=$env:HTTPS_PROXY `
--docker-env no_proxy=$env:NO_PROXY
|
关键参数:
--driver=hyperv:Windows 推荐(性能比 VirtualBox 好)--memory=8192m:默认 2GB 跑不动生产规模 Pod--image-repository:阿里云镜像仓库,避免 docker.io 拉镜像超时--hyperv-virtual-switch=minikube:需要提前在 Hyper-V 管理器创建名为 “minikube” 的内部虚拟交换机
3.6 创建 Hyper-V 虚拟交换机
1
2
3
4
5
| # 列出已有交换机
Get-VMSwitch
# 创建内部交换机(如果还没有)
New-VMSwitch -Name "minikube" -SwitchType Internal
|
3.7 验证
1
2
3
4
5
6
7
8
9
| minikube kubectl -- get pods -A
# NAMESPACE NAME READY STATUS RESTARTS AGE
# kube-system coredns-5dd5756b68-s8jr6 1/1 Running 0 73s
# kube-system etcd-minikube 1/1 Running 0 86s
# kube-system kube-apiserver-minikube 1/1 Running 0 88s
# kube-system kube-controller-manager-minikube 1/1 Running 0 86s
# kube-system kube-proxy-5cq5b 1/1 Running 0 73s
# kube-system kube-scheduler-minikube 1/1 Running 0 86s
# kube-system storage-provisioner 1/1 Running 1 (43s ago) 85s
|
四、minikube 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| # 集群信息
minikube version
minikube update-check
minikube status
# 节点
minikube ip
# 172.21.197.227
# 进入节点(root 账号无密码)
minikube ssh
# docker 环境变量
minikube docker-env
# 让本地 docker 命令操作 minikube 的 docker daemon
# eval $(minikube docker-env)
# 日志
minikube logs
# 镜像
minikube image list
minikube image pull registry.k8s.io/metrics-server/metrics-server:v0.6.4
# Dashboard
minikube dashboard
# 或只拿 URL 不打开浏览器
minikube dashboard --url
# 启用插件
minikube addons enable metrics-server
minikube addons enable ingress
minikube addons enable dashboard
# 清理
minikube delete --purge --all
|
五、minikube 多 profile
minikube 1.22+ 支持多 profile(多套独立集群):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 创建多个集群
minikube start -p dev --driver=docker
minikube start -p prod --driver=hyperv
# 切换
minikube profile dev
kubectl get nodes
minikube profile prod
kubectl get nodes
# 列出所有
minikube profile list
# 删除
minikube delete -p dev
|
六、kind:CI 测试的最佳选择
kind 用 Docker 容器模拟 K8s 节点,启动 30 秒,特别适合 CI:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 安装
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# 3 节点集群
cat > kind-3node.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
EOF
kind create cluster --config kind-3node.yaml --name my-cluster
# 验证
kubectl cluster-info
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# my-cluster-control-plane Ready control-plane 2m v1.28.0
# my-cluster-control-plane2 Ready control-plane 2m v1.28.0
# my-cluster-control-plane3 Ready control-plane 2m v1.28.0
# my-cluster-worker Ready <none> 90s v1.28.0
# my-cluster-worker2 Ready <none> 90s v1.28.0
# 加载本地镜像到集群
kind load docker-image my-app:1.0 --name my-cluster
# 删除
kind delete cluster --name my-cluster
|
七、Linux 装 minikube
1
2
3
4
5
6
7
8
9
| curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动(docker driver)
minikube start --driver=docker --memory=4096m
# 加 dashboard
minikube addons enable dashboard
minikube addons enable metrics-server
|
八、对比 minikube vs kind
| 维度 | minikube | kind |
|---|
| 节点实现 | VM / 容器 | 纯 Docker 容器 |
| 启动速度 | 3~5 分钟 | 30~60 秒 |
| 多节点支持 | 实验性 | 一等公民 |
| 镜像预加载 | minikube image load | kind load docker-image |
| Dashboard | 内置 | 需手动装 |
| 适合场景 | 个人学习 | CI/CD |
| 资源占用 | 较重(VM) | 轻(容器) |
九、常见坑
- minikube 启动卡在 “Starting cluster”:99% 是网络问题,先
minikube delete --purge --all 再加代理重试 - Windows Hyper-V 启动失败:“Virtual switch ‘minikube’ not found” → 提前在 Hyper-V 管理器创建内部交换机
- 资源不足:
minikube start --memory=2048m 默认值,复杂应用(Ingress + Dashboard + Metrics)至少 4096MB - kubectl 命令找不到:
minikube kubectl -- get pods 加前缀,或 alias kubectl="minikube kubectl --" - 容器内不能访问外网:minikube 内部网络与宿主机隔离,需要
--docker-env http_proxy=... 注入代理 - kind 节点重启后数据丢:本质是容器,stop/start 会重建,etcd 数据丢失
十、前置知识 / 下一步
前置:
下一步:
- Kubeadm 一键部署(2022-06-15)—— 多节点生产集群
- K8s 资源限制与探针(2022-03-15)—— Pod 调优
参考资料