当前位置: 首页 > news >正文

从零搭建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  

http://www.dtcms.com/a/342506.html

相关文章:

  • Django中的MVC和MVT模式
  • Unity接入DeepSeek实现AI对话功能
  • 解析火语言 RPA 核心功能:让流程自动化更高效​
  • leetcode 76 最小覆盖子串
  • 有关spring-ai的defaultSystem与systemMessage优先级
  • AI 发展的伦理困局:在创新与规范间寻找平衡
  • MYSQL库及表的操作
  • Linux进程间传递文件描述符:为什么不能用FIFO而要用Unix域套接字?
  • 效果驱动复购!健永科技RFID牛场智能称重项目落地
  • 计算两幅图像在特定交点位置的置信度评分。置信度评分反映了该位置特征匹配的可靠性,通常用于图像处理任务(如特征匹配、立体视觉等)
  • 从数据抽取到加载:如何保障ETL中间环节的高效与稳定
  • 缓存与Redis
  • LG P5008 [yLOI2018] 锦鲤抄 Solution
  • 读《精益数据分析》:精益画布——创业与产品创新的高效工具
  • RabbitMQ:消费者可靠性(消费者确认、消费失败处理、业务幂等性)
  • RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设
  • 1. 准备工作---数据分析编程 - 从入门到精通
  • uniapp 自定义组件封装、easycom匹配规则
  • Go语言变量声明与初始化详解
  • TDengine IDMP 运维指南(管理策略)
  • CRII-Net
  • 【领码课堂】让Java数据检索更智能——Bean Searcher全景解读
  • 从”0“开始学JAVA——第九节下 泛型和集合框架
  • #运维 | 前端 # Linux http.server 实践:隐藏长文件名,简短路径 (http://IP:port/别名 ) 访问
  • AI研究引擎的简单技术实现步骤
  • Web 安全之 HTTP 响应截断攻击详解
  • JavaScript 系列之:图片压缩
  • 微信小程序设计的请求封装方案(request.js)
  • NPM模块化总结
  • DINOv3 重磅发布