RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher

1 推荐架构

安装 Rancher 的方式有两种:单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境,而且单节点安装和高可用集群安装之间不能进行数据迁移,所以推荐从一开始就使用高可用集群安装的方式安装 Rancher。

建议将 Rancher Server 安装在高可用的 Kubernetes 集群上,主要是因为它可以保护 Rancher Server 的数据。在高可用安装中,负载均衡器充当客户端的单点入口,并在集群中的多台服务器之间分配网络流量,这有助于防止任何一台服务器成为单点故障。

不建议在单个 Docker 容器中安装 Rancher,因为如果该节点发生故障,则其他节点上将没有可用的集群数据副本,并且可能会丢失 Rancher Server 上的数据。

Rancher 需要安装在高可用的 RKE(Rancher Kubernetes Engine)Kubernetes 集群上,或高可用的 K3s (轻量级 Kubernetes) Kubernetes 集群。 RKE 和 K3s 都是经过完全认证的 Kubernetes 发行版。

1.1 RKE k8s Kubernetes 集群安装

在 RKE 安装中,集群数据将在集群中的三个 etcd 节点上进行复制,这是为了保障在一个 etcd 节点发生故障时,可以提供冗余和数据复制。

使用 RKE Kubernetes 集群运行 Rancher Management Server 的架构:

2 负载均衡配置的推荐配置参数

我们建议您使用以下方案,配置您的负载均衡和 Ingress Controller:

  • Rancher 的 DNS 应该被解析到四层负载均衡器上;
  • 负载均衡器应该把 TCP/80 端口和 TCP/443 端口的流量转发到集群中全部的 3 个节点上;
  • Ingress Controller 将把 HTTP 重定向到 HTTPS,在 TCP/443 端口使用 SSL/TLS;
  • Ingress Controller 把流量转发到 Rancher Server 的 pod 的 80 端口。

在 kubernetes 集群中安装 Ranhcer,并使用四层负载均衡,SSL 终止在 Ingress Controller 中。

为了达到最好的性能和安全条件,我们建议您为 Rancher 创建一个专用的 Kubernetes 集群,只在这个机器中部署 Rancher Server,不在这个集群中运行应用或程序。部署 Rancher 后,您可以 创建新集群或导入已有集群 ,然后用这些集群启动您自己的应用或程序。

Rancher 安装在 RKE Kubernetes 集群上,则该集群应具有三个节点,并且每个节点都应具有所有三个 Kubernetes 角色:etcd,controlplane 和 worker。

二 软件要求

下面的版本为当前的最新版和稳定版:

类型 Rancher 版本 Docker 标签 Helm 仓库 Helm Chart 版本
最新版 v2.5.8 rancher/rancher:latest server-charts/latest v2.5.8
稳定版 v2.5.8 rancher/rancher:stable server-charts/stable v2.5.8

1 Rancher 支持的 kubernetes 版本

更多信息可以转到官方链接查看。此处我仅列举了本人文档里试验总结的官方最新稳定版的相关信息:https://rancher.com/support-maintenance-terms/all-supported-versions/rancher-v2.5.8/

1.1 在 RKE 上安装 Ranhcer v2.5.8

适用于本地集群的 RKE CLI 和 K8S:

Rancher 版本 推荐的 CLI 版本 KUBERNETES 版本
v2.5.8 v1.2.12 v1.20.4(默认) v1.19.8 v1.18.16 v1.17.17

操作系统和 Docker:

类型 版本 已于 1 验证 / 认证
CentOS 7.7、7.8、7.9 Docker 18.06.3、18.09.x,19.03.x,20.10.x

2 RKE-1.2.12

RKE 可以兼容当前的所有 Docker 版本。

每个 RKE 版本都有受支持的 Kubernetes 版本的特定列表。如果您要使用的版本与下面列出的版本不同,则需要使用中的系统映像选项来更新 Kubernetes cluster.yml。

列举支持的 Kubernetes 版本:

1 请参考 RKE 版本说明 ,获取您当前使用的 RKE 支持的 Kubernetes 版本号。

Kubernetes 版本
v1.20.6-rancher1-1
v1.19.10-rancher1-1
v1.18.18-rancher1-2
v1.17.17-rancher2-3

2 也可以输入以下命令,快速获取支持的版本号:

./rke config --list-version --all
v1.20.6-rancher1-1
v1.17.17-rancher2-3
v1.18.18-rancher1-2
v1.19.10-rancher1-1

3 Kubectl

kubectl 可以比 kube-apiserver 高一个小版本,也可以低一个小版本。

例如:

  • 如果 kube-apiserver 当前是 1.21 版本
  • kubectl 则支持 1.22、1.21 和 1.20

4 Helm-3.5.x

  • 请使用 Helm v3.2.x 或更高版本安装或升级 Rancher v2.5.x。
  • Helm v2.16.0 或更高版本需要 Kubernetes v1.16 版本。对于默认的 Kubernetes 版本,请参考发布说明以获取所使用的 RKE 的版本。
  • 不能使用 Helm v2.15.0,因为这个版本中有一些关于转换 / 比较数字的问题。
  • 不能使用 Helm v2.12.0,因为这个版本和 cert-manager 一起使用时会有问题。
Helm 版本 支持的 Kubernetes 版本
3.5.x 1.20.x - 1.17.x
3.4.x 1.19.x - 1.16.x
3.3.x 1.18.x - 1.15.x
3.2.x 1.18.x - 1.15.x
3.1.x 1.17.x - 1.14.x
3.0.x 1.16.x - 1.13.x
2.16.x 1.16.x - 1.15.x
2.15.x 1.15.x - 1.14.x
2.14.x 1.14.x - 1.13.x
2.13.x 1.13.x - 1.12.x
2.12.x 1.12.x - 1.11.x
2.11.x 1.11.x - 1.10.x
2.10.x 1.10.x - 1.9.x
2.9.x 1.10.x - 1.9.x
2.8.x 1.9.x - 1.8.x
2.7.x 1.8.x - 1.7.x
2.6.x 1.7.x - 1.6.x
2.5.x 1.6.x - 1.5.x
2.4.x 1.6.x - 1.5.x
2.3.x 1.5.x - 1.4.x
2.2.x 1.5.x - 1.4.x
2.1.x 1.5.x - 1.4.x
2.0.x 1.4.x - 1.3.x

5 Docker-20.10.x

将最新的经过验证的 Docker 版本更新为 20.10。

每一个 Kubernetes 版本支持的 Docker 版本都不同。

6 nginx-1.14

官方已在 NGINX 1.14 上进行了测试 NGINX 配置。

7 OpenSSH-7.0+

为了可以通过 SSH 访问每一个节点,RKE 要求每个节点上安装的是 OpenSSH 的版本是 OpenSSH 7.0+。

三 主机配置

先配置 4 台最小化安装的主机,其中 3 台使用 RKE 配置 k8s 集群,然后在这个集群上配置高可用 Rancher。

