YAOTU INSIGHTS

从零搭建Kubernetes集群:CentOS 7实战指南

从零搭建Kubernetes集群:CentOS 7实战指南
1. 为什么需要从零搭建Kubernetes集群在容器编排领域Kubernetes已经成为事实上的行业标准。但大多数教程都假设你已经具备现成的云环境或基础设施这对于想要真正理解系统底层工作原理的开发者来说始终隔着一层迷雾。自己从零开始搭建集群就像亲手组装一台电脑——每个螺丝的位置、每条线路的连接方式都了然于胸这种掌控感是使用托管服务无法替代的。我最近在CentOS 7系统上完整走通了集群搭建流程过程中遇到了不少官方文档没提及的坑。本文将用最直白的语言带你一步步完成包括控制平面初始化、工作节点加入、网络插件配置等全流程。我们会使用kubeadm这个官方工具来简化操作但绝不回避任何底层细节。2. 环境准备与系统配置2.1 硬件资源规划生产环境通常需要至少三个控制平面节点实现高可用但为了演示目的我们先采用最简单的单控制平面架构。以下是推荐的最低配置节点类型CPU内存磁盘数量控制平面(master)2核2GB40GB1工作节点(node)1核1GB30GB2实际测试发现master节点内存低于2GB时kube-apiserver会频繁崩溃。如果只是学习用途可以适当降低配置但不要低于1核1GB。2.2 操作系统基础配置所有节点需要统一进行以下准备工作# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 禁用SELinux setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config # 关闭swap swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab # 设置主机名解析 cat EOF /etc/hosts 192.168.1.100 k8s-master 192.168.1.101 k8s-node1 192.168.1.102 k8s-node2 EOF关键细节说明关闭swap是因为kubelet在设计上假设节点资源不受swap影响主机名解析建议同时写入/etc/cloud/cloud.cfg防止云主机重启后被覆盖时间同步必须配置否则证书验证会失败yum install -y ntpdate ntpdate time.windows.com3. 容器运行时与Kubernetes组件安装3.1 Docker安装与配置虽然Kubernetes已经支持containerd等轻量级运行时但Docker仍然是调试最方便的选择# 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装指定版本较新版本可能不兼容 yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io # 配置cgroup驱动为systemd mkdir /etc/docker cat /etc/docker/daemon.json EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOF # 启动服务 systemctl enable --now docker遇到过docker日志撑爆磁盘的情况建议定期清理find /var/lib/docker/containers -type f -name *.log -delete3.2 安装kubeadm/kubelet/kubectl配置Kubernetes官方源cat EOF /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF安装指定版本组件yum install -y kubelet-1.20.5 kubeadm-1.20.5 kubectl-1.20.5 systemctl enable --now kubelet版本选择建议1.20.x是当前较稳定的版本生产环境应避免使用最新版本如1.25因为很多周边生态可能还未适配4. 控制平面初始化4.1 初始化master节点在k8s-master上执行kubeadm init \ --apiserver-advertise-address192.168.1.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.20.5 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16参数解析--apiserver-advertise-address指定API服务器监听的IP使用阿里云镜像仓库加速下载明确指定与安装版本一致的Kubernetes版本service和pod的CIDR不要与现有网络冲突成功后会输出类似如下信息Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config4.2 配置kubectl认证执行上述提示命令后验证集群状态kubectl get nodes # 应看到master节点状态为NotReady因为还没装网络插件常见问题处理如果出现The connection to the server localhost:8080 was refused说明kubectl配置未生效检查~/.kube/config文件权限是否为当前用户所有5. 网络插件部署5.1 安装Calico网络选择Calico作为CNI插件kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml部署后可以通过以下命令观察进度watch kubectl get pods -n kube-system # 等待所有pod变为Running状态网络问题排查技巧如果pod一直处于ContainerCreating状态kubectl describe pod name查看事件常见原因是镜像拉取失败可以手动docker pull然后重新部署6. 工作节点加入集群6.1 获取加入令牌在master节点执行kubeadm token create --print-join-command # 会输出类似 kubeadm join 192.168.1.100:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx6.2 在工作节点执行加入命令在k8s-node1和k8s-node2上分别运行master提供的join命令kubeadm join 192.168.1.100:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx加入成功后在master节点验证kubectl get nodes # 应看到三个节点状态均为Ready节点加入失败排查检查节点间网络是否互通ping/telnet 6443端口确认token是否过期默认24小时有效期查看节点kubelet日志journalctl -u kubelet -f7. 集群功能验证7.1 部署测试应用创建一个Nginx部署kubectl create deployment nginx --imagenginx:1.19 kubectl expose deployment nginx --port80 --typeNodePort访问测试kubectl get svc nginx # 获取NodePort端口如30xxx curl http://任意节点IP:NodePort7.2 核心组件监控查看集群健康状态kubectl get componentstatus # 所有组件应为Healthy8. 生产环境进阶配置8.1 证书自动续期默认证书有效期为1年配置自动续期kubeadm alpha certs renew all # 或者在kubeadm配置中添加 # apiServer: # certSANs: # - your-domain.com8.2 节点维护与隔离安全下线节点kubectl drain node-name --ignore-daemonsets # 维护完成后重新加入 kubectl uncordon node-name9. 常见问题速查表问题现象可能原因解决方案kubelet不断重启内存不足增加swap或减少节点负载Pod网络不通网络插件未正确安装重新应用Calico配置镜像拉取失败仓库认证问题配置imagePullSecrets节点NotReadykubelet未运行systemctl restart kubelet10. 性能调优建议调整kubelet参数--max-pods50默认110可能过高配置合理的Pod资源请求/限制使用Local SSD作为docker存储驱动定期执行kubectl delete pod --field-selectorstatus.phaseSucceeded清理已完成pod我在实际部署中发现CentOS 7的默认内核参数可能需要调整才能获得最佳网络性能。建议在/etc/sysctl.conf中添加net.ipv4.tcp_tw_reuse 1 net.ipv4.ip_local_port_range 1024 65000 net.core.somaxconn 32768