Kubernetes 适合管理多节点、多服务、可扩缩容的容器应用。小项目不一定需要 K8s;如果只是单机部署,Docker Compose、1Panel 或普通 systemd 可能更简单。
基础组件
| 组件 | 作用 |
|---|---|
kubeadm |
初始化或加入集群 |
kubelet |
节点上的核心代理,负责运行 Pod |
kubectl |
命令行管理工具 |
containerd |
常用容器运行时 |
| CNI | Pod 网络插件,例如 Calico、Flannel |
| Ingress Controller | HTTP/HTTPS 入口控制 |
Kubernetes 现在通过 CRI 对接容器运行时。Docker Engine 本身不直接实现 CRI,如果要用 Docker,需要额外组件;生产和学习环境更常见的选择是 containerd。
节点准备
每个节点都建议先检查:
1 | hostnamectl |
关闭 swap:
1 | sudo swapoff -a |
还要从 /etc/fstab 移除或注释 swap 挂载,否则重启后会恢复。
加载内核模块:
1 | cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
内核参数:
1 | cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf |
containerd 检查
安装并启动后检查:
1 | sudo systemctl status containerd |
如果 kubelet 和 containerd 的 cgroup driver 不一致,集群初始化很容易失败。systemd 系统通常建议使用 SystemdCgroup = true。
常见配置位置:
1 | /etc/containerd/config.toml |
改完后:
1 | sudo systemctl restart containerd |
安装 kubeadm、kubelet、kubectl
官方仓库按 Kubernetes 小版本区分。示例使用 v1.36,实际要按官方文档和目标集群版本替换。
1 | KUBE_VERSION=v1.36 |
如果你用的不是 Debian/Ubuntu,按官方文档切换到对应系统的安装方式。
初始化控制平面
示例:
1 | sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
--pod-network-cidr 要和 CNI 插件匹配。Flannel、Calico 的推荐网段不一定一样,不要随手复制。
初始化完成后配置 kubectl:
1 | mkdir -p $HOME/.kube |
查看节点:
1 | kubectl get nodes |
安装 CNI 后,节点才会从 NotReady 变成 Ready。
工作节点加入
控制平面初始化完成后会输出 kubeadm join 命令。忘记后可以重新生成:
1 | kubeadm token create --print-join-command |
在工作节点执行输出的 join 命令。
常用 kubectl
1 | kubectl get nodes -o wide |
进入容器:
1 | kubectl exec -it pod_name -n namespace -- sh |
常见报错
| 报错 | 常见原因 | 处理方向 |
|---|---|---|
preflight 提示 swap |
swap 未关闭 | swapoff -a 并修改 /etc/fstab |
container runtime is not running |
containerd 未启动或 CRI 配置异常 | 查 containerd 和 crictl info |
kubelet is not running |
kubelet 配置、cgroup、运行时异常 | journalctl -u kubelet |
节点 NotReady |
CNI 未安装或网络异常 | kubectl get pods -A、看 CNI Pod |
ImagePullBackOff |
镜像名、tag、仓库权限或网络问题 | kubectl describe pod |
CrashLoopBackOff |
容器启动后反复崩溃 | kubectl logs --previous |
Pending |
资源不足、PVC 未绑定、调度规则不满足 | kubectl describe pod |
| Ingress 不通 | Ingress Controller、Service、DNS、证书配置问题 | 从 Pod、Service、Ingress 逐层查 |
排查顺序
kubectl get nodes看节点。kubectl get pods -A看系统组件。kubectl describe看事件。kubectl logs看容器日志。- 到节点上看
kubelet、containerd、磁盘和网络。 - 最后再改 YAML,不要一上来就重装集群。