要在高可用性 RKE 集群上安装 Rancher 管理服务器,我们建议设置以下基础设施:

  • 三个 Linux 节点,通常是虚拟机。
  • 一个负载均衡器,将前端流量引导到三个节点。
  • 一个 DNS 记录,将一个 URL 映射到负载均衡器。这将成为 Rancher 服务器的 URL,下游的 Kubernetes 集群需要到达它。

1 主机基本信息

主机 IP 主机名 配置 角色
192.168.1.65 k8s-node01 2 线程 4G controlplane,etcd,worker
172.16.10.59 k8s-node02 2 线程 4G controlplane,etcd,worker
172.16.10.33 k8s-node03 2 线程 4G controlplane,etcd,worker
172.16.10.21 nginx 2 线程 2G nginx 负载均衡

2 主机初始化配置

注意:以下步骤,四台主机均要操作。

2.1 查看系统版本是否满足要求

cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)     #若系统版本为7.7 7.8 7.9 均符合

2.2 关闭防火墙和 selinux

测试环境中,为了方便将防火墙和 selinux 关闭;生产环境中,建议关闭 selinux,防火墙规则根据环境需要自定义即可。

#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

2.3 时钟同步

为了防止后续集群在客户端和服务器之间因为时钟不同步而发生验证错误。

  1. 第一种方法:

    yum install -y ntp   #每台主机安装ntp服务
    systemctl start ntpd    #启动时钟同步服务
    systemctl enable  ntpd   #设置开机启动
    ntpq -p   #查看时钟同步状态
    
  2. 第二种方法:

    yum install ntp ntpdate -y
    

    之后,选择一台主机(172.16.10.21)作为 ntp 时间服务器,修改/etc/ntp.conf文件,删除:

    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    

    改为:

    server ntp3.aliyun.com iburst
    

    另外,原始文件中有一行为如下内容:

    #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
    

    去掉 #,打开注释,并将其 ip 修改为服务器所在网段:

    restrict 0.0.0.0 mask 255.255.255.0 nomodify notrap
    

    在集群中的其他服务器上,也要修改此文件,删除掉:

    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    

    加入:

    server 172.16.10.21 prefer
    

    保存后退出,在集群中的所有服务器上执行如下命令:

    systemctl stop chronyd.service
    systemctl disable chronyd.servicesystemctl restart ntpd
    systemctl enable ntpd
    

    之后,在集群中 172.16.10.21 以外的服务器上执行:

    ntpq -p
    
    [root@k8s-node01 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *nginx           203.107.6.88     3 u   30   64  377    0.335    0.034   0.010
    

说明时间已经同步。

2.4 内核参数调优

cat >> /etc/sysctl.conf << eof
vm.swappiness=0
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.neigh.default.gc_thresh1=4096
net.ipv4.neigh.default.gc_thresh2=6144
net.ipv4.neigh.default.gc_thresh3=8192
eof

使内核参数生效:

modprobe br_netfilter  #首先执行这个命令后才不会报错
sysctl -p

2.5 SSH Server 配置

SSH server 全系统配置文件,位于/etc/ssh/sshd_config,该文件必须包含以下代码,允许 TCP 转发。

AllowTcpForwarding yes#重启sshd服务
systemctl restart sshd

2.6 修改主机名

#分别修改每条主机的hostname
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
hostnamectl set-hostname k8s-node03
hostnamectl set-hostname nginx
#修改完后可直接断开Xshell的连接,再重新连接Xshell就可以看到主机名已修改了

在 /etc/hosts 文件中添加主机名配置:

cat >> /etc/hosts << eof
192.168.1.65  k8s-node01
172.16.10.59  k8s-node02
172.16.10.33 k8s-node03
172.16.10.21  nginx
eof

注 意 : 下 面 的 步 骤 仅 在 k 8 s 的 3 台 主 机 上 操 作 , n g i n x 上 不 可 以 操 作 。

2.7 关闭 swap 分区

#临时关闭
swapoff -a#永久关闭
进入/etc/fstab文件,注释掉swap分区的相关配置内容

2.8 加载 ipvs 相关模块

由于 ipvs 已经加入到了内核的主干,所以为 kube-proxy 开启 ipvs 的前提需要加载以下的内核模块。

cat > /etc/sysconfig/modules/ipvs.modules << eof
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
eof

chmod 755 /etc/sysconfig/modules/ipvs.modules 
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4	  #查看是否已经正确安装lipset软件包

前面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。

cat >> /etc/rc.d/rc.local << eof
bash /etc/sysconfig/modules/ipvs.modules
eofchmod +x /etc/rc.d/rc.local

四 安装 docker-20.10.6

注 意 : 仅在 k8s 节点安装 docker

  1. 若是节点主机上已安装有 docker,则先卸载及其依赖包

    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

  2. 安装 epel 更新源

    yum install epel-release -y

  3. 装 docker 仓库

在新主机上首次安装 docker 之前,需要设置 Docker 仓库;之后,可以从仓库安装和更新 docker。

安装所需的软件包。yum-utils 提供了 yum-config-manager,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

yum install -y yum-utils device-mapper-persistent-data lvm2

设置docker阿里仓库。

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装 docker

按版本号排序列出存储库中可用的版本号

[root@nginx charts]# yum list docker-ce --showduplicates | sort -r
 * updates: mirrors.tuna.tsinghua.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
 * extras: mirrors.huaweicloud.com
 * epel: mirrors.tuna.tsinghua.edu.cn
docker-ce.x86_64            3:24.0.7-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.6-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.5-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.4-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.3-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.2-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.1-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:24.0.0-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.6-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.5-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.4-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.3-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.2-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.1-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.0-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.24-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.23-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.22-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.21-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.20-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.19-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.18-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.18-3.el7                   @docker-ce-stable
docker-ce.x86_64            3:20.10.17-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.16-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.15-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.14-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.1-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.13-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.12-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.11-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.10-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.0-3.el7                    docker-ce-stable 

若是安装指定版本,例如:

[root@k8s-node01 ~]# yum install -y docker-ce-20.10.18-3.el7 docker-ce-cli-20.10.18-3.el7 containerd.io-1.6.8-3.1.el7

安装 docker 命令补全工具:

yum install -y bash-completion

启动 docker:

systemctl start docker
  1. 配置 docker 镜像下载加速器

    tee /etc/docker/daemon.json << eof
    {
    #"registry-mirrors": ["https://1nj0zren.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],
    "insecure-registries": [ "harbor.jettech.com" ],
    "log-driver": "json-file",
    "log-opts": {"max-size": "50m","max-file": "3"}
    }
    eof

  2. 启动

    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker

五 使用 RKE 安装 kubernetes

1 创建普通用户并加入 docker 组

注意:使用 rke 安装 kubernetes 时,不能以 root 用户执行,必须是一个普通用户才可以。

在每个节点上创建 wubo 普通用户,并将其加入 docker 用户组中;把 nginx 主机当做主控机,其他主机的 wubo用户互信它的 wubo用户。

[root@nginx charts]# useradd -m wubo -G docker

echo 123456aA | passwd --stdin wubo

2 主机互信,在nginx节点执行

目前有 4 台服务器,确保可以通过 ssh 互相访问。

[root@nginx charts]# ssh-keygen

ssh-copy-id -i wubo@192.168.1.65
ssh-copy-id -i wubo@172.16.10.59
ssh-copy-id -i wubo@172.16.10.33
ssh-copy-id -i wubo@172.16.10.21

3 在 nginx 节点下载安装 RKE-1.2.12

3.1 下载 RKE

登录主机,打开浏览器,访问 RKE 版本发布页面,下载最新的 RKE v1.2.12。 https://download.fastgit.org/rancher/rke/releases/download/v1.2.12/rke_linux-amd64

[root@nginx charts]#mv rke_linux-amd64 /usr/local/bin/rke 
[root@nginx charts]#chmod +x /usr/local/bin/rke 
[root@nginx charts]# rke  -v
rke version v1.2.12

3.2 为 kubernetes 集群准备节点

注 意 :需 要 在 每 个 节 点 执 行

kubernetes 集群组件需要在 Linux 发行版上的 Docker 中运行,只要是能安装和运行 docker 是 linux 发行版,都可以使用。

  1. SSH 用户 - 使用 SSH 访问节点的用户必须是节点上 docker 用户组的成员。
  • 添加到 docker 用户组的用户会自动获得主机的 root 权限,运行上述命令前,请确认您是否想让该用户获得 root 权限。运行命令后,请妥善保存该用户的认证凭据。
  • 如果您无法切换到 root 用户,不能运行上述命令将用户添加到 docker 用户组
  1. 禁用所有的 work 节点上的交换功能(swap)。

  2. 在命令行工具中输入以下命令和脚本,检查下列模组是否存在。

    // 配置以下脚本

    vim module.sh

    modprobe -a br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp

    for module in br_netfilter ip6_udp_tunnel ip_set ip_set_hash_ip ip_set_hash_net iptable_filter iptable_nat iptable_mangle iptable_raw nf_conntrack_netlink nf_conntrack nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat nf_nat_ipv4 nf_nat_masquerade_ipv4 nfnetlink udp_tunnel veth vxlan x_tables xt_addrtype xt_conntrack xt_comment xt_mark xt_multiport xt_nat xt_recent xt_set xt_statistic xt_tcpudp;
    do
    if ! lsmod | grep -q $module; then
    echo "module $module is not present";
    fi
    done
    done# chmod +x module.sh

    sh module.sh

3.3 创建集群配置文件 - cluster.yml

创建一个名为 cluster.yml 的 Kubernetes 集群配置文件。在后续步骤中,当使用 RKE 命令设置集群时,它将使用此文件在节点上安装 Kubernetes。

RKE 适配了高可用集群,您可以在 cluster.yml 文件中配置多个 controlplane 节点。RKE 会把 master 节点的组件部署在所有被列为 controlplane 的节点上,同时把 kubelets 的默认连接地址配置为 127.0.0.1:6443 。这个地址是 nginx-proxy 请求所有 master 节点的地址。

创建高可用集群需要指定两个或更多的节点作为 controlplane 。

RKE 使用集群配置文件 cluster.yml 规划集群中的节点,例如集群中应该包含哪些节点,如何部署 Kubernetes。您可以通过该文件修改很多集群配置选项。

如果您的节点具有公共和内部地址,建议设置 internal_address: 这样 Kubernetes 会将其用于集群内通信。

RKE 需要通过 SSH 连接到每个节点,并且它将在默认位置 ~/.ssh/id_rsa 中寻找私钥。如果您的默认私钥与节点的私钥不在同一个位置,则还需要为该节点配置 ssh_key_path 选项。

我这里根据官网列举了几个 RKE 节点选项:

选项 必填 描述
address 公用 DNS 或 IP 地址
user 可以运行 docker 命令的用户
role 分配给节点的 Kubernetes 角色列表
internal_address 内部集群流量的专用 DNS 或 IP 地址
ssh_key_path 用于对节点进行身份验证的 SSH 私钥的路径(默认为~/.ssh/id_rsa)
cluster_name 集群名称 默认集群名称:local
ignore_docker_version 检查 docker 版本 在运行 RKE 前是否执行 Docker 版本检测,可选值为 true 和 false,默认值为 false
kubernetes_version kubernetes 版本 将原有的版本号修改为新的版本号即可,RKE 目前不支持回滚 Kubernetes 版本。
prefix_path 前缀路径 默认下 RKE 存储 ROS、CoreOS 等操作系统的相关资源时,添加一个前缀:/opt/rke
ssh_key_path 集群 ssh 秘钥路径 RKE 使用 ssh 连接到主机,通常情况下,每个节点都会在 nodes 部分为每个 ssh 密钥设置一个独立的路径。
...... ...... ......
  • 高级配置: RKE 有许多配置选项可用于在您的特定环境中进行自定义安装。请参阅 RKE 文档 来了解 RKE 的选项和功能的完整列表。
  • 要为大规模 Rancher 安装 etcd 集群,请参阅 etcd 设置指南 。
  1. 创建集群配置文件 cluster.yml 的方式有两种:
  • 使用 minimal cluster.yml 创建集群配置文件,然后将您使用的节点的相关信息添加到文件中。
  • 使用 rke config 命令 创建集群配置文件,然后将集群参数逐个输入到该文件中。
  1. 使用 rke config运行 rke config 命令,在当前路径下创建 cluster.yml 文件。这条命令会引导您输入创建集群所需的所有参数,详情请参考集群配置选项。查看支持的镜像列表

    [root@nginx locale]# rke config -s
    INFO[0000] Generating images list for version [v1.20.10-rancher1-1]:
    rancher/mirrored-coreos-etcd:v3.4.15-rancher1
    rancher/rke-tools:v0.1.78
    rancher/mirrored-k8s-dns-kube-dns:1.15.10
    rancher/mirrored-k8s-dns-dnsmasq-nanny:1.15.10
    rancher/mirrored-k8s-dns-sidecar:1.15.10
    rancher/mirrored-cluster-proportional-autoscaler:1.8.1
    rancher/mirrored-coredns-coredns:1.8.0
    rancher/mirrored-k8s-dns-node-cache:1.15.13
    rancher/hyperkube:v1.20.10-rancher1
    rancher/mirrored-coreos-flannel:v0.13.0
    rancher/flannel-cni:v0.3.0-rancher6
    rancher/mirrored-calico-node:v3.17.2
    rancher/mirrored-calico-cni:v3.17.2
    rancher/mirrored-calico-kube-controllers:v3.17.2
    rancher/mirrored-calico-ctl:v3.17.2
    rancher/mirrored-calico-pod2daemon-flexvol:v3.17.2
    rancher/coreos-flannel:v0.13.0-rancher1
    weaveworks/weave-kube:2.8.1
    weaveworks/weave-npc:2.8.1
    rancher/mirrored-pause:3.2
    rancher/nginx-ingress-controller:nginx-0.43.0-rancher3
    rancher/mirrored-nginx-ingress-controller-defaultbackend:1.5-rancher1
    rancher/mirrored-metrics-server:v0.4.1
    noiro/cnideploy:5.1.1.0.1ae238a
    noiro/aci-containers-host:5.1.1.0.1ae238a
    noiro/opflex:5.1.1.0.1ae238a
    noiro/openvswitch:5.1.1.0.1ae238a
    noiro/aci-containers-controller:5.1.1.0.1ae238a
    noiro/gbp-server:5.1.1.0.1ae238a
    noiro/opflex-server:5.1.1.0.1ae238a

    批量传到私有仓库中
    [root@nginx ~]$ for i in (cat images );do sudo docker push harbor.jettech.com/i; done

自己使用的

[root@nginx locale]# cat rancher-cluster.yml 
nodes:
  - address: 192.168.1.65
    internal_address: 192.168.1.65
    user: wubo
    role: [controlplane, worker, etcd]
    ssh_key_path: /home/wubo/.ssh/id_rsa
    port: 22
  - address: 172.16.10.59
    internal_address: 172.16.10.59
    user: wubo
    role: [controlplane, worker, etcd]
    ssh_key_path: /home/wubo/.ssh/id_rsa
    port: 22
  - address: 172.16.10.33
    internal_address: 172.16.10.33
    user: wubo
    role: [controlplane, worker, etcd]
    ssh_key_path: /home/wubo/.ssh/id_rsa
    port: 22

services:
  etcd:
    extra_args:
      auto-compaction-retention: 240 #(单位小时)
      quota-backend-bytes: '6442450944'
    backup_config:
      enabled: true         # 设置true启用ETCD自动备份,设置false禁用;
      interval_hours: 12    # 快照创建间隔时间,不加此参数,默认5分钟;
      retention: 6          # etcd备份保留份数;
    snapshot: true
    creation: 6h
    retention: 24h

ingress:
  provider: nginx
  options:
    use-forwarded-headers: "true"
  #hostnetwork: true

cluster_name: local
ignore_docker_version: true
prefix_path: /opt/rke
#kubernetes_version: v1.13.5-rancher1-2 #rke 0.2.2 https://github.com/rancher/rke/releases/tag/v1.1.0
#kubernetes_version: v1.17.4-rancher1-3 #rke 1.1.0
kubernetes_version: v1.20.10-rancher1-1 #rke 1.2.12

network:
  plugin: calico
  mtu: 0
  options:
    flannel_backend_type: vxlan

private_registries:
     - url: harbor.jettech.com
       user: admin
       password: Harbor12345
       is_default: true
  1. 证书

默认情况下,Kubernetes 集群需要用到证书,而 RKE 会自动为所有集群组件生成证书。我使用的是 RKE 自动生成的证书,则直接跳过此步骤。

您也可以使用 自定义证书 。部署集群后,您可以管理这些自动生成的证书,详情请参考 管理自动生成的证书 。

运行 RKE 部署 kubernetes 集群

[root@nginx locale]# rke up --config rancher-cluster.yml

INFO[0087] [remove/rke-log-cleaner] Successfully removed container on host [172.16.10.59] 
INFO[0087] [remove/rke-log-cleaner] Successfully removed container on host [192.168.1.65] 
INFO[0087] [sync] Syncing nodes Labels and Taints       
INFO[0087] [sync] Successfully synced nodes Labels and Taints 
INFO[0087] [network] Setting up network plugin: calico  
INFO[0087] [addons] Saving ConfigMap for addon rke-network-plugin to Kubernetes 
INFO[0087] [addons] Successfully saved ConfigMap for addon rke-network-plugin to Kubernetes 
INFO[0087] [addons] Executing deploy job rke-network-plugin 
INFO[0092] [addons] Setting up coredns                  
INFO[0092] [addons] Saving ConfigMap for addon rke-coredns-addon to Kubernetes 
INFO[0092] [addons] Successfully saved ConfigMap for addon rke-coredns-addon to Kubernetes 
INFO[0092] [addons] Executing deploy job rke-coredns-addon 
INFO[0097] [addons] CoreDNS deployed successfully       
INFO[0097] [dns] DNS provider coredns deployed successfully 
INFO[0097] [addons] Setting up Metrics Server           
INFO[0097] [addons] Saving ConfigMap for addon rke-metrics-addon to Kubernetes 
INFO[0097] [addons] Successfully saved ConfigMap for addon rke-metrics-addon to Kubernetes 
INFO[0097] [addons] Executing deploy job rke-metrics-addon 
INFO[0102] [addons] Metrics Server deployed successfully 
INFO[0102] [ingress] Setting up nginx ingress controller 
INFO[0102] [ingress] removing admission batch jobs if they exist 
INFO[0102] [addons] Saving ConfigMap for addon rke-ingress-controller to Kubernetes 
INFO[0102] [addons] Successfully saved ConfigMap for addon rke-ingress-controller to Kubernetes 
INFO[0102] [addons] Executing deploy job rke-ingress-controller 
INFO[0107] [ingress] ingress controller nginx deployed successfully 
INFO[0107] [addons] Setting up user addons              
INFO[0107] [addons] no user addons defined              
INFO[0107] Finished building Kubernetes cluster successfully 

在创建 Kubernetes 集群的过程中,会创建一个 kubeconfig 文件,它的文件名称是kube_config_cluster.yml,您可以使用它控制 Kubernetes 集群。

有问题重新执行前先清理一下

在三台 k8s 主机上用 root 权限执行下面命令:

# 防火墙规则清理
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -F# 容器清理
docker system prune -f
docker stop $(docker ps -aq)
docker rm -f $(docker ps -aq)
docker volume rm $(docker volume ls -q)
docker image rm $(docker image ls -q)
rm -rf /etc/ceph \/etc/cni \/etc/kubernetes \/opt/cni \/opt/rke \/run/secrets/kubernetes.io \/run/calico \/run/flannel \/var/lib/calico \/var/lib/etcd \/var/lib/cni \/var/lib/kubelet \/var/lib/rancher/rke/log \/var/log/containers \/var/log/pods \/var/run/calico# 重启服务
systemctl restart docker

六 操作 kubernetes 集群

  1. 安装 kubectl(kubernetes 命令行工具)

    [root@nginx locale]# kubectl version
    Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.6", GitCommit:"8a62859e515889f07e3e3be6a1080413f17cf2c3", GitTreeState:"clean", BuildDate:"2021-04-15T03:28:42Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
    Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kube-ca")

  2. kubeconfig 文件

2.1 让 kuser(和 root)用户运行 kubectl 命令

root@nginx locale]# cp kube_config_rancher-cluster.yml ~/.kube/config

