安装CentOS K8s时需要注意哪些细节以避免常见问题?
- 内容介绍
- 文章标签
- 相关推荐
程序与版本兼容性
痛点:很多使用者在使用旧版 CentOS时遇到 Kubernetes 组件不兼容导致集群无法启动。
确保操作程序满足以下要求:
- CentOS 7.6+ 或 CentOS 8.x。说起来,
-
Kubernetes 与操作程序的
kubeadm/kubelet/kubectl版本保持一致。 - 提前确认所选 Kubernetes 版本对应的镜像和组件支持的最小内核。其实,
基础环境准备
1. 更新程序并安装必要依赖
# 更新所有软件包
yum update -y
# 安装常用依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 关闭防火墙 & SELinux
痛点:防火墙或 SELinux 未关闭会导致 kubelet、kube‑proxy 等组件通信失败。
# 停止并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
3. 临时关闭交换分区
痛点:交换分区未关闭会触发 kubelet “swap is enabled” 错误。
# 暂时关闭 swap
swapoff -a
# 永久禁用 swap
sed -i '/swap/s/^/#/' /etc/fstab
4. 配置网络
为保证节点间的可靠通信,建议使用静态 IP;如果使用 DHCP,请确保租约不会频繁变更。说起来,
容器运行时 & Docker 安装
痛点:Docker 未正确安装或未使用 systemd cgroup 驱动。会导致 pod 创建失败。
# 添加 Docker 官方仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker CE
yum install -y docker-ce docker-ce-cli containerd.io
# 配置 Docker 使用 systemd cgroup driver
mkdir -p /etc/docker
cat> /etc/docker/daemon.json
Kubernetes 主要组件安装
# 添加 Kubernetes 仓库
cat> /etc/yum.repos.d/kubernetes.repo
内核参数与 sysctl 调优
痛点:默认内核参数不满足 Kubernetes 网络转发需求,会导致 pod 网络不可达。
# 创建 sysctl 配置文件
cat> /etc/sysctl.d/k8s.conf
时间同步保障
痛点:节点时间不同步会导致证书校验错误、调度异常等问题。说起来,
# 安装 chrony 并开启同步服务
yum install -y chrony
systemctl enable chronyd && systemctl start chronyd
# 确认同步状态
chronyc tracking
Kubeadm 初始化与网络插件部署
痛点:忽略网络插件的前置条件是导致集群卡在 “NodeNetworkNotReady” 状态的主要原因。按理说,
# 初始化集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.27.0
# 配置 kubectl 对普通使用者可用
export KUBECONFIG=/etc/kubernetes/admin.conf
# 部署 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 若使用其他插件。请参考对应官方文档部署,
高可用 & 运维注意事项
- Pain Point:单 master 节点宕机后整个集群失效。方法的观点是,至少部署三台 master 并开启 HA 控制平面。
-
定期检查节点健康:
``。 - 开启监控的观点是。Promeus + Grafana 或使用云原生监控套件,及时捕获异常指标。
- PVC 与存储类需提前规划,避免后期扩容困难。
- POD 日志与组件日志是故障排查关键,建议统一收集至 Elasticsearch/Kibana 或 Loki。
常见问题快速排查清单
| Pain Point | SOLUTION |
|---|---|
| Kubelet 启动报错 “swap is enabled” | - 确认已执行 `swapoff -a` - 检查 /etc/fstab 中是否仍有 swap 条目并注释掉
- 重启 kubelet 服务 `systemctl restart kubelet` |
| CNI 插件未就绪,Pod 显示 “NetworkNotReady” | - 检查 sysctl 参数是否生效 - 确认 br_netfilter 模块已加载 - 查看 CNI POD 日志 `kubectl logs -n kube-system calico-node-...` |
| Kube‑apiserver 与 etcd 通信超时 | - 确认所有 master 节点时间同步 - 检查防火墙或安全组是否放行 2379/2380/6443 端口 - 查看 etcd 日志 `journalctl -u etcd` |
| Docker 与 containerd 冲突 | - 推荐仅保留一种容器运行时 - 若保留 containerd。删除 Docker 并重启 kubelet - 在 /var/lib/kubelet/kubeadm-flags.env 中指定 `--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock` |
| POD 拉取镜像慢或失败 | - 设置国内镜像加速,如阿里云、华为云加速地址 - 确认节点能访问外网 DNS - 在 /etc/docker/daemon.json 中加入 `"registry-mirrors": ` |
备忘清单
- 程序升级至最新补丁;确认内核>= 3.10,
- 防火墙、SELinux 已临时或策略放行;确保端口 6443、2379‑2380、10250 等开放。
- Swap 已关闭;/etc/fstab 已注释对应行。
- 静态 IP 已配置或 DHCP 稳定;DNS 正常解析.
- Docker 安装完成且使用 systemd cgroup driver;或改用 containerd 并配置好 runtime endpoint。老实说,
程序与版本兼容性
痛点:很多使用者在使用旧版 CentOS时遇到 Kubernetes 组件不兼容导致集群无法启动。
确保操作程序满足以下要求:
- CentOS 7.6+ 或 CentOS 8.x。说起来,
-
Kubernetes 与操作程序的
kubeadm/kubelet/kubectl版本保持一致。 - 提前确认所选 Kubernetes 版本对应的镜像和组件支持的最小内核。其实,
基础环境准备
1. 更新程序并安装必要依赖
# 更新所有软件包
yum update -y
# 安装常用依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 关闭防火墙 & SELinux
痛点:防火墙或 SELinux 未关闭会导致 kubelet、kube‑proxy 等组件通信失败。
# 停止并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
3. 临时关闭交换分区
痛点:交换分区未关闭会触发 kubelet “swap is enabled” 错误。
# 暂时关闭 swap
swapoff -a
# 永久禁用 swap
sed -i '/swap/s/^/#/' /etc/fstab
4. 配置网络
为保证节点间的可靠通信,建议使用静态 IP;如果使用 DHCP,请确保租约不会频繁变更。说起来,
容器运行时 & Docker 安装
痛点:Docker 未正确安装或未使用 systemd cgroup 驱动。会导致 pod 创建失败。
# 添加 Docker 官方仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker CE
yum install -y docker-ce docker-ce-cli containerd.io
# 配置 Docker 使用 systemd cgroup driver
mkdir -p /etc/docker
cat> /etc/docker/daemon.json
Kubernetes 主要组件安装
# 添加 Kubernetes 仓库
cat> /etc/yum.repos.d/kubernetes.repo
内核参数与 sysctl 调优
痛点:默认内核参数不满足 Kubernetes 网络转发需求,会导致 pod 网络不可达。
# 创建 sysctl 配置文件
cat> /etc/sysctl.d/k8s.conf
时间同步保障
痛点:节点时间不同步会导致证书校验错误、调度异常等问题。说起来,
# 安装 chrony 并开启同步服务
yum install -y chrony
systemctl enable chronyd && systemctl start chronyd
# 确认同步状态
chronyc tracking
Kubeadm 初始化与网络插件部署
痛点:忽略网络插件的前置条件是导致集群卡在 “NodeNetworkNotReady” 状态的主要原因。按理说,
# 初始化集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.27.0
# 配置 kubectl 对普通使用者可用
export KUBECONFIG=/etc/kubernetes/admin.conf
# 部署 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 若使用其他插件。请参考对应官方文档部署,
高可用 & 运维注意事项
- Pain Point:单 master 节点宕机后整个集群失效。方法的观点是,至少部署三台 master 并开启 HA 控制平面。
-
定期检查节点健康:
``。 - 开启监控的观点是。Promeus + Grafana 或使用云原生监控套件,及时捕获异常指标。
- PVC 与存储类需提前规划,避免后期扩容困难。
- POD 日志与组件日志是故障排查关键,建议统一收集至 Elasticsearch/Kibana 或 Loki。
常见问题快速排查清单
| Pain Point | SOLUTION |
|---|---|
| Kubelet 启动报错 “swap is enabled” | - 确认已执行 `swapoff -a` - 检查 /etc/fstab 中是否仍有 swap 条目并注释掉
- 重启 kubelet 服务 `systemctl restart kubelet` |
| CNI 插件未就绪,Pod 显示 “NetworkNotReady” | - 检查 sysctl 参数是否生效 - 确认 br_netfilter 模块已加载 - 查看 CNI POD 日志 `kubectl logs -n kube-system calico-node-...` |
| Kube‑apiserver 与 etcd 通信超时 | - 确认所有 master 节点时间同步 - 检查防火墙或安全组是否放行 2379/2380/6443 端口 - 查看 etcd 日志 `journalctl -u etcd` |
| Docker 与 containerd 冲突 | - 推荐仅保留一种容器运行时 - 若保留 containerd。删除 Docker 并重启 kubelet - 在 /var/lib/kubelet/kubeadm-flags.env 中指定 `--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock` |
| POD 拉取镜像慢或失败 | - 设置国内镜像加速,如阿里云、华为云加速地址 - 确认节点能访问外网 DNS - 在 /etc/docker/daemon.json 中加入 `"registry-mirrors": ` |
备忘清单
- 程序升级至最新补丁;确认内核>= 3.10,
- 防火墙、SELinux 已临时或策略放行;确保端口 6443、2379‑2380、10250 等开放。
- Swap 已关闭;/etc/fstab 已注释对应行。
- 静态 IP 已配置或 DHCP 稳定;DNS 正常解析.
- Docker 安装完成且使用 systemd cgroup driver;或改用 containerd 并配置好 runtime endpoint。老实说,

