What
本地的 kind / minikube 集群拉取镜像时,总是报同一个错误:
1
| spec.containers{nginx}: Failed to pull image "nginx:alpine": failed to pull and unpack image "docker.io/library/nginx:alpine": failed to resolve reference "docker.io/library/nginx:alpine": failed to do request: Head "https://registry-1.docker.io/v2/library/nginx/manifests/alpine ": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused
|
明明宿主机上已经开着代理(Clash,7890 端口),为什么容器里还是连不上?
核心原因:网络隔离层级搞错了
kind 的 K8s 节点、minikube(docker driver)的节点,本质都是运行在宿主机上的 Docker 容器。
- 宿主机视角:
127.0.0.1:7890 指向宿主机上运行的代理软件。 - 节点(容器)视角:容器内访问
127.0.0.1:7890,访问的是容器自己的 Loopback 接口,而不是宿主机的。 - 结果:容器内部根本没有监听 7890 的服务 →
connection refused。
所以配置里不能写 127.0.0.1,必须让节点访问"宿主机在容器网络里对应的那个 IP"。而不同运行时,这个 IP 不一样:
| 运行时 | 节点所在网段 | 宿主机在节点眼里的 IP |
|---|
| kind(docker0) | 172.17.0.0/16 | 172.17.0.1(docker0 网关) |
| minikube(docker driver) | 192.168.49.0/24 | 192.168.49.1(minikube 默认集群网段) |
代理配置
首先,需要注意两个前提:
- 代理必须监听容器可达的地址。Clash 等要开启 Allow LAN(监听
0.0.0.0:<port>),否则即使写了正确的 IP,172.17.x.x / 192.168.x.x 这类非本机流量也会被代理拒绝。 NO_PROXY 必须放行集群内部网段。否则集群组件间通信的 Service ClusterIP、Pod CIDR、.svc 域名等等也会被错误地送进代理,导致集群通信异常。这是最容易被忽略、也最容易踩坑的一条。
Kind 的配置方法
Kind 走的是容器运行时(docker 或 containerd)的环境变量,用 systemd drop-in 注入:
- docker:
/etc/systemd/system/docker.service.d/http-proxy.conf - containerd:
/etc/systemd/system/containerd.service.d/http-proxy.conf
1
2
3
4
| [Service]
Environment="HTTP_PROXY=http://172.17.0.1:7890"
Environment="HTTPS_PROXY=http://172.17.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.0.0.0/8,192.168.0.0/16,.svc,.cluster.local"
|
重启生效:
1
2
| sudo systemctl daemon-reload
sudo systemctl restart docker
|
Minikube 的配置方法
minikube 节点在 192.168.49.0/24 网段,宿主机对节点是 192.168.49.1。
方法一:重建节点时通过 --docker-env 传(若已有节点需先 minikube delete):
1
2
3
4
| minikube start \
--docker-env HTTP_PROXY=http://192.168.49.1:7890 \
--docker-env HTTPS_PROXY=http://192.168.49.1:7890 \
--docker-env NO_PROXY=localhost,127.0.0.1,::1,192.168.49.0/24,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local
|
方法二:在原节点内部给 docker 运行时加环境变量(docker driver 可用 minikube profile list 确认):
1
2
3
4
5
6
7
8
9
10
11
12
| sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.49.1:7890"
Environment="HTTPS_PROXY=http://192.168.49.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.49.0/24,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local"
EOF
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
|
配置前先确认节点能连通代理端口(在 minikube 节点内执行):
1
2
| nc -vz 192.168.49.1 7890
# Connection to 192.168.49.1 7890 port [tcp/*] succeeded!
|