CentOS 7下Kubernetes集群部署与优化指南
1. CentOS 7环境下Kubernetes集群部署全指南
在传统运维向云原生转型的大背景下,Kubernetes(简称K8S)已成为容器编排的事实标准。作为企业级Linux发行版的代表,CentOS 7因其稳定性和长期支持特性,成为部署生产级K8S集群的常见选择。本文将基于最新1.28版本,详解在CentOS 7.9系统上搭建生产可用K8S集群的全流程,涵盖从系统准备到网络插件配置的完整技术栈。
特别提示:CentOS 7已进入维护周期,建议新部署环境考虑CentOS Stream或Rocky Linux等替代方案。若必须使用CentOS 7,请确保系统更新至最新补丁。
1.1 基础环境准备
标准化的系统环境是集群稳定的前提。建议使用最小化安装的CentOS 7.9系统,配置要求如下:
- 硬件规格:
- Master节点:2核CPU/4GB内存/50GB磁盘(生产环境建议翻倍)
- Worker节点:根据工作负载动态扩展
- 网络要求:
- 各节点间全互通
- 关闭防火墙或放行6443、2379-2380等关键端口
- 禁用SELinux(临时方案:
setenforce 0)
关键初始化操作:
# 设置主机名解析(所有节点) cat >> /etc/hosts <<EOF 192.168.1.10 k8s-master 192.168.1.11 k8s-node1 192.168.1.12 k8s-node2 EOF # 关闭swap(永久生效需修改/etc/fstab) swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 加载内核模块 cat > /etc/modules-load.d/k8s.conf <<EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF modprobe -- $(cat /etc/modules-load.d/k8s.conf)1.2 容器运行时选型与配置
虽然Docker仍是常见选择,但K8S已逐步转向containerd作为默认运行时。两种方案的安装对比如下:
| 运行时类型 | 安装方式 | 关键配置 | 适用场景 |
|---|---|---|---|
| Docker CE | yum install docker-ce | 需配置cgroupdriver=systemd | 需要docker CLI的调试环境 |
| containerd | 通过rpm包安装 | 需配置systemd_cgroup = true | 生产推荐方案 |
containerd配置示例:
# 安装containerd yum install -y containerd.io mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml systemctl enable --now containerd1.3 Kubernetes组件安装
使用官方yum源确保版本一致性:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF # 安装三件套(指定版本避免自动升级) yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 systemctl enable kubelet2. 集群初始化与节点加入
2.1 控制平面初始化
定制化kubeadm配置是生产部署的关键步骤。创建kubeadm-config.yaml:
apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock kubeletExtraArgs: cgroup-driver: systemd --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.28.0 controlPlaneEndpoint: "k8s-master:6443" networking: podSubnet: "10.244.0.0/16" serviceSubnet: "10.96.0.0/12" apiServer: extraArgs: advertise-address: 192.168.1.10初始化命令:
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log成功后会输出节点加入命令,形如:
kubeadm join k8s-master:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxx \ --control-plane --certificate-key yyyyyyyy2.2 Worker节点加入
在各工作节点执行上述join命令(不带--control-plane参数)。验证节点状态:
kubectl get nodes -o wide # 预期输出应显示所有节点Ready状态2.3 常见初始化问题排查
cgroup驱动不一致:
# 检查kubelet日志 journalctl -xeu kubelet | grep cgroup # 解决方案:确保docker/containerd与kubelet统一使用systemd镜像拉取失败:
# 手动拉取镜像(适用于国内环境) kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers证书过期问题:
# 查看证书有效期 kubeadm certs check-expiration # 更新证书 kubeadm certs renew all
3. 网络插件部署实践
3.1 Flannel方案部署
作为最简网络方案,Flannel适合资源受限环境:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml关键配置参数:
Network: 需与kubeadm的podSubnet一致(默认10.244.0.0/16)Backend: 建议使用vxlan(性能要求高可考虑host-gw)
3.2 Calico方案对比
对于需要网络策略的生产环境,Calico是更优选择:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml性能调优建议:
# custom-resources.yaml 片段 spec: calicoNetwork: ipPools: - cidr: 10.244.0.0/16 encapsulation: VXLAN natOutgoing: true nodeAddressAutodetectionV4: interface: eth.*3.3 网络连通性测试
部署测试Pod验证跨节点通信:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 kubectl run testpod --image=busybox --rm -it -- sh # 在testpod中执行 wget -qO- nginx4. 生产环境优化实践
4.1 内核参数调优
创建/etc/sysctl.d/k8s.conf:
net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 fs.inotify.max_user_watches = 524288 fs.file-max = 2097152 vm.swappiness = 0应用配置:sysctl --system
4.2 日志与监控方案
基础监控部署:
# 部署metrics-server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 添加启动参数解决证书问题 kubectl edit deploy -n kube-system metrics-server # 添加:--kubelet-insecure-tls4.3 持久化存储配置
本地存储方案示例:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer5. 版本升级与维护
5.1 集群升级策略
先升级kubeadm:
yum install -y kubeadm-1.28.1 --disableexcludes=kubernetes kubeadm upgrade plan kubeadm upgrade apply v1.28.1逐个节点升级kubelet:
kubectl drain <node> --ignore-daemonsets yum install -y kubelet-1.28.1 kubectl-1.28.1 systemctl restart kubelet kubectl uncordon <node>
5.2 日常维护命令
- 查看集群状态:
kubectl get componentstatuses - 检查事件:
kubectl get events --sort-by=.metadata.creationTimestamp - 资源使用:
kubectl top nodes
关键经验:生产环境务必保留至少一个未升级的Master节点作为回滚点,建议在维护窗口期进行升级操作。