centos部署k8s的常见问题及解决方法
导读:CentOS部署K8s常见问题及解决方法 1. 节点无法加入集群 问题描述:Worker节点执行kubeadm join后,Master节点kubectl get nodes显示节点状态为NotReady,或节点无法加入。 可能原因:网络...
CentOS部署K8s常见问题及解决方法
1. 节点无法加入集群
- 问题描述:Worker节点执行
kubeadm join后,Master节点kubectl get nodes显示节点状态为NotReady,或节点无法加入。 - 可能原因:网络插件未正确安装、防火墙/安全组阻止通信、节点证书不匹配、
kubeadm join命令参数错误(如token过期)。 - 解决方法:
- 检查网络插件状态:确保网络插件(如Flannel、Calico)已正确安装且Pod运行正常(
kubectl get pods -n kube-system)。 - 开放必要端口:关闭防火墙(
systemctl stop firewalld & & systemctl disable firewalld)或放行K8s集群端口(如6443、10250、10255)。 - 验证证书:检查Master节点
/etc/kubernetes/pki下的证书是否有效,若证书过期需重新生成。 - 重新生成join命令:Master节点执行
kubeadm token create --print-join-command获取新命令,在Worker节点执行。
- 检查网络插件状态:确保网络插件(如Flannel、Calico)已正确安装且Pod运行正常(
2. Pod一直处于ContainerCreating状态
- 问题描述:Pod状态卡在
ContainerCreating,无法进入Running状态。 - 可能原因:镜像拉取失败(如镜像不存在、网络问题)、存储卷挂载失败(如NFS未挂载、权限不足)、容器运行时(Docker)异常。
- 解决方法:
- 查看Pod详情:
kubectl describe pod < pod-name>,重点检查Events部分(如Failed to pull image、MountVolume failed)。 - 手动拉取镜像:若镜像拉取失败,手动拉取并标记(如
docker pull coredns:1.8.0 & & docker tag coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:1.8.0)。 - 检查存储卷:确认存储服务(如NFS)运行正常,挂载点存在且权限正确(
chmod 777 /mnt/nfs)。 - 重启容器运行时:
systemctl restart docker,并检查Docker日志(journalctl -u docker)。
- 查看Pod详情:
3. 网络插件未准备就绪
- 问题描述:
kubectl get nodes显示节点状态为NotReady,或kubectl get pods -n kube-system中网络插件Pod(如Flannel的kube-flannel-ds)状态为Pending或CrashLoopBackOff。 - 可能原因:CNI插件未安装、内核参数未配置、网络插件与K8s版本不兼容。
- 解决方法:
- 安装CNI插件:以Flannel为例,执行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml。 - 配置内核参数:添加
/etc/sysctl.d/k8s.conf文件,内容为net.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1,然后执行sysctl -p生效。 - 检查版本兼容性:确保网络插件版本与K8s版本匹配(如Flannel v0.18.0支持K8s v1.27+)。
- 安装CNI插件:以Flannel为例,执行
4. Pod状态为ErrImagePull
- 问题描述:Pod状态为
ErrImagePull,无法拉取镜像。 - 可能原因:镜像名称或标签错误、镜像仓库地址不可达、镜像拉取权限不足(如私有仓库未配置
imagePullSecrets)。 - 解决方法:
- 检查镜像信息:确认
image字段名称(如nginx:1.25而非nginx)和标签正确。 - 测试镜像拉取:在Node节点上手动执行
docker pull < image-name>,验证是否能拉取。 - 配置私有仓库权限:若使用私有仓库,创建
imagePullSecrets(kubectl create secret docker-registry my-secret --docker-server=< registry-url> --docker-username=< user> --docker-password=< pass>),并在Pod配置中引用。
- 检查镜像信息:确认
5. 服务无法访问
- 问题描述:Service创建后,无法通过
ClusterIP或NodePort访问(如curl < cluster-ip> :< port>超时)。 - 可能原因:Service类型配置错误(如
ClusterIP未暴露到外网)、端口映射错误(targetPort与容器端口不一致)、CoreDNS解析失败。 - 解决方法:
- 检查Service配置:
kubectl describe service < service-name>,确认type(如NodePort需指定nodePort范围30000-32767)、ports(targetPort与容器端口一致)。 - 测试端口连通性:在Node节点上执行
curl < node-ip> :< node-port>,验证是否能访问。 - 检查CoreDNS:
kubectl get pods -n kube-system -l k8s-app=kube-dns,若CoreDNS异常,修改corednsConfigMap(kubectl edit configmap coredns -n kube-system),将forward指向可用DNS(如8.8.8.8),并重启CoreDNS Pods(kubectl delete pod -l k8s-app=kube-dns -n kube-system)。
- 检查Service配置:
6. etcd服务异常
- 问题描述:etcd服务无法启动(
systemctl status etcd显示failed),或Master节点无法正常调度Pod。 - 可能原因:etcd配置文件错误(如
/etc/etcd/etcd.conf中initial-cluster配置错误)、数据目录权限问题、磁盘空间不足。 - 解决方法:
- 检查etcd配置:确认
etcd.conf中initial-cluster(如etcd0=http://192.168.1.100:2380)、initial-cluster-state(new或existing)、data-dir(如/var/lib/etcd)配置正确。 - 检查数据目录权限:
chown -R etcd:etcd /var/lib/etcd。 - 清理磁盘空间:
df -h检查磁盘使用率,删除无用文件(如/var/log下的旧日志)。
- 检查etcd配置:确认
7. 内核参数配置错误
- 问题描述:初始化Master节点时
kubeadm init报错(如bridge-nf-call-iptables未设置为1),或Pod网络不通。 - 可能原因:未开启IP转发、
net.bridge.bridge-nf-call-iptables未设置为1、未加载br_netfilter模块。 - 解决方法:
- 开启IP转发:添加
/etc/sysctl.d/k8s.conf文件,内容为net.ipv4.ip_forward = 1,执行sysctl -p生效。 - 设置bridge参数:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables。 - 加载
br_netfilter模块:modprobe br_netfilter,并添加到/etc/modules-load.d/k8s.conf(永久生效)。
- 开启IP转发:添加
8. Docker与K8s cgroup驱动不一致
- 问题描述:Pod无法调度(
kubelet日志显示cgroup driver mismatch),或Docker服务启动失败。 - 可能原因:Docker的
cgroup-driver(如systemd)与K8s的cgroup-driver(如cgroupfs)不一致。 - 解决方法:
- 修改Docker配置:编辑
/etc/docker/daemon.json,添加"exec-opts": ["native.cgroupdriver=systemd"],执行systemctl daemon-reload & & systemctl restart docker。 - 修改K8s组件配置:编辑
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,添加--cgroup-driver=systemd,执行systemctl daemon-reload & & systemctl restart kubelet。
- 修改Docker配置:编辑
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos部署k8s的常见问题及解决方法
本文地址: https://pptw.com/jishu/745950.html
