Kind 与 Minikube 配置代理

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/16172.17.0.1(docker0 网关)
minikube(docker driver)192.168.49.0/24192.168.49.1(minikube 默认集群网段)

代理配置

首先,需要注意两个前提

  1. 代理必须监听容器可达的地址。Clash 等要开启 Allow LAN(监听 0.0.0.0:<port>),否则即使写了正确的 IP,172.17.x.x / 192.168.x.x 这类非本机流量也会被代理拒绝。
  2. 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!
Licensed under CC BY-NC-SA 4.0
最后更新于 2026年9月1日星期二
使用 Hugo 构建
主题 StackJimmy 设计