从零搭建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集群的搭建,并掌握了常见问题的排查方法。下一步建议:

  1. 部署Metrics Server实现资源监控

  2. 配置Ingress Controller(如Nginx)暴露服务

  3. 使用Rancher或Kubesphere简化管理

问题交流:你在搭建集群时还遇到过哪些问题?欢迎评论区留言!


附录:常用命令速查


# 查看集群状态  

kubectl get cs  



# 查看Pod详情  

kubectl describe pod <pod-name> -n <namespace>  



# 强制删除卡住的Pod  

kubectl delete pod <pod-name> --grace-period=0 --force  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linlichaoblms

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值