cloud
cloud-native
云原生与 kubernetes
安装 Kubernetes
拉取镜像代理

拉取镜像代理

2024..7.18 更新

⚠️

由于众所周知的原因, docker.io 被墙了。因此配置代理乃是重中之重的工作

预制条件:首先需要一个有源的 ClashX

本文有参考 https://juejin.cn/post/7166794699586404388 (opens in a new tab) 以及 docker和containerd增加代理 (opens in a new tab)

前提说明

在某些场景中,往往需要离线或使用代理 (Proxy), 例如:

需要通过 Proxy pull 容器镜像:

  • Docker Hub: docker.io
  • Quay: quay.io
  • GCR: gcr.io
  • GitHub 镜像库:ghcr.io

在某些企业环境中,需要通过代理访问外部服务

Docker 配置代理

# 创建docker.service.d目录
mkdir -p /etc/systemd/system/docker.service.d

# 创建HTTP&HTTPS代理文件
# 192.168.88.15 请替换为你的局域网代理 IP 或者  本机 127.0.0.1
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<-EOF
[Service]
Environment="HTTP_PROXY=socks5://192.168.88.15:7890"       #代理服务器地址
Environment="HTTPS_PROXY=socks5://192.168.88.15:7890"      #https
Environment="NO_PROXY=localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,registry.cn-hongkong.aliyuncs.com,.svc,.cluster.local,<nodeCIDR>,<APIServerInternalURL>,<serviceNetworkCIDRs>,<etcdDiscoveryDomain>,<clusterNetworkCIDRs>,<platformSpecific>,<REST_OF_CUSTOM_EXCEPTIONS>"            #哪些地址不需要走代理
EOF

# 重启dockerd
systemctl daemon-reload
systemctl restart docker

Containerd 配置代理

# 创建 containerd.service.d 目录
mkdir /etc/systemd/system/containerd.service.d/

# 创建或编辑文件
# 创建HTTP&HTTPS代理文件
# 192.168.88.15 请替换为你的局域网代理 IP 或者  本机 127.0.0.1
cat > /etc/systemd/system/containerd.service.d/http-proxy.conf <<-EOF
[Service]
Environment="HTTP_PROXY=socks5://192.168.88.15:7890"       #代理服务器地址
Environment="HTTPS_PROXY=socks5://192.168.88.15:7890"      #https
Environment="NO_PROXY=localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,registry.cn-hongkong.aliyuncs.com,.svc,.cluster.local,<nodeCIDR>,<APIServerInternalURL>,<serviceNetworkCIDRs>,<etcdDiscoveryDomain>,<clusterNetworkCIDRs>,<platformSpecific>,<REST_OF_CUSTOM_EXCEPTIONS>"          #哪些地址不需要走代理
EOF

# 重启containerd
systemctl daemon-reload
systemctl restart containerd

关于 NO_PROXY 忽略代理的配置说明

最佳实践:Proxy 中 NO_PROXY 的推荐配置 在配置 Proxy 时要特别注意,哪些要走 Proxy, 哪些不走 Proxy 要非常明确,避免出现网络访问异常甚至业务异常。 这里有个推荐 NO_PROXY 配置:

  • 本地地址和网段:localhost127.0.0.1127.0.0.0/8
  • Kubernetes 的默认域名后缀:.svc.cluster.local
  • Kubernetes Node 的网段甚至所有应该不用 proxy 访问的 node 网段:<nodeCIDR>
  • APIServer 的内部 URL: <APIServerInternalURL>
  • Service Network: <serviceNetworkCIDRs>
  • etcd 的 Discovery Domain: <etcdDiscoveryDomain>
  • Cluster Network: <clusterNetworkCIDRs>
  • 其他特定平台相关网段(如 DevOps, Git/制品仓库。..): <platformSpecific>
  • 其他特定 NO_PROXY 网段:<REST_OF_CUSTOM_EXCEPTIONS>
  • 常用内网网段:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

拉取镜像测试

crictl pull docker.io/library/redis
crictl pull docker.io/library/nginx:alpine
crictl pull docker.io/library/mysql