一 基础信息

1.1 前提

  1. 本次安装的为 20220129 最新版:Rancher v2.6.3
  2. VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求)
  3. VM YUM 仓库:已配置对应版本的 RHEL 和 EPEL YUM 仓库
  4. VM 提供 root 权限
  5. 已配置 ntp(防止因为时间不一致导致的诡异问题)
  6. 提供 Proxy 访问互联网 Rancher 相关域名;
  7. 端口要求,为了正常运行,Rancher 需要在 Rancher 节点和下游 Kubernetes 集群节点上开放一些端口。端口需求列出了不同集群类型的 Rancher 和下游集群的所有必要端口。具体如下表:

Rancher 节点的入站规则

协议 端口 目的 描述
TCP 80 客户端,操作机 Rancher 节点 使用外部 SSL 终端时的 Rancher UI/API
TCP 443 客户端,操作机,所有 K3S 节点 Rancher 节点 Rancher agent,Rancher UI/API,kubectl

Rancher 节点的出站规则

协议 端口 目的 描述
TCP 22 Rancher 节点 所有 K3S 节点 使用 Node Driver 对节点进行 SSH 配置
TCP 2376 Rancher 节点 所有 K3S 节点 Docker Machine 使用的 Docker daemon TLS 端口
TCP 6443 Rancher 节点 K3S Server Kubernetes API server

成功:

如果以上前期条件均已满足。

即可以通过「离线 - 有代理」方式进行安装。

1.2 VM 信息

信息:

OS 配置 Proxy 过程略

1.2 Proxy 信息

ftp_proxy="http://192.168.0.1:8080"
http_proxy="http://192.168.0.1:8080"
https_proxy="http://192.168.0.1:8080"

proxy 需要 allow 的 doamin 如下:

域名 用途
http://mirror.cnrancher.com Rancher 国内组件源
https://registry.cn-hangzhou.aliyuncs.com Rancher 国内镜像源
https://dockerauth.cn-hangzhou.aliyuncs.com Rancher 国内镜像源
https://gitee.com Rancher 国内 Helm Charts 源
http://mirrors.aliyun.com YUM 源
https://mirrors.aliyun.com YUM 源
https://rpm.rancher.com Rancher 源

评论:

以上的 allowed domain 可能不全,需要进一步补充。

二 「离线 - 有代理」方式安装

评论:

本次环境为:离线,有代理。

通过代理安装部署。

假设 Rancher 所在主机 IP 地址为:192.168.0.100

2.1 Rancher 安装配置

2.1.1 安装配置 Docker 及 docker-compose

RHEL 7.8 安装命令如下:

# sudo -i
# yum install -y docker docker-compose # systemctl status docker
# systemctl enable docker
# systemctl start docker

信息:

Docker 版本为:1.13,安装后带了 3 个和 docker 有关的 service:

# systemctl list-unit-files|grep docker
docker-cleanup.service disabled
docker-storage-setup.service disabled
docker.service disabled
docker-cleanup.timer disabled

docker.service 目录是:/usr/lib/systemd/system/docker.service

docker-compose version 1.18.0, build 8dd22a9

RHEL registries.conf 配置:

配置 insecure-registry:

vi /etc/containers/registries.conf
[registries.search]
registries = ['registry.cn-hangzhou.aliyuncs.com', 'registry.access.redhat.com', 'registry.redhat.io', 'docker.io'] [registries.insecure]
registries = [] [registries.block]
registries = []

Docker 配置 Proxy(可选配置,建议配置来保障 docker 100% 使用代理)[1]

首先创建配置文件:

# mkdir -p /usr/lib/systemd/system/docker.service.d/
# vi /usr/lib/systemd/system/docker.service.d/http-proxy.conf

然后添加配置:

[Service]
Environment="HTTP_PROXY=http://192.168.0.1:8080"
Environment="HTTPS_PROXY=http://192.168.0.1:8080"
Environment="NO_PROXY=localhost,127.0.0.1,0.0.0.0,192.168.0.100,10.109.205.245,cattle-system.svc,.svc,.cluster.local,example.com"

