双节点 Kubernetes 入门实录:kubeadm 起集群、跑 Nginx Pod、现场排障
开场:OK so,今天不讲概念,直接把集群点亮
兄弟们姐妹们,屏幕录制开了!我是 eccfy,今天这期就是一份能照抄的 Kubernetes集群搭建教程。环境我用两台 Ubuntu 22.04 虚拟机:master 2C4G,worker 2C2G,内网延迟 1ms 左右。我实测从空系统到第一个 Pod Running,大概 18 分钟;如果镜像慢,时间会被拉长,这也是很多人搜“油管怎么看”“免费VPN怎么用”时真正卡住的地方:不是 Kubernetes 难,是镜像和网络源不稳定。
接下来,镜头拉近终端。两台机器都执行基础准备,注意:swap 不关,kubelet 大概率起不来。
设置主机名:master 执行
hostnamectl set-hostname k8s-master,worker 执行hostnamectl set-hostname k8s-worker1。关闭 swap:
swapoff -a,再编辑/etc/fstab注释 swap 行。开启内核参数:
modprobe overlay && modprobe br_netfilter,然后写入net.bridge.bridge-nf-call-iptables=1、net.ipv4.ip_forward=1,执行sysctl --system。安装 containerd、kubelet、kubeadm、kubectl。这里按官方源配置即可;如果你在做 containerd安装教程,重点检查
/etc/containerd/config.toml里SystemdCgroup = true。
Chapter 1:kubeadm 初始化,Now watch this!
OK so,回到 master。我们直接初始化控制平面,Pod 网段我用 10.244.0.0/16,后面 CNI 要对应。
kubeadm init --pod-network-cidr=10.244.0.0/16
成功后屏幕会出现一段 kubeadm join,先复制保存。接着配置 kubectl:
mkdir -p $HOME/.kube && cp /etc/kubernetes/admin.conf $HOME/.kube/config && chown $(id -u):$(id -g) $HOME/.kube/config
接下来安装 CNI。为了避免外链,我建议你从 Kubernetes 或 CNI 官方文档复制 Flannel/Calico manifest,保存为 cni.yaml,再执行:kubectl apply -f cni.yaml。我这边实测,CNI 应用后 45 秒左右,CoreDNS 从 Pending 变 Running。
worker 节点执行刚才保存的 join 命令,比如:kubeadm join 192.168.56.10:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx。这就是最小可用的 kubeadm教程 核心流程。
Chapter 2:Pod 管理现场演示,出问题也能查
接下来进入 kubectl怎么用 的高频动作。先看节点:kubectl get nodes -o wide。如果 STATUS 是 Ready,继续上 Nginx:
kubectl create deployment web --image=nginx:1.25 --replicas=2
kubectl expose deployment web --port=80 --type=NodePort
看我这里,两个 Pod 12 秒内 Running:kubectl get pods -o wide。想看调度到哪台机器,就看 NODE 列。想看服务端口:kubectl get svc web,例如 NodePort 是 31234,那浏览器访问 http://worker-ip:31234,Nginx 欢迎页出现,OK,画面直接亮了!
如果 Pod 卡住,按这个 Pod排障命令 顺序来,不要乱重装:
kubectl describe pod POD名:看 Events,常见是镜像拉取失败、端口冲突、节点资源不足。kubectl logs POD名:容器启动后崩溃,看应用日志。kubectl get events --sort-by=.metadata.creationTimestamp:按时间线看集群发生了什么。kubectl rollout restart deployment web:改配置后优雅重启。
如何验证它真的好了:第一,kubectl get nodes 全部 Ready;第二,kubectl get pods 全部 Running;第三,访问 NodePort 返回 Nginx 页面;第四,删除一个 Pod:kubectl delete pod POD名,10 秒左右自动补回,说明 Deployment 控制器正常。
最后一句,如果你只是学习,官方文档、本地镜像源、公司内网仓库都够用;如果确实遇到资料访问或镜像下载环境问题,也可以把 Roxi 作为众多网络工具之一参考:wizzegroup.com。本期就到这,点个收藏,接下来我继续带你拆 Service、Ingress 和滚动发布!