K8s零基础集群搭建实战:从三台CentOS开始
很多新手提到K8s集群搭建就觉得门槛高,其实只要理清准备工作和执行顺序,跟着命令行一步步操作,三台虚拟机就能跑起来一套完整的Kubernetes环境。
本文围绕K8s零基础集群搭建实战,帮你跳过常见的坑,直接拿到可验证的结果。
准备工作:硬件、系统和网络规划
建议准备三台CentOS 7.9虚拟机,每台分配2核CPU、4GB内存和50GB磁盘。操作系统要求Linux内核版本3.10以上(CentOS 7默认符合)。防火墙和SELinux需要关闭或做兼容配置,否则kubeadm初始化会报错。
先确保三台机器能互相通信,主机名和IP映射写入/etc/hosts。示例:
192.168.1.10 master
192.168.1.11 node1
192.168.1.12 node2
所有节点需要关闭交换分区,因为kubelet必须关闭swap才能正常工作。
执行以下命令并注释/etc/fstab中swap行后重启:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
另外,需要配置Docker和K8s的yum源,建议使用阿里云镜像加速。
核心步骤:安装容器运行时并用kubeadm初始化集群
1. 安装Docker(所有节点)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
2. 安装kubeadm、kubelet和kubectl(所有节点)
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
3. 主节点初始化(仅在master执行)
kubeadm init --apiserver-advertise-address=192.168.1.10 --pod-network-cidr=10.244.0.0/16
这里--pod-network-cidr指定Pod网络地址范围,后续安装Flannel时需要一致。
初始化成功后屏幕会输出kubeadm join命令,请复制保存,后面工作节点需要用。
接着配置kubectl环境:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4. 安装Pod网络插件(Flannel)
在主节点执行:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
等待几分钟后,kubectl get pods -n kube-system可以看到flannel相关Pod状态变为Running。
5. 工作节点加入集群
在node1和node2上执行刚才保存的kubeadm join命令,如果当时没保存,可以在master上通过kubeadm token create --print-join-command重新生成。
加入成功后,主节点执行kubectl get nodes看到所有节点Ready即初步完成。
新手最容易踩的坑
坑一:初始化时提示"kubelet isn't running"。 原因是swap未完全关闭或/etc/fstab中注释不彻底。
检查free -h确认swap为0,并查看/etc/fstab中h没有swap相关行。
坑二:flannel一直处于Pending。 通常因为Pod网络CIDR与初始化时指定的不一致。
检查/etc/cni/net.d/目录下的配置文件,如果flannel自动生成的CIDR是10.244.0.0/16,而初始化用的是其他网段,则需修改flannel配置或重做初始化。
坑三:节点状态显示NotReady。 使用kubectl describe node 查看Conditions,常见原因是CNI插件未就绪或kubelet无法拉取镜像。
检查各节点能否访问registry.k8s.io,如果不行请配置镜像代理。
坑四:kubectl命令提示"Unable to connect to the server: dial tcp...". 可能是kubeconfig文件权限或路径不对。
重新执行mkdir -p $HOME/.kube && cp -i /etc/kubernetes/admin.conf $HOME/.kube/config。
部署一个Nginx验证集群可用性
用命令创建一个简单的Deployment来验证集群能否正常工作:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
查看Pod是否运行:
kubectl get pods
查看服务暴露出的NodePort端口:
kubectl get svc nginx
拿到端口号(例如30080),在浏览器访问任意节点的IP加端口,比如http://192.168.1.10:30080,如果看到Nginx默认欢迎页,说明整个集群搭建成功。
如果你正在处理K8s零基础集群搭建实战,建议先按本文步骤完整执行一遍,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分,大多数报错都能在本教程中找到对应解法。