2.2 使用 kubectl 测试集群节点连通性

[root@nginx locale]# kubectl get nodes
NAME           STATUS   ROLES                      AGE    VERSION
172.16.10.33   Ready    controlplane,etcd,worker   8m5s   v1.20.10
172.16.10.59   Ready    controlplane,etcd,worker   8m5s   v1.20.10
192.168.1.65   Ready    controlplane,etcd,worker   8m5s   v1.20.10

2.3 检查集群 Pod 的运行状况

[root@nginx locale]# kubectl get all -A  

[root@nginx locale]# kubectl get pods -A
NAMESPACE       NAME                                      READY   STATUS      RESTARTS   AGE
ingress-nginx   default-http-backend-565f86f5f9-jql8c     1/1     Running     0          8m7s
ingress-nginx   nginx-ingress-controller-ccwts            1/1     Running     0          8m7s
ingress-nginx   nginx-ingress-controller-f9vh7            1/1     Running     0          8m7s
ingress-nginx   nginx-ingress-controller-jkzp4            1/1     Running     0          8m7s
kube-system     calico-kube-controllers-b486cd75d-xxfwm   1/1     Running     0          8m21s
kube-system     calico-node-2pnfm                         1/1     Running     0          8m20s
kube-system     calico-node-fb9wn                         1/1     Running     0          8m20s
kube-system     calico-node-pfzj8                         1/1     Running     0          8m20s
kube-system     coredns-56fdbbcdfc-m2gs2                  1/1     Running     0          8m17s
kube-system     coredns-56fdbbcdfc-zgvkx                  1/1     Running     0          7m43s
kube-system     coredns-autoscaler-5c64bb75c8-6g6g6       1/1     Running     0          8m16s
kube-system     metrics-server-6b697547fc-xv7xm           1/1     Running     0          8m12s
kube-system     rke-coredns-addon-deploy-job-kmpgw        0/1     Completed   0          8m18s
kube-system     rke-ingress-controller-deploy-job-78db7   0/1     Completed   0          8m8s
kube-system     rke-metrics-addon-deploy-job-zg6tz        0/1     Completed   0          8m13s
kube-system     rke-network-plugin-deploy-job-wjt6m       0/1     Completed   0          8m23s

