前言

k8s 集群中,使用 kubelet 报错,如下:

The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?

排查思路

1. 检查环境是否正常

1.1 确认是否在 Master 节点排查

  • 确保当前操作的机器是 Kubernetes 的 Master 节点,因为 127.0.0.1:6443 是 Kubernetes API Server 的默认监听地址。
  • 如果是在 Worker 节点,Worker 节点无法直接访问 127.0.0.1:6443,需要通过 Master 节点的 IP 或域名访问。

1.2 确认 kube-apiserver 的状态

ps aux | grep kube-apiserver
  • 如果没有看到 kube-apiserver 进程,说明 API Server 没有启动。
  • 可能的原因包括配置文件错误、服务未启动或容器未运行。

2. 检查 kube-apiserver 服务

2.1 如果 kube-apiserver 是以容器方式运行

查看 kube-apiserver 容器的状态:

docker ps | grep kube-apiserver

或使用 containerd

crictl ps | grep kube-apiserver

如果容器没有运行:

查看 kube-apiserver 容器的日志:

docker logs <kube-apiserver 容器 ID>

或:

crictl logs <kube-apiserver 容器 ID>

如果容器在重启循环:通常是配置文件(如证书、参数等)错误,查看日志以定位具体原因。

2.2 如果 kube-apiserver 是以 systemd 服务运行

检查服务状态:

systemctl status kube-apiserver

重启服务并查看日志:

systemctl restart kube-apiserver
journalctl -xeu kube-apiserver
journalctl -u kube-apiserver -f

测试 API Server 是否可用

在 Master 节点上,测试 API Server 的端口是否可以访问:

curl -k https://127.0.0.1:6443/healthz

如果返回 ok,说明 API Server 正常运行。

3. 检查 kube-apiserver 的配置

3.1 确认 API Server 的监听地址

  • 检查 kube-apiserver 的启动参数,确认 --advertise-address--bind-address 参数是否正确。
  • 默认情况下,--bind-address 配置为 0.0.0.0,确保不限制监听地址。
  • 确保 --advertise-address 配置为 Master 节点的实际 IP 地址。

3.2 检查证书和密钥

Kubernetes 的 API Server 通常使用证书进行通信,证书问题会导致 API Server 无法启动:

  • 确认 --cert-dir 或相关的 --tls-cert-file--tls-private-key-file 参数是否指向正确的证书文件。
  • 确保证书文件没有过期,可以使用以下命令检查:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates

如果证书过期,需要重新生成证书。

4. 检查防火墙和网络配置

4.1 检查本地端口占用

确保 6443 端口未被其他服务占用:

netstat -tuln | grep 6443

如果被其他进程占用,停止相关进程或修改 kube-apiserver 的端口号。

telnet 127.0.0.1 6443

如果无法连接,可能是 API Server 未启动或防火墙阻止了流量。

4.2 检查防火墙规则

确保防火墙未阻止 6443 端口:

iptables -L -n | grep 6443

如果防火墙阻止了流量,添加规则放行:

iptables -A INPUT -p tcp --dport 6443 -j ACCEPT

如果使用 firewalld

firewall-cmd --add-port=6443/tcp --permanent
firewall-cmd --reload

关闭防火墙测试:

systemctl stop firewalld

4.3 检查 SELinux

如果启用了 SELinux,可能限制了 kube-apiserver 的运行:

getenforce

如果是 Enforcing 模式,可以暂时关闭:

setenforce 0

5. 检查 etcd 状态

Kube-apiserver 依赖 etcd 存储集群状态,如果 etcd 不可用,API Server 无法正常工作。

5.1 检查 etcd 容器或服务是否运行

检查 etcd 容器状态:

docker ps | grep etcd

或:

crictl ps | grep etcd

检查 etcd 服务状态:

systemctl status etcd

5.2 检查 etcd 集群健康状态

使用 etcdctl 检查健康状态:

etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key endpoint health

如果 etcd 不健康,可能需要恢复 etcd 数据或修复集群。

6. 检查 kubeconfig 文件

kubectl 命令通过 kubeconfig 文件访问 API Server,如果文件配置错误,也可能导致连接被拒绝。

6.1 确认 kubeconfig 文件路径

检查 /etc/kubernetes/admin.conf~/.kube/config 文件是否存在,并配置正确。

