一、先决条件(所有主机执行)

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
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=
net.bridge.bridge-nf-call-iptables=
net.ipv4.neigh.default.gc_thresh1=
net.ipv4.neigh.default.gc_thresh2=
net.ipv4.neigh.default.gc_thresh3=
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,,回车,回车,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": ,
"max-concurrent-uploads": ,
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": ""
}
}
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=$
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 ]]; 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
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 ]; 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 ]; 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=$
cur_time='['$(date +"%Y-%m-%d %H:%M:%S")']'
echo ${cur_time} ${log} | tee -a ${log_file}
} POSITIONAL=()
while [[ $# -gt ]]; 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
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 ]; 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=$
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 ]; 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 ]; 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 ]; 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:
retention:

常规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 / Running 31m
ingress-nginx nginx-ingress-controller-h46wq / Running 31m
ingress-nginx nginx-ingress-controller-kshvs / Running 31m
ingress-nginx nginx-ingress-controller-p8tw7 / Running 31m
kube-system canal-5pgj4 / Running 31m
kube-system canal-hgl58 / Running 31m
kube-system canal-lz7v7 / Running 31m
kube-system kube-dns-autoscaler-bdb58979-jgqx8 / Running 31m
kube-system kube-dns-b9c8976b8- / Running 31m
kube-system metrics-server-75656f5b94-zm5j2 / Running 31m
kube-system rke-ingress-controller-deploy-job-nnr6n / Completed 31m
kube-system rke-kubedns-addon-deploy-job-9vzxv / Completed 31m
kube-system rke-metrics-addon-deploy-job-qwkpc / Completed 31m
kube-system rke-network-plugin-deploy-job-lck7b / Completed 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. 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..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= \
--set auditLog.destination=hostPath \
--set auditLog.hostPath=/opt/rancher/auditlogs/ \
--set auditLog.maxAge= \
--set auditLog.maxBackups= \
--set auditLog.maxSize= \
--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 [[ $ == '' ]];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:-}
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:-}
SSL_SIZE=${SSL_SIZE:-} ## 国家代码(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+)) = ${dns[$i]} >> ${SSL_CONFIG}
done if [[ -n ${SSL_TRUSTED_IP} ]]; then
ip=(${SSL_TRUSTED_IP})
for i in "${!ip[@]}"; do
echo IP.$((i+)) = ${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= --ssl-date=

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= \
--set auditLog.destination=hostPath \
--set auditLog.hostPath=/opt/rancher/auditlogs/ \
--set auditLog.maxAge= \
--set auditLog.maxBackups= \
--set auditLog.maxSize= \
--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 / Running 42s 10.42.0.8 172.16.3.241 <none> <none>
cattle-system rancher-89444f57b-q4lsq / Running 42s 10.42.1.5 172.16.3.243 <none> <none>
cattle-system rancher-89444f57b-ztcrh / Running 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. 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..tgz
kubeconfig=/root/.kube/config
helm --kubeconfig=$kubeconfig upgrade rancher ./rancher \
--set hostname=rancher.wmqe.com \
--set ingress.tls.source=secret \
--set auditLog.level= \
--set auditLog.destination=hostPath \
--set auditLog.hostPath=/opt/rancher/auditlogs/ \
--set auditLog.maxAge= \
--set auditLog.maxBackups= \
--set auditLog.maxSize= \
--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、保存,即可触发进行升级。

离线安装 Rancher2.2.4 HA 集群的更多相关文章

  1. Cloudera Manager安装之利用parcels方式(在线或离线)安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(五)

    前期博客 Cloudera Manager安装之Cloudera Manager 5.6.X安装(tar方式.rpm方式和yum方式) (Ubuntu14.04) (三) 如果大家,在启动的时候,比如 ...

  2. 安装spark ha集群

    安装spark ha集群 1.默认安装好hadoop+zookeeper 2.安装scala 1.解压安装包 tar zxvf scala-2.11.7.tgz 2.配置环境变量 vim /etc/p ...

  3. Storm-1.0.1+ZooKeeper-3.4.8+Netty-4.1.3 HA集群安装

    Storm-1.0.1+ZooKeeper-3.4.8+Netty-4.1.3 HA集群安装 下载Storm-1.0.1 http://mirrors.tuna.tsinghua.edu.cn/apa ...

  4. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  5. 菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章

    菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章 cheungmine, 2014-10-25 0 引言 在生产环境上安装Hadoop高可用集群一直是一个需要极度耐心和体力的细致工作 ...

  6. 基于zookeeper的高可用Hadoop HA集群安装

    (1)hadoop2.7.1源码编译 http://aperise.iteye.com/blog/2246856 (2)hadoop2.7.1安装准备 http://aperise.iteye.com ...

  7. Hadoop(HDFS,YARN)的HA集群安装

    搭建Hadoop的HDFS HA及YARN HA集群,基于2.7.1版本安装. 安装规划 角色规划 IP/机器名 安装软件 运行进程 namenode1 zdh-240 hadoop NameNode ...

  8. Cloudera Manager安装之利用parcels方式安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(五)

    参考博客 Cloudera Manager安装之利用parcels方式安装单节点集群  Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式.rpm ...

  9. corosync+pacemaker实现高可用(HA)集群

    corosync+pacemaker实现高可用(HA)集群(一)     重要概念 在准备部署HA集群前,需要对其涉及的大量的概念有一个初步的了解,这样在实际部署配置时,才不至于不知所云 资源.服务与 ...

随机推荐

  1. get传数组

    开发真的处处都是坑呀 ajax get请求,传数组,想当然的给了个json数组['','',''],结果500错误 正确的方式,多次赋值,见下图,后台会自动转数组

  2. 让System.Drawing.Bitmap可以在linux运行

    .net core的bitmap使用的是以下类库,但无法在linux运行 https://github.com/CoreCompat/CoreCompat 在linux运行需要安装runtime.li ...

  3. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  4. Windows下Unity安装

    安装教程: https://www.paws3d.com/lesson/us-0101/ 问题1: 安装并完成注册后,在网页上能登录,但打开Unity时不能启动成功,一直停留在如下界面 解决方案:断网 ...

  5. div+css 组织结构

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>家谱 ...

  6. Linux:用户和组总结

    从创建文件说起:useradd xiaomi           这里是创建了xiaomi用户 默认系统还会创建:/home/xiaomi  /var/mail/xiaomi        即家目录和 ...

  7. 39.date hitogram基础知识

    主要知识点: date hitogram之统计每月电视销量     上一节讲到histogram,他是以数值进行分组.本节讲到以日期进行bucket分组操作,也就是说把连续的日期变成离散的日期区间,然 ...

  8. 【模板】dijkstra

    洛谷 4779 #include<cstdio> #include<cstring> #include<algorithm> #include<queue&g ...

  9. 混合了RBAC和ACL的权限系统(一) -- 用户组织结构

    最近的工作是一个基础设计,打造一个基于RBAC和ACL的权限基础组件. 这个基础组件的特点是:同时混合了RBAC和ACL的认证方式,也就是说同时提供系统级别的授权(RBAC)和对象级别的授权(ACL) ...

  10. OSI七层参考模型每一层都有哪些协议

    OSI七层参考模型每一层都有哪些协议 第七层应用层 协议:DHCP • DNS • FTP • Gopher • HTTP • IMAP4 • IRC • NNTP • XMPP • POP3 • S ...