離線安裝 Rancher2.2.4 HA 集群


一、先決條件(所有主機執行)

1.1 基礎設置

1、安裝基礎軟件

#環境centos7.6
yum install -y vim net-tools wget lrzsz

2、防火牆

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld.service && systemctl disable firewalld.service

3、時間同步

yum install -y ntp 
systemctl enable ntpd && systemctl start ntpd
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp yes
ntpq -p

4、內核參數

cat >> /etc/sysctl.conf<<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
EOF

#加載 sysctl
-p

5、加載模塊

cat >modules.sh <<EOF
modprobe br_netfilter
modprobe ip6_udp_tunnel
modprobe ip_set
modprobe ip_set_hash_ip
modprobe ip_set_hash_net
modprobe iptable_filter
modprobe iptable_nat
modprobe iptable_mangle
modprobe iptable_raw
modprobe nf_conntrack_netlink
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
modprobe nf_defrag_ipv4
modprobe nf_nat
modprobe nf_nat_ipv4
modprobe nf_nat_masquerade_ipv4
modprobe nfnetlink
modprobe udp_tunnel
#modprobe VETH
#modprobe VXLAN
modprobe x_tables
modprobe xt_addrtype
modprobe xt_conntrack
modprobe xt_comment
modprobe xt_mark
modprobe xt_multiport
modprobe xt_nat
modprobe xt_recent
modprobe xt_set
modprobe xt_statistic
modprobe xt_tcpudp
EOF

#執行 sh modules.sh

6、掛載數據盤

掛載阿里雲數據盤

fdisk /dev/vdb
n,p,1,回車,回車,wq
fdisk -l
mkfs.ext4 /dev/vdb1 
echo '/dev/vdb1 /opt ext4 defaults 0 0' >>/etc/fstab
mount -a
df -h

7、安裝docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y

#更改docker存儲路徑

mkdir -p /opt/data/docker
sed -i "s#-H fd:#-g /opt/data/docker -H fd:#g" /lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl status docker

#調整參數

cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://mirror.nexus.wmqe.com"],
"max-concurrent-downloads": 5,
"max-concurrent-uploads": 5,
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
    "max-size": "100m",
    "max-file": "3"
    }
}
EOF

#重啟
systemctl restart docker.service
systemctl status docker.service

 

1.2 下載CLI工具

Rancher依靠私有鏡像倉庫進行離線安裝,必須擁有自己的私有鏡像倉庫或其他方式將所有Docker鏡像分發到每個節點。HA安裝需要以下CLI工具, 確保這些工具安裝在您的工作站或者筆記本上,並且您的工作站或者筆記本需要有權限訪問Rancher環境。

1)kubectl:Kubernetes命令行工具;

2)rke:Rancher Kubernetes Engine,用於構建Kubernetes集群的cli;

3)helm:Kubernetes的包管理(客戶端helm和服務器Tiller)。

這些安裝包可從rancher網站(https://docs.rancher.cn/rancher2x/install-prepare/download/)下載

mkdir -p /opt/rancher/cli && cd /opt/rancher/cli
wget https://docs.rancher.com/download/kubernetes/linux-amd64-v1.14.3-kubectl &&
wget https://docs.rancher.com/download/rke/v0.2.4-rke_linux-amd64 &&
wget https://docs.rancher.com/download/helm/helm-v2.14.1-linux-amd64.tar.gz

tar -zxvf helm-v2.14.1-linux-amd64.tar.gz && rm -rf helm-v2.14.1-linux-amd64.tar.gz
mv linux-amd64/{helm,tiller} ./ && rm -rf linux-amd64
mv linux-amd64-v1.14.3-kubectl kubectl
mv v0.2.4-rke_linux-amd64 rke
chmod +x kubectl rke

 

1.3 加入環境變量

echo "export PATH=/opt/rancher/cli:\$PATH" >> /etc/profile
source /etc/profile

#centos7.6第一次需添加所有用戶執行該命令,后續修改不用添加:
echo "source /etc/profile" >> /etc/bashrc

 

二、准備離線鏡像

2.1 准備文件

Rancher HA安裝需要使用來自3個源的鏡像,將3個源合並到一個名為rancher-images.txt的文件中。

1、在版本發布頁面,找到需要安裝的Rancher 2.xx版本。不要下載的版本標示rc或者Pre-release,因為它們不適用於穩定的生產環境。https://github.com/rancher/rancher/releases/tag/v2.2.4

2、從發行版的 Assets 部分,下載以下三個文件,這些文件是在離線環境中安裝Rancher所必需的:

1)rancher-images.txt:此文件包含安裝Rancher所需的所有鏡像的列表。

