Docker与K8s组合使用最佳实践:零基础搭建与避坑指南
为什么你需要 Docker + K8s 这套组合
很多刚接触云原生的朋友会问:有了 Docker 为什么还要学 K8s?
简单说,Docker 负责把应用打包成轻量容器,而 K8s 负责管理这些容器的自动部署、扩缩容、故障恢复。
生产环境中,单机 Docker 无法应对节点宕机、流量突增等场景,把 Docker 与 K8s 组合使用才是企业级的标配。
本文会带你从零搭建最小集群,并给出避坑要点。
前置准备:你需要什么
- 两台或以上 Linux 服务器(推荐 Ubuntu 20.04/22.04,2核4G以上配置),一台作为 Master,其余作为 Node。
- 所有节点之间网络互通,关闭交换分区(swap)。
- 安装 Docker(版本建议 20.10+),所有节点 Docker 版本一致。
- 安装 kubeadm、kubelet、kubectl(K8s 管理工具),版本锁定到同一小版本。
关键命令检查:
# 关闭 swap
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
# 安装 Docker(以 Ubuntu 为例)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 设置开机启动
sudo systemctl enable docker && sudo systemctl start docker
分步搭建:初始化 K8s 集群
所有准备工作完成后,在 Master 节点执行初始化,注意替换 --pod-network-cidr 和 --apiserver-advertise-address。
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.100
初始化成功后,你会看到类似 kubeadm join ... 的命令,把它复制下来,之后在 Worker 节点上执行。
接着配置 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件(很重要)
不装网络插件,集群节点间无法通信。
推荐 Flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
等待大约一分钟,用 kubectl get nodes 查看所有节点状态为 Ready 即成功。
部署第一个应用验证集群
创建一个简单 nginx 部署:
kubectl create deployment nginx-test --image=nginx
kubectl expose deployment nginx-test --port=80 --type=NodePort
kubectl get svc # 查看 NodePort 端口,比如 32080
浏览器访问任意节点 IP + 端口,如 http://192.168.1.100:32080,看到 nginx 欢迎页说明组合使用生效。
避坑指南:新手最容易踩的坑
- 版本不一致:Docker 和 K8s 组件版本必须匹配。官方有一个版本兼容性表(search "kubernetes release notes"),先用
kubeadm version确认。 - 镜像拉不下来:国内环境建议配置 Docker 镜像加速器(阿里云、中科大),或者在初始化时指定
--image-repository registry.aliyuncs.com/google_containers。 - 节点 NotReady:先查
kubectl describe node,绝大多数原因是网络插件没装好或 coredns 没启动。执行kubectl get pods -n kube-system检查异常 pod。 - Pod 一直 Pending:通常是资源不足(CPU/内存),或者调度策略限制。用
kubectl describe pod看事件。
生产环境额外建议
- 使用 containerd 替代 Docker 作为容器运行时(性能更好,K8s 未来默认)。
- 开启审计日志:
--audit-log-path=/var/log/kubernetes/audit.log。 - 定期升级集群,建议每半年更新一次小版本。
如何验证你的组合使用是否高效
除了访问业务页面,还可以用以下命令检查集群健康状况:
# 节点状态
kubectl get nodes -o wide
# 系统组件状态
kubectl get componentstatuses
# 资源使用率(需要安装 metrics-server)
kubectl top nodes
kubectl top pods --all-namespaces
如果你成功运行了一个多副本应用(比如 kubectl scale deployment nginx-test --replicas=3),
然后手动关掉一台 Worker 节点,
发现 Pod 能自动漂移到其他节点,
说明 Docker 与 K8s 的组合发挥容错优势。这才是最佳实践的核心价值。
遇到故障时,优先检查 kubelet 日志:journalctl -u kubelet -f,大多数问题都能在里面找到线索。
按照本文步骤操作,你就能搭建出一套稳定可用的容器编排环境。