Skip to content

antony@notes:~/rancher$ cat "Full-Offline-Installation-Harbor-RKE2-Rancher.md"

Full Offline Installation - Harbor, RKE2, Rancher

2024-07-29· rancher ·Full Offline Installation

Full Offline Installation - Harbor, RKE2, Rancher

Preface

本篇文章主要介紹如何在離線模式下,安裝 Harbor v2.7.0, RKE2 v1.25.9, Rancher Prime v2.7.3 和 Neuvector 5.1.3,主要分為兩大部分

  1. 準備離線安裝所需之檔案
  2. 開始離線安裝

可以透過點擊展開以下目錄,選擇想看的內容,跳轉至特定章節

:::warning

:::spoiler 文章目錄

[TOC]

:::

準備離線安裝

Requirements for Docker, Hardware, and Networking

  • 一台機器,最低規格: 4 CORE, 8G RAM, 250G Disk (建議 300G 以上)
  • Disk 檔案系統為 Btrfs,需啟動 LVM,將 / 目錄的可用空間設為 270G ,/home 目錄 30G
  • 須能上網
  • 檢查 Docker 儲存 Image 的目錄應為 /var/lib/docker
$ sudo docker info -f '{{ .DockerRootDir}}'
  • 檢查目錄的儲存容量

邏輯層

$ lsblk -o NAME,SIZE,MOUNTPOINTS

實體層

$ df -hT
  • 檢查 Docker 儲存 Image 的目錄目前已使用多大的儲存空間
$ sudo du -sh `sudo docker info -f '{{ .DockerRootDir}}'`

Prepare

Create Working Directory

$ mkdir -p work/{harbor,rke2,rancher,minio,compressed_files}

準備 Harbor v2.7.0 全離線安裝包

  1. 切換工作目錄
$ cd ~/work/harbor
  1. 下載 Harbor 壓縮檔,版本 v2.7.0
$ wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
  1. 下載 Docker Compose 套件,版本 1.18
$ sudo wget https://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64
  1. 將以上離線安裝 Harbor 所需之套件壓縮成一個檔案
$ cd ..; tar -czf compressed_files/harbor-offline.tar.gz harbor/
  1. 檢查是否符合預期
$ ls -lh compressed_files/

螢幕輸出

total 762M
-rw-r--r-- 1 762M harbor-offline.tar.gz

解壓縮命令 : tar -xzf compressed_files/harbor-offline.tar.gz

準備 RKE2 v1.25.9 全離線安裝包

  1. 切換工作目錄,並切換為 root 使用者
$ cd ~/work/rke2 && sudo su
  1. 下載離線安裝 RKE2 所需 Image 之壓縮檔
$ curl -# -OL https://github.com/rancher/rke2/releases/download/v1.25.9%2Brke2r1/rke2-images.linux-amd64.tar.zst

$ curl -# -OL https://github.com/rancher/rke2/releases/download/v1.25.9%2Brke2r1/rke2.linux-amd64.tar.gz

$ curl -# -OL https://github.com/rancher/rke2/releases/download/v1.25.9%2Brke2r1/sha256sum-amd64.txt
  1. 下載官網提供的離線安裝 RKE2 所需之安裝腳本,並賦予它執行權限
$ curl -sfL https://get.rke2.io --output install.sh && chmod +x install.sh
  1. 檢查當前目錄下的檔案
$ ls -lh

螢幕輸出

total 939M
-rwxr-xr-x 1 root root  22K May 23 13:48 install.sh
-rw-r--r-- 1 root root 915M May 23 13:46 rke2-images.linux-amd64.tar.zst
-rw-r--r-- 1 root root  25M May 23 13:47 rke2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 3.6K May 23 13:47 sha256sum-amd64.txt
  1. 將以上離線安裝 RKE2 所需之檔案,壓縮成一個檔案
$ cd ..; tar -czf compressed_files/rke2-offline.tar.gz rke2/
  1. 檢查是否符合預期
$ ls -lh compressed_files/

螢幕輸出

total 1.7G
-rw-r--r-- 1 762M harbor-offline.tar.gz
-rw-r--r-- 1 937M rke2-offline.tar.gz

解壓縮命令 : tar -xzf compressed_files/rke2-offline.tar.gz

  1. 離開 root 使用者
$ exit

準備 Rancher Prime v2.7.3 全離線安裝包

$ cd ~/work/rancher

# 安裝 helm
$ wget https://get.helm.sh/helm-v3.8.2-linux-amd64.tar.gz

$ tar zxvf helm-v3.8.2-linux-amd64.tar.gz

$ sudo cp linux-amd64/helm /usr/local/bin/

$ helm repo add rancher-prime https://charts.rancher.com/server-charts/prime

$ helm repo update

$ helm fetch rancher-prime/rancher --version=v2.7.3

$ wget https://github.com/rancher/rancher/releases/download/v2.7.3/rancher-images.txt

$ wget https://github.com/rancher/rancher/releases/download/v2.7.3/rancher-load-images.sh

$ wget https://github.com/rancher/rancher/releases/download/v2.7.3/rancher-save-images.sh
  • 準備 cert-manager 環境
$ wget https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.crds.yaml

$ helm repo add jetstack https://charts.jetstack.io

$ helm repo update

$ helm fetch jetstack/cert-manager --version v1.11.0

$ sudo docker pull quay.io/jetstack/cert-manager-controller:v1.11.0

$ sudo docker pull quay.io/jetstack/cert-manager-webhook:v1.11.0

$ sudo docker pull quay.io/jetstack/cert-manager-cainjector:v1.11.0

$ sudo docker pull quay.io/jetstack/cert-manager-ctl:v1.11.0

# 之後要再改 tag push 到 harbor
$ sudo docker images
REPOSITORY                                 TAG       IMAGE ID       CREATED         SIZE
nginx                                      stable    7067317e3807   10 days ago     142MB
quay.io/jetstack/cert-manager-controller   v1.7.1    db7725ef729d   12 months ago   65.9MB
quay.io/jetstack/cert-manager-webhook      v1.7.1    36736adc2f4b   12 months ago   52.5MB
quay.io/jetstack/cert-manager-cainjector   v1.7.1    623ec0d31539   12 months ago   44.5MB
quay.io/jetstack/cert-manager-ctl          v1.7.1    4e60e4ce697f   12 months ago   57.2MB

$ sudo docker tag quay.io/jetstack/cert-manager-controller:v1.7.1 harbor.example.com/rancher/cert-manager-controller:v1.7.1
$ sudo docker tag quay.io/jetstack/cert-manager-webhook:v1.7.1 harbor.example.com/rancher/cert-manager-webhook:v1.7.1
$ sudo docker tag quay.io/jetstack/cert-manager-cainjector:v1.7.1 harbor.example.com/rancher/cert-manager-cainjector:v1.7.1
$ sudo docker tag quay.io/jetstack/cert-manager-ctl:v1.7.1 harbor.example.com/rancher/cert-manager-ctl:v1.7.1
  • 下載 neuvector image
$ sudo docker pull neuvector/controller:5.1.3

$ sudo docker pull neuvector/manager:5.1.3

$ sudo docker pull neuvector/enforcer:5.1.3

$ sudo docker pull neuvector/scanner:latest

$ sudo docker pull neuvector/updater:latest

$ sudo docker tag neuvector/scanner harbor.example.com/rancher/neuvector/scanner

$ sudo docker tag neuvector/updater harbor.example.com/rancher/neuvector/updater

$ sudo docker tag neuvector/manager:5.1.1 harbor.example.com/rancher/neuvector/manager:5.1.1

$ sudo docker tag neuvector/enforcer:5.1.1 harbor.example.com/rancher/neuvector/enforcer:5.1.1

$ sudo docker tag neuvector/controller:5.1.1 harbor.example.com/rancher/neuvector/controller:5.1.1
  • 下載所有 rancher 會用到的 image
$ chmod +x rancher-save-images.sh

$ chmod +x rancher-load-images.sh

$ ll
total 13432
-rw-r--r-- 1 rancher users    66038 Feb 20 10:20 cert-manager-v1.7.1.tgz
-rw-r--r-- 1 rancher users 13633605 Apr 14  2022 helm-v3.8.2-linux-amd64.tar.gz
-rw-r--r-- 1 rancher users    13996 Feb 20 10:10 rancher-2.7.1.tgz
-rw-r--r-- 1 rancher users    19406 Jan 25 06:21 rancher-images.txt
-rwxr-xr-x 1 rancher users     4115 Jan 25 06:22 rancher-load-images.sh
-rwxr-xr-x 1 rancher users     1757 Jan 25 06:21 rancher-save-images.sh
drwxr-xr-x 2 rancher rancher       50 Apr 14  2022 linux-amd64
-rw-r--r-- 1 rancher rancher   358698 Feb  4  2022 cert-manager.crds.yaml

# 預計下載會等兩個小時
# registry.rancher.com rancher-prime 來源
$ sudo ./rancher-save-images.sh --image-list ./rancher-images.txt --images rancher-images.tar.gz --source-registry registry.rancher.com | tee result.log
  • 壓縮全離線安裝 rancher 會需要的所有檔案
$ tar -czvf rancher-offline.tar.gz cert-manager.crds.yaml image/rancher-image.tar.gz helm-v3.8.2-linux-amd64.tar.gz rancher-2.7.3.tgz cert-manager-v1.11.0.tgz rancher-images.txt rancher-load-images.sh push.sh

程式自動化

:::spoiler load 和 Save 自動化程式

#!/bin/bash

[ -f detail-result.txt ] && cat /dev/null > detail-result.txt
[ -f result.txt ] && cat /dev/null > result.txt
exec {BASH_XTRACEFD}>>detail-result.txt
set -x

## load Image

### var

all_image_txt=$(cat rancher-images.txt cert-manager-images.txt neuvector-images.txt)

while read line
do
  if sudo docker images "${line}" | grep -q "${line%:*}"; then
    if ! sudo docker rmi "${line}" &> /dev/null; then
      echo rmi "${line}" Error && exit 1
    fi
  fi
done <<< $(cat rancher-images.txt | sed 's|registry.rancher.com/||g')


while read image
do
  if ! sudo docker pull "$image" 1> /dev/null 2> ./result.txt; then
    echo pull "$image" Error && exit 1
  fi
done <<< $(cat rancher-images.txt cert-manager-images.txt neuvector-images.txt)


## Save Image

### var
all_image=$(cat rancher-images.txt cert-manager-images.txt | tr '\n' ' ')
neuvector_image=$(cat neuvector-images.txt | sed 's|docker.io/||g' | tr '\n' ' ')

for n in $all_image $neuvector_image
do
  if ! sudo docker images "$n" | grep -q "${n%:*}"; then
    echo "$n" pull Error >> pull_error.txt
    if ! sudo docker pull "$n" 1> /dev/null 2> still_pull_error.txt; then
      echo "$n" pull Error twice >> pull_error.txt && exit 1
    fi
  fi
done

sudo docker save $all_image | gzip --stdout > rancher-cert_manager-image.tar.gz
[ "$?" != "0" ] && echo "save rancher image error" && exit 1

## 壓成一個壓縮檔
tar -czf ../compressed_files/rancher-offline.tar.gz rancher-cert_manager-image.tar.gz rancher-2.7.3.tgz cert-manager-v1.11.0.tgz helm-v3.8.2-linux-amd64.tar.gz cert-manager.crds.yaml

sudo docker save $neuvector_image | gzip --stdout > ../compressed_files/neuvector-image.tar.gz
[ "$?" != "0" ] && echo "save neuvector image error" && exit 1

tar -czf ../compressed_files/full-offline.tar.gz ../compressed_files/harbor-offline.tar.gz  ../compressed_files/neuvector-image.tar.gz  ../compressed_files/rancher-offline.tar.gz  ../compressed_files/rke2-offline.tar.gz
[ "$?" == "0" ] && split -b 7G ../compressed_files/full-offline.tar.gz ../compressed_files/full-offline.tar.gz.part

:::



:::spoiler minio

minio

$ cd ~/work/minio

# 準備 docker-compose
$ sudo wget https://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64
  • 準備 image
$ sudo docker pull minio/minio

$ sudo docker tag minio/minio harbor.example.com/library/minio

$ sudo docker push harbor.example.com/library/minio

:::


開始離線安裝

建置系統環境確認

  • Private Registry: 4 CORE, 6G RAM, 300G Disk
  • Rancher Manager: 4 CORE, 8G RAM, 100G Disk
  • Kubernetes Master: 4 CORE, 8G RAM, 100G Disk
  • Worker(*3): 4 CORE, 8G RAM, 100G Disk

安裝前準備

  1. 確認 根目錄 可用空間
$ df -hT /

螢幕輸出:

Filesystem              Type   Size  Used Avail Use% Mounted on
/dev/mapper/system-root btrfs  200G   28G  173G  14% /
  1. 將全離線安裝包上傳至機器
$ scp -r split/ <遠端機器>

檢查 split/ 目錄下之全離線安裝包檔案

ls -lh split/

螢幕輸出

total 27G
-rw-r--r-- 1 root root 7.0G Jun  6 21:51 full_offline.tar.gz.aa
-rw-r--r-- 1 root root 7.0G Jun  6 21:51 full_offline.tar.gz.ab
-rw-r--r-- 1 root root 7.0G Jun  6 21:52 full_offline.tar.gz.ac
-rw-r--r-- 1 root root 5.9G Jun  6 21:53 full_offline.tar.gz.ad
  1. 建立並切換工作目錄
$ mkdir -p compressed_files && cd compressed_files/
  1. 解壓縮全離線安裝包 (耗時約 3 分鐘)
$ cat ../split/full_offline.tar.gz.a* | tar -zxvf -

須注意全離線安裝包的路徑

螢幕輸出:

harbor-offline.tar.gz
rancher-offline.tar.gz
rke2-offline.tar.gz

檢視檔案

ls -lh

螢幕輸出 :

total 27G
-rw-r--r-- 1 1003 users 762M May 23 14:33 harbor-offline.tar.gz
-rw-r--r-- 1 1003 users  26G May 26 10:34 rancher-offline.tar.gz
-rw-r--r-- 1 root root  937M May 23 15:10 rke2-offline.tar.gz
  1. 將 harbor、rancher、rke2 全離線安裝包傳送至對應之機器
$ scp harbor-offline.tar.gz  <harbor 的機器>
$ scp rke2-offline.tar.gz  <rancher 的機器>
$ scp rancher-offline.tar.gz  <rancher 的機器>
$ scp rke2-offline.tar.gz  <rke2 的機器>

安裝 harbor v2.7.0

  1. 連線至 harbor 機器,並確認目錄可用空間

檢查命令

df -hT / /home

螢幕輸出 :

Filesystem              Type   Size  Used Avail Use% Mounted on
/dev/mapper/system-root btrfs  200G   28G  173G  14% /
/dev/mapper/system-home xfs     50G   84M   50G   1% /home 
  1. Enable Repositories
$ sudo zypper mr -e 1 2 3 4
  1. 安裝 docker
$ sudo zypper in -y docker && sudo systemctl enable --now docker

系統需要有 “Containers-Module” Repository

  1. 安裝 DNS Server
$ sudo zypper in -y -t pattern dhcp_dns_server  
  1. 將 harbor 和 Rancher 的 Domain Name 到 DNS Server 註冊成 A Record
$ sudo yast2 dns-server
  1. 檢查 Harbor 和 Rancher 的名稱解析
$ host rancher.example.com && host harbor.example.com

螢幕輸出 :

rancher.example.com has address 192.168.61.62
harbor.example.com has address 192.168.61.61
  1. 解壓縮 harbor 全離線安裝包 (耗時約 4 秒鐘),並切換至 harbor/ 目錄
$ tar -zxvf harbor-offline-v2.11.0.tar.gz && cd harbor/v2.11.0/

螢幕輸出:

harbor/
harbor/harbor-offline-installer-v2.11.0.tgz
harbor/docker-compose-Linux-x86_64
  1. 將 docker-compose 移至 /usr/bin 目錄下,並賦予 755 之權限
$ sudo mv docker-compose-linux-x86_64 /usr/bin/docker-compose && sudo chmod 755 /usr/bin/docker-compose
  1. 解壓縮 harbor-offline-installer,並切換至工作目錄
$ tar -xvf harbor-offline-installer-v2.11.0.tgz; cd harbor/
  1. 複製 harbor.yml
$ cp harbor.yml.tmpl harbor.yml
  1. 建立自簽憑證工作目錄
$ mkdir ssl;cd ssl

:::spoiler 憑證腳本

$ cat mk
#!/bin/bash

domain=$2
ip=$3

help()
{
  cat <<EOF
Usage: mk [OPTIONS]

Available options:

create    create [domain] [IP]
delete    delete cert
test      test
EOF
  exit
}

ssl()
{
openssl genrsa -aes256 -passout pass:password -out ca-key.pem 4096

openssl req -new -x509 -sha256 -days 365 -subj "/C=TW/ST=Taipei/L=Taipei/O=test/OU=lab/CN=example" -passin pass:password -key ca-key.pem -out ca.pem

openssl genrsa -out cert-key.pem 4096

openssl req -new -sha256 -subj "/CN=example" -key cert-key.pem -out cert.csr

echo -e "subjectAltName=DNS:${domain},IP:${ip}\nextendedKeyUsage = serverAuth" > extfile.cnf

openssl x509 -req -sha256 -days 365 -passin pass:password -in cert.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf -CAcreateserial
}

de()
{
rm ca-key.pem ca.pem ca.srl cert.csr cert-key.pem cert.pem extfile.cnf &>/dev/null
if [ "$?" == "0" ];then
  echo "delete all cert ok!"
else
  echo "delete cert fail,please check!"
fi
}

ts()
{
openssl verify -CAfile ca.pem -verbose cert.pem
}


case $1 in
  create)
    if [ "$#" == "3" ];then
      ssl
    else
      help
    fi
  ;;
  delete)
    de
  ;;
  test)
    ts
  ;;
  *)
    help
  ;;
esac

:::


  1. 透過自動化程式建立自簽憑證
$ ./mk create harbor.example.com 192.168.11.90

$1,放 Domain Name $2,Harbor 機器之 IP 位址

螢幕輸出 :

Generating RSA private key, 4096 bit long modulus (2 primes)
..++++
............................++++
e is 65537 (0x010001)
Generating RSA private key, 4096 bit long modulus (2 primes)
................................................................................................................................++++
.............................++++
e is 65537 (0x010001)
Signature ok
subject=CN = example
Getting CA Private Key
  1. 檢視自動化程式建立自簽憑證產生之檔案
$ ls -l

螢幕輸出 :

total 32
-rw------- 1 rancher users 3326 Jun  6 00:45 ca-key.pem
-rw-r--r-- 1 rancher users 2009 Jun  6 00:45 ca.pem
-rw-r--r-- 1 rancher users   41 Jun  6 00:45 ca.srl
-rw------- 1 rancher users 3243 Jun  6 00:45 cert-key.pem
-rw-r--r-- 1 rancher users 1582 Jun  6 00:45 cert.csr
-rw-r--r-- 1 rancher users 1874 Jun  6 00:45 cert.pem
-rw-r--r-- 1 rancher users   85 Jun  6 00:45 extfile.cnf
-rwxr-xr-x 1 rancher users 1175 Jun  6 00:44 mk
  1. 切換回上一層目錄,並編輯 harbor.yml
$ cd .. && vim harbor.yml

針對以下 3 個內容進行設定

檔案內容 :

# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.example.com  

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /home/rancher/harbor/cert.pem 
  private_key: /home/rancher/harbor/cert-key.pem 
......以下內容省略
  1. 讓 Docker 信任 自簽憑證
$ sudo mkdir /etc/docker/certs.d

$ sudo cp ssl/ca.pem /etc/docker/certs.d/

$ sudo systemctl restart docker
  1. 讓 OS 信任憑證
$ sudo cp ssl/ca.pem /usr/share/pki/trust/anchors/

$ sudo cp ssl/ca.pem /etc/pki/trust/anchors/

$ sudo update-ca-certificates --fresh
  1. 啟動 harbor
$ sudo ./install.sh --with-trivy
  1. 檢查 harbor 服務是否正常啟動
$ sudo docker-compose ps

螢幕輸出 :

      Name                     Command               State                              Ports
------------------------------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up
harbor-db           /docker-entrypoint.sh  13        Up
harbor-jobservice   /harbor/entrypoint.sh            Up
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up      127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up
nginx               nginx -g daemon off;             Up      0.0.0.0:80->8080/tcp,:::80->8080/tcp,
                                                             0.0.0.0:443->8443/tcp,:::443->8443/tcp
redis               redis-server /etc/redis.conf     Up
registry            /home/harbor/entrypoint.sh       Up
registryctl         /home/harbor/start.sh            Up
trivy-adapter       /home/scanner/entrypoint.sh      Up
  1. 透過 curl 檢查,可否 Access harbor 的 Web UI
$ curl -k -H "host: 192.168.61.61" "https://harbor.example.com/dashboard/"

螢幕輸出 :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Harbor</title>
        <base href="/"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <link rel="icon" type="image/x-icon" href="favicon.ico?v=2"/>
    <link rel="stylesheet" href="styles.778b44f8c96802aa.css"></head>
    <body>
        <harbor-app>
            <div class="spinner spinner-lg app-loading app-loading-fixed">
                Loading...
            </div>
        </harbor-app>
    <script src="runtime.5bc96e435ac00039.js" type="module"></script><script src="polyfills.d52770ae19691b1f.js" type="module"></script><script src="scripts.fc6b7827d4dcd875.js" defer></script><script src="main.a842fe34c6928c35.js" type="module"></script></body>
</html>
  1. 在 Firefox 瀏覽器匯入憑證 (ca.pem)

步驟 : 設定 -> 隱私與安全性 -> 檢視憑證 -> 匯入

  1. 在瀏覽器上登入 harbor
  1. 建立一個 rancher 的 project 點選公開

  1. 透過 docker 登入 harbor
$ sudo docker login harbor.example.com

螢幕輸出 :

Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 設定 Harbor 在機器開機時自動啟動
$ cat <<EOF | sudo tee /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor start at boot
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /home/rancher/harbor/v2.11.0/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /home/rancher/harbor/v2.11.0/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl enable harbor --now 

在 harbor 主機 準備 離線安裝 rke2,rancher,neuvector 所需之 image

  1. 建立並切換至 rancher 目錄
$ mkdir rancher; cd rancher
  1. rancher-offline.tar.gz 解壓縮 (耗時約 3 分鐘)
$ tar -xzvf ../rancher-offline.tar.gz

螢幕輸出 :

cert-manager.crds.yaml
image/rancher-image.tar.gz
helm-v3.8.2-linux-amd64.tar.gz
rancher-2.7.3.tgz
cert-manager-v1.11.0.tgz
rancher-images.txt
rancher-load-images.sh
push.sh
  1. 檢查當前目錄之檔案是否符合預期
$ ls -lh

螢幕輸出 :

total 14M
-rw-r--r-- 1 1003 users  65K May 23 16:48 cert-manager-v1.11.0.tgz
-rw-r--r-- 1 1003 users 380K Jan 11 22:56 cert-manager.crds.yaml
-rw-r--r-- 1 1003 users  14M Apr 14  2022 helm-v3.8.2-linux-amd64.tar.gz
drwxr-xr-x 1 root root    40 Jun  7 00:30 image
-rwxr-xr-x 1 1003 users 1.4K May 26 09:55 push.sh
-rw-r--r-- 1 1003 users  14K May 22 10:22 rancher-2.7.3.tgz
-rw-r--r-- 1 1003 users  33K May 25 09:46 rancher-images.txt
-rw-r--r-- 1 1003 users 4.1K Apr 24 23:55 rancher-load-images.sh
  1. 編輯 push.sh 程式,須修改程式內 image 壓縮檔的目錄
$ vi push.sh

將第 10 行的 compressed_files/ 刪除

# Load image
sudo docker load --input compressed_files/image/rancher-image.tar.gz

改成

# Load image
sudo docker load --input image/rancher-image.tar.gz
  1. 執行自動將 離線安裝 rke2、rancher 和 neuvector 的 image PUSH 到 自建 Harbor (耗時約 2 小時左右)
$ ./push.sh

:::spoiler push 程式

#!/bin/bash

# output log
exec {BASH_XTRACEFD}>>detail.log

# Debug mode
set -x

# Load image
sudo docker load --input image/rancher-image.tar.gz | tee load-image.std.log 2> load-image.str.log 
[ "$?" != "0" ] && echo load image fail && exit 1

# var
rancher_image=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep  '^registry.rancher.com')
n_image=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep "^neuvector")
cert_image=$(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep "^quay.io")
registry_name='harbor.example.com'


for n in $cert_image
do
  x=$(echo ${n/quay.io/${registry_name}})
  sudo docker tag "$n" "${x/jetstack/rancher}"
  [ "$?" != "0" ] && echo "$n" tag fail >> tag.log && exit 1
  sudo docker push "${x/jetstack/rancher}"
  [ "$?" != "0" ] && echo "${x/jetstack/rancher}" push fail >> push.log && exit 1
done

for e in $n_image
do
  a=$(echo ${registry_name}/rancher/"$e")
  sudo docker tag "$e" "$a"
  [ "$?" != "0" ] && echo "$e" tag fail >> tag.log && exit 1
  sudo docker push "$a"
  [ "$?" != "0" ] && echo "$a" push fail >> push.log && exit 1
done

for r in $rancher_image
do
  sudo docker tag $r ${r/registry.rancher.com/${registry_name}}
  [ "$?" != "0" ] && echo "$r" tag fail >> tag.log && exit 1
  sudo docker push "${r/registry.rancher.com/${registry_name}}"
  [ "$?" != "0" ] && echo "${r/registry.rancher.com/${registry_name}}" push fail >> push.log && exit 1
done

:::


  1. 到 harbor 網站檢查 image 的數量應該要有 200 張

安裝 Upstream Cluster - RKE2 v1.25.9

  1. 連線至 Rancher 主機

  2. 檢查 Harbor 和 Rancher 的名稱解析

$ host rancher.example.com && host harbor.example.com

螢幕輸出 :

rancher.example.com has address 192.168.61.62
harbor.example.com has address 192.168.61.61
  1. 解壓縮 rke2-airgap-v1.28.10.tar.gz,並切換至 rke2 目錄
$ tar -zxvf rke2-airgap-v1.28.10.tar.gz && cd rke2/v1.28.10
  1. 檢視目錄結構
$ ls -lh

螢幕輸出 :

total 939M
-rwxr-xr-x 1 rancher users  22K May 23 13:48 install.sh
-rw-r--r-- 1 rancher users 915M May 23 13:46 rke2-images.linux-amd64.tar.zst
-rw-r--r-- 1 rancher users  25M May 23 13:47 rke2.linux-amd64.tar.gz
-rw-r--r-- 1 rancher users 3.6K May 23 13:47 sha256sum-amd64.txt
  1. 將 RKE2 全離線安裝包的物件,搬移至 /root/rke2-artifacts/
$ sudo mkdir /root/rke2-artifacts && sudo mv * /root/rke2-artifacts/
  1. 切換為 root 使用者,並將工作目錄切換至 /root/rke2-artifacts/
$ sudo su - root

# cd /root/rke2-artifacts/
  1. 檢視目錄結構
# ls -lh

螢幕輸出 :

total 939M
-rwxr-xr-x 1 rancher users  22K May 23 13:48 install.sh
-rw-r--r-- 1 rancher users 915M May 23 13:46 rke2-images.linux-amd64.tar.zst
-rw-r--r-- 1 rancher users  25M May 23 13:47 rke2.linux-amd64.tar.gz
-rw-r--r-- 1 rancher users 3.6K May 23 13:47 sha256sum-amd64.txt
  1. 執行 RKE2 安裝腳本
# INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh

螢幕輸出 :

[WARN]  /usr/local is read-only or a mount point; installing to /opt/rke2
[INFO]  staging local checksums from /root/rke2-artifacts/sha256sum-amd64.txt
[INFO]  staging zst airgap image tarball from /root/rke2-artifacts/rke2-images.linux-amd64.tar.zst
[INFO]  staging tarball from /root/rke2-artifacts/rke2.linux-amd64.tar.gz
[INFO]  verifying airgap tarball
grep: /tmp/rke2-install.VlfWezVfj7/rke2-images.checksums: No such file or directory
[INFO]  installing airgap tarball to /var/lib/rancher/rke2/agent/images
[INFO]  verifying tarball
[INFO]  unpacking tarball file to /opt/rke2
[INFO]  updating tarball contents to reflect install path
[INFO]  moving systemd units to /etc/systemd/system
[INFO]  install complete; you may want to run:  export PATH=$PATH:/opt/rke2/bin

r1:~/rke2-artifacts # export PATH=$PATH:/opt/rke2/bin
  1. 設定 RKE2 Node 之基本組態檔
# mkdir -p /etc/rancher/rke2/

# vim /etc/rancher/rke2/config.yaml

檔案內容 :

node-name:
  - "rms-1"
token: my-shared-secret
  1. 設定 RKE2 的 Registry 設定檔
$ vim /etc/rancher/rke2/registries.yaml

檔案內容 :

mirrors:
  docker.io:
    endpoint:
      - "https://harbor.example.com"
configs:
  "harbor.example.com":
    auth:
      username: admin
      password: Harbor12345
    tls:
      insecure_skip_verify: true
  1. 啟用 RKE2 服務
# systemctl enable --now rke2-server

螢幕輸出 :

Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /etc/systemd/system/rke2-server.service.

退出 root 使用者

# exit
  1. 設定 kubeconfigkubectl
$ cd ~ && mkdir ~/.kube && \
  sudo cp /etc/rancher/rke2/rke2.yaml .kube/config && \
  sudo chown rancher .kube/config && \
  sudo cp /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/ && \
  sudo cp /opt/rke2/bin/* /usr/local/bin/
  1. 檢視 node 狀態
$ kubectl get nodes

螢幕輸出 :

NAME    STATUS   ROLES                       AGE   VERSION
rms-1   Ready    control-plane,etcd,master   27m   v1.25.9+rke2r1
  1. 如果要 Join 多台 Server Nodes ,重複以上流程即可 (不是 HA 架構,請跳過本步驟)

Note: 在建立其他台 Server Nodes 時,RKE2 基本組態設定檔必須指定第一台 RKE2 Server node 的 IP

$ vim /etc/rancher/rke2/config.yaml

檔案內容 :

server: https://192.168.80.12:9345
node-name:
  - "rms-2"
token: my-shared-secret
  1. Run 一個 Nginx 的 Pod ,測試可否拉的到 Harbor 上的 Image
$ kubectl run myweb --image=rancher/library-nginx:1.19.2-alpine

螢幕輸出 :

pod/myweb created

檢查 STATUS 是否為 Running

$ kubectl get pod

螢幕輸出 :

NAME      READY   STATUS    RESTARTS   AGE
pod/web   1/1     Running   0          4s

安裝 Rancher Prime v2.7.3

  1. 連線至 Rancher 所在之主機

  2. 檢查 Harbor 和 Rancher 的名稱解析

$ host rancher.example.com && host harbor.example.com

螢幕輸出 :

rancher.example.com has address 192.168.61.62
harbor.example.com has address 192.168.61.61
  1. 解壓縮 Rancher 離線安裝包 rancher-offline.tar.gz
$ tar -zxvf rancher-airgap-config-v2.8.5.tar.gz

螢幕輸出 :

rancher/v2.8.5/
rancher/v2.8.5/rancher-2.8.5.tgz
rancher/v2.8.5/cert-manager-v1.15.1.tgz
rancher/v2.8.5/cert-manager.yaml
rancher/v2.8.5/cmctl
rancher/v2.8.5/helm-v3.15.1-linux-amd64.tar.gz
rancher/v2.8.5/rancher-images.txt
rancher/v2.8.5/rancher-load-images.sh
rancher/v2.8.5/rancher-save-images.sh
rancher/v2.8.5/push.sh
  1. 清除多餘檔案
$ rm -r image/ push.sh rancher-images.txt rancher-load-images.sh
  1. 檢視當前目錄的內容
$ ls -lh

螢幕輸出 :

total 14M
-rw-r--r-- 1 rancher users 380K Jan 11 22:56 cert-manager.crds.yaml
-rw-r--r-- 1 rancher users  65K May 23 16:48 cert-manager-v1.11.0.tgz
-rw-r--r-- 1 rancher users  14M Apr 14  2022 helm-v3.14.2-linux-amd64.tar.gz
-rw-r--r-- 1 rancher users  14K May 22 10:22 rancher-2.7.3.tgz
  1. 安裝 Helm v3.8.2
$ tar zxvf helm-v3.15.1-linux-amd64.tar.gz

螢幕輸出 :

linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
  1. 將 helm 執行檔複製到 /usr/local/bin/ 目錄下
$ sudo cp linux-amd64/helm /usr/local/bin/
  1. 檢視 Helm 版本 應為 v3.8.2
$ helm version

螢幕輸出 :

version.BuildInfo{Version:"v3.8.2", GitCommit:"6e3701edea09e5d55a8ca2aae03a68917630e91b", GitTreeState:"clean", GoVersion:"go1.17.5"}
  1. 透過 Helm Chart 產生 cert-manager 在 Kubernetes 中所需之資源清單的範本
sed "s|quay.io/jetstack|harbor.example.com/rancher|g" cert-manager.yaml  | kubectl apply -f -
$ helm template cert-manager ./cert-manager-v1.14.0.tgz --output-dir . \
    --namespace cert-manager \
    --set image.repository=rancher/cert-manager-controller \
    --set webhook.image.repository=rancher/cert-manager-webhook \
    --set cainjector.image.repository=rancher/cert-manager-cainjector \
    --set startupapicheck.image.repository=rancher/cert-manager-ctl

螢幕輸出 :

wrote ./cert-manager/templates/cainjector-serviceaccount.yaml
wrote ./cert-manager/templates/serviceaccount.yaml
wrote ./cert-manager/templates/webhook-serviceaccount.yaml
wrote ./cert-manager/templates/webhook-config.yaml
wrote ./cert-manager/templates/cainjector-rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/webhook-rbac.yaml
wrote ./cert-manager/templates/cainjector-rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/webhook-rbac.yaml
wrote ./cert-manager/templates/cainjector-rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/webhook-rbac.yaml
wrote ./cert-manager/templates/cainjector-rbac.yaml
wrote ./cert-manager/templates/rbac.yaml
wrote ./cert-manager/templates/webhook-rbac.yaml
wrote ./cert-manager/templates/service.yaml
wrote ./cert-manager/templates/webhook-service.yaml
wrote ./cert-manager/templates/cainjector-deployment.yaml
wrote ./cert-manager/templates/deployment.yaml
wrote ./cert-manager/templates/webhook-deployment.yaml
wrote ./cert-manager/templates/webhook-mutating-webhook.yaml
wrote ./cert-manager/templates/webhook-validating-webhook.yaml
wrote ./cert-manager/templates/startupapicheck-serviceaccount.yaml
wrote ./cert-manager/templates/startupapicheck-rbac.yaml
wrote ./cert-manager/templates/startupapicheck-rbac.yaml
wrote ./cert-manager/templates/startupapicheck-job.yaml
  1. 在 K8S 中,建立 cert-manager Namespace
$ kubectl create ns cert-manager

螢幕輸出 :

namespace/cert-manager created
  1. 建立 cert-manager CRDs 資源
$ kubectl create -f cert-manager-crd.yaml

螢幕輸出 :

customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
  1. 建立 cert-manager
$ kubectl apply -R -f cert-manager/

螢幕輸出 :

deployment.apps/cert-manager-cainjector created
clusterrole.rbac.authorization.k8s.io/cert-manager-cainjector created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-cainjector created
role.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection created
rolebinding.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection created
serviceaccount/cert-manager-cainjector created
deployment.apps/cert-manager created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-issuers created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-certificates created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-orders created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-challenges created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim created
clusterrole.rbac.authorization.k8s.io/cert-manager-view created
clusterrole.rbac.authorization.k8s.io/cert-manager-edit created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-approve:cert-manager-io created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-certificatesigningrequests created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-issuers created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-certificates created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-orders created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-challenges created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-approve:cert-manager-io created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-certificatesigningrequests created
role.rbac.authorization.k8s.io/cert-manager:leaderelection created
rolebinding.rbac.authorization.k8s.io/cert-manager:leaderelection created
service/cert-manager created
serviceaccount/cert-manager created
job.batch/cert-manager-startupapicheck created
role.rbac.authorization.k8s.io/cert-manager-startupapicheck:create-cert created
rolebinding.rbac.authorization.k8s.io/cert-manager-startupapicheck:create-cert created
serviceaccount/cert-manager-startupapicheck created
configmap/cert-manager-webhook created
deployment.apps/cert-manager-webhook created
mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
clusterrole.rbac.authorization.k8s.io/cert-manager-webhook:subjectaccessreviews created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-webhook:subjectaccessreviews created
role.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving created
rolebinding.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving created
service/cert-manager-webhook created
serviceaccount/cert-manager-webhook created
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
  1. 檢查 cert-manager 運行狀態
$ kubectl -n cert-manager get pod

螢幕輸出 :

NAME                                       READY   STATUS      RESTARTS   AGE
cert-manager-5ff9b8f69d-v5xqc              1/1     Running     0          16s
cert-manager-cainjector-785c5c866d-pnlwq   1/1     Running     0          16s
cert-manager-startupapicheck-dtjtr         0/1     Completed   0          6s
cert-manager-webhook-696d5db768-dklqd      1/1     Running     0          16s
  1. 透過 Helm Chart 產生 Rancher 在 Kubernetes 中所需之資源清單的範本
$ helm template --validate rancher ./rancher-2.8.5.tgz --output-dir . --no-hooks --namespace cattle-system \
    --set hostname=rancher.example.com \
    --set certmanager.version=1.15.1 \
    --set rancherImage=rancher/rancher \
    --set systemDefaultRegistry=harbor.example.com \
    --set useBundledSystemChart=true \
    --set global.cattle.psp.enabled=false \
    --set replicas=3

螢幕輸出 :

wrote ./rancher/templates/serviceAccount.yaml
wrote ./rancher/templates/configMap.yaml
wrote ./rancher/templates/clusterRoleBinding.yaml
wrote ./rancher/templates/service.yaml
wrote ./rancher/templates/deployment.yaml
wrote ./rancher/templates/ingress.yaml
wrote ./rancher/templates/validate-psp-install.yaml
wrote ./rancher/templates/issuer-rancher.yaml
wrote ./rancher/templates/priorityClass.yaml
  1. 在 K8S 中,建立 cattle-system Namespace
$ kubectl create namespace cattle-system

螢幕輸出 :

namespace/cattle-system created
  1. 建立 Rancher Prime v2.7.3
$ kubectl -n cattle-system apply -R -f rancher/

螢幕輸出 :

clusterrolebinding.rbac.authorization.k8s.io/rancher created
configmap/rancher-config created
deployment.apps/rancher created
ingress.networking.k8s.io/rancher created
issuer.cert-manager.io/rancher created
priorityclass.scheduling.k8s.io/rancher-critical created
service/rancher created
serviceaccount/rancher created
  1. 檢查 Rancher 的 Deployment, Replicaset, Pod 和 service 運行狀態,是否都正常
$ watch -n 0.1 kubectl get all -n cattle-system -o wide

螢幕輸出 :

NAME                                   READY   STATUS      RESTARTS   AGE     IP           NODE    NOMINATED NODE   READINESS GATES
pod/helm-operation-6rf56               0/2     Completed   0          10m     10.42.0.26   rms-1   <none>           <none>
pod/helm-operation-m5hc9               0/2     Completed   0          10m     10.42.0.30   rms-1   <none>           <none>
pod/helm-operation-qhr26               0/2     Completed   0          8m27s   10.42.0.36   rms-1   <none>           <none>
pod/helm-operation-wtk87               0/2     Completed   0          10m     10.42.0.29   rms-1   <none>           <none>
pod/rancher-79db978b9f-wl4lj           1/1     Running     0          11m     10.42.0.25   rms-1   <none>           <none>
pod/rancher-webhook-6bc5b49767-56fkq   1/1     Running     0          10m     10.42.0.31   rms-1   <none>           <none>

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
service/rancher           ClusterIP   10.43.228.176   <none>        80/TCP,443/TCP   11m   app=rancher
service/rancher-webhook   ClusterIP   10.43.132.35    <none>        443/TCP          10m   app=rancher-webhook
service/webhook-service   ClusterIP   10.43.194.112   <none>        443/TCP          10m   app=rancher-webhook

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS        IMAGES
                         SELECTOR
deployment.apps/rancher           1/1     1            1           11m   rancher           rancher/rancher:v2.7.3                              app=rancher
deployment.apps/rancher-webhook   1/1     1            1           10m   rancher-webhook   harbor.example.com/rancher/rancher-webhook:v0.3.3   app=rancher-webhook

NAME                                         DESIRED   CURRENT   READY   AGE   CONTAINERS        IMAGES
                               SELECTOR
replicaset.apps/rancher-79db978b9f           1         1         1       11m   rancher           rancher/rancher:v2.7.3                              app=rancher,pod-template-hash=79db978b9f
replicaset.apps/rancher-webhook-6bc5b49767   1         1         1       10m   rancher-webhook   harbor.example.com/rancher/rancher-webhook:v0.3.3   app=rancher-webhook,pod-template-hash=6bc5b49767 
  1. 透過 curl 檢查,可否 Access Rancher 的 Web UI
$ curl -k -H "host: rancher.example.com" https://192.168.61.61/dashboard/

螢幕輸出 :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Harbor</title>
        <base href="/"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <link rel="icon" type="image/x-icon" href="favicon.ico?v=2"/>
    <link rel="stylesheet" href="styles.778b44f8c96802aa.css"></head>
    <body>
        <harbor-app>
            <div class="spinner spinner-lg app-loading app-loading-fixed">
                Loading...
            </div>
        </harbor-app>
    <script src="runtime.5bc96e435ac00039.js" type="module"></script><script src="polyfills.d52770ae19691b1f.js" type="module"></script><script src="scripts.fc6b7827d4dcd875.js" defer></script><script src="main.a842fe34c6928c35.js" type="module"></script></body>
</html>

:::spoiler 安裝 minio

/### 安裝 minio

:::spoiler root ca script

domain=$2
ip=$3

help()
{
  cat <<EOF
Usage: mk [OPTIONS]

Available options:

create    create [domain] [IP]
delete    delete cert
test      test
EOF
  exit
}

ssl()
{
openssl genrsa -aes256 -passout pass:password -out ca.key 4096

openssl req -new -x509 -sha256 -days 365 -subj "/C=TW/ST=Taipei/L=Taipei/O=test/OU=lab/CN=example" -passin pass:password -key ca.key -out cacerts.pem

openssl genrsa -out private.key 4096

openssl req -new -sha256 -subj "/CN=example" -key private.key -out cert.csr

echo -e "subjectAltName=DNS:${domain},IP:${ip}\nextendedKeyUsage = serverAuth" > extfile.cnf

openssl x509 -req -sha256 -days 365 -passin pass:password -in cert.csr -CA cacerts.pem -CAkey ca.key -out public.crt -extfile extfile.cnf -CAcreateserial
}

de()
{
rm ca.key cacerts.pem ca.srl cert.csr private.key public.crt extfile.cnf &>/dev/null
if [ "$?" == "0" ];then
  echo "delete all cert ok!"
else
  echo "delete cert fail,please check!"
fi
}

ts()
{
openssl verify -CAfile cacerts.pem -verbose public.crt
}


case $1 in
  create)
    if [ "$#" == "3" ];then
      ssl
    else
      help
    fi
  ;;
  delete)
    de
  ;;
  test)
    ts
  ;;
  *)
    help
  ;;
esac
$ sudo zypper in docker

$ sudo systemctl enable docker.service

$ sudo systemctl start docker.service

$ mkdir -p minio/{data,certs/CAs,ssl}

$ cd minio

$ ll
total 8284
drwxr-xr-x 2 rancher users       6 Mar  3 16:32 certs
drwxr-xr-x 2 rancher users       6 Mar  3 16:32 data
-rw-r--r-- 1 rancher users 8479184 Mar  3 16:31 docker-compose-Linux-x86_64
drwxr-xr-x 2 rancher users       6 Mar  3 16:32 ssl

$ sudo mv docker-compose-Linux-x86_64 /usr/bin/docker-compose

$ sudo chmod 755 /usr/bin/docker-compose

$ cd ~/minio/ssl

$ vim mk

$ chmod +x mk

$ ./mk create minio2.example.com 192.168.11.127

$ ./mk test

$ cp private.key public.crt ~/minio/certs

$ cp cacerts.pem ~/minio/certs/CAs/
# 把 harbor 簽好的 ca.pem scp 過來
# ssh 進入到 client 並且複製到 OS
$ sudo cp ca.pem /usr/share/pki/trust/anchors/

$ sudo cp ca.pem /etc/pki/trust/anchors/

$ sudo update-ca-certificates --fresh

# 把憑證塞入 docker 就可以使用 ca login
$ sudo mkdir /etc/docker/certs.d

$ sudo cp ca.pem /etc/docker/certs.d/

$ sudo systemctl restart docker

# 測試是否可以 login harbor
$ sudo docker login harbor.example.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
# image 的來源要從 harbor 上的位置去做更改
$ vim docker-compose.yml
version: '3'
services:
  minio:
    image: harbor.example.com/library/minio
    hostname: minio2.example.com
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ACCESS_KEY: admin
      MINIO_SECRET_KEY: admin123
    volumes:
      - /home/rancher/minio/data:/data
      - /home/rancher/minio/config:/root/.minio/
      - /home/rancher/minio/certs:/root/.minio/certs
    command: server --console-address ':9001' /data
    privileged: true
    restart: always
    
$ sudo docker-compose up -d

$ sudo docker-compose ps
    Name                   Command               State                                         Ports
-------------------------------------------------------------------------------------------------------------------------------------------
minio_minio_1   /usr/bin/docker-entrypoint ...   Up      0.0.0.0:9000->9000/tcp,:::9000->9000/tcp, 0.0.0.0:9001->9001/tcp,:::9001->9001/tcp

:::

安裝 Downstream cluster

  1. 設定 Registry Endpoint

  1. 建好 Downstream cluster 後需要手動把 rke2 command 丟到 /usr/local/bin/ 這個目錄,不然在 snapshot 時會有問題
$ sudo cp /opt/rke2/bin/* /usr/local/bin/

安裝 Neuvector

  1. 開啟瀏覽器,進到 Rancher Web UI

  2. 選擇 Downstream Cluster –> 點選 “Cluster Tools” –> 點擊 “Install”

  1. 選擇 “Customize Helm options brfore install”,並確認 Container Registry 位址

  1. 設定 Neuvector 的 Container Images
rancher/neuvector/controller
5.1.3

rancher/neuvector/manager
5.1.3

rancher/neuvector/enforcer
5.1.3

rancher/neuvector/scanner
latest

rancher/neuvector/updater
latest

  1. 設定 Container Runtime 為 “k3s Containerd Runtime”

至 Dostream Cluster 機器執行以下命令,檢查 containerd.sock 的路徑是否正確

$ sudo ls -l /run/k3s/containerd/containerd.sock

  1. “Next” –> “Install”

  2. 安裝好後,點擊左側選單 “Neuvector” –> “Neuvector”

  1. Neuvector 畫面

tags: work
Enable Rancher vcluster on Airgap HarvesterInstall High-Availability Rancher and Setting up an NGINX Load Balancer