2)rancher-save-images.sh:此腳本rancher-images.txt從Docker Hub中下載所有鏡像並將所有鏡像保存為rancher-images.tar.gz。

3)rancher-load-images.sh:此腳本從rancher-images.tar.gz文件加載鏡像,並將其推送到您的私有鏡像倉庫。

把下載的三個文件存放在下面的目錄中

mkdir /opt/rancher/deploy && cd /opt/rancher/deploy

3、確保rancher-save-images.sh可執行。

chmod +x rancher-save-images.sh

4、通過RKE生成鏡像清單

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

5、對鏡像列表進行排序和去重,以去除重復的鏡像。

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

6、復制以下腳本保存為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

7、復制以下腳本保存為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

8、復制以下腳本保存為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

 

2.2 同步鏡像

1、在可用訪問Internet的主機中,使用rancher-save-images.sh和 rancher-images.txt創建所有所需鏡像的壓縮包;

chmod +x rancher-save-images.sh
./rancher-save-images.sh --image-list /opt/rancher/deploy/rancher-images.txt

會在當前目錄rancher-images-$(date +"%Y-%m-%d") 生成所有鏡像的壓縮文件。

2、拷貝所有文件到內網環境中的Linux主機上,然后執行以下腳本去加載壓縮包。如果上一步下載鏡像的主機可以連接內網的鏡像倉庫,那么此步驟可以跳過。

chmod +x rancher-load-images.sh
./rancher-load-images.sh --images-path /opt/rancher/deploy/rancher-images-$(date +"%Y-%m-%d")

3、使用rancher-push-images.sh把導入的docker鏡像自動tag重命名,然后上傳到私有鏡像倉庫。鏡像默認全部上傳到鏡像倉庫的rancher項目下,如果鏡像倉庫不支持自動創建項目名(比如Harbor),需要提前手動去鏡像倉庫創建好項目。執行腳本后會要求輸入鏡像倉庫地址和用戶名、用戶密碼。

chmod +x rancher-push-images.sh
./rancher-push-images.sh
reg.nexus.wmqe.com
admin
*******

 

三、RKE安裝K8S

3.1 創建RKE配置文件

使用下面的示例創建rancher-cluster.yml文件,使用創建的3個節點的IP地址或域名替換列表中的IP地址。

cd /opt/rancher/deploy

vim rancher-cluster.yml

nodes:
- address: 172.16.3.241
  user: rancher
  role: [ "controlplane", "etcd", "worker" ]
  ssh_key_path: ~/.ssh/id_rsa
- address: 172.16.3.242
  user: rancher
  role: [ "controlplane", "etcd", "worker" ]
  ssh_key_path: ~/.ssh/id_rsa
- address: 172.16.3.243
  user: rancher
  role: [ "controlplane", "etcd", "worker" ]
  ssh_key_path: ~/.ssh/id_rsa

private_registries:
- url: reg.nexus.wmqe.com
  user: admin
  password: "******"
  is_default: true

services:
  etcd:
    backup_config:
      enabled: true
      interval_hours: 1
      retention: 30

常規RKE節點選項:

address yes 公共域名或IP地址

user yes 可以運行docker命令的用戶

