CentOS 7.9上k8s v1.15.1初始化踩坑实录:从preflight报错到集群就绪
·
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启用时:
- 内存使用统计变得不可靠
- 可能引发性能抖动
- 影响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. 经验总结与优化建议
经过这次部署,有几个关键点值得注意:
-
版本矩阵:Kubernetes、Docker、ETCD等组件的版本兼容性必须严格匹配
-
生产环境建议:
- 使用kubeadm-config.yaml文件而非命令行参数
- 提前规划好Pod和Service的CIDR范围
- 考虑使用本地镜像仓库加速部署
-
后续监控:
# 安装Metrics Server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
最后发现,集群初始化失败往往不是单一原因导致,而是多个小问题的叠加。建议每次修改后使用kubeadm reset彻底清理环境,避免残留配置干扰。
更多推荐
所有评论(0)