---
# System prepended metadata

title: Harbor 2.0 Migration
tags: [Harbor]

---

# Harbor 2.0 Migration
###### tags: `Harbor`

## 前言與目的

為了取代一案Harbor需撰寫完整SOP
## 事前準備

> - 確認一案images都是可以被pull狀態?
> - 確認一案和二案harbor網路是通的?
> - 申請CR單變更外部DNS設定之IPs
### 預計影響

| 項目         | Harbor(舊)        | Harbor(新)       | After Merge    |
| ------------ |:----------------- |:---------------- |:-------------- |
| 專案數量     | 111               | 2                | 114            |
| 網路環境(IP) | 172.16.31.111~115 | 172.29.101.1~5   | 172.29.101.1~5 |
| 主機帳密     |                   | admin/nchcharbor |                |
| Domain name     |   registry.twcc.ai    | registry2.twcc.ai                 | registry.twcc.ai

二案預計保留的映象檔有
AI Maker: AI Tranning and Inference 應用之映像檔
Data-Pipeline: Dadabase服務之映像檔
### 資料備份

1. 備份一案MariaDB
    a. 連線至DB環境 (需申請登入帳密)
    b. command line備份
    * 172.16.31.106
    ```
    mysqldump -u root -p air_service > backup_"$(date)".sql
    ```


2. 備份二案PostgreSQL
    a. 連線至DB環境並轉換使用者身分為pstgres
    ```
    # ssh 172.22.4.199
    # su postgres
    ```
    b. 透過pg_dump指令備份clair資料
    ```
    $ pg_dump clair > backup-clair.out
    ```
    c. 透過pg_dump指令備份harbor資料
    ```
    $ pg_dump harbor > backup-harbor.out
    ```
    d. 透過pg_dump指令備份所有資料
    ```
    $ pg_dumpall > db.out
    $ \q
    $ exit
    # exit
    ```

### 整體流程
***總執行時間約五個工作天***
1. 現存專案與資料轉移 (replication) (done)
    a. 登入二案harbor進行設定
    * 新增registry endpoint(一案)
    ![](https://i.imgur.com/drM68io.png)
    ![](https://i.imgur.com/3aex8Yn.png)
    * 新增replication rule
    ![](https://i.imgur.com/Rl2UkVM.png)
    ![](https://i.imgur.com/z0xkUwo.png)
    Override為同路徑的image若layer不同是否覆蓋
    
    b. 開始複製
    ![](https://i.imgur.com/8BciUWh.png)

    c. 確認replication task 執行成功
    ![](https://i.imgur.com/p8A2LGf.png)

    d. 確認複製結果(示意圖)
    * 原一案
    ![](https://i.imgur.com/QLGltif.png)
    * 原二案
    ![](https://i.imgur.com/ktg6GUB.png)
    * 複製後的二案
    ![](https://i.imgur.com/JJMipLi.png)
    * 路徑衝突且layer不同之處理
        * 一案
        ![](https://i.imgur.com/uqVk39q.png)
        * 二案
        ![](https://i.imgur.com/vprUE61.png)
        * 複製後的二案(Override = true)
        ![](https://i.imgur.com/pNRUuDV.png)
        路徑衝突且layer不同後覆寫的相關log
        ![](https://i.imgur.com/B4fnYkK.png)
        * 複製後的二案(Override = false)
        ![](https://i.imgur.com/4fmNqkx.png)
        路徑衝突且layer不同後不覆寫的相關log
        ![](https://i.imgur.com/hz5gHML.png)
        
    e. 檢查搬移專案configuration
        i. 掃描功能相關設定


2. 環境測試(手動測試) (done)
    | 測項                    | 說明                               | note |
    | ----------------------- | ---------------------------------- | ---- |
    | HealthCheck(Harbor)     | 驗證Harbor系統是否正常             |      |
    | HealthCheck(Database)   | 驗證後端資料庫系統叢集是否正常     |      |
    | HealthCheck(Registry)   | 驗證後端儲存系統是否正常           |      |
    | HealthCheck(Core)       | 驗證Harbor核心功能是否正常         |      |
    | HealthCheck(Redis)      | 驗證後端子系統Redis叢集是否正常    |      |
    | HealthCheck(JobService) | 驗證任務派發功能是否正常           |      |
    | HealthCheck(Portal)     | 驗證Harbor原生管理者頁面是否正常   |      |
    | HealthCheck(Clair)      | 驗證後端掃描系統Clair是否正常      |      |
    | docker pull             | 手動驗證command line拉取映象檔是否正常 |      |
    | docker push             | 手動驗證command line推送映象檔是否正常 |      |

3. issue fix (all) (on-going)
4. 執行 Harbor 初始化 script (on-going) 

5. 服務入口轉移(併行測試結束後方可執行)
    a. 停止一案harbor 
    b. 申請CR單變更外部DNS設定之IPs (國網同仁會幫忙申請)
    * 172.29.101.6~172.29.101.10

    c. 修改Harbor主機設定檔
    * 172.29.101.1~172.29.101.5
        ```
        # cd /opt/harbor
        # docker-compose down    
        # vim /opt/harbor/harbor.yml
          +=:
            hostname: registry.twcc.ai

        # vim /opt/harbor/common/config/core/env
          +=:
            EXT_ENDPOINT=https://registry.twcc.ai

        # vim /opt/harbor/common/config/registry/config.yml
          +=:
            realm: https://registry.twcc.ai/service/token
            
        # docker-compose up -d
        ```

[待確認或討論問題]
3-1. 國網DNS修改這部分要請誰幫忙?怎麼進行?
Ans: 
內部DNS: 申請完程,併行測試中.
外部DNS: 預計使用一案外部DNS, 需走CR流程.

<!--
## 案例說明
### case1: 本地project不存在
>在他端(128)存在路徑為t1/r1/mariadb:latest的image
![](https://i.imgur.com/TYp6fMb.png)
在本地端(129)則沒有t1這個project
![](https://i.imgur.com/EOyffYX.png)
在本地端自動生成project t1
![](https://i.imgur.com/mi3aII8.png)
image成功複製
![](https://i.imgur.com/zLjTFRc.png)
在本地端設定他端的replication rule
![](https://i.imgur.com/DCfdnZn.png)
開始複製
![](https://i.imgur.com/h7GrYi8.png)
確認複製進度及結果
![](https://i.imgur.com/qnGAtKQ.png)
### case2: 本地project存在
>他端project
![](https://i.imgur.com/H259HXl.png)
本端同名project
![](https://i.imgur.com/aVVtfqI.png)
複製後結果
![](https://i.imgur.com/bFjJW4H.png)

### case3: 本地project存在且存在相同路徑之image
>他端images
![](https://i.imgur.com/uqVk39q.png)
本地端同路徑images
![](https://i.imgur.com/vprUE61.png)
路徑衝突且layer不同後覆寫的相關log
![](https://i.imgur.com/B4fnYkK.png)
路徑衝突且layer不同後不覆寫的相關log
![](https://i.imgur.com/hz5gHML.png)
路徑衝突後直接覆寫的相關log
![](https://i.imgur.com/mWW5ZSG.png)
路徑衝突後不覆寫的相關log
![](https://i.imgur.com/Nd3eZj1.png)

結論:本地的相同路徑若不存在則自動生成，若存在則直接放置於相同的本地路徑；路徑衝突且layer不同之image則須決定是否覆蓋
-->


