配置代理后kubectl命令无法执行问题排查求助
问题根因
你配置的是全局HTTPS代理环境变量,默认会作用于所有HTTP/HTTPS请求,包括kubectl访问Kubernetes apiserver的请求。kubeadm部署的集群默认apiserver监听地址是127.0.0.1:6443或者节点内网IP段的地址,这类内网地址走外部代理转发自然无法连通,就会出现请求挂起超时的情况,和你设置的Pod CIDR没有直接关联。
解决方案
方案1:临时给拉镜像的操作单独指定代理,不设置全局代理变量
仅在执行docker pull、crictl pull这类拉取外部镜像的命令前临时加上代理参数即可,不会影响kubectl等本地请求的正常运行:
https_proxy=proxy.xyx.yyyy.com:8080 docker pull <镜像地址>
方案2:配置全局代理时添加NO_PROXY例外规则
如果确实需要长期配置全局代理,需要把集群内网相关的地址段全部加入不代理的例外列表,在配置代理的环境变量时添加如下参数:
export https_proxy=proxy.xyx.yyyy.com:8080 export http_proxy=proxy.xyx.yyyy.com:8080 export no_proxy=127.0.0.1,localhost,10.244.0.0/16,10.96.0.0/12,你的节点物理IP段,/var/run/docker.sock
必须加入例外的地址说明:
- 本地回环地址
127.0.0.1、localhost - Kubernetes的Service CIDR(默认是
10.96.0.0/12,如果自定义过网段替换为实际值即可) - 你用到的Pod CIDR
10.244.0.0/16 - 三个节点所在的物理内网IP段
- Docker socket地址,避免Docker相关操作走代理
配置完成后执行source加载对应的配置文件(比如~/.bashrc),再测试kubectl和镜像拉取操作均可正常运行。
方案3:给Docker服务单独配置代理(最推荐)
如果仅需要Docker拉镜像走代理,不影响其他系统进程,可以单独给Docker daemon配置代理,不需要设置系统全局变量:
- 创建Docker代理配置目录:
sudo mkdir -p /etc/systemd/system/docker.service.d
- 新建
/etc/systemd/system/docker.service.d/http-proxy.conf文件,写入如下内容:
[Service] Environment="HTTP_PROXY=proxy.xyx.yyyy.com:8080" Environment="HTTPS_PROXY=proxy.xyx.yyyy.com:8080" Environment="NO_PROXY=localhost,127.0.0.1,10.244.0.0/16,10.96.0.0/12,你的节点物理IP段"
- 重载配置并重启Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
该方案下系统无全局代理变量,kubectl可正常运行,Docker拉镜像时自动走配置的代理。
内容的提问来源于stack exchange,提问作者user17509777
相关产品推荐
相关产品推荐