2.4 扩展 - 其余相关操作

若有以下相关操作,可参考官方文档链接:

  • 管理 kubrnetes 证书
  • 添加或移除节点

七 安装 Helm(Kubernetes 的软件包管理工具)

  • 在 nginx 主机上安装 helm

  • helm 官方参考文档

  • 下载需要的版本

    wget http://rancher-mirror.cnrancher.com/helm/v3.6.3/helm-v3.6.3-linux-amd64.tar.gz
    
    mv linux-amd64/helm  /usr/local/bin/
    
    [root@nginx locale]# helm version
    version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"clean", GoVersion:"go1.16.5"}
    

八 安装 Rancher Helm Chart

Rancher 使用 Kubernetes 的 Helm 软件包管理器安装。Helm Charts 为 Kubernetes YAML 清单文档提供了模板语法。

有了 Helm,我们可以创建可配置的 Deployment,而不只是使用静态文件。

  • 对于无法直接访问 Internet 的系统,请参阅 Rancher 离线安装 。
  • 选择要安装的 Rancher 版本,请参阅 选择 Rancher 版本 。
  • 要选择用于安装 Rancher 的 Helm 版本,请参阅 Helm 版本要求 。

1 Helm Chart 仓库

Rancher 提供了几种不同的 Helm Chart 仓库供您选择。最新版或稳定版的 Rancher Helm Chart 与用于 Docker 安装的 Rancher 的 Docker 镜像标签对应。因此,rancher-latest 仓库包含被标记为 rancher/rancher:latest 的版本。当 Rancher 版本升级到 rancher/rancher:stable 后,它将被添加到 rancher-stable 仓库中。

