Containerd 如何配置 Proxy?

时间:2022-11-17 09:59:08

前言

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

  1. 需要通过 Proxy pull 容器镜像:
  1. Docker Hub: ​​docker.io​
  2. Quay: ​​quay.io​
  3. GCR: ​​gcr.io​
  4. GitHub 镜像库:​​ghcr.io​
  1. 在某些企业环境中,需要通过代理访问外部服务

Docker 如何配置代理想必大家都很清楚,但是自从 ​​Kubernetes 1.20 版本以后开始弃用 Docker​​, containerd 逐渐成为主流 CRI. 所以我们下面介绍一下如何配置 contaienrd 的 Proxy.

????Notes:

还有一种场景需要 containerd 配置 proxy, 就是将 ​​Dragonfly 和 containerd 结合使用​​ 的时候。

Containerd 配置 Proxy 步骤

这里以通过 systemd 安装的 containerd 为例。

containerd 的配置一般位于 ​​/etc/containerd/config.toml​​ 下,service 文件位于:​​/etc/systemd/system/containerd.service​​ 配置 Proxy 可以通过 service 环境变量方式配置,具体如下:

创建或编辑文件:​​/etc/systemd/system/containerd.service.d/http-proxy.conf​

内容如下:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost"

配置后保存重启即可:

systemctl restart containerd.service

最佳实践:Proxy 中 ​​NO_PROXY​​ 的推荐配置

在配置 Proxy 时要特别注意,哪些要走 Proxy, 哪些不走 Proxy 要非常明确,避免出现网络访问异常甚至业务异常。

这里有个推荐 ​​NO_PROXY​​ 配置:

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

最终配置如下:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local,.ewhisper.cn,<nodeCIDR>,<APIServerInternalURL>,<serviceNetworkCIDRs>,<etcdDiscoveryDomain>,<clusterNetworkCIDRs>,<platformSpecific>,<REST_OF_CUSTOM_EXCEPTIONS>"

????????????

总结

Kubernetes 1.20 以上,企业 air gap 场景下可能会需要用到 containerd 配置 Proxy. 本文介绍了其配置方法,以及配置过程中 ​​NO_PROXY​​ 的最佳实践。