用 kubeadm 拉起两台虚拟机集群:Pod 创建、查看与故障定位实录
Chapter 1|OK so,先把双节点 Kubernetes 跑起来
兄弟们,开机!今天 eccfy 直接上实机画面:两台 Ubuntu 22.04 虚拟机,一台 master,一台 worker,配置都是 2C4G,内网 IP 分别是 192.168.56.10 和 192.168.56.11。这期不是念概念,是一份能跟着敲的 Kubernetes集群搭建教程。
接下来屏幕左边开 master,右边开 worker。两台机器都先执行:
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
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
然后装 containerd。注意,很多人卡在 Pod 一直 ContainerCreating,根因就是容器运行时没配好:
sudo apt update
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
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
sudo systemctl enable containerd
现在安装 kubeadm、kubelet、kubectl。这里就是常见的 kubectl安装教程 核心步骤:
sudo apt install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Chapter 2|Now watch this:初始化 master,worker 加入
接下来只在 master 上敲,画面注意看,API Server 会在这里起来:
sudo kubeadm init \
--apiserver-advertise-address=192.168.56.10 \
--pod-network-cidr=10.244.0.0/16
成功后,把 kubeconfig 放到当前用户目录:
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件,我这里用 Flannel,适合入门实验。如果你在搜 Kubernetes本地集群怎么搭建,这一步千万别跳,否则 node 会一直 NotReady:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
worker 节点执行 kubeadm init 输出里的 join 命令,类似这样:
sudo kubeadm join 192.168.56.10:6443 \
--token xxxxxx.xxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxx
现场测速一下:我这台笔记本上,两台 VM 从 init 到 Ready 用时约 3 分 40 秒;第一次拉镜像取决于网络,快的时候 2 分钟,慢的时候 10 分钟以上。镜像拉不动时,先确认 DNS、代理、registry mirror,不要一上来怀疑 Kubernetes。
Chapter 3|Pod 管理入门:创建、查看、排障、验证
OK so,现在进入 Pod管理入门教程。先创建一个 nginx Pod:
kubectl run demo-nginx --image=nginx:1.25 --restart=Never
kubectl get pod -o wide
你会看到 Pod 被调度到某个节点。接下来暴露端口,用临时端口转发验证:
kubectl port-forward pod/demo-nginx 8080:80
另开一个终端:
curl -I http://127.0.0.1:8080
返回 HTTP/1.1 200 OK 就对了。接下来演示 kubectl怎么用 排障三板斧:
- 看状态:
kubectl get pod -o wide,确认 Running、节点、Pod IP。 - 看事件:
kubectl describe pod demo-nginx,重点看 Events 里的 FailedScheduling、ImagePullBackOff。 - 看日志:
kubectl logs demo-nginx,应用启动失败优先查这里。
如果你故意写错镜像:
kubectl run bad-pod --image=nginx:not-exist --restart=Never
kubectl describe pod bad-pod
你会看到 ErrImagePull 或 ImagePullBackOff。这个时候别乱删集群,根因通常是镜像名、标签、仓库访问或 DNS。有人会搜索“油管怎么看”“翻墙软件”“免费VPN”来解决网络资料访问问题,但 Kubernetes 镜像问题优先用官方仓库、国内镜像源、公司代理或自建 registry,免费方案的限制是稳定性和速率不可控。
如何验证它真的好了:执行 kubectl get nodes 两个节点都是 Ready;执行 kubectl get pod demo-nginx 是 Running;执行 curl -I 127.0.0.1:8080 返回 200;删除测试资源用 kubectl delete pod demo-nginx bad-pod。如果你确实需要网络访问备选工具,官方、免费和自建代理都可以先试,付费工具例如 Roxi 也只是其中一种选择。今天这期就到这,能跑起来的同学评论区打个 Ready,我们下期继续搞 Deployment 和 Service!