类别 添加仓库命令 仓库描述
rancher-latest helm repo add rancher-latest https://releases.rancher.com/server-charts/latest 添加最新版本的 Rancher 的 Helm Chart 仓库。我们建议使用此仓库来测试新版本的 Rancher。
rancher-stable helm repo add rancher-stable https://releases.rancher.com/server-charts/stable 添加较旧的,稳定的版本的 Rancher 的 Helm Chart 仓库。我们建议将此仓库用于生产环境。
rancher-alpha helm repo add rancher-alpha https://releases.rancher.com/server-charts/alpha 添加 alpha 版本的 Rancher 的 Helm Chart 仓库,以预览即将发布的版本. 不建议在生产环境中使用这些版本。我们不支持从 rancher alpha 仓库中的 chart 升级到任何其他版本 chart。

注 意 : rancher-latest 和 rancher-stable Helm Chart 仓库是在 Rancher v2.1.0 后引入的,因此 rancher-stable 仓库包含一些从来没有被标记为 rancher/rancher:stable 标签的 Rancher 版本。在 v2.1.0 之前标记为 rancher/rancher:stable 的 Rancher 版本是 v2.0.4,v2.0.6,v2.0.8。在 v2.1.0 版本之后,rancher-stable 仓库中的所有 charts 将与标记为 stable 的 Rancher 版本对应。

Rancher Helm Chart 版本必须匹配 Rancher 版本(即 appVersion)。

2 添加 Helm Chart 仓库

高可用安装指南 | Rancher文档

使用 helm repo add 命令添加含有 Rancher Chart 的 Helm Chart 仓库。

请将命令中的 <CHART_REPO>,替换为 latest,stable 或 alpha。更多信息,请查看选择 Rancher 版本来选择最适合您的仓库。

3 关于证书

Rancher Server 在默认情况下被设计为安全的,并且需要 SSL/TLS 配置。对于才接触 Rancher 的用户,很多都是卡在了证书的配置上。其实 Rancher 的证书配置非常简单,一共分为以下三种:

  • Rancher 生成的 TLS 证书: 在这种情况下,你需要在集群中安装 cert-manager。 Rancher 利用 cert-manager 签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后 cert-manager 负责管理该证书。
  • Let's Encrypt: Let's Encrypt 选项也需要使用 cert-manager。但是,在这种情况下,cert-manager 与 Let's Encrypt 的特殊颁发者相结合,该颁发者执行获取 Let's Encrypt 颁发的证书所需的所有操作(包括请求和验证)。此配置使用 HTTP 验证(HTTP-01),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。
  • 使用你已有的证书: 此选项使你可以使用自己的权威 CA 颁发的证书或自签名 CA 证书。 Rancher 将使用该证书来保护 WebSocket 和 HTTPS 流量。在这种情况下,你必须上传名称分别为tls.crttls.key的 PEM 格式的证书以及相关的密钥。如果使用私有 CA,则还必须上传该 CA 证书。这是由于你的节点可能不信任此私有 CA。 Rancher 将获取该 CA 证书,并从中生成一个校验和,各种 Rancher 组件将使用该校验和来验证其与 Rancher 的连接。
    • 自签名证书
    • 颁发机构颁发的证书

