CentOS 7.9上部署Kubernetes 1.15.1全记录:从preflight报错到集群就绪

当我在生产环境首次部署Kubernetes 1.15.1集群时,本以为按照官方文档就能顺利完成,没想到从preflight检查开始就遭遇连环坑。这篇文章将还原整个排错过程,不仅告诉你"怎么做",更会解释"为什么这么做"。

1. 环境准备与初始配置

在CentOS 7.9上部署Kubernetes集群前,系统需要满足几个基本条件。我的服务器配置如下:

  • 硬件:4核CPU/8GB内存/100GB SSD
  • 操作系统:CentOS 7.9.2009 (Core)
  • 内核版本:5.4.259-1.el7.elrepo.x86_64

首先需要配置基础环境:

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 禁用SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 配置时间同步
yum install -y ntpdate
ntpdate time.windows.com

提示:生产环境中建议使用chrony进行时间同步,精度更高且支持渐进式时间调整。

2. 第一个拦路虎:Swap启用报错

执行kubeadm init时,第一个报错来得猝不及防:

[ERROR Swap]: running with swap on is not supported. Please disable swap

为什么Kubernetes要禁用Swap?

Kubernetes的资源调度器(kube-scheduler)依赖Linux cgroups来精确控制容器资源使用。当Swap启用时:

  1. 内存使用统计变得不可靠
  2. 可能引发性能抖动
  3. 影响Pod的QoS保障

解决方法如下:

# 临时禁用Swap
swapoff -a

# 永久禁用需要修改/etc/fstab
sed -i '/swap/s/^/#/' /etc/fstab

# 验证Swap状态
free -h | grep Swap

3. Docker版本兼容性问题

解决Swap问题后,第二个警告出现了:

WARNING SystemVerification: this Docker version is not on the list of validated versions: 18.03.1-ce

Kubernetes对Docker版本有严格验证,1.15.1版本官方验证的Docker版本是18.09。以下是完整升级步骤:

# 卸载旧版本
yum remove -y docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine

# 安装指定版本
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io

# 配置Docker
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 启动服务
systemctl enable --now docker

4. kubeadm参数弃用问题

当使用旧版文档中的命令时,遇到了参数弃用警告:

Flag --experimental-upload-certs has been deprecated, use --upload-certs instead

正确的初始化命令应该是:

kubeadm init \
  --config=kubeadm-config.yaml \
  --upload-certs \
  | tee kubeadm-init.log

这里我准备了详细的kubeadm-config.yaml配置:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: 1.15.1
controlPlaneEndpoint: "k8s-master:6443"
networking:
  podSubnet: "10.244.0.0/16"
apiServer:
  extraArgs:
    service-node-port-range: 30000-32767

5. 网络插件安装与最终验证

选择Flannel作为CNI插件,因其简单稳定且兼容1.15.1版本:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

验证集群状态的关键命令:

# 查看节点状态
kubectl get nodes -o wide

# 检查核心组件状态
kubectl get pods -n kube-system

# 测试DNS解析
kubectl run -it --rm --image=busybox:1.28 test-dns -- nslookup kubernetes.default

6. 经验总结与优化建议

经过这次部署,有几个关键点值得注意:

  1. 版本矩阵:Kubernetes、Docker、ETCD等组件的版本兼容性必须严格匹配

  2. 生产环境建议

    • 使用kubeadm-config.yaml文件而非命令行参数
    • 提前规划好Pod和Service的CIDR范围
    • 考虑使用本地镜像仓库加速部署
  3. 后续监控

    # 安装Metrics Server
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
    

最后发现,集群初始化失败往往不是单一原因导致,而是多个小问题的叠加。建议每次修改后使用kubeadm reset彻底清理环境,避免残留配置干扰。

更多推荐