从零构建生产级K8s集群:CentOS 7实战指南与深度避坑手册
当容器化技术成为现代应用部署的标准范式时,Kubernetes(K8s)作为容器编排领域的事实标准,其学习曲线却让许多初学者望而生畏。本指南专为使用CentOS 7系统的技术团队设计,聚焦v1.23这个长期支持版本,通过可复现的标准化流程,带您跨越从单机实验到生产可用集群的技术鸿沟。我们将特别关注中国开发者常见的网络环境问题,提供完整的离线解决方案。
1. 环境准备:构建稳健的基础设施层
1.1 系统配置标准化
在3台虚拟机(建议2核4G配置)上执行以下标准化操作:
# 设置永久主机名(分别在每台机器执行) hostnamectl set-hostname k8s-master # 主节点 hostnamectl set-hostname k8s-node1 # 工作节点1 hostnamectl set-hostname k8s-node2 # 工作节点2网络配置关键点:
- 使用NAT模式时,确保所有节点在同一网段(如192.168.10.0/24)
- 桥接模式需保持与物理机同网段
典型/etc/sysconfig/network-scripts/ifcfg-ens33配置:
BOOTPROTO=static ONBOOT=yes IPADDR=192.168.10.100 PREFIX=24 GATEWAY=192.168.10.1 DNS1=114.114.114.1141.2 安全策略调优
K8s对Linux内核有特殊要求,需执行以下关键操作:
# 关闭并禁用防火墙 systemctl stop firewalld && systemctl disable firewalld # 彻底关闭SELinux setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 清理iptables规则 iptables -F && iptables -t nat -F内存管理优化:
# 关闭swap并持久化 swapoff -a sed -i '/swap/s/^/#/' /etc/fstab2. 容器运行时:Docker 20.10精准配置
2.1 版本锁定安装
由于K8s v1.23对Docker版本有严格限制,必须使用20.10系列:
# 配置阿里云镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 精确安装指定版本 yum install -y docker-ce-20.10.23 docker-ce-cli-20.10.23 containerd.io2.2 关键参数调优
创建/etc/docker/daemon.json实现性能优化:
{ "registry-mirrors": [ "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }启动服务并验证:
systemctl enable --now docker docker info | grep Cgroup3. Kubernetes核心组件部署
3.1 使用国内源安装三件套
配置阿里云K8s源并安装指定版本:
cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.173.2 主节点初始化实战
执行具有中国特色的初始化命令:
kubeadm init \ --apiserver-advertise-address=192.168.10.100 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --kubernetes-version v1.23.17成功后会输出kubeadm join命令,务必保存。
4. 网络插件:Flannel深度适配方案
4.1 离线部署方案
针对国内网络环境,推荐离线部署方式:
- 提前下载所需镜像:
docker pull quay.io/coreos/flannel:v0.15.1- 使用本地化部署文件:
# kube-flannel.yml apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: psp.flannel.unprivileged spec: privileged: false volumes: - configMap - secret - emptyDir - hostPath allowedHostPaths: - pathPrefix: "/etc/cni/net.d" - pathPrefix: "/etc/kube-flannel" - pathPrefix: "/run/flannel" readOnlyRootFilesystem: false # 其他必要配置...4.2 网络问题诊断技巧
当节点处于NotReady状态时,使用以下诊断流程:
# 查看核心组件状态 kubectl get pods -n kube-system # 检查kubelet日志 journalctl -u kubelet -f # 验证网络连接性 kubectl run test-nginx --image=nginx kubectl exec test-nginx -- curl google.com5. 集群验证与生产级加固
5.1 基础功能测试
部署测试应用验证集群功能:
kubectl create deployment nginx-test --image=nginx:1.21 --replicas=3 kubectl expose deployment nginx-test --port=80 --type=NodePort5.2 安全加固建议
| 加固项 | 操作命令/配置 | 影响范围 |
|---|---|---|
| API Server审计 | 修改/etc/kubernetes/manifests/kube-apiserver.yaml | 控制平面 |
| 节点隔离 | kubectl taint nodes node1 key=value:NoSchedule | 特定工作节点 |
| RBAC权限控制 | kubectl create clusterrolebinding | 全集群 |
# 启用API审计日志示例 cat >> /etc/kubernetes/manifests/kube-apiserver.yaml <<EOF - --audit-log-path=/var/log/kubernetes/audit.log - --audit-log-maxage=30 - --audit-log-maxbackup=10 EOF6. 典型问题解决方案库
案例1:镜像拉取失败
# 预先拉取常用镜像 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6案例2:证书过期处理
# 更新证书 kubeadm certs renew all systemctl restart kubelet在真实生产环境中,我们曾遇到某金融客户因时钟不同步导致API调用失败的情况。最终通过部署chronyd服务并添加以下配置解决:
server ntp.aliyun.com iburst stratumweight 0 driftfile /var/lib/chrony/drift makestep 1.0 3