• Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher


    一 基础信息

    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% 使用代理)

    首先创建配置文件:

    # 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 配置参考了这里和这里

    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/,第一次显示如下:

    Rancher bootstrap 密码

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

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

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

    Rancher 安装 - Admin 密码

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

    Rancher 首页

    至此 Rancher 安装完成。

    2.1.4 Rancher 中国区优化配置

    使用码云代替 Github

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

    每个 repo 的对应关系如下:

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

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

    修改后如下:

    修改 Chart 仓库

    总结

    至此,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 官方文档 ↩︎

  • 相关阅读:
    C语言如何判定循环结束和提前结束?
    二、python Django路由与请求(request的参数)
    HTTP协议详细总结
    Mybatis整合达梦数据库
    IP 基础
    Spring Cloud微服务治理框架深度解析
    vue创建项目并启动
    深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)
    map原理理解
    别问怎么下载,金蝶云星空SaaS BI系统不用下载
  • 原文地址:https://www.cnblogs.com/east4ming/p/17275048.html