問題描述
無法從 harbor 通過 docker pull
下載鏡像。
這可能是一個個例,只有特定網絡情況下才會發生的問題。由於我這種網絡情況下發生了多次,因此有必要記錄下來。
環境
- Harbor 通過
https://IP
提供服務,使用自簽名的證書。 - Harbor 有兩個網卡,分別是
10.10.1/24
和10.10.10/24
,HTTPS 服務證書指定的10.10.10/24
的 IP。 - k8s 新的幾個集羣都在
10.10.0/24
網段。 - 這幾個新的集羣都無法從 Harbor 下載鏡像。
處理方法
一開始在 k8s 添加了到 10.10.10/24 的路由,能 ping 通,但是仍然無法 pull。
經過排查網絡問題,發現在 Harbor 上響應請求時,找不到 10.10.0/24
網段的服務器,在 Harbor 同樣配置路由後解決。配置路由就遇到了 Harbor Https 私有證書配置注意事項 中提過的證書問題。按照注意事項配置後解決。
CentOS 添加路由
添加臨時路由
Linux 通過命令添加路由時都是臨時的,重啓後就丟了。
臨時路由可以測試看看,而且也可以保證不重啓的情況下讓路由生效。
ip route add 10.10.0.0/24 via 10.10.1.1 dev ens160
其中
dev ens160
可以不提供,會自動選擇可用網卡。
本文遇到的問題需要在兩個端互相添加路由。
添加永久路由
根據自己的網卡名,在 /etc/sysconfig/network-scripts/
下面添加對應的 route-網卡名
配置文件,例如 route-ens160
,添加路由內容,和上面命令一樣,就是 ip route add
後面跟着的內容:
10.10.0.0/24 via 10.10.1.1 dev ens160
配置路由後重啓網絡 systemctl restart network
。
Ansible 腳本
- name: harbor route and ca
hosts: docker
vars:
ca_file: /etc/docker/certs.d/HARBOR_IP/ca.crt
route_file: /etc/sysconfig/network-scripts/route-ens160
tasks:
- name: Create /etc/docker/certs.d/HARBOR_IP
file:
path: /etc/docker/certs.d/HARBOR_IP
state: directory
mode: '0751'
- name: copy ca_file
copy: src=ca.crt dest={{ ca_file }}
- name: copy route_file
copy: src=route-ens160 dest={{ route_file }}
- name: restart service network
service:
name: network
state: restarted
當前目錄需要提供 harbor 的 ca.crt
以及網卡對應的路由配置文件 route-ens160
。
CA 證書路徑需要將實際的 IP 替換腳本中的 HARBOR_IP
。