ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS 7下Kubernetes集群部署与优化指南

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 CEyum 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 containerd

1.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 kubelet

2. 集群初始化与节点加入

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 yyyyyyyy

2.2 Worker节点加入

在各工作节点执行上述join命令(不带--control-plane参数)。验证节点状态:

kubectl get nodes -o wide # 预期输出应显示所有节点Ready状态

2.3 常见初始化问题排查

  1. cgroup驱动不一致:

    # 检查kubelet日志 journalctl -xeu kubelet | grep cgroup # 解决方案:确保docker/containerd与kubelet统一使用systemd
  2. 镜像拉取失败:

    # 手动拉取镜像(适用于国内环境) kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
  3. 证书过期问题:

    # 查看证书有效期 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- nginx

4. 生产环境优化实践

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-tls

4.3 持久化存储配置

本地存储方案示例:

apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer

5. 版本升级与维护

5.1 集群升级策略

  1. 先升级kubeadm:

    yum install -y kubeadm-1.28.1 --disableexcludes=kubernetes kubeadm upgrade plan kubeadm upgrade apply v1.28.1
  2. 逐个节点升级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节点作为回滚点,建议在维护窗口期进行升级操作。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进