Containerd 如何配置 Proxy?
- 2022 年 11 月 17 日
- 筆記
- docker, Kubernetes, 雲原生, 可觀察性
前言
在某些 air gap 場景中,往往需要離線或使用代理 (Proxy), 例如:
- 需要通過 Proxy pull 容器鏡像:
- Docker Hub:
docker.io
- Quay:
quay.io
- GCR:
gcr.io
- GitHub 鏡像庫:
ghcr.io
- Docker Hub:
- 在某些企業環境中,需要通過代理訪問外部服務
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
配置:
- 本地地址和網段:
localhost
和127.0.0.1
或127.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
最終配置如下:
[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 編寫!