6.2 测试 kubeconfig 文件

使用以下命令测试连接:

kubectl --kubeconfig=/etc/kubernetes/admin.conf get nodes

7. 检查日志

查看 kube-apiserver 日志或其他相关组件的日志以获取更多细节:

journalctl -u kube-apiserver -f

8.检查容器运行时是否正常

容器运行时配置文件路径通常是 /etc/containerd/config.toml 或 /etc/crio/crio.conf

Kubelet 依赖容器运行时来启动 Pod,首先确认容器运行时是否正常。

如果使用 Containerd

systemctl status containerd

如果使用 Docker

systemctl status docker

如果服务未启动或异常,尝试重启服务:

systemctl restart containerd
# 或
systemctl restart docker

8.1 测试容器运行时状态

  • Containerd
crictl info
  • Docker
docker info

如果命令超时或报错,表明容器运行时有问题,需要进一步排查。

8.2 检查 Kubelet 与容器运行时的通信

Kubelet 使用 CRI(Container Runtime Interface) 与容器运行时通信,以下是常见问题及解决办法:

2.2.1 检查 Kubelet 配置

查看 /var/lib/kubelet/config.yaml 或 Kubelet 的启动参数,确认 container-runtimecontainer-runtime-endpoint 配置是否正确。

Containerd

container-runtime-endpoint 应配置为:

unix:///run/containerd/containerd.sock

Docker

container-runtime-endpoint 应配置为:

unix:///var/run/dockershim.sock

8.2.2 检查容器运行时的 Socket 文件

确认对应的 Socket 文件是否存在并可用:

ls -l /run/containerd/containerd.sock
# 或
ls -l /var/run/dockershim.sock

如果文件不存在,可能是容器运行时未正确启动,需检查运行时日志。

8.2.3 测试 Kubelet 与运行时的通信

使用 crictl 测试 Kubelet 是否能够与容器运行时正常通信:

crictl pods

如果报错,可能是容器运行时未正确配置或无法访问 container-runtime-endpoint

8.3 检查 Kubelet 配置和状态

8.3.1 检查 Kubelet 服务

确认 Kubelet 服务是否正常运行:

systemctl status kubelet

如果服务异常或未启动,尝试重启:

systemctl restart kubelet

8.3.2 检查 Kubelet 日志

通过日志查看更详细的错误信息:

journalctl -u kubelet -f

8.3.3 检查 Kubelet 的证书和配置

Kubelet 需要通过证书与 API Server 通信,检查以下文件是否存在且配置正确:

  • /var/lib/kubelet/kubeconfig
  • /etc/kubernetes/kubelet.conf

可以通过以下命令测试 Kubelet 是否能访问 API Server:

kubectl --kubeconfig=/etc/kubernetes/kubelet.conf get nodes

如果无法访问,可能是证书过期、API Server 不可用或网络问题。

9.检查kubelet是否正常:

systemctl status kubelet

如果服务没有起来尝试拉起

systemctl start kubelet

查看服务日志:

journalctl  -u kubelet -f

10.检查系统资源

有时系统资源不足也会导致k8s集群的错误。请检查系统的内存、CPU 和磁盘空间是否充足:

# 检查内存使用情况
free -m # 检查 CPU 使用情况
top # 检查磁盘空间
df -h

手动清理旧的日志文件

有时旧的日志文件可能会导致问题。可以手动清理这些文件并重启相关服务:

