Docker容器管理平台Rancher高可用部署——看这篇就够了
记得刚接触Rancher时,看了官方文档云里雾里,跟着官网文档部署了高可用Rancher,发现不管怎么折腾都无法部署成功(相信已尝试的朋友也有类似的感觉),今天腾出空来写个总结,给看到的朋友留个参考(亲测可用!按照下面步骤操作不会出现部署超时、部署完成后无法打开等问题)。
也许有人会问:什么是RANCHER?套用官网的话:Rancher 是为使用容器的公司打造的容器管理平台。
也许有人又会问:用K8s不香吗,为什么要加一层RANCHER?其实K8s是比较复杂的,尤其是各组件的版本选择以及大规模的使用场景上,需要一个管理平台降低容器化落地的复杂度。
【说明】:
- 当前Rancher版本为:V2.5.5 ;
- 若只想通过Docker安装单机版体验,可执行:
- docker run -d --privileged --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher:latest
- 下面部署的Rancher集群证书均使用自签名私有证书。
- 中文官网文档:https://docs.rancher.cn/rancher2/ 。
- 通过Rancher导入K8s集群时,需要预先在目标服务器上安装Docker,Docker的安装请参考【附录】。
【规划】:
- 用2台centos7部署k3s+rancher(做高可用),IP分别为:192.168.21.30,192.168.21.31;
- 用1台centos部署mysql5.7存储rancher数据,同时部署nginx代理2台rancher,IP为:192.168.20.101;
- 配置dns域名:rancher.test.cn - 192.168.20.101 ;
【安装K3s(K8s)】
说明:什么是K3s?K3s是K8s的精简版,很多时候我们并不需要用到K8s的所有功能,Rancher公司帮我们做了一款精简版的K8s,即K3s,推荐在K3s上部署Rancher。
一、准备工作
1. 内核升级:
建议所有K8s节点(包括K3s、k8s master worker节点)内核均升级到最新稳定版(目前是kernel5.4),好处请自行Google。
- # 载入公钥
- rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
- # 安装ELRepo
- rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
- # 载入elrepo-kernel元数据
- yum --disablerepo=\* --enablerepo=elrepo-kernel repolist
- # 查看可用的rpm包
- yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel*
- # 安装长期支持版本的kernel
- yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64
- # 删除旧版本工具包
- yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64 -y
- # 安装新版本工具包
- yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64
- #查看默认启动顺序
- awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
- CentOS Linux (4.4.183-1.el7.elrepo.x86_64) 7 (Core)
- CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core)
- CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core)
- #默认启动的顺序是从0开始,新内核是从头插入(目前位置在0,而4.4.4的是在1),所以需要选择0。
- grub2-set-default 0
- #重启并检查
- reboot
2. 修改主机名:
- hostnamectl set-hostname k3s01
- echo "127.0.0.1 k3s01" >> /etc/hosts
3. 配置dns或者在每台服务器及个人电脑上添加hosts解析(192.168.20.101 rancher.test.cn);
4. 2台rancher节点上安装helm:
- wget http://rancher-mirror.cnrancher.com/helm/v3.4.2/helm-v3.4.2-linux-amd64.tar.gz
- tar zxf helm-v3.4.2-linux-amd64.tar.gz
- cp linux-amd64/helm /usr/local/sbin/
5. 部署mysql5.7(具体请百度),创建"rancher"库,创建用户rancher,密码为rancher,mysql端口为61306。
6. 部署nginx(我是直接在mysql5.7服务器上部署,即IP为192.168.20.101这台机器),代理配置如下:
- [root@rancher-proxy ~]# cat /etc/nginx/nginx.conf
- worker_processes 4;
- worker_rlimit_nofile 40000;
- include /usr/share/nginx/modules/*.conf;
- events {
- worker_connections 8192;
- }
- stream {
- upstream rancher_servers_http {
- least_conn;
- server 192.168.21.30:80 max_fails=3 fail_timeout=5s;
- server 192.168.21.31:80 max_fails=3 fail_timeout=5s;
- }
- server {
- listen 80;
- proxy_pass rancher_servers_http;
- }
- upstream rancher_servers_https {
- least_conn;
- server 192.168.21.30:443 max_fails=3 fail_timeout=5s;
- server 192.168.21.31:443 max_fails=3 fail_timeout=5s;
- }
- server {
- listen 443;
- proxy_pass rancher_servers_https;
- }
- upstream rancher_servers_k8sapi {
- least_conn;
- server 192.168.21.30:6443 max_fails=3 fail_timeout=5s;
- server 192.168.21.31:6443 max_fails=3 fail_timeout=5s;
- }
- server {
- listen 6443;
- proxy_pass rancher_servers_k8sapi;
- }
- }
二、部署K3s
1. 分别在2台Rancher节点上,运行以下命令以启动 K3s Server 并将其连接到外部数据库:
- curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_EXEC="--tls-san rancher.test.cn" INSTALL_K3S_MIRROR=cn sh -s - server --datastore-endpoint="mysql://rancher:rancher@tcp(192.168.20.101:61306)/rancher"
2. k3s创建成功确认:
- k3s kubectl get nodes
- k3s kubectl get pods --all-namespaces
- cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
- [root@k3s02 ~]# cat ~/.kube/config
- apiVersion: v1
- clusters:
- - cluster:
- ……
- server: https://rancher.test.cn:6443
- ……
结果: 您现在可以使用kubectl来管理您的 K3s 集群。如果您有多个 kubeconfig 文件,可以在使用kubectl时通过传递文件路径来指定要使用的kubeconfig文件:
- kubectl --kubeconfig ~/.kube/config get pods --all-namespaces
4. 镜像加速
- cat >> /etc/rancher/k3s/registries.yaml <<EOF
- mirrors:
- "docker.io":
- endpoint:
- - "https://fogjl973.mirror.aliyuncs.com"
- - "https://registry-1.docker.io"
- EOF
- systemctl restart k3s
- k3s kubectl get pods --all-namespaces
【安装RANCHER】
- helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable
- kubectl create namespace cattle-system
- #!/bin/bash -e
- help ()
- {
- echo ' ================================================================ '
- echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是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-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=cattle-ca
- # ssl相关配置
- SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
- SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
- 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
生成证书:
- ./create_self-signed-cert.sh --ssl-domain=rancher.test.cn --ssl-trusted-domain=rancher.test.cn --ssl-trusted-ip=192.168.20.101,192.168.21.30,192.168.21.31 --ssl-size=2048 --ssl-date=3650
- kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=tls.crt --key=tls.key
- kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pem
- helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=rancher.test.cn --set ingress.tls.source=secret --set privateCA=true
- Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
可以执行下面步骤:
- export KUBECONFIG=~/.kube/config
检查:
- kubectl get pods --all-namespaces
- helm ls --all-namespaces
- kubectl -n cattle-system rollout status deploy/rancher
- Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
- deployment "rancher" successfully rolled out
检查 deployment 的状态:
- kubectl -n cattle-system get deploy rancher
- NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
- rancher 3 3 3 3 3m
恭喜!

感谢RANCHER公司为我们提供了这款开源、简洁易用、功能强大的容器管理平台!
- wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
- yum install docker-ce -y
- docker --version
- sudo systemctl start docker
- sudo systemctl enable docker
- sudo systemctl status docker
容器加速:
- [root@rancher-work02 ~]# cat /etc/docker/daemon.json
- {
- "registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
- }
生效容器加速配置:
- systemctl daemon-reload
- systemctl restart docker
恭喜!
Docker安装完毕。
Docker容器管理平台Rancher高可用部署——看这篇就够了的更多相关文章
- CDH构建大数据平台-Kerberos高可用部署【完结篇】
CDH构建大数据平台-Kerberos高可用部署[完结篇] 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装Kerberos相关的软件包并同步配置文件 1>.实验环境 ...
- 企业级容器管理平台 Rancher 介绍入门及如何备份数据
企业级容器管理平台 Rancher 介绍入门及如何备份数据 是什么 Rancher 是一个为 DevOps 团队提供的完整的 Kubernetes 与容器管理解决方案的开源的企业级容器管理平台.它解决 ...
- [转帖]devops 容器管理平台 rancher 简介
https://testerhome.com/topics/10828 chenhengjie123 for PPmoney · 2017年11月13日 · 最后由 c19950809 回复于 201 ...
- Docker 容器管理:rancher
Rancher:https://www.cnrancher.com/ 是一个开源的企业级全栈化容器部署及管理平台. 定位上和 K8s 比较接近,都是通过 web 界面赋予完全的 docker 服务编排 ...
- Docker容器管理平台Humpback进阶-私有仓库
Docker私有仓库 在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,docker 会去哪儿查找并下载镜像呢? 它实际上是从 registry.hub.doc ...
- 物联网架构成长之路(45)-容器管理平台Rancher
0.前言 按照上一篇博客,我已经把需要下载的rancher docker 依赖镜像下载上传到Harbor了. 1. 安装 执行如下,实现一键安装 docker run -d --restart=unl ...
- 【OGG】 RAC环境下管理OGG的高可用 (五)
[OGG] RAC环境下管理OGG的高可用 (五) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道 ...
- 微服务下的容器部署和管理平台Rancher
Rancher是什么 Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台.Rancher提供了在生产环境中使用的管理Docke ...
- 【Docker】Docker管理平台 Rancher ---- 你应该学学Rancher是怎么做容器的管理的
Elasticsearch is a Lucene-based search engine developed by the open-source vendor, elastic. With pri ...
随机推荐
- 学习笔记之Python人机交互小项目一:名字管理系统
2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施.与往年不同的是,今年的实训老师是学校邀请的公司在职人员来给我们实训.今年实训的内容是Python语言,下面 ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
- hadoop目录结构
Hadoop目录结构 重要目录结构: bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本 etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件 lib目录:存放H ...
- ORA-28001: the password has expired解决方法
Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...
- 一网打尽,一文讲通虚拟机VirtualBox及Linux使用
本文将从虚拟机的选择.安装.Linux系统安装.SSH客户端工具使用四个方面来详细介绍Linux系统在虚拟机下的安装及使用方法,为你在虚拟机下正常使用Linux保驾护航. 1.虚拟机的选择 在讲虚拟机 ...
- Vue css过渡 和 js 钩子过渡
css过渡 <transition name="slide"> <div v-show="!showChatInput" class=&quo ...
- 使用 C# 9 的records作为强类型ID - 初次使用
强类型ID 实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例. publi ...
- intellij idea2020将javaWeb项目打成war包并部署到阿里云服务器遇到java.lang. UnsupportedClass VersionError问题(已解决)
首先将javaweb项目打包成war文件(有关如何打包参考 https://jingyan.baidu.com/article/20b68a88642829386cec62f7.html.https: ...
- ps ww
[root@ma ~]# ps ww -p 1 PID TTY STAT TIME COMMAND 1 ? Ss 0:01 /sbin/init[root@ma ~]# ps -p 1 PID TTY ...
- 【Linux】CentOS7中修改中文字符集
CentOS 7中字符集查看的方式是 locale -a 或者locale 如果想显示中文的话,应该修改为 LANG="zh_CN.UTF-8" 在命令行界面临时修改字符集的话 ...