一、安裝基礎軟件node
#環境centos7.6
yum install -y vim net-tools wget lrzsz
二、防火牆linux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0 systemctl stop firewalld.service && systemctl disable firewalld.service
三、時間同步nginx
yum install -y ntp systemctl enable ntpd && systemctl start ntpd timedatectl set-timezone Asia/Shanghai timedatectl set-ntp yes ntpq -p
四、內核參數git
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
五、加載模塊github
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
六、掛載數據盤docker
掛載阿里雲數據盤json
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
七、安裝dockervim
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
#調整參數centos
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
Rancher依靠私有鏡像倉庫進行離線安裝,必須擁有本身的私有鏡像倉庫或其餘方式將全部Docker鏡像分發到每一個節點。HA安裝須要如下CLI工具, 確保這些工具安裝在您的工做站或者筆記本上,而且您的工做站或者筆記本須要有權限訪問Rancher環境。
1)kubectl:Kubernetes命令行工具;
2)rke:Rancher Kubernetes Engine,用於構建Kubernetes集羣的cli;
3)helm:Kubernetes的包管理(客戶端helm和服務器Tiller)。
這些安裝包可從rancher網站(https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/download/)下載
mkdir -p /opt/rancher/cli && cd /opt/rancher/cli wget https://www.cnrancher.com/download/kubernetes/linux-amd64-v1.14.3-kubectl && wget https://www.cnrancher.com/download/rke/v0.2.4-rke_linux-amd64 && wget https://www.cnrancher.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
echo "export PATH=/opt/rancher/cli:\$PATH" >> /etc/profile source /etc/profile #centos7.6第一次需添加全部用戶執行該命令,後續修改不用添加: echo "source /etc/profile" >> /etc/bashrc
Rancher HA安裝須要使用來自3個源的鏡像,將3個源合併到一個名爲rancher-images.txt的文件中。
一、在版本發佈頁面,找到須要安裝的Rancher 2.xx版本。不要下載的版本標示rc或者Pre-release,由於它們不適用於穩定的生產環境。https://github.com/rancher/rancher/releases/tag/v2.2.4
二、從發行版的 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
三、確保rancher-save-images.sh可執行。
chmod +x rancher-save-images.sh
四、經過RKE生成鏡像清單
rke config --system-images -all >> ./rancher-images.txt
五、對鏡像列表進行排序和去重,以去除重複的鏡像。
sort -u rancher-images.txt -o rancher-images.txt
六、複製如下腳本保存爲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
一、在可用訪問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") 生成全部鏡像的壓縮文件。
二、拷貝全部文件到內網環境中的Linux主機上,而後執行如下腳本去加載壓縮包。若是上一步下載鏡像的主機能夠鏈接內網的鏡像倉庫,那麼此步驟能夠跳過。
chmod +x rancher-load-images.sh ./rancher-load-images.sh --images-path /opt/rancher/deploy/rancher-images-$(date +"%Y-%m-%d")
三、使用rancher-push-images.sh把導入的docker鏡像自動tag重命名,而後上傳到私有鏡像倉庫。鏡像默認所有上傳到鏡像倉庫的rancher項目下,若是鏡像倉庫不支持自動建立項目名(好比Harbor),須要提早手動去鏡像倉庫建立好項目。執行腳本後會要求輸入鏡像倉庫地址和用戶名、用戶密碼。
chmod +x rancher-push-images.sh ./rancher-push-images.sh reg.nexus.wmqe.com admin *******
使用下面的示例建立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)
一、建立rancher帳號並加入docker組(三臺都執行)
useradd rancher -G docker
#設置密碼
passwd rancher
#重啓生效
reboot
二、root帳戶可登入(三臺都執行)
vim /etc/ssh/sshd_config
PasswordAuthentication yes
systemctl restart sshd
三、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
一、運行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
二、若是建立失敗必定要清理緩存再繼續
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/
一、檢查節點狀態
建立完成後,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/ 目錄。
二、複製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
三、檢查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小節進行鏡像同步。
四、保存配置文件
保存 kube_config_rancher-cluster.yml 和 rancher-cluster.yml 文件的副本,您將須要這些文件來維護和升級 Rancher 實例。
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
一、先獲取helm的版本(忽略沒有安裝tiller的報錯)
helm version |grep Client | awk -F""\" '{print $2}'
Error: could not find tiller v2.14.1
二、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
******
三、安裝tiller
helm init --skip-refresh --service-account tiller \ --tiller-image reg.nexus.wmqe.com/rancher/tiller:v2.14.1
注意:
一、helm init在缺省配置下,會去谷歌鏡像倉庫拉取gcr.io/kubernetes-helm/tiller鏡像,並在Kubernetes集羣上安裝配置Tiller。離線環境下,可經過--tiller-image指定私有鏡像倉庫鏡像。
二、helm init在缺省配置下,會利用https://kubernetes-charts.storage.googleapis.com做爲缺省的stable repository地址,並去更新相關索引文件。
三、若是是離線安裝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}
此步驟須要在能鏈接互聯網的主機上操做,在可訪問互聯網並安裝有Helm客戶端的主機上執行如下操做。
一、添加Rancher Charts倉庫
指定安裝的版本(好比: latest or stable)
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
二、獲取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壓縮文件。
將生成的rancher-vx.x.x.tgz文件拷貝到離線環境安裝有kubectl和Helm客戶端的主機上,解壓rancher-vx.x.x.tgz文件得到rancher文件夾。
tar -zxvf rancher-2.2.4.tgz
在阿里雲上新建內網的4層負載均衡器,後端目標端口爲443,生成一個IP:172.16.3.244,對這個IP進行域名A記錄
rancher.wmqe.com 172.16.3.244
一、下載權威證書
將服務證書和CA中間證書鏈合併名爲tls.crt的文件中,將私鑰複製到名爲tls.key的文件中。
mkdir /opt/rancher/ca_tls/
二、建立命名空間及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。
三、安裝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://rancher.com/docs/rancher/v2.x/en/installation/ha/helm-rancher/chart-options/#api-audit-log
若是使用的是本身建立的自簽名證書,則須要建立證書secret和CA證書secret。
一、生成自簽名證書腳本
一鍵生成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;
二、生成證書
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
三、建立命名空間及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。
四、安裝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
一、查看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>
二、訪問rancher
須要在設置好負載均衡,並作域名解析。
admin,******
etcd的備份在以前部署kubernetes的時候已經指定了備份間隔和保留天數
services: etcd: backup_config: enabled: true interval_hours: 1 retention: 30
#參數說明:
interval_hours: 1 每隔一個小時進行備份,不支持單位和小數
retention: 30 清理30天以前的備份數據
#若是修改這兩個參數後,直接從新部署一次便可
rke up --config ./rancher-cluster.yml
注意:會重啓kube-apiserver、kube-scheduler、kube-controller-manager、etcd-rolling-snapshots四個容器。不影響rancher集羣的運行。自動備份會在每一個etcd節點上的 /opt/rke/etcd-snapshots 目錄生成備份文件,只需定時複製一份到遠程存儲中。
從rke v0.2.0開始,當rke 建立集羣后,會在配置文件當前目錄下生成xxxx.rkestate文件,文件中保存了集羣的配置信息和各組件使用的證書信息。
cd /opt/rancher/deploy
rke etcd snapshot-save --name etcd_back_0612_1743 --config rancher-cluster.yml
把生成的備份文件,rancher-cluster.yml,rancher-cluster.rkestate進行備份到遠程存儲中。
升級 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/
一、安裝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
二、同步鏡像到私有倉庫
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
登入到以前 1.2 小節安裝有CLI(kubectl、helm)工具的主機(prod-rancher-server-01)
一、更新本地 helm repo 緩存。
helm repo update
二、查看本地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
三、查看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...
四、下載 Rancher Charts 離線包
mkdir -p /opt/rancher/upgrade2.2.5 && cd /opt/rancher/upgrade2.2.5 helm fetch rancher-stable/rancher --version v2.2.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首頁,會發現左下角的版本號已是最新版本了。
此時升級的是rancher上添加的k8s集羣(該集羣跑的是業務),而非運行rancher自己的k8s集羣(該集羣版本保持不變)。
rancher2.2.5 版本爲 Kubernetes v1.15 提供實驗支持,併爲 Kubernetes v1.14 提供官方支持。因此升級完rancher後,就能夠升級k8s集羣了。
一、進入對應的集羣 -> 集羣 -> 升級
二、選擇 Kubernetes 版本爲 v1.14.3-rancher1-1
三、顯示高級選項->私有鏡像倉庫->填入私有倉庫信息
四、保存,便可觸發進行升級。