# 清理旧的日志文件
sudo rm -rf /var/log/pods/*
sudo rm -rf /var/log/containers/* # 重启 containerd 和 kubelet 服务
sudo systemctl restart containerd
sudo systemctl restart kubelet

最后不行,就只有重启机器了

k8s dial tcp 127.0.0.1:6443: connect: connection refused排查流程及解决思路的更多相关文章

  1. docker登录报错Error response from daemon: Get https://192.168.30.10/v1/users/: dial tcp 192.168.30.10:443: connect: connection refused

    背景描述: 登录docker报错: [root@localhost sysconfig]# docker login 192.168.30.10 Username (newcs06): newcs06 ...

  2. 私有Docker仓库login Error response from daemon: Get https://x.x.x.x/v2/: dial tcp x.x.x.x:443: connect: connection refused

    一.登陆私有仓库错误: docker login --username=evan 192.168.0.203 Error response from daemon: Get https://192.1 ...

  3. docker login harbor出现的报错Error response from daemon: Get https://172.16.1.99/v1/users/: dial tcp 172.16.1.99:443: getsockopt: connection refused解决方法

    出现的问题 [root@master01 ~]# docker login 172.16.1.99 Username: admin Password: Error response from daem ...

  4. Get https://192.168.2.119/v2/: dial tcp 192.168.2.119:443: getsockopt: connection refused

    Get https://192.168.2.119/v2/: dial tcp 192.168.2.119:443: getsockopt: connection refused

  5. http: server gave HTTP response to HTTPS client & Get https://192.168.2.119/v2/: dial tcp 192.168.2.119:443: getsockopt: connection refused

    http: server gave HTTP response to HTTPS client 出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTP ...

  6. Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused

    配置docker网络flannel时,配置etcd的key的时候出现以下错误 Error:  client: etcd cluster is unavailable or misconfigured; ...

  7. Go丨语言对数据库操作报错 panic: dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.

    panic: dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine ac ...

  8. dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启

    kubernetes(k8s)DNS 服务反复重启解决: k8s.io/dns/pkg/dns/dns.go:150: Failed to list *v1.Service: Get https:// ...

  9. (转)dial tcp 10.96.0.1:443: getsockopt: no route to host --- kubernetes(k8s)DNS 服务反复重启

    转:https://blog.csdn.net/shida_csdn/article/details/80028905 kubernetes(k8s)DNS 服务反复重启解决: k8s.io/dns/ ...

  10. Get https://172.18.255.243:6443/api/v1/namespaces/kube-system/configmaps/kubelet-config-1.12: dial tcp 172.18.255.243:6443: i/o timeout

    问题描述 使用外网加入集群的时候报如下错误: Get https://172.18.255.243:6443/api/v1/namespaces/kube-system/configmaps/kube ...

随机推荐

  1. html css使用特殊自定义字体避免侵权

    一般系统支持的网页常见中文字体有:宋体.雅黑.黑体.但是大多网站使用电脑自带微软雅黑(方正的)可能侵权 p { font-family: Arial,sans-serif; } 可免费商用字体百度自行 ...

  2. Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和桌面推流

    一.前言 随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求.之前就 ...

  3. Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放

    一.前言 随着音视频的爆发式的增长,各种推拉流应用场景应运而生,基本上都要求各个端都能查看实时视频流,比如PC端.手机端.网页端,在网页端用websocket来接收并解码实时视频流显示,是一个非常常规 ...

  4. 记一次简单的存储过程和Pivot行转列

    首先我很讨厌写存储过程,其次我很讨厌 没办法,主要是需要进行 行转列,项目经理说可以用Pivot.我不是很精通sql,但是我会百度呀~ pivot需要有确定的列名.那我这个项目里面没办法确定,最后问了 ...

  5. [转]IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    原文链接: IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

  6. Github无法访问解决办法

    Github无法访问解决办法 问题描述:网速正常,但是github无法访问. 解决办法: 1.因为Github网址域名更换.查询网站https://ipchaxun.com/ ,例如输入github. ...

  7. [转]快速的批量修改重命名.net程序的命名空间

    在实际项目中,我们有时会遇到因为项目重构,需要修改命名空间,除了一个一个类修改外,大多数会采用批量替换的方法去重命名.昨天又遇到了此类问题,网上找过的方法说要结合ReSharper重构重命名.于是装上 ...

  8. UOS系统mysql服务安装

    UOS系统mysql服务安装 背景 1.安装环境:kvm虚拟机 2.运行环境:uos server-1060e 3.架构:x86 4.安装mysql版本:mysql-5.7 1.安装准备 # Mysq ...

  9. Linux 虚拟机中不重启的情况下加新硬盘及扩展根分区容量

    我这个系统是Redhat7.7的系统.磁盘占用比较高,需要扩充空用空间,同时又不能关停服务器,或者服务.所以就需要在虚拟机中不重启的情况下加新硬盘及扩展根分区容量. 首先,看一下我这个虚拟机分区占用情 ...

  10. C++:异常处理

    C++的异常处理机制是由三部分组成:检查(try).抛出(throw)和捕获(catch).需要检查的语句放到try中:throw用来当出现异常时发出一个异常信息:catch用来捕获异常信息,且处理它 ...