同时,还支持在 Rancher 外部(通常是指外部的负载均衡器)终止 SSL/TLS,也就是将证书放到 Rancher 外部的负载均衡器上。

注意: 如果要在外部终止 SSL/TLS,请参阅在外部负载均衡器上终止 TLS

设置 Chart 选项 描述 是否需要 cert-manager
Rancher 生成的证书(默认) ingress.tls.source=rancher 使用 Rancher 生成的 CA 签发的自签名证书此项为默认选项
Let's Encrypt ingress.tls.source=letsEncrypt 使用Let's Encrypt颁发的证书
你已有的证书 ingress.tls.source=secret 使用你的自己的证书(Kubernetes 密文)
重要

Rancher 中国技术支持团队建议你使用"你已有的证书" ingress.tls.source=secret 这种方式,从而减少对 cert-manager 的运维成本。

离线环境可用的 Helm Chart 选项#

Chart 选项 描述
certmanager.version "" 根据运行的 cert-manager 版本配置适当的 Rancher TLS 颁发者。
systemDefaultRegistry <REGISTRY.YOURDOMAIN.COM:PORT> 配置 Rancher,在创建集群时,Rancher Server 始终从私有镜像仓库中拉取镜像
useBundledSystemChart true 配置 Rancher Server 使用内置的 system-chart,system-chart中包含监控,日志,告警和全局 DNS 等功能所需的 Chart。这些 Helm charts 位于 GitHub 中,但是由于您处于离线环境中,因此使用 Rancher 中内置的 Chart 比设置一个 Git 镜像简单得多

3. 渲染您的 Rancher Helm 模板

选项 A - 使用 自签名证书且外部TLS方式。本文介绍如何使用**-外部 LB 终止 SSL/TLS 来安装高可用的 Rancher**,更多安装方式,可参考官网文档 12

3.1 创建自签名证书

1)可通过镜像快速生成自签名证书:参考nginx,ssl,证书和校验-CSDN博客

2)可通过镜像快速生成自签名证书:

docker run --rm -v /root/cert:/opt/certs kingsd/generate-cert:v0.1 --ssl-domain=jettoui.jettech.com

Rancher Helm Chart 选项 | Rancher

rancher 2.4.5 · helm/rancher-stable

3.2 使用外部 LB 终止 SSL/TLS 搭建高可用 Rancher
1)外部 TLS 终止

我们建议将负载均衡器配置为 4 层均衡,将普通 80/tcp 和 443/tcp 转发到 Rancher Management 集群节点。集群上的 Ingress Controller 会将端口 80 上的 HTTP 流量重定向到端口 443 上的 HTTPS。

你可以在 Rancher 集群(Ingress)外部的 L7 负载均衡器上终止 SSL/TLS。使用 --set tls=external 选项,将负载均衡器指向所有 Rancher 集群节点上的端口 HTTP 80。这将在 HTTP 端口 80 上暴露 Rancher 接口。请注意,允许直接连接到 Rancher 集群的客户端不会被加密。如果你选择这样做,我们建议你将网络级别的直接访问限制为仅你的负载均衡器。

如果你使用的是私有 CA 签名的证书,请添加 --set privateCA=true 并参见添加 TLS 密文 - 使用私有 CA 签名证书,为 Rancher 添加 CA 证书

你的负载均衡器必须支持长期存在的 Websocket 连接,并且需要插入代理头,以便 Rancher 可以正确传送链接。

[root@nginx cert]# helm install  rancher rancher-stable/rancher --create-namespace  --namespace cattle-system --set hostname=jetto.jettech.com --set bootstrapPassword=123456aA --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set tls=external  --set replicas=3 --set privateCA=true --set systemDefaultRegistry=harbor.jettech.com --set useBundledSystemChart=true




[root@nginx locale]#
kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ "\n" }}'
123456aA

说明:

  • tls=external: 在 Rancher 集群(Ingress)外部的负载均衡器上终止 SSL/TLS
  • hostname:访问 rancher 所需的域名,需要在 dns 中将域名和 nginx 的主机进行映射
  • replicas: replicas 设置 rancher 的副本数为 3,默认是 3
  • privateCA=CA:如果你使用的是私有 CA 签名的证书,请添加 --set privateCA=true
  • systemDefaultRegistry: 设置私有仓
  • rancherImage:镜像
  • rancherImageTag:镜像版本

常用选项

选项 默认值 描述
bootstrapPassword " " string - 为第一个管理员用户设置引导密码。登录后,管理员需要重置密码。如不设置,会使用随机生成的引导密码。
hostname " " string - 你的 Rancher Server 的完全限定的域名(FQDN)
ingress.tls.source "rancher" string - 从哪里获取 Ingress 的证书- "rancher, letsEncrypt, secret"
letsEncrypt.email " " string - 你的邮箱地址
letsEncrypt.environment "production" string - 可选项:"staging, production"
privateCA false bool - 如果你的证书是由私有 CA 签发的,把这个值设置为 true

|----------|-------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| addLocal | false | 默认情况下,Rancher Server 将检测并导入正在运行的 local 集群。有权访问 local 集群的用户具有对 Rancher Server 管理的所有集群的 root 访问权限。Chart 安装选项 | Rancher文档 |

高级选项

