Skip to content

解决 Docker Desktop 获取节点状态时 Unable to connect to the server: EOF

前言

在 macOS 环境使用 Docker 开启单节点 Kubernetes 环境时,通过 kubectl 获取节点状态时响应 Unable to connect to the server: EOF 咦!Docker Desktop 显示 Kubernetes 服务已正在启动没有任何问题,就是通过终端 kubectl 与 kube-apiserver 无法交互!

看到了吧,Docker Kubernetes 确实正常!

问题表现

通过执行 kubectl get nodes 无法正确显示 Kubernetes 节点状态,并响应如下错误信息

txt
Unable to connect to the server: EOF

问题分析

Step 1: 查看 Kubernetes 状态配置信息

通过执行以下命令查看当前 macOS 系统 Kubernetes 节点配置信息

terminal
shell
kubectl config view

具体配置如下

yaml
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://kubernetes.docker.internal:6443
  name: docker-desktop
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
current-context: docker-desktop
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED

通过上面的配置信息可以看到 kube-apiserver 访问的地址为 https://kubernetes.docker.internal:6443 那么 Docker Desktop 在开启 Kubernetes 服务时必定会向 /etc/hosts 配置文件写入映射

Step 2: 查看 /etc/hosts 配置文件

/etc/hosts
txt
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 	kubernetes.docker.internal
# End of section

Step 3: 关闭代理测试是否正常

terminal
shell
kubectl get node

咦!关闭代理之后可以正常响应 Kubernetes 节点状态信息

txt
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   58m   v1.32.2

Step 4: 添加 no_proxy 环境变量

临时添加,只需要在当前终端执行一个 export 命令即可

shell
export no_proxy=kubernetes.docker.internal

当然,为作为一个开发者你的代理基本常开,编辑 ~/.zshrc~/.bash_profile 添加以下配置导出环境变量

~/.zshrc
shell
export no_proxy=kubernetes.docker.internal

总结

代理这个东西吧,有好有坏,一不小心就掉坑里了!