Containerd 如何配置 Proxy?

前言

在某些 air gap 場景中,往往需要離線或使用代理 (Proxy), 例如:

  1. 需要通過 Proxy pull 容器鏡像:
    1. Docker Hub: docker.io
    2. Quay: quay.io
    3. GCR: gcr.io
    4. GitHub 鏡像庫:ghcr.io
  2. 在某些企業環境中,需要通過代理訪問外部服務

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=//127.0.0.1:7890"
Environment="HTTPS_PROXY=//127.0.0.1:7890"
Environment="NO_PROXY=localhost"

配置後保存重啟即可:

systemctl restart containerd.service

最佳實踐:Proxy 中 NO_PROXY 的推薦配置

在配置 Proxy 時要特別注意,哪些要走 Proxy, 哪些不走 Proxy 要非常明確,避免出現網絡訪問異常甚至業務異常。

這裡有個推薦 NO_PROXY 配置:

  1. 本地地址和網段:localhost127.0.0.1127.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=//127.0.0.1:7890"
Environment="HTTPS_PROXY=//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 的最佳實踐。

本文由東風微鳴技術博客 EWhisper.cn 編寫!