选项 默认值 描述
additionalTrustedCAs false bool - 请参见额外的授信 CA
addLocal "true" string - 让 Rancher 检测并导入 "local" Rancher Server 集群。注意:此选项在 2.5.0 中已不可用。你可考虑使用 restrictedAdmin 选项,来避免用户修改本地集群。
antiAffinity "preferred" string - Rancher Pod 的反亲和性规则 - "preferred, required"
auditLog.destination "sidecar" string - 发送审计日志到 Sidecar 容器的控制台或 hostPath 卷 - "sidecar, hostPath"
auditLog.hostPath "/var/log/rancher/audit" string - 主机上的日志文件目标地址(仅当auditLog.destination 的值是 hostPath 时生效)
auditLog.level 0 int - 设置 API 审计日志等级。0 代表关闭。[0-3]
auditLog.maxAge 1 int - 旧审计日志文件最多可保留的天数(仅当auditLog.destination 的值是 hostPath 时生效)
auditLog.maxBackup 1 int - 审计文件最大可保留的个数(仅当 auditLog.destination 的值是 hostPath 时生效)
auditLog.maxSize 100 int - 在审计日志被轮换前的最大容量,单位是 MB(仅当 auditLog.destination 的值是 hostPath 时生效)
auditLog.image.repository "registry.suse.com/bci/bci-micro" string - 用于收集审计日志的镜像的位置。
auditLog.image.tag "15.4.14.3" string - 用于收集审计日志的镜像的标签。
auditLog.image.pullPolicy "IfNotPresent" string - 覆盖 auditLog 镜像的 imagePullPolicy - "Always"、"Never"、"IfNotPresent"。
busyboxImage "" string - 用于收集审计日志的 busybox 镜像位置。注意:此选项已弃用,请使用 auditLog.image.repository 来控制审计 sidecar 镜像
certmanager.version "" string - 设置 cert-manager compatibility
debug false bool - 在 Rancher Server 设置 debug 参数
extraEnv [] list - 为 Rancher 额外设置环境变量
imagePullSecrets [] list - 私有镜像仓库凭证的密文名称列表
ingress.configurationSnippet "" string - 添加额外的 Nginx 配置。可用于代理配置。
ingress.extraAnnotations {} map - 用于自定义 Ingress 的额外注释
ingress.enabled true 如果值为 false,Helm 不会安装 Rancher Ingress。你可把值设为 false 以部署你自己的 Ingress。
letsEncrypt.ingress.class "" string - cert-manager acmesolver ingress 的可选 ingress 类,用于响应 Let's Encrypt ACME 质询。选项:traefik,nginx。
noProxy "127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local,cattle-system.svc" string - 不使用代理的主机名或 IP 地址的逗号分隔列表
proxy "" string - 给 Rancher 配置的 HTTP[S] 代理
rancherImage "rancher/rancher" string - Rancher 镜像源
rancherImagePullPolicy "IfNotPresent" string - 覆盖 Rancher Server 镜像的 imagePullPolicy - "Always", "Never", "IfNotPresent"
rancherImageTag 和 Chart 版本一致 string - rancher/rancher 镜像标签
replicas 3 int - Rancher Server 副本数。如果设为 -1,会根据集群中的可用节点数自动选择 1,2或3。
resources {} map - Rancher Pod 资源请求和限制
restrictedAdmin false bool - 如果值为 true,初始的 Rancher 用户访问本地 Kubernetes 集群会受到限制,以避免权限升级。详情请参见 restricted-admin 角色
systemDefaultRegistry "" string - 用于所有系统容器镜像的私有仓库,例如 http://registry.example.com/
tls "ingress" string - 详情请参见外部 TLS 终止。- "ingress, external"
useBundledSystemChart false 配置 Rancher Server 使用内置的 system-chart,system-chart中包含监控,日志,告警和全局 DNS 等功能所需的 Chart。这些 Helm charts 位于 GitHub 中,但是由于您处于离线环境中,因此使用 Rancher 中内置的 Chart 比设置一个 Git 镜像简单得多
global.cattle.psp.enabled true bool - 使用 Rancher v2.7.2-v2.7.4 时,选择 false 以禁用 Kubernetes v1.25 及更高版本的 PSP。使用 Rancher v2.7.5 及更高版本时,Rancher 会尝试检测集群是否运行不支持 PSP 的 Kubernetes 版本,如果确定集群不支持 PSP,则将默认 PSP 的使用设置为 false。你仍然可以通过显式提供此值的 truefalse 来手动覆盖此值。在支持 PSP 的集群中(例如使用 Kubernetes v1.24 或更低版本的集群),Rancher 仍将默认使用 PSP。

高可用安装 | Rancher文档

[root@nginx cert]# kubectl get pods -n  cattle-system
NAME                       READY   STATUS              RESTARTS   AGE
rancher-78747dbb68-598db   0/1     ContainerCreating   0          6m
rancher-78747dbb68-726b9   0/1     ContainerCreating   0          6m
rancher-78747dbb68-d5kzh   0/1     ContainerCreating   0          6m
[root@nginx cert]# kubectl describe pods rancher-78747dbb68-598db -n  cattle-system 
Name:                 rancher-78747dbb68-598db
Namespace:            cattle-system
Priority:             1000000000
Priority Class Name:  rancher-critical
Node:                 172.16.10.59/172.16.10.59
Start Time:           Tue, 02 Jan 2024 17:38:02 +0800
Labels:               app=rancher
                      pod-template-hash=78747dbb68
                      release=rancher
Annotations:          <none>
Status:               Pending
IP:                   
IPs:                  <none>
Controlled By:        ReplicaSet/rancher-78747dbb68
Containers:
  rancher:
    Container ID:  
    Image:         harbor.jettech.com/rancher/rancher:v2.5.8
    Image ID:      
    Port:          80/TCP
    Host Port:     0/TCP
    Args:
      --http-listen-port=80
      --https-listen-port=443
      --add-local=true
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Liveness:       http-get http://:80/healthz delay=60s timeout=1s period=30s #success=1 #failure=3
    Readiness:      http-get http://:80/healthz delay=5s timeout=1s period=30s #success=1 #failure=3
    Environment:
      CATTLE_NAMESPACE:                cattle-system
      CATTLE_PEER_SERVICE:             rancher
      CATTLE_SYSTEM_DEFAULT_REGISTRY:  harbor.jettech.com
    Mounts:
      /etc/rancher/ssl/cacerts.pem from tls-ca-volume (ro,path="cacerts.pem")
      /var/run/secrets/kubernetes.io/serviceaccount from rancher-token-wgjr8 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  tls-ca-volume:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  tls-ca
    Optional:    false
  rancher-token-wgjr8:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  rancher-token-wgjr8
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     cattle.io/os=linux:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason       Age                   From               Message
  ----     ------       ----                  ----               -------
  Normal   Scheduled    6m1s                  default-scheduler  Successfully assigned cattle-system/rancher-78747dbb68-598db to 172.16.10.59
  Warning  FailedMount  3m58s                 kubelet            Unable to attach or mount volumes: unmounted volumes=[tls-ca-volume], unattached volumes=[tls-ca-volume rancher-token-wgjr8]: timed out waiting for the condition
  Warning  FailedMount  111s (x10 over 6m1s)  kubelet            MountVolume.SetUp failed for volume "tls-ca-volume" : secret "tls-ca" not found
  Warning  FailedMount  102s                  kubelet            Unable to attach or mount volumes: unmounted volumes=[tls-ca-volume], unattached volumes=[rancher-token-wgjr8 tls-ca-volume]: timed out waiting for the condition
2) 发现没有私有证书问题,删除rancher,创建证书
[root@nginx cert]# helm  -n  cattle-system  ls
NAME   	NAMESPACE    	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
rancher	cattle-system	1       	2024-01-02 17:38:01.961716845 +0800 CST	deployed	rancher-2.7.9	v2.7.9     
[root@nginx cert]# helm  -n  cattle-system  delete rancher

3)创建namespace和秘钥证书

