从零搭建Kubernetes集群:常见踩坑与解决方案
前言
Kubernetes(K8s)已成为容器编排的事实标准,但手动搭建集群时总会遇到各种“坑”。本文将从零开始,使用kubeadm搭建一个双节点集群(1 Master + 1 Worker),并总结网络插件选择、证书过期、镜像拉取失败等典型问题的解决方案。
环境准备
- 主机配置:
- Master节点:2核CPU/4GB内存/20GB磁盘(CentOS 7.9)
- Worker节点:2核CPU/2GB内存/20GB磁盘(CentOS 7.9)
- 关键工具:
- Docker 20.10+
- kubeadm 1.28+
- kubectl 1.28+
📌 所有节点需执行以下操作:
1. 关闭防火墙与SELinux
systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2. 配置内核参数与模块
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 加载overlay和br_netfilter模块 modprobe overlay && modprobe br_netfilter
3. 安装Docker与kubeadm
# 安装Docker yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable docker && systemctl start docker # 添加kubeadm源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF # 安装工具 yum install -y kubeadm kubectl kubelet systemctl enable kubelet
初始化Master节点
在Master节点执行:
kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ # 替换为Master节点IP --image-repository registry.aliyuncs.com/google_containers \ # 使用阿里云镜像 --kubernetes-version v1.28.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
成功输出后,按提示操作:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件(Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
⚠️ 如果Pod网络CIDR不是
10.244.0.0/16
,需修改Calico的YAML中的CALICO_IPV4POOL_CIDR
字段。
加入Worker节点
在Worker节点执行Master初始化后输出的kubeadm join
命令,例如:
kubeadm join 192.168.1.100:6443 --token abcdef.1234567890 \ --discovery-token-ca-cert-hash sha256:xxxxxx
验证节点状态:
kubectl get nodes # 预期输出(STATUS为Ready即成功) NAME STATUS ROLES AGE VERSION master-1 Ready control-plane 10m v1.28.0 worker-1 Ready <none> 5m v1.28.0
常见问题与解决方案
1. kubeadm init卡在pull image
步骤
原因:默认镜像仓库k8s.gcr.io
国内无法访问。
解决:
-
使用阿里云镜像仓库:
--image-repository registry.aliyuncs.com/google_containers
-
手动拉取镜像后重试:
```bash
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
```
2. Worker节点加入集群时报connection refused
原因:Master节点的6443端口未开放或防火墙未关闭。
解决:
- 检查Master节点防火墙规则:
```bash
iptables -L | grep 6443
```
- 开放端口(临时):
```bash
iptables -I INPUT -p tcp --dport 6443 -j ACCEPT
```
3. CoreDNS/Canal Pod一直处于Pending
状态
原因:未正确安装网络插件或Pod CIDR冲突。
解决:
-
确认网络插件已安装:
kubectl get pods -n kube-system
-
检查节点是否被标记为不可调度:
```bash
kubectl describe node | grep -i taint
# 如有NoSchedule污点,去除:
kubectl taint nodes node-role.kubernetes.io/control-plane-
```
4. 证书过期导致kubectl无法连接
原因:kubeadm默认证书有效期为1年。
解决:
- 更新证书:
```bash
kubeadm certs renew all
# 重启kube-apiserver等组件
docker restart $(docker ps | grep kube-apiserver | awk ‘{print $1}’)
```
总结
通过本文,你已完成了一个最小化K8s集群的搭建,并掌握了常见问题的排查方法。下一步建议:
-
部署Metrics Server实现资源监控
-
配置Ingress Controller(如Nginx)暴露服务
-
使用Rancher或Kubesphere简化管理
问题交流:你在搭建集群时还遇到过哪些问题?欢迎评论区留言!
附录:常用命令速查
# 查看集群状态 kubectl get cs # 查看Pod详情 kubectl describe pod <pod-name> -n <namespace> # 强制删除卡住的Pod kubectl delete pod <pod-name> --grace-period=0 --force