Linux 安装 K8S 之 minikube

摘要

安装前设置

修正系统的时间

1
2
3
4
5
6
7
8
# 安装chrony
sudo dnf install chrony -y
# 启动服务
sudo systemctl enable --now chronyd
# 修正时间
sudo chronyc makestep
# 查看时间
date

安装 docker

创建用户

  • 避免使用root用户,这里创建一个 centos 用户,要求该用户具有sudo权限,如果使用docker运行时,则需要将该用户添加到docker用户组

1
2
3
4
5
6
7
8
9
# 1.创建用户
$ sudo useradd -m -s /bin/bash centos
# 2.添加到docker用户组
$ sudo usermod -aG docker centos
# 3.将用户添加到 sudo(管理员)组,说明:wheel 是 CentOS 中允许使用 sudo 权限的用户组。具体可以通过 visudo 命令查看
$ sudo usermod -aG wheel centos
## 这种添加方式使用sudo时需要输入密码,如果不希望输入密码,可以通过 visudo 命令修改,将 wheel 组改为 %wheel ALL=(ALL) NOPASSWD: ALL 的形式
# 4.切换用户,以下操作均在该用户下进行
$ su - centos

安装 kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1.下载 kubectl
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# 2.验证下载(可选)
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
$ echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
## 验证通过输出
kubectl: 成功

# 3.安装 kubectl
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 4.查看安装的版本
$ kubectl version --client
Client Version: v1.33.2
Kustomize Version: v5.6.0
  • 启用 shell 自动补全功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1.安装 bash-completion
# 1.1 检查bash-completion是否已安装,有输出说明已经安装
$ type _init_completion
# 1.2 安装bash-completion,安装后会创建文件 /usr/share/bash-completion/bash_completion
$ dnf install bash-completion

# 2.安装 kubectl 的自动补全功能
# 2.1 当前用户
$ echo 'source <(kubectl completion bash)' >>~/.bashrc
# 2.2 所有用户
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
$ sudo chmod a+r /etc/bash_completion.d/kubectl

# 3 如果 kubectl 有关联的别名,你可以扩展 Shell 补全来适配此别名
$ echo 'alias k=kubectl' >>~/.bashrc
$ echo 'complete -o default -F __start_kubectl k' >>~/.bashrc

# 4.刷新配置文件
$ source ~/.bashrc

使用 minikube 创建 K8S 集群

  • 该工具只适合在本机进行开发和测试时使用,其原理是在本机的docker环境中创建一个minikube容器作为k8s的节点机。

安装 minikube

1
2
3
4
5
6
7
8
# 1.下载
$ curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
# 2.安装
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
# 3.验证
$ minikube version
# 4.查看帮助
$ minikube --help

创建集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建集群,注意不能使用 root 用户,要求该用户具有 docker 权限,并且具有sudo权限,否则会报错
# 系统内存至少 4G,以保证稳定性
# 默认使用docker驱动 --driver=docker,minikube 支持的驱动:https://minikube.sigs.k8s.io/docs/drivers/
$ minikube start
😄 Rocky 8.10 (amd64) 上的 minikube v1.36.0
✨ 根据现有的配置文件使用 docker 驱动程序
👍 在集群中 "minikube" 启动节点 "minikube" primary control-plane
🚜 正在拉取基础镜像 v0.0.47 ...
> index.docker.io/kicbase/sta...: 502.26 MiB / 502.26 MiB 100.00% 27.50 M
❗ minikube was unable to download gcr.io/k8s-minikube/kicbase:v0.0.47, but successfully downloaded docker.io/kicbase/stable:v0.0.47@sha256:6ed579c9292b4370177b7ef3c42cc4b4a6dcd0735a1814916cbc22c8bf38412b as a fallback image
🔥 创建 docker container(CPU=2,内存=2200MB)...
🐳 正在 Docker 28.1.1 中准备 Kubernetes v1.33.1…
▪ 正在生成证书和密钥...
▪ 正在启动控制平面...
▪ 配置 RBAC 规则 ...
🔗 配置 bridge CNI (Container Networking Interface) ...
🔎 正在验证 Kubernetes 组件...
▪ 正在使用镜像 gcr.io/k8s-minikube/storage-provisioner:v5
🌟 启用插件: default-storageclass, storage-provisioner
🏄 完成!kubectl 现在已配置,默认使用"minikube"集群和"default"命名空间
  • Minikube 允许你创建多个独立的 Kubernetes 集群,每个 profile 是一个单独的 minikube 实例,互不干扰。

1
2
3
4
# -p 是 --profile 的缩写,表示 指定使用哪个 Minikube 集群(Profile),默认 profile 名是 minikube
minikube start -p dev
minikube start -p test
minikube start -p prod
  • 获取集群状态

1
2
3
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 27s v1.33.1
  • 查看本机容器,k8s 集群就在这个容器中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e7eaad73934 kicbase/stable:v0.0.47 "/usr/local/bin/entr…" 47 minutes ago Up 47 minutes 127.0.0.1:32772->22/tcp, 127.0.0.1:32771->2376/tcp, 127.0.0.1:32770->5000/tcp, 127.0.0.1:32769->8443/tcp, 127.0.0.1:32768->32443/tcp minikube

# 查看该容器中的docker容器
$ docker exec -it minikube docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c25bcc3cb76c 1cf5f116067c "/coredns -conf /etc…" 2 minutes ago Up 2 minutes k8s_coredns_coredns-674b8bbfcf-8jrx4_kube-system_bc7a83c7-31e7-495c-820a-a29414099387_0
a22714ccfce2 b79c189b052c "/usr/local/bin/kube…" 2 minutes ago Up 2 minutes k8s_kube-proxy_kube-proxy-5dkt4_kube-system_8ad25d8e-b023-4383-9441-0ddbb5159c9b_0
a368d902aef9 registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-proxy-5dkt4_kube-system_8ad25d8e-b023-4383-9441-0ddbb5159c9b_0
973caed86b2c registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_coredns-674b8bbfcf-8jrx4_kube-system_bc7a83c7-31e7-495c-820a-a29414099387_0
9db7567143a2 6e38f40d628d "/storage-provisioner" 2 minutes ago Up 2 minutes k8s_storage-provisioner_storage-provisioner_kube-system_4e82402e-ba65-4061-920e-988a71cb529b_0
ba39fe88ad59 registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_storage-provisioner_kube-system_4e82402e-ba65-4061-920e-988a71cb529b_0
ef0733df95b4 ef43894fa110 "kube-controller-man…" 2 minutes ago Up 2 minutes k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_0378f173c980f85a71d36305bacb0ad1_0
852828a600d5 c6ab243b29f8 "kube-apiserver --ad…" 2 minutes ago Up 2 minutes k8s_kube-apiserver_kube-apiserver-minikube_kube-system_78e1292e1d47cc7d09b2c6f5826fa624_0
97efb54702cd 499038711c08 "etcd --advertise-cl…" 2 minutes ago Up 2 minutes k8s_etcd_etcd-minikube_kube-system_3924ef3609584191d8d09190210d2d78_0
a3dd2c2817f1 398c985c0d95 "kube-scheduler --au…" 2 minutes ago Up 2 minutes k8s_kube-scheduler_kube-scheduler-minikube_kube-system_feee622ba49882ef945e2406d3ba86df_0
927ebc63cf80 registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-scheduler-minikube_kube-system_feee622ba49882ef945e2406d3ba86df_0
744d4c6e3571 registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-controller-manager-minikube_kube-system_0378f173c980f85a71d36305bacb0ad1_0
4ae6bdc25908 registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-apiserver-minikube_kube-system_78e1292e1d47cc7d09b2c6f5826fa624_0
dff641d8672a registry.k8s.io/pause:3.10 "/pause" 2 minutes ago Up 2 minutes k8s_POD_etcd-minikube_kube-system_3924ef3609584191d8d09190210d2d78_0
  • 配置你的终端,让 Docker CLI 指向 minikube 内部的 Docker 守护进程(就是通过 docker 远程连接的方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看docker远程的环境变量,我们可以将其配置到宿主机的环境变量中
$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.49.2:2376"
export DOCKER_CERT_PATH="/home/centos/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

# 临时配置宿主机环境变量,此时我们再执行docker命令,就会使用minikube的docker-daemon
$ eval $(minikube -p minikube docker-env)
# 取消临时配置,-u 是 --unset 的缩写
$ eval $(minikube -p minikube docker-env -u)

minikube 命令

  • 登录到 minikube 环境(用于调试)

1
2
# 实际上就是进入minikube容器的shell
$ minikube ssh
  • 运行 kubectl 命令

1
2
3
4
5
6
7
8
9
10
11
12
# 查看支持的命令
$ minikube kubectl -- --help
# 运行 kubectl 命令,这里注意 minikube kubectl -- 前面有空格
$ minikube kubectl -- get pods --namespace kube-system
NAME READY STATUS RESTARTS AGE
coredns-674b8bbfcf-8jrx4 1/1 Running 0 45m
etcd-minikube 1/1 Running 0 45m
kube-apiserver-minikube 1/1 Running 0 45m
kube-controller-manager-minikube 1/1 Running 0 45m
kube-proxy-5dkt4 1/1 Running 0 45m
kube-scheduler-minikube 1/1 Running 0 45m
storage-provisioner 1/1 Running 0 45m
  • node节点管理

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
37
38
39
40
41
42
43
44
45
46
47
48
49
# 添加一个worker节点,此时就是又启动了一个minikube容器
$ minikube node add
😄 将节点 m02 作为 [worker] 添加到集群 minikube
❗ 在没有任何 CNI 的情况下创建集群,向其中添加节点可能会导致网络中断。
👍 在集群中 "minikube" 启动节点 "minikube-m02" worker
🚜 正在拉取基础镜像 v0.0.47 ...
🔥 创建 docker container(CPU=2,内存=2200MB)...
🐳 正在 Docker 28.1.1 中准备 Kubernetes v1.33.1…
🔎 正在验证 Kubernetes 组件...
🏄 已成功将 m02 添加到 minikube!

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce5431e994c3 kicbase/stable:v0.0.47 "/usr/local/bin/entr…" 24 minutes ago Up 24 minutes 127.0.0.1:32792->22/tcp, 127.0.0.1:32791->2376/tcp, 127.0.0.1:32790->5000/tcp, 127.0.0.1:32789->8443/tcp, 127.0.0.1:32788->32443/tcp minikube-m02
2739aa21a085 kicbase/stable:v0.0.47 "/usr/local/bin/entr…" About an hour ago Up About an hour 127.0.0.1:32777->22/tcp, 127.0.0.1:32776->2376/tcp, 127.0.0.1:32775->5000/tcp, 127.0.0.1:32774->8443/tcp, 127.0.0.1:32773->32443/tcp minikube

# 查看节点
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 55m v1.33.1
minikube-m02 Ready <none> 70s v1.33.1

$ minikube node list
minikube 192.168.49.2
minikube-m02 192.168.49.3

# 停止节点
$ minikube node stop minikube-m02
✋ 正在停止节点 "minikube-m02" ...
🛑 正在通过 SSH 关闭“minikube-m02”…
🛑 成功停止节点 minikube-m02

# 启动节点
$ minikube node start minikube-m02
👍 在集群中 "minikube" 启动节点 "minikube-m02" worker
🚜 正在拉取基础镜像 v0.0.47 ...
🔄 正在为"minikube-m02"重启现有的 docker container ...
🐳 正在 Docker 28.1.1 中准备 Kubernetes v1.33.1…
🔎 正在验证 Kubernetes 组件...
🌟 启用插件:
😄 成功启动节点 minikube-m02!

# 删除节点
$ minikube node delete minikube-m02
🔥 正在从集群 minikube 中删除节点 minikube-m02
✋ 正在停止节点 "minikube-m02" ...
🛑 正在通过 SSH 关闭“minikube-m02”…
🔥 正在删除 docker 中的“minikube-m02”…
💀 节点 minikube-m02 已成功删除。
  • 停止集群: 此时只是停止容器

1
2
3
4
$ minikube stop
✋ 正在停止节点 "minikube" ...
🛑 正在通过 SSH 关闭“minikube”…
🛑 1 个节点已停止
  • 删除集群: 删除容器及其配置

1
2
3
4
5
$ minikube delete
🔥 正在删除 docker 中的“minikube”…
🔥 正在删除容器 "minikube" ...
🔥 正在移除 /home/centos/.minikube/machines/minikube…
💀 已删除所有关于 "minikube" 集群的痕迹。