天天看點

Harbor 無法下載下傳鏡像的一個原因

問題描述

無法從 harbor 通過 ​

​docker pull​

​ 下載下傳鏡像。

這可能是一個個例,隻有特定網絡情況下才會發生的問題。由于我這種網絡情況下發生了多次,是以有必要記錄下來。

環境

  1. Harbor 通過​

    ​https://IP​

    ​ 提供服務,使用自簽名的證書。
  2. Harbor 有兩個網卡,分别是​

    ​10.10.1/24​

    ​​ 和​

    ​10.10.10/24​

    ​​,HTTPS 服務證書指定的​

    ​10.10.10/24​

    ​ 的 IP。
  3. k8s 新的幾個叢集都在​

    ​10.10.0/24​

    ​ 網段。
  4. 這幾個新的叢集都無法從 Harbor 下載下傳鏡像。

處理方法

一開始在 k8s 添加了到 10.10.10/24 的路由,能 ping 通,但是仍然無法 pull。

經過排查網絡問題,發現在 Harbor 上響應請求時,找不到 ​

​10.10.0/24​

​​ 網段的伺服器,在 Harbor 同樣配置路由後解決。配置路由就遇到了 ​​Harbor Https 私有證書配置注意事項​​ 中提過的證書問題。按照注意事項配置後解決。

CentOS 添加路由

參考: ​​Add a Static Route on 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:      

目前目錄需要提供 harbor 的 ​

​ca.crt​

​​ 以及網卡對應的路由配置檔案 ​

​route-ens160​

​。