最后重启容器并验证:

# systemctl daemon-reload
# systemctl restart docker
# systemctl show docker --property Environment

评论:

Linux NO_PROXY CIDR 方式配置不生效,只有 IP 地址会生效。

2.1.2 生成 100 年有效期的证书

评论:

df -h 查看文件系统,如下:

# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/rhel-root 67G 5.5G 62G 9% /
...
/dev/mapper/vgdata-lvdata 100G 33M 100G 1% /data
...

/data 目录 100G,所以 rancher 安装在 /data/rancher 目录下。

vi create_self-signed-cert.sh
#!/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} || -n ${SSL_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
chmod +x create_self-signed-cert.sh

生成 100 年证书:

./create_self-signed-cert.sh --ssl-trusted-ip=192.168.0.100 --ssl-date=3650

证书重命名(为了符合 rancher docker 安装对证书的要求):

# cp tls.crt cert.pem
# cp tls.key key.pem

2.1.3 安装 Rancher

通过 docker-compose 方式启动,方便通过文件形式查看相关配置。

# vi docker-compose.yml

Yaml 配置参考了这里[2]和这里[3]

version: '3.3'
services:
rancher:
restart: unless-stopped
ports:
- '80:80'
- '443:443'
environment:
- 'HTTP_PROXY=http://192.168.0.1:8080'
- 'HTTPS_PROXY=http://192.168.0.1:8080'
- 'NO_PROXY=localhost,127.0.0.1,0.0.0.0,192.168.0.100,cattle-system.svc,.svc,.cluster.local,example.com'
- CATTLE_TLS_MIN_VERSION=1.0
- SSL_CERT_DIR="/etc/rancher/ssl"
- AUDIT_LEVEL=1
- CATTLE_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com
volumes:
- '/data/rancher:/var/lib/rancher'
- '/data/rancher/certs/cert.pem:/etc/rancher/ssl/cert.pem'
- '/data/rancher/certs/key.pem:/etc/rancher/ssl/key.pem'
- '/data/rancher/certs/cacerts.pem:/etc/rancher/ssl/cacerts.pem'
- '/data/rancher/log/auditlog:/var/log/auditlog'
privileged: true
image: 'registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.6.3'

启动 rancher:

# docker-compose up -d

可以通过以下命令查看启动日志:

# docker-compose logs -f

启动后,通过浏览器访问:https://192.168.0.100/,第一次显示如下:

在 terminal 中按照要求输入如下命令获取 bootstrap password:

# docker logs  rancher_rancher_1  2>&1 | grep "Bootstrap Password:"
2022/01/29 07:56:10 [INFO] Bootstrap Password:
...

并把该密码输入到输入框中,随后会生成一个 admin 密码,如下:

勾选I agree...,点击 Continue 进入 rancher 首页,如下图:

至此 Rancher 安装完成。

2.1.4 Rancher 中国区优化配置

使用码云代替 Github

Rancher 默认使用 Github 上的 repo 作为 Chart 仓库的 URL,如果出现 timeout 情况,可以将 Chart 仓库 URL 替换成码云的地址。

每个 repo 的对应关系如下:

应用商店地址 RANCHER REPO 地址 GITEE 地址
https://git.rancher.io/helm3-charts https://github.com/rancher/helm3-charts https://gitee.com/rancher/helm3-charts
https://git.rancher.io/charts https://github.com/rancher/charts https://gitee.com/rancher/charts
https://git.rancher.io/system-charts https://github.com/rancher/system-charts https://gitee.com/rancher/system-charts

那么如何修改 Chart 仓库 URL 呢?

  1. 首页点击左上角汉堡菜单,选择「管理集群」->「Advanced」-> 「Chart 仓库」
  2. 点击列表右侧的省略号 -> Edit
  3. 将 Chart 仓库 URL 替换成码云中的地址即可,点击 Save
  4. 此时,对应的 Chart 仓库的状态变为 Refreshed,等待其变为 Active 之后即可正常使用

修改后如下:

总结

