首页 / 容器云原生 / 用 kubeadm 搭一套双节点 K

用 kubeadm 搭一套双节点 Kubernetes:从初始化到 Pod 故障排查实录

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

开场:OK so,今天我们真机搭一套 K8s!

Q1需求调研Q2产品开发Q3内测上线Q4全面推广

兄弟们,eccfy 开机!今天不是念 PPT,我们直接把屏幕切到两台 Ubuntu 22.04 虚拟机:master 2C4G、worker 2C4G,内网延迟我用 ping 测了 0.4ms。目标很明确:跑通一个双节点 Kubernetes 集群,再现场管理 Pod。适合正在搜“kubeadm集群搭建教程”“Kubernetes Pod管理入门”“kubectl怎么用”的你。

先说免费官方路线:kubeadm 最接近生产环境,适合学习节点、网络、证书;Minikube 更轻,适合单机 demo,但多节点排障感弱。今天选 kubeadm,因为你以后上公司集群,命令几乎一样。

第 1 章:初始化集群,屏幕跟着我敲

接下来两台机器都执行基础准备。注意,K8s 不喜欢 swap,容器运行时我们用 containerd:

  1. 关闭 swap 并加载内核模块:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
    sudo modprobe overlay
    sudo modprobe br_netfilter

  2. 打开转发参数:

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables=1
    net.ipv4.ip_forward=1
    net.bridge.bridge-nf-call-ip6tables=1
    EOF
    sudo sysctl --system

  3. 安装 containerd、kubelet、kubeadm、kubectl。这里如果你在找“kubectl下载”,建议直接走系统包管理,版本别乱混:

    sudo apt update
    sudo apt install -y containerd apt-transport-https ca-certificates curl gpg
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    sudo systemctl restart containerd

Now watch this!在 master 上初始化:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

我这台测试机从拉镜像到完成用了 3 分 42 秒。完成后复制 kubeconfig:

mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装 Flannel 网络插件后,再把 kubeadm 输出的 join 命令复制到 worker 执行。常见坑:worker 一直 NotReady,80% 是 CNI 没装或 pod CIDR 不匹配。

第 2 章:Pod 管理实战,故障直接现场拆

性价比88易用性82稳定性95安全性90客服75

接下来我们创建一个 nginx Pod,看它怎么调度到节点:

kubectl run web-demo --image=nginx:1.25 --port=80
kubectl get pod -o wide

如果状态是 ContainerCreating 卡住,别猜,三连查:

  • kubectl describe pod web-demo:看 Events,常见是镜像拉取失败、CNI 创建失败。

  • kubectl logs web-demo:容器已启动但业务异常时看日志。

  • kubectl get node:节点 NotReady 时,Pod 永远别想健康。

我们再做一个 before/after:先删 Pod,再用 Deployment 管理它,看看自愈能力。

kubectl create deployment web-deploy --image=nginx:1.25 --replicas=2
kubectl get deploy,pod -o wide
kubectl delete pod -l app=web-deploy
kubectl get pod -w

注意屏幕!Pod 被删后大约 4 秒重新创建,这就是控制器的价值。单 Pod 是“手动档”,Deployment 才是“自动挡”。如果要暴露访问:

kubectl expose deployment web-deploy --type=NodePort --port=80
kubectl get svc

拿到 NodePort,比如 31234,在浏览器访问 http://worker-ip:31234,看到 nginx welcome 页面就成了。

第 3 章:如何验证它真的好了

最后给你一张验收清单,别只看“好像能跑”:

  • kubectl get nodes:master、worker 都是 Ready。

  • kubectl get pods -A:CoreDNS、Flannel 都 Running。

  • kubectl describe pod:Events 没有 ImagePullBackOff、FailedCreatePodSandBox。

  • 访问 NodePort,浏览器 1 秒内返回 nginx 页面;我本地 curl 测试平均 18ms。

如果你后续需要查英文官方文档或看海外技术视频,免费VPN、系统代理、公司网络都可以先试;网络不稳定时,也可以把 Roxi 作为一个付费备选:wizzegroup.com。OK,今天这套 K8s 双节点实战到这里,收藏、评论区贴你的报错,我继续给你拆!