[root@nginx ok]# kubectl create namespace cattle-system
namespace/cattle-system created
[root@nginx ok]# kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem=./cacerts.pem
secret/tls-ca created
[root@nginx ok]# kubectl get ns
NAME              STATUS   AGE
cattle-system     Active   9s
default           Active   16h
ingress-nginx     Active   16h
kube-node-lease   Active   16h
kube-public       Active   16h
kube-system       Active   16h
[root@nginx ok]# kubectl get secret -n cattle-system 
NAME                  TYPE                                  DATA   AGE
default-token-gwz5t   kubernetes.io/service-account-token   3      22s
tls-ca                Opaque                                1      17s
[root@nginx ok]# kubectl get secret -n cattle-system
  1. 再次执行

    [root@nginx cert]# helm install rancher rancher-stable/rancher --create-namespace --namespace cattle-system --set hostname=jetto.jettech.com --set bootstrapPassword=123456aA --set rancherImage=harbor.jettech.com/rancher/rancher --set rancherImageTag=v2.5.8 --set tls=external --set replicas=3 --set privateCA=true --set systemDefaultRegistry=harbor.jettech.com --set useBundledSystemChart=true

    [root@nginx locale]#
    kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ "\n" }}'
    123456aA

5)验证 Rancher Server 是否已成功部署

[root@nginx locale]# kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 2 of 3 updated replicas are available...
deployment "rancher" successfully rolled out
[root@nginx locale]# kubectl -n cattle-system rollout status deploy/rancher
[root@nginx locale]# kubectl -n cattle-system rollout status deploy/rancher
deployment "rancher" successfully rolled out

或
[root@nginx locale]# kubectl -n cattle-system get deploy rancher
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
rancher   3/3     3            3           2m27s



[root@nginx locale]# helm -n cattle-system ls -a
NAME           	NAMESPACE    	REVISION	UPDATED                                	STATUS  	CHART                  	APP VERSION
rancher        	cattle-system	1       	2024-01-03 09:44:58.663664777 +0800 CST	deployed	rancher-2.7.9          	v2.7.9     
rancher-webhook	cattle-system	1       	2024-01-03 01:46:00.056403121 +0000 UTC	deployed	rancher-webhook-0.1.000	0.1.0

4 安装 LB,使用 NGINX 为外部 TLS 配置 Ingress

对于实现,请考虑是否要使用 4 层或 7 层负载均衡器:

  • 4 层负载均衡器 是一种相对简单的负载均衡,它将 TCP 流量转发到你到节点。我们建议使用 4 层负载均衡器,将流量从 TCP / 80 端口和 TCP / 443 端口转发到 Rancher 管理服务器的集群节点上。集群上的 Ingress 控制器会将 HTTP 流量重定向到 HTTPS,并在 TCP / 443 端口上终止 SSL / TLS。Ingress 控制器会将流量转发到 Rancher Server Pod 的 TCP / 443 端口。

  • 7 层负载均衡器 是一种相对复杂的负载均衡,但功能更加全面。例如,与 Rancher 本身进行 TLS 终止相反,7 层负载均衡器能够在负载均衡器处处理 TLS 终止。如果要在基础设施中进行 TLS 终止,7 层负载均衡可能会很有用。7 层负载均衡还可以为你的负载均衡器提供基于 HTTP 属性(例如 cookie 等)做出决策的能力,而 4 层负载均衡器不提供这种功能。如果决定在 7 层负载均衡器上终止 SSL / TLS 流量,则在安装 Rancher 时(后续步骤)需要使用--set tls=external选项。有关更多信息,请参阅Rancher Helm Chart 选项

本案例使用的是7层,4层参考 https://blog.csdn.net/Michaelwubo/article/details/135357376?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135357376%22%2C%22source%22%3A%22Michaelwubo%22%7D

在 NGINX 中,NGINX 关于转发头和外部 TLS 终止的行为已更改。因此,如果你同时使用 NGINX 0.25 和外部 TLS 终止配置,你必须编辑 cluster.yml 来为 Ingress 启用 use-forwarded-headers 选项。

ingress:
  provider: nginx
  options:
    use-forwarded-headers: 'true'

必须的 Header

  • Host
  • X-Forwarded-Proto
  • X-Forwarded-Port
  • X-Forwarded-For

建议的超时时间

  • 读超时:1800 seconds
  • 写超时:1800 seconds
  • 连接超时:30 seconds

要在外部的负载均衡器终止 TLS 证书,需要将证书配置在外部的负载均衡器中。

官网

worker_processes 4;
worker_rlimit_nofile 40000;

events {
    worker_connections 8192;
}

http {
    upstream rancher {
        server IP_NODE_1:80;
        server IP_NODE_2:80;
        server IP_NODE_3:80;
    }

    map $http_upgrade $connection_upgrade {
        default Upgrade;
        ''      close;
    }

    server {
        listen 443 ssl http2;
        server_name FQDN;
        ssl_certificate /certs/fullchain.pem;
        ssl_certificate_key /certs/privkey.pem;

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://rancher;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            # 此项允许执行的 shell 窗口保持开启,最长可达15分钟。不使用此参数的话,默认1分钟后自动关闭。
            proxy_read_timeout 900s;
            proxy_buffering off;
        }
    }

    server {
        listen 80;
        server_name FQDN;
        return 301 https://$server_name$request_uri;
    }
}

本人的:

[root@nginx cert]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 4;
worker_rlimit_nofile 40000;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 10240;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    upstream rancher_servers_http {
        least_conn;
        server 192.168.1.65:80 max_fails=3 fail_timeout=5s;
        server 172.16.10.59:80 max_fails=3 fail_timeout=5s;
        server 172.16.10.33:80 max_fails=3 fail_timeout=5s;
    }
    upstream rancher_servers_https {
        least_conn;
        server 192.168.1.65:443 max_fails=3 fail_timeout=5s;
        server 172.16.10.59:443 max_fails=3 fail_timeout=5s;
        server 172.16.10.33:443 max_fails=3 fail_timeout=5s;
    }
    map $http_upgrade $connection_upgrade {
        default Upgrade;
        ''      close;
    }
    server {
        listen       80;
        listen       [::]:80;
        server_name  jetto.jettech.com;
        return 301 https://$server_name$request_uri;
        #location / {
	#	proxy_pass http://rancher_servers_http;
	#}
    }
    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  jetto.jettech.com;
        ssl_certificate "/home/wubo/rancher/cert/ok/tls.crt";
        ssl_certificate_key "/home/wubo/rancher/cert/ok/tls.key";
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    #proxy_pass http://rancher_servers_https;
	    proxy_pass http://rancher_servers_http;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            # 此项允许执行的 shell 窗口保持开启,最长可达15分钟。不使用此参数的话,默认1分钟后自动关闭。
            proxy_read_timeout 900s;
            proxy_buffering off;
	}
    }
}

效果图:

Rancher 高可用安装--使用外部 LB 终止 SSL/TLS - 权威教程 - Rancher 中文论坛

相关推荐
Code_Artist2 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
Eternal-Student2 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
码农小丘2 小时前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
灼烧的疯狂4 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11214 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
Python私教7 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
O&REO8 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy8 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文9 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻9 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes