kubeadm + containerd + calico
完整安装流程
0. 清理旧环境(非常重要)
如果你之前用 Docker 试过 Kubernetes,那必须先完全移除相关配置
- 停止 kubelet、Docker、cri-dockerd(如果有)
sudo systemctl stop kubelet
sudo systemctl stop docker
sudo systemctl stop cri-docker cri-docker.socket 2>/dev/null
- 移除 cri-dockerd(如果有)
yay -Rns cri-dockerd-bin
- 移除 Docker(可选)
sudo pacman -Rns docker docker-cli docker-buildx 2>/dev/null
- 重置 kubeadm(如果之前尝试过)
sudo kubeadm reset -f
sudo rm -rf /etc/cni/net.d
sudo rm -rf /etc/kubernetes
1. 安装 Kubernetes 组件(AUR 官方二进制版)
yay -S kubeadm-bin kubelet-bin kubectl-bin
2. 安装 containerd(Kubernetes 推荐运行时)
sudo pacman -S containerd
3. 配置 containerd(必须,否则 kubeadm 会卡死)
生成默认配置
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
编辑 /etc/containerd/config.toml
- 找到:
SystemdCgroup = false
- 改成:
SystemdCgroup = true
-
若未找到
SystemdCgroup = false- 则在
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]配置下 - 添加
SystemdCgroup = true配置项
- 则在
-
这是 kubeadm 官方要求的 cgroup driver
重启 containerd
sudo systemctl enable --now containerd
sudo systemctl restart containerd
4. 关闭 swap(kubeadm 必须)
关闭 swap
sudo swapoff -a
永久禁用
- 注释掉 swap 行
sudo vim /etc/fstab
- 或者去掉 swap 行
sudo sed -i '/swap/d' /etc/fstab
验证修改
cat /proc/swaps
- 输出内容必须为空
5. 启动 kubelet(它会报错,正常)
sudo systemctl enable --now kubelet
- kubelet 现在会循环报错,因为还没 init 这完全正常
6. 初始化 Kubernetes(使用 containerd 的 CRI)
pod 网络段必须与 Calico 一致:192.168.0.0/16
执行
sudo kubeadm init \
--cri-socket=unix:///run/containerd/containerd.sock \
--pod-network-cidr=192.168.0.0/16
- 完成后会看到
Your Kubernetes control-plane has initialized successfully!
- 这就表示成功
7. 配置 kubectl(普通用户使用)
配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证配置
kubectl get nodes
- 节点是
NotReady(正常,因为 CNI 还没装)
8. 安装 Calico 网络
Calico 推荐 IP 池为 192.168.0.0/16(我们 init 时也用了这个)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/calico.yaml
等几分钟
kubectl get pods -n kube-system
kubectl get nodes
- 当所有 pods 变成
Running,节点变成Ready后,说明 Calico 已经生效,集群完全正常
完成!你现在有一个完全干净、稳定的 kubeadm + containerd + Calico 集群
可视化界面
1. 使用官方 Web UI:Kubernetes Dashboard
安装 Kubernetes 专用包管理器
sudo pacman -S helm
部署 Dashboard
- 添加 kubernetes-dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
- 安装 Dashboard
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
创建管理员用户(必须)
- 创建配置文件
dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
- 应用配置
kubectl apply -f dashboard-admin.yaml
获取登录 Token
kubectl -n kubernetes-dashboard create token admin-user
- 复制这个 Token
启动本地代理(可选,推荐)
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
打开 Web UI
- 很多代理 / 科学上网客户端会劫持 https,然后自己去解析域名
- 对于 localhost 或 10.x.x.x 这种地址,有些代理会处理得很奇怪,导致 “name resolution failed”
- 可以尝试关掉 代理插件 / 系统代理 再访问
-
浏览器打开 https://localhost:8443
- 粘贴 Token 登录即可
-
如果不启动本地代理,则先使用以下命令查看
kubernetes-dashboard-kong-proxy的CLUSTER-IP- 浏览器打开
https://<CLUSTER-IP>:443<CLUSTER-IP>换成kubernetes-dashboard-kong-proxy的CLUSTER-IP
- 粘贴 Token 登录即可
- 浏览器打开
kubectl -n kubernetes-dashboard get svc
2. 使用 Lens(可选,推荐)
Lens 是一款可视化桌面应用,类似于 docker-desktop
安装应用
yay -S lens-bin
- 注册并登录账户后即可使用
命令行容器管理工具
在 Kubernetes 环境下,使用 Docker 风格的命令,管理给 containerd 用的镜像
1. 安装 nerdctl
yay -S nerdctl
2. 使用 nerdctl
常用功能
| 功能 | nerdctl | docker |
|---|---|---|
| 列出容器 | nerdctl ps | docker ps |
| 拉镜像 | nerdctl pull | docker pull |
| 构建镜像 | nerdctl build | docker build |
| 运行容器 | nerdctl run | docker run |
| 查看日志 | nerdctl logs | docker logs |
| 推送镜像 | nerdctl push | docker push |
还有更多的功能,Docker 命令怎么写,nerdctl 命令就怎么写
本地构建并使用镜像
nerdctl build -t myimage:latest .
kubectl apply ...
- 镜像必须在 containerd 的
k8s.ionamespace 下,k8s 才能使用
查看 containerd namespace(重要概念)
containerd 支持多 namespace
- k8s 默认使用:
k8s.io
- 列出 namesapce
nerdctl namespace ls
- 切换 namespace(非常重要)
nerdctl -n k8s.io images
nerdctl -n k8s.io ps
- 把镜像直接放进 k8s 使用
nerdctl -n k8s.io build -t myimage:v1 .
- 把已经 build 好的镜像转移到 k8s.io
nerdctl save -o hello.tar hello:v1
nerdctl -n k8s.io load -i hello.tar
常见验证命令
查看控制平面是否全部正常
kubectl get pods -n kube-system -o wide
查看节点状态
kubectl get nodes -o wide
测试 pod 网络
kubectl run test --image=busybox -it -- sh
# 在 Pod 中:
ping 8.8.8.8