至此,Rancher 单节点安装完成。

  1. 地址:https://192.168.0.100
  2. 目录:/data/rancher
  3. 证书目录:/data/rancher/certs
  4. 审计日志目录:/data/rancher/log/auditlog

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.


  1. Configure Docker to use a proxy with or without authentication - Red Hat Customer Portal

  2. 选项 B - 使用已有的自签名证书 - Rancher 官方文档

  3. 自定义 CA 证书 - Rancher 官方文档

Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher的更多相关文章

  1. Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

    联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...

  2. 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  3. NHibernate系列文章十:NHibernate对象二级缓存下

    摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...

  4. Python学习系列之(二)图解Windows8.1下安装Django

    一. 下载 去官网下载https://www.djangoproject.com/download/最新版,最新版本是1.6 二. 安装: 将下载下来的Django-1.6.tar.gz解压到D盘,接 ...

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

    .. 欢迎大家,加入我的微信公众号:大数据躺过的坑     免费给分享       同时,大家可以关注我的个人博客:  http://www.cnblogs.com/zlslch/   和  http ...

  6. kubernetes系列:(二)、kubernetes部署mysql(单节点)

    使用kubeadm搭建好kubernetes集群后就可以动手部署自己的应用了. 本文用例来自官网,如有需要请参看 kubernetes官网 一.环境说明 kubernetes 1.13.1 docke ...

  7. 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  8. Jenkins pipeline 入门到精通系列文章

    Jenkins2 入门到精通系列文章. Jenkins2 下载与启动jenkins2 插件安装jenkins2 hellopipelinejenkins2 pipeline介绍jenkins2 jav ...

  9. Maven进价:Maven构建系列文章

    Maven:基于Java平台的项目构建.依赖管理和项目信息管理. 1.构建 Maven标准化了构建过程 构建过程:编译.运行单元测试.生成文档.打包和部署 避免重复:设计.编码.文档.构建 2.依赖管 ...

  10. 安装Windows Server 2022 - 初学者系列 - 学习者系列文章

    这天要写一个关于系统部署的系列文章,涉及到Windows Server 2022操作系统的安装,所以就写了此文.Windows系列的操作系统安装,以前的博文中都有介绍,这里再次做一个安装描述吧.需要的 ...

随机推荐

  1. uniapp 模拟器的使用

    uniapp 模拟器的使用 下载夜深模拟器 uniapp  - 工具-设置 adb路径  模拟器路径 模拟器端口号 :26944

  2. 【Jenkins】jenkins 配置腾讯企业邮箱

    首页]-->[系统管理]-->[系统设置] //////////////////////////////////////////////////////////////////////// ...

  3. Bugku Log4j2 漏洞题目 解题参考

    Log4j2 漏洞题目 题目地址 https://ctf.bugku.com/challenges/detail/id/340.html?page=1 二.攻击环境准备 需要一台linux云服务器,把 ...

  4. 如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法【转载】

    如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法.powermill显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底删除清理干净powermi ...

  5. cat、more、less、tail、head文件查看指令辨析

    1.cat 简介 cat [OPTION]... [FILE]... cat 可以将多个文本连接起来并输出,当省略输入文件或输入文件用字符-替代时,读取标准输入 常用参数 -n \(~~~~\)输出行 ...

  6. 简单了解promise

    promise是什么: JavaScript中存在很多异步操作, Promise将异步操作队列化,按照期望的顺序执行,返回 符合预期的结果.可以通过链式调用多个 Promise达到我们的目的. Pro ...

  7. B树、B+树详解

    B树.B+树详解   B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树 ...

  8. 剑指Offer2---------替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   重点: ...

  9. 如何让charles无论怎么请求都返回一个结果

    1. map Local         将匹配的url映射到本地文件.这个需要首先将url右键,save Response,将原有报文保存到本地,然后映射到该文件,修改该文件即可,直接自己写费事2. ...

  10. .NET实验三

    实验名称:实验三 Windows 应用程序开发 一. 实验目的 1. 掌握窗口控件的使用方法: 2. 掌握 Windows 的编程基础. 二. 实验要求   根据要求,编写 C#程序,并将程序代码和运 ...