role yes 分配給節點的Kubernetes角色列表

internal_address no 內部集群通信的私有域名或IP地址

ssh_key_path no 用於對節點進行身份驗證的SSH私鑰的路徑(默認為~/.ssh/id_rsa)

 

3.2 免密登入

1、創建rancher賬號並加入docker組(三台都執行)

useradd rancher -G docker

#設置密碼

passwd rancher

 

2、root賬戶可登入(三台都執行)

vim /etc/ssh/sshd_config

PasswordAuthentication yes
systemctl restart sshd

 

3、root賬戶免登入(rke安裝的節點執行)

ssh-keygen -t rsa
ssh-copy-id rancher@172.16.3.241
ssh-copy-id rancher@172.16.3.242
ssh-copy-id rancher@172.16.3.243

 

3.3 創建Kubernetes集群

1、運行RKE命令創建Kubernetes集群

cd /opt/rancher/deploy/
rke up --config ./rancher-cluster.yml

完成后,顯示:Finished building Kubernetes cluster successfully

rke v0.2.0開始,當rke 創建集群后,會在配置文件當前目錄下生成xxxx.rkestate文件,文件中保存了集群的配置信息和各組件使用的證書信息。

 

#報錯:FATA[0075] [etcd] Failed to bring up Etcd Plane: [etcd] Etcd Cluster is not healthy

#參考:https://www.gitmemory.com/issue/rancher/rke/1244/478974206

 

2、如果創建失敗一定要清理緩存再繼續

