K3s如何通过代理去下载镜像?

如何通过代理去下载镜像?

适用于以下情况:
有些镜像国内镜像站没有同步或者同步不及时或者同步有缺失等情况, 需要我们连接国外镜像站下载。

设置方式

假设部署的架构是一主两从, 也就是1个server(master)管理控制节点+2个agent(node/worker)工作节点, 其中代理服务器在master节点服务器上,
并且监听了0.0.0.0, 允许局域网其它节点(2个agent节点)通过代理与外网进行通信。
这里我们假定server的ip地址是172.16.1.2, socks5代理端口是10808, http代理端口是10809。

# server节点编辑该文件,追加如下内容:
vi /etc/systemd/system/k3s.service.env
HTTP_PROXY="http://127.0.0.1:10809"
HTTPS_PROXY="http://127.0.0.1:10809"

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>"
# 然后重启k3s服务
systemctl restart k3s
# 2个 agent 节点都需要编辑该文件, 并追加如下内容
vi /etc/systemd/system/k3s-agent.service.env
HTTP_PROXY="http://172.16.1.2:10809"
HTTPS_PROXY="http://172.16.1.2:10809"

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>"
# 然后重启k3s agent服务
systemctl restart k3s-agent

有以下几点要点需要注意:

  1. NO_PROXY一定要有, 不然k3s会将局域网内ip流量(私有地址流量)转发到代理。
  2. 如何确定pull images时走代理了,以及如何排错?
    将代理日志级别开启到"loglevel": "info"级别,然后tail -f access.log日志文件,
    1. 如果在日志文件中发现私有地址转发进来了, 说明NO_PROXY没配置对;
    2. kubectl describe po 查看正在拉取镜像的pod在哪台节点上, 然后查看代理日志中是否有该节点ip连接镜像网站的相关字样, 若有, 代理配置正常, 可以使用; 反之亦然。
  3. k3s.service.env 文件不支持变量的解引用, 类似于这种写法: HTTPS_PROXY=${HTTPS_PROXY} 该写法只会将${HTTPS_PROXY}当成一个普通字符串传递给HTTPS_PROXY
  4. 目前测试只有这一种方式能代理成功, 其余的直接操作containerd代理或者网络上说的其它方式的代理均不起作用, 不再赘述。

ref

高级选项和配置 | K3s

代理需要认证应该怎么配置呢

HTTP_PROXY=http://user:pwd@your-proxy.example.com:8888

试试这种