Featured image of post K8s 单机环境:Linux 脚本安装 / Windows minikube / macOS 速上手

K8s 单机环境:Linux 脚本安装 / Windows minikube / macOS 速上手

学习或本地开发,怎么快速起一个 K8s 集群?本文覆盖 Linux 一键脚本(CentOS 7/8、Ubuntu)、Windows minikube 完整流程、Hyper-V / Docker driver 选择、镜像预拉取与常用命令。

写于 2021-06,背景:K8s 1.21 GA,minikube 1.22 引入 profile 概念,kind 成为 e2e 测试标配。本地学习 K8s 早就不用 kubeadm 起 3 节点了——一台机器就够。

一、单机环境选型

场景推荐方案启动时间
个人学习 Linuxminikube(docker driver)3~5 分钟
个人学习 Windowsminikube(hyperv driver)5~10 分钟
团队开发统一环境kind(多节点)30 秒
CI/CD 跑 e2e 测试kind + docker30 秒
快速验证 YAMLminikube3~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

  1. 控制面板 → 程序 → 启用或关闭 Windows 功能
  2. 勾选 Hyper-V(含 Hyper-V 管理工具 + Hyper-V 平台)
  3. 重启电脑

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

维度minikubekind
节点实现VM / 容器纯 Docker 容器
启动速度3~5 分钟30~60 秒
多节点支持实验性一等公民
镜像预加载minikube image loadkind load docker-image
Dashboard内置需手动装
适合场景个人学习CI/CD
资源占用较重(VM)轻(容器)

九、常见坑

  1. minikube 启动卡在 “Starting cluster”:99% 是网络问题,先 minikube delete --purge --all 再加代理重试
  2. Windows Hyper-V 启动失败:“Virtual switch ‘minikube’ not found” → 提前在 Hyper-V 管理器创建内部交换机
  3. 资源不足minikube start --memory=2048m 默认值,复杂应用(Ingress + Dashboard + Metrics)至少 4096MB
  4. kubectl 命令找不到minikube kubectl -- get pods 加前缀,或 alias kubectl="minikube kubectl --"
  5. 容器内不能访问外网:minikube 内部网络与宿主机隔离,需要 --docker-env http_proxy=... 注入代理
  6. kind 节点重启后数据丢:本质是容器,stop/start 会重建,etcd 数据丢失

十、前置知识 / 下一步

前置

下一步

  1. Kubeadm 一键部署(2022-06-15)—— 多节点生产集群
  2. K8s 资源限制与探针(2022-03-15)—— Pod 调优

参考资料

使用 Hugo 构建
主题 StackJimmy 设计