rm -rf /var/lib/rancher/etcd/*
rm -rf /etc/kubernetes/*
rke remove --config ./rancher-cluster.yml

參考:http://www.zhangrenhua.com/2019/01/09/Rancher2.1%20HA%E9%83%A8%E7%BD%B2k8s/

  

3.4 測試集群

1、檢查節點狀態

創建完成后,RKE會創建了一個文件kube_config_rancher-cluster.yml。通過kubectl測試您的連接,並查看您的所有節點是否處於Ready狀態。

kubectl --kubeconfig=kube_config_rancher-cluster.yml get nodes

NAME            STATUS   ROLES                      AGE   VERSION
172.16.3.241   Ready    controlplane,etcd,worker   33m   v1.13.5
172.16.3.242    Ready    controlplane,etcd,worker   33m   v1.13.5
172.16.3.243   Ready    controlplane,etcd,worker   33m   v1.13.5

執行完后會生成 $HOME/.kube/ 目錄。

 

2、復制config文件

kube_config_rancher-cluster.yml 這個文件包含 kubectl 和 helm 訪問 K8S 的憑據。可以將此文件復制到 $HOME/.kube/config,后續就不用指定配置文件執行 kubectl 命令

cp kube_config_rancher-cluster.yml /root/.kube/config

#或者如果正在使用多個Kubernetes集群,請將KUBECONFIG環境變量設置為kube_config_rancher-cluster.yml文件路徑。

export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

 

3、檢查Pod狀態

kubectl get pod -A

NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE
ingress-nginx   default-http-backend-7dd5cb66c4-qdr4g     1/1     Running     1          31m
ingress-nginx   nginx-ingress-controller-h46wq            1/1     Running     1          31m
ingress-nginx   nginx-ingress-controller-kshvs            1/1     Running     1          31m
ingress-nginx   nginx-ingress-controller-p8tw7            1/1     Running     1          31m
kube-system     canal-5pgj4                               2/2     Running     2          31m
kube-system     canal-hgl58                               2/2     Running     2          31m
kube-system     canal-lz7v7                               2/2     Running     2          31m
kube-system     kube-dns-autoscaler-bdb58979-jgqx8        1/1     Running     1          31m
kube-system     kube-dns-b9c8976b8-95849                  3/3     Running     12         31m
kube-system     metrics-server-75656f5b94-zm5j2           1/1     Running     2          31m
kube-system     rke-ingress-controller-deploy-job-nnr6n   0/1     Completed   0          31m
kube-system     rke-kubedns-addon-deploy-job-9vzxv        0/1     Completed   0          31m
kube-system     rke-metrics-addon-deploy-job-qwkpc        0/1     Completed   0          31m
kube-system     rke-network-plugin-deploy-job-lck7b       0/1     Completed   0          31m

#如果有 pod 啟動失敗,用 kubectl describe 命令查看啟動日志,如果是鏡像不存在問題,需再執行3.3小節進行鏡像同步。

 

4、保存配置文件

保存 kube_config_rancher-cluster.yml 和 rancher-cluster.yml 文件的副本,您將需要這些文件來維護和升級 Rancher 實例。

  

四、Helm安裝Rancher

4.1 初始化Helm

4.1.1 配置Helm客戶端訪問權限

Helm在Kubernetes集群上安裝Tiller服務以管理charts,由於RKE默認啟用RBAC,因此我們需要使用kubectl來創建一個serviceaccount,clusterrolebinding才能讓Tiller具有部署到集群的權限。

在離線環境中安裝有kubectl的主機上執行以下命令:

kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller

 

#附:如果是多集群需指定kubeconfig配置文件

kubeconfig=/root/.kube/config
kubectl --kubeconfig=$kubeconfig -n kube-system \
    create serviceaccount tiller
kubectl
--kubeconfig=$kubeconfig \ create clusterrolebinding tiller \ --clusterrole cluster-admin \ --serviceaccount=kube-system:tiller

 

4.1.2 安裝Helm Server(Tiller)

1、先獲取helm的版本(忽略沒有安裝tiller的報錯)

helm version |grep Client | awk -F""\" '{print $2}'

Error: could not find tiller
v2.14.1

2、chart倉庫上傳到私有倉庫(若已上傳可跳過本步驟)

1)把原來的rancher-images.txt文件備份,新建新的rancher-images.txt文件,內容如下(版本號即為之前查到的):

registry.cn-shanghai.aliyuncs.com/rancher/tiller:v2.14.1

2)下載鏡像

./rancher-save-images.sh --image-list /op/rancher/deploy/rancher-images.txt

3)同步鏡像到私有倉庫

./rancher-push-images.sh
reg.nexus.wmqe.com
admin
******

3、安裝tiller

helm init --skip-refresh --service-account tiller \
--tiller-image reg.nexus.wmqe.com/rancher/tiller:v2.14.1

注意:

1、helm init在缺省配置下,會去谷歌鏡像倉庫拉取gcr.io/kubernetes-helm/tiller鏡像,並在Kubernetes集群上安裝配置Tiller。離線環境下,可通過--tiller-image指定私有鏡像倉庫鏡像。

2、helm init在缺省配置下,會利用https://kubernetes-charts.storage.googleapis.com作為缺省的stable repository地址,並去更新相關索引文件。

3、如果是離線安裝Tiller, 如果有內部的chart倉庫,可通過--stable-repo-url指定內部chart地址;如果沒有內部的chart倉庫, 可通過添加--skip-refresh參數禁止Tiller更新索引。

 

#參考范例:在離線環境中安裝有kubectl和Helm客戶端的主機上執行以下命令

kubeconfig=xxx.yaml
helm_version=`helm version |grep Client | awk -F""\" '{print $2}'`
helm init --kubeconfig=$kubeconfig --skip-refresh \
    --service-account tiller \
--tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:${helm_version}

 

4.2 打包Rancher Charts模板

此步驟需要在能連接互聯網的主機上操作,在可訪問互聯網並安裝有Helm客戶端的主機上執行以下操作。

1、添加Rancher Charts倉庫

指定安裝的版本(比如: latest or stable)

helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

2、獲取Rancher Charts離線包

可查看Rancher Charts倉庫中Helm Chart的版本

helm search rancher

NAME                      CHART VERSION    APP VERSION    DESCRIPTION                                                 
rancher-stable/rancher    2.2.4            v2.2.4         Install Rancher Server to manage Kubernetes clusters acro...

獲取離線包

helm fetch rancher-stable/rancher --version v2.2.4

結果:默認在當前目錄下生成rancher-vx.x.x.tgz壓縮文件,可通過-d指定生成的壓縮包路徑,比如:helm fetch rancher-stable/rancher --version v2.2.4 -d /home,將會在/home目錄下生成rancher-vx.x.x.tgz壓縮文件。

 

4.3 離線安裝Rancher

將生成的rancher-vx.x.x.tgz文件拷貝到離線環境安裝有kubectl和Helm客戶端的主機上,解壓rancher-vx.x.x.tgz文件獲得rancher文件夾。

tar -zxvf rancher-2.2.4.tgz

4.3.1 配置負載均衡

在阿里雲上新建內網的4層負載均衡器,后端目標端口為80、443,生成一個VIP:172.16.3.244,對這個VIP進行域名A記錄

rancher.wmqe.com 172.16.3.244

 

4.3.2 使用權威認證證書安裝

1、下載權威證書

將服務證書和CA中間證書鏈合並名為tls.crt的文件中,將私鑰復制到名為tls.key的文件中。

mkdir /opt/rancher/ca_tls/

2、創建命名空間及secrets

#創建命名空間

kubectl create namespace cattle-system

#使用kubectl創建類型為tls的secrets。

kubectl -n cattle-system create secret \
    tls tls-rancher-ingress \
    --cert=/opt/rancher/ca_tls/tls.crt \
    --key=/opt/rancher/ca_tls/tls.key

注意:必須把服務證書文件和 key 文件重命名為 tls.crt 和 tls.key。

3、安裝rancher

然后執行以下命令進行rancher安裝,指定之前根據Rancher Charts倉庫下載的rancher文件,不用再指定版本號。

#新建審計日志目錄(所有主機執行)

mkdir /opt/rancher/auditlogs/

#安裝(在安裝helm主機上執行)

cd /opt/rancher/deploy/
helm install ./rancher \ --name rancher \ --namespace cattle-system \ --set hostname=rancher.wmqe.com \ --set ingress.tls.source=secret \ --set auditLog.level=3 \ --set auditLog.destination=hostPath \ --set auditLog.hostPath=/opt/rancher/auditlogs/ \ --set auditLog.maxAge=20 \ --set auditLog.maxBackups=20 \ --set auditLog.maxSize=100 \ --set rancherImage=reg.nexus.wmqe.com/rancher/rancher

注意:=號后面不能有空格。

 

Chart高級選項參考:

https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/ha-install/helm-rancher/tcp-l4/advanced-settings/

https://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/chart-options/#api-audit-log

  

4.3.3 使用自簽名證書安裝

如果使用的是自己創建的自簽名證書,則需要創建證書secret和CA證書secret。

1、生成自簽名證書腳本

一鍵生成ssl自簽名證書腳本:https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/self-signed-ssl/

mkdir -p /opt/rancher/ca_tls && cd /opt/rancher/ca_tls
vim create_self-signed-cert.sh

#!/bin/bash -e

help ()
{
    echo  ' ================================================================ '
    echo  ' --ssl-domain: 生成ssl證書需要的主域名,如不指定則默認為localhost,如果是ip訪問服務,則可忽略;'
    echo  ' --ssl-trusted-ip: 一般ssl證書只信任域名的訪問請求,有時候需要使用ip去訪問server,那么需要給ssl證書添加擴展IP,多個IP用逗號隔開;'
    echo  ' --ssl-trusted-domain: 如果想多個域名訪問,則添加擴展域名(SSL_TRUSTED_DOMAIN),多個擴展域名用逗號隔開;'
    echo  ' --ssl-size: ssl加密位數,默認2048;'
    echo  ' --ssl-date: ssl有效期,默認10年;'
    echo  ' --ca-date: ca有效期,默認10年;'
    echo  ' --ssl-cn: 國家代碼(2個字母的代號),默認CN;'
    echo  ' 使用示例:'
    echo  ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
    echo  ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
    echo  ' ================================================================'
}

case "$1" in
    -h|--help) help; exit;;
esac

if [[ $1 == '' ]];then
    help;
    exit;
fi

CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
    key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
    value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
    case "$key" in
        --ssl-domain) SSL_DOMAIN=$value ;;
        --ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
        --ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
        --ssl-size) SSL_SIZE=$value ;;
        --ssl-date) SSL_DATE=$value ;;
        --ca-date) CA_DATE=$value ;;
        --ssl-cn) CN=$value ;;
    esac
done

# CA相關配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
CA_DOMAIN=localhost

# ssl相關配置
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
SSL_DOMAIN=${SSL_DOMAIN:-localhost}
SSL_DATE=${SSL_DATE:-3650}
SSL_SIZE=${SSL_SIZE:-2048}

## 國家代碼(2個字母的代號),默認CN;
CN=${CN:-CN}

SSL_KEY=$SSL_DOMAIN.key
SSL_CSR=$SSL_DOMAIN.csr
SSL_CERT=$SSL_DOMAIN.crt

echo -e "\033[32m ---------------------------- \033[0m"
echo -e "\033[32m       | 生成 SSL Cert |       \033[0m"
echo -e "\033[32m ---------------------------- \033[0m"

if [[ -e ./${CA_KEY} ]]; then
    echo -e "\033[32m ====> 1. 發現已存在CA私鑰,備份"${CA_KEY}""${CA_KEY}"-bak,然后重新創建 \033[0m"
    mv ${CA_KEY} "${CA_KEY}"-bak
    openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
else
    echo -e "\033[32m ====> 1. 生成新的CA私鑰 ${CA_KEY} \033[0m"
    openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
fi

if [[ -e ./${CA_CERT} ]]; then
    echo -e "\033[32m ====> 2. 發現已存在CA證書,先備份"${CA_CERT}""${CA_CERT}"-bak,然后重新創建 \033[0m"
    mv ${CA_CERT} "${CA_CERT}"-bak
    openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
else
    echo -e "\033[32m ====> 2. 生成新的CA證書 ${CA_CERT} \033[0m"
    openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
fi

echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
cat > ${SSL_CONFIG} <<EOM
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
EOM

if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} ]]; then
    cat >> ${SSL_CONFIG} <<EOM
subjectAltName = @alt_names
[alt_names]
EOM
    IFS=","
    dns=(${SSL_TRUSTED_DOMAIN})
    dns+=(${SSL_DOMAIN})
    for i in "${!dns[@]}"; do
      echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
    done

    if [[ -n ${SSL_TRUSTED_IP} ]]; then
        ip=(${SSL_TRUSTED_IP})
        for i in "${!ip[@]}"; do
          echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
        done
    fi
fi

echo -e "\033[32m ====> 4. 生成服務SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}

echo -e "\033[32m ====> 5. 生成服務SSL CSR ${SSL_CSR} \033[0m"
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}

echo -e "\033[32m ====> 6. 生成服務SSL CERT ${SSL_CERT} \033[0m"
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
    -CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
    -days ${SSL_DATE} -extensions v3_req \
    -extfile ${SSL_CONFIG}

echo -e "\033[32m ====> 7. 證書制作完成 \033[0m"
echo
echo -e "\033[32m ====> 8. 以YAML格式輸出結果 \033[0m"
echo "----------------------------------------------------------"
echo "ca_key: |"
cat $CA_KEY | sed 's/^/  /'
echo
echo "ca_cert: |"
cat $CA_CERT | sed 's/^/  /'
echo
echo "ssl_key: |"
cat $SSL_KEY | sed 's/^/  /'
echo
echo "ssl_csr: |"
cat $SSL_CSR | sed 's/^/  /'
echo
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/  /'
echo

echo -e "\033[32m ====> 9. 附加CA證書到Cert文件 \033[0m"
cat ${CA_CERT} >> ${SSL_CERT}
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/  /'
echo

echo -e "\033[32m ====> 10. 重命名服務證書 \033[0m"
echo "cp ${SSL_DOMAIN}.key tls.key"
cp ${SSL_DOMAIN}.key tls.key
echo "cp ${SSL_DOMAIN}.crt tls.crt"
cp ${SSL_DOMAIN}.crt tls.crt

#腳本說明

--ssl-domain: 生成ssl證書需要的主域名,如不指定則默認為localhost,如果是ip訪問服務,則可忽略;

--ssl-trusted-ip: 一般ssl證書只信任域名的訪問請求,有時候需要使用ip去訪問server,那么需要給ssl證書添加擴展IP,多個IP用逗號隔開;

--ssl-trusted-domain: 如果想多個域名訪問,則添加擴展域名(TRUSTED_DOMAIN),多個TRUSTED_DOMAIN用逗號隔開;

--ssl-size: ssl加密位數,默認2048;

--ssl-date: ssl有效期,默認10年;

--ca-date: ca有效期,默認10年;

--ssl-cn: 國家代碼(2個字母的代號),默認CN;

  

2、生成證書

chmod +x create_self-signed-cert.sh

./create_self-signed-cert.sh --ssl-domain=rancher.wmqe.com \
--ssl-trusted-ip=172.16.3.241,172.16.3.242,172.16.3.243 --ssl-size=2048 --ssl-date=3650

 

3、創建命名空間及secrets

kubectl create namespace cattle-system

kubectl -n cattle-system create secret tls tls-rancher-ingress \
    --cert=/opt/rancher/ca_tls/tls.crt \
    --key=/opt/rancher/ca_tls/tls.key

kubectl -n cattle-system create secret generic tls-ca \
    --from-file=/opt/rancher/ca_tls/cacerts.pem

注意:必須保證文件名為cacerts.pem、tls.crt和tls.key。

 

4、安裝rancher

mkdir /opt/rancher/auditlogs/
cd /opt/rancher/deploy/
helm install ./rancher \
    --name rancher \
    --namespace cattle-system \
    --set hostname=awsrancher.wmqe.com \
    --set ingress.tls.source=secret \
    --set auditLog.level=3 \
    --set auditLog.destination=hostPath \
    --set auditLog.hostPath=/opt/rancher/auditlogs/ \
    --set auditLog.maxAge=20 \
    --set auditLog.maxBackups=20 \
    --set auditLog.maxSize=100 \
    --set privateCA=true \
    --set rancherImage=reg.nexus.wmqe.com/rancher/rancher

安裝成功會提示Happy Containering!

不用指定版本stable,因為指定了Charts模板目錄,自動會安裝對應的版本的rancher。

 

#卸載方法

helm del --purge rancher
helm del --purge cattle-node

 

4.3.4 檢查rancher狀態

1、查看pod運行情況

kubectl get pod -o wide -A

NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE    IP              NODE            NOMINATED NODE   READINESS GATES
cattle-system   rancher-89444f57b-2nkvz                   1/1     Running     0          42s    10.42.0.8       172.16.3.241   <none>           <none>
cattle-system   rancher-89444f57b-q4lsq                   1/1     Running     0          42s    10.42.1.5       172.16.3.243   <none>           <none>
cattle-system   rancher-89444f57b-ztcrh                   1/1     Running     0          42s    10.42.2.7       172.16.3.242    <none>           <none>

2、訪問rancher

訪問之前設置好的域名(對負載均衡做的域名解析)。

https://rancher.wmqe.com

admin,******

 

注意:登入后 local 集群會一直顯示:Waiting for server-url setting to be set

報這個問題的原因是剛剛創建的 cattle-cluster-agent還沒有被創建成功,耐心等待十分鍾左右即可,這個過程與自己的網絡有關,通過 kubectl get pod -A 命令進行監控。

  

五、升級Rancher

升級 rancher2.2.4 集群,從 2.2.4 版本升級到 rancher 2.2.5版本,同時升級rancher中添加的k8s集群版本。

參考:https://www.cnrancher.com/docs/rancher/v2.x/cn/upgrades/ha-server-upgrade-helm-airgap/

5.1 同步鏡像

1、安裝docker

啟動一台新主機,安裝docker(不要用生產環境,免得主機上的鏡像太多)

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y
systemctl restart docker
systemctl enable docker
systemctl status docker

2、同步鏡像到私有倉庫

1)下載鏡像列表文件,從 https://github.com/rancher/rancher/releases/tag/v2.2.5/rancher-images.txt 網站下載 2.2.5 版本的鏡像列表文件,上傳到如下新建的目錄。

mkdir -p /opt/rancher/upgrade2.2.5 && cd /opt/rancher/upgrade2.2.5

2)同時新建 2.1 小節中的兩個腳本(鏡像拉取和鏡像上傳腳本)。

rancher-save-images.sh
rancher-push-images.sh

3)下載鏡像

chmod +x rancher-save-images.sh
./rancher-save-images.sh --image-list /opt/rancher/upgrade2.2.5/rancher-images.txt

4)同步鏡像到私有倉庫

chmod +x rancher-push-images.sh
./rancher-push-images.sh
reg.nexus.wmqe.com
admin
xxxxxxxx

 

5.2 升級rancher

登入到之前 1.2 小節安裝有CLI(kubectl、helm)工具的主機(prod-rancher-server-01)

1、更新本地 helm repo 緩存。

helm repo update

2、查看本地helm repo

helm repo list

#結果如下:
stable            https://kubernetes-charts.storage.googleapis.com 
local             http://127.0.0.1:8879/charts                     
rancher-stable    https://releases.rancher.com/server-charts/stable

3、查看rancher版本已經是最新版本了

helm search rancher

#結果如下:
NAME                      CHART VERSION    APP VERSION    DESCRIPTION                                                 
rancher-stable/rancher    2.2.5            v2.2.5         Install Rancher Server to manage Kubernetes clusters acro...

4、下載 Rancher Charts 離線包

mkdir -p /opt/rancher/upgrade2.2.5 && cd /opt/rancher/upgrade2.2.5
helm fetch rancher-stable/rancher --version v2.2.5

5、升級rancher

升級參數應該以安裝時設置的參數為准。

tar zxvf rancher-2.2.5.tgz
kubeconfig=/root/.kube/config
helm --kubeconfig=$kubeconfig upgrade rancher ./rancher \
    --set hostname=rancher.wmqe.com \
    --set ingress.tls.source=secret \
    --set auditLog.level=3 \
    --set auditLog.destination=hostPath \
    --set auditLog.hostPath=/opt/rancher/auditlogs/ \
    --set auditLog.maxAge=20 \
    --set auditLog.maxBackups=20 \
    --set auditLog.maxSize=100 \
    --set rancherImage=reg.nexus.wmqe.com/rancher/rancher

執行完后,登入rancher首頁,會發現左下角的版本號已經是最新版本了。

 

5.3 升級k8s集群

此時升級的是rancher上添加的k8s集群(該集群跑的是業務),而非運行rancher本身的k8s集群(該集群版本保持不變)。

rancher2.2.5 版本為 Kubernetes v1.15 提供實驗支持,並為 Kubernetes v1.14 提供官方支持。所以升級完rancher后,就可以升級k8s集群了。

1、進入對應的集群 -> 集群 -> 升級

2、選擇 Kubernetes 版本為 v1.14.3-rancher1-1

3、顯示高級選項->私有鏡像倉庫->填入私有倉庫信息

4、保存,即可觸發進行升級。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM