Rancher 離線安裝

當需要安裝Rancher的主機只有內網,而沒有外網通信的時候,Rancher 的安裝就成爲一大難題,這裏記錄下Rancher離線安裝的步驟,讓你的主機沒有互聯網也能安裝Rancher。

1、首先找到 Rancher 相應版本 的 rancher-images.txt;

https://github.com/rancher/rancher/releases

2、通過RKE生成鏡像清單

./rke config --system-images -all >> ./rancher-images.txt

rke  鏈接:https://pan.baidu.com/s/18uP0FREHXiAkw1CsX33PNw    提取碼:2ih2 

3、解析模板以獲取鏡像詳細信息

./linux-amd64/helm template ./cert-manager-v0.6.7.tgz | grep -oP '(?<=image: ").*(?=")' >> ./rancher-images.txt

helm 鏈接:https://pan.baidu.com/s/1r1TBpTlTdOTUrwF2t8I2Gw      提取碼:0is3 


4、對鏡像列表進行排序和去重,以去除重複的鏡像

sort -u rancher-images.txt -o rancher-images.txt

5、複製腳本文件

rancher-save-images.sh

#!/bin/bash
# 定義日誌
workdir='../pwd'
log_file=${workdir}/sync_images_$(date +"%Y-%m-%d").log

logger()
{
    log=$1
    cur_time='['$(date +"%Y-%m-%d %H:%M:%S")']'
    echo ${cur_time} ${log} | tee -a ${log_file}
}

list="../rancher-images.txt"
#images="rancher-images.tar.gz"

POSITIONAL=()
while [[ $# -gt 0 ]]; do
    key="$1"
    case $key in
        -i|--images)
        images="$2"
        shift # past argument
        shift # past value
        ;;
        -l|--image-list)
        list="$2"
        shift # past argument
        shift # past value
        ;;
        -h|--help)
        help="true"
        shift
    ;;
    esac
done

usage () {
    echo "USAGE: $0 [--image-list rancher-images.txt] [--images rancher-images.tar.gz]"
    echo "  [-l|--images-list path] text file with list of images. 1 per line."
    echo "  [-l|--images path] tar.gz generated by docker save."
    echo "  [-h|--help] Usage message"
}

if [[ $help ]]; then
    usage
    exit 0
fi

set -e -x

mkdir -p rancher-images-$(date +"%Y-%m-%d")
cd rancher-images-$(date +"%Y-%m-%d")

for i in $(cat ${list}); 
do
    docker pull ${i}

    if [ $? -ne 0 ]; then
        logger "${i} pull failed."
    else
        logger "${i} pull successfully."
    fi

    docker save ${i} | gzip > $(echo $i | sed "s#/#-#g; s#:#-#g").tgz

    if [ $? -ne 0 ]; then
        logger "${i} save failed."
    else
        logger "${i} save successfully."
    fi
done

rancher-load-images.sh

#!/bin/bash

# 定義日誌
workdir='../pwd'
log_file=${workdir}/sync_images_$(date +"%Y-%m-%d").log

logger()
{
    log=$1
    cur_time='['$(date +"%Y-%m-%d %H:%M:%S")']'
    echo ${cur_time} ${log} | tee -a ${log_file}
}

POSITIONAL=()
while [[ $# -gt 0 ]]; do
    key="$1"
    case $key in
        -i|--images-path)
        images_path="$2"
        shift # past argument
        shift # past value
        ;;
        -l|--image-list)
        list="$2"
        shift # past argument
        shift # past value
        ;;
        -h|--help)
        help="true"
        shift
        ;;
    esac
done

usage () {
    echo "USAGE: $0 [--image-list rancher-images.txt] [--images rancher-images.tar.gz]"
    echo "  [-l|--images-list path] text file with list of images. 1 per line."
    echo "  [-l|--images path] tar.gz generated by docker save."
    echo "  [-h|--help] Usage message"
}

if [[ $help ]]; then
    usage
    exit 0
fi

set -e -x

# 鏡像壓縮文件列表
images=$(ls $images_path | grep ".tgz")
cd $images_path

# 導入鏡像
docker_load ()
{
    for imgs in $(echo ${images});
    do
        gunzip -c ${imgs} | docker load

        if [ $? -ne 0 ]; then
            logger "${imgs} load failed."
        else
            logger "${imgs} load successfully."
        fi
    done
}

docker_load

rancher-push-images.sh

#!/bin/bash

## 鏡像上傳說明
# 需要先在鏡像倉庫中創建 rancher 項目
# 根據實際情況更改以下私有倉庫地址

# 定義日誌
workdir='../pwd'
log_file=${workdir}/sync_images_$(date +"%Y-%m-%d").log

logger()
{
    log=$1
    cur_time='['$(date +"%Y-%m-%d %H:%M:%S")']'
    echo ${cur_time} ${log} | tee -a ${log_file}
}

images_hub() {

    while true; do
        read -p "輸入鏡像倉庫地址(不加http/https): " registry
        read -p "輸入鏡像倉庫用戶名: " registry_user
        read -p "輸入鏡像倉庫用戶密碼: " registry_password
        echo "您設置的倉庫地址爲: ${registry},用戶名: ${registry_user},密碼: xxx"
        read -p "是否確認(Y/N): " confirm

        if [ $confirm != Y ] && [ $confirm != y ] && [ $confirm == '' ]; then
            echo "輸入不能爲空,重新輸入"
        else
            break
        fi
    done
}

images_hub

echo "鏡像倉庫 $(docker login -u ${registry_user} -p ${registry_password} ${registry})"

images=$(docker images -a | grep -v TAG | awk '{print $1 ":" $2}')
namespace=rancher

docker_push() {
    for imgs in $(echo ${images}); do
        n=$(echo ${imgs} | awk -F"/" '{print NF-1}')
        #如果鏡像名中沒有/,那麼此鏡像一定是library倉庫的鏡像;
        if [ ${n} -eq 0 ]; then
            img_tag=${imgs}
            #namespace=rancher
            #重命名鏡像
            docker tag ${imgs} ${registry}/${namespace}/${img_tag}
            #刪除原始鏡像
            #docker rmi ${imgs}
            #上傳鏡像
            docker push ${registry}/${namespace}/${img_tag}
        #如果鏡像名中有一個/,那麼/左側爲項目名,右側爲鏡像名和tag
        elif [ ${n} -eq 1 ]; then
            img_tag=$(echo ${imgs} | awk -F"/" '{print $2}')
            #namespace=$(echo ${imgs} | awk -F"/" '{print $1}')
            #重命名鏡像
            docker tag ${imgs} ${registry}/${namespace}/${img_tag}
            #刪除舊鏡像
            #docker rmi ${imgs}
            #上傳鏡像
            docker push ${registry}/${namespace}/${img_tag}
        #如果鏡像名中有兩個/,
        elif [ ${n} -eq 2 ]; then
            img_tag=$(echo ${imgs} | awk -F"/" '{print $3}')
            #namespace=$(echo ${imgs} | awk -F"/" '{print $2}')
            #重命名鏡像
            docker tag ${imgs} ${registry}/${namespace}/${img_tag}
            #刪除舊鏡像
            #docker rmi ${imgs}
            #上傳鏡像
            docker push ${registry}/${namespace}/${img_tag}
        else
            #標準鏡像爲四層結構,即:倉庫地址/項目名/鏡像名:tag,如不符合此標準,即爲非有效鏡像。
            echo "No available images"
        fi
    done
}

docker_push

6、rancher-save-images.sh 賦權限並執行  備份鏡像

chmod +x rancher-save-images.sh

./rancher-save-images.sh

7、離線安裝Rancher鏡像文件,rancher-load-images.sh

chmod +x rancher-load-images.sh

./rancher-load-images.sh --images-path rancher-images-2019-06-07/

8、此外,還可以將鏡像上傳至私有鏡像倉庫

chmod +x rancher-push-images.sh 
./rancher-push-images.sh

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章