安装 Rancher 的方式有两种:单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境,而且单节点安装和高可用集群安装之间不能进行数据迁移,所以推荐从一开始就使用高可用集群安装的方式安装 Rancher。
??建议将 Rancher Server 安装在高可用的 Kubernetes 集群上,主要是因为它可以保护 Rancher Server 的数据。在高可用安装中,负载均衡器充当客户端的单点入口,并在集群中的多台服务器之间分配网络流量,这有助于防止任何一台服务器成为单点故障。
????????不建议在单个 Docker 容器中安装 Rancher,因为如果该节点发生故障,则其他节点上将没有可用的集群数据副本,并且可能会丢失 Rancher Server 上的数据。
????????Rancher 需要安装在高可用的 RKE(Rancher Kubernetes Engine)Kubernetes 集群上,或高可用的 K3s (轻量级 Kubernetes) Kubernetes 集群。 RKE 和 K3s 都是经过完全认证的 Kubernetes 发行版。
????????在 RKE 安装中,集群数据将在集群中的三个 etcd 节点上进行复制,这是为了保障在一个 etcd 节点发生故障时,可以提供冗余和数据复制。
??使用 RKE Kubernetes 集群运行 Rancher Management Server 的架构:
?
我们建议您使用以下方案,配置您的负载均衡和 Ingress Controller:
在 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 |
更多信息可以转到官方链接查看。此处我仅列举了本人文档里试验总结的官方最新稳定版的相关信息:https://rancher.com/support-maintenance-terms/all-supported-versions/rancher-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 |
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
kubectl 可以比 kube-apiserver 高一个小版本,也可以低一个小版本。
例如:
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 |
将最新的经过验证的 Docker 版本更新为 20.10。
每一个 Kubernetes 版本支持的 Docker 版本都不同。
官方已在 NGINX 1.14 上进行了测试 NGINX 配置。
为了可以通过 SSH 访问每一个节点,RKE 要求每个节点上安装的是 OpenSSH 的版本是 OpenSSH 7.0+。
先配置 4 台最小化安装的主机,其中 3 台使用 RKE 配置 k8s 集群,然后在这个集群上配置高可用 Rancher。
??要在高可用性 RKE 集群上安装 Rancher 管理服务器,我们建议设置以下基础设施:
主机 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 负载均衡 |
注意:以下步骤,四台主机均要操作。
cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core) #若系统版本为7.7 7.8 7.9 均符合
测试环境中,为了方便将防火墙和 selinux 关闭;生产环境中,建议关闭 selinux,防火墙规则根据环境需要自定义即可。
#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
为了防止后续集群在客户端和服务器之间因为时钟不同步而发生验证错误。
yum install -y ntp #每台主机安装ntp服务
systemctl start ntpd #启动时钟同步服务
systemctl enable ntpd #设置开机启动
ntpq -p #查看时钟同步状态
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
????????说明时间已经同步。
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
SSH server 全系统配置文件,位于/etc/ssh/sshd_config
,该文件必须包含以下代码,允许 TCP 转发。
AllowTcpForwarding yes#重启sshd服务
systemctl restart sshd
#分别修改每条主机的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 上 不 可 以 操 作 。
#临时关闭
swapoff -a#永久关闭
进入/etc/fstab文件,注释掉swap分区的相关配置内容
?
由于 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
注 意 : 仅在 k8s 节点安装 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
4. 安装 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
5. 配置 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
6. 启动
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
注意:使用 rke 安装 kubernetes 时,不能以 root 用户执行,必须是一个普通用户才可以。
??在每个节点上创建 wubo 普通用户,并将其加入 docker 用户组中;把 nginx 主机当做主控机,其他主机的 wubo用户互信它的 wubo用户。
[root@nginx charts]# useradd -m wubo -G docker
echo 123456aA | passwd --stdin wubo
目前有 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
登录主机,打开浏览器,访问 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
注 意 :需 要 在 每 个 节 点 执 行
??kubernetes 集群组件需要在 Linux 发行版上的 Docker 中运行,只要是能安装和运行 docker 是 linux 发行版,都可以使用。
// 配置以下脚本
# 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
创建一个名为?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 config 命令
?创建集群配置文件,然后将集群参数逐个输入到该文件中。? ? ?2. 使用?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
3.?证书
??默认情况下,Kubernetes 集群需要用到证书,而 RKE 会自动为所有集群组件生成证书。我使用的是 RKE 自动生成的证书,则直接跳过此步骤。
??您也可以使用 自定义证书 。部署集群后,您可以管理这些自动生成的证书,详情请参考 管理自动生成的证书 。
[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
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?扩展 - 其余相关操作
若有以下相关操作,可参考官方文档链接:
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 使用 Kubernetes 的 Helm 软件包管理器安装。Helm Charts 为 Kubernetes YAML 清单文档提供了模板语法。
??有了 Helm,我们可以创建可配置的 Deployment,而不只是使用静态文件。
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)。
使用?helm repo add
?命令添加含有 Rancher Chart 的 Helm Chart 仓库。
??请将命令中的 <CHART_REPO>,替换为 latest,stable 或 alpha。更多信息,请查看选择 Rancher 版本来选择最适合您的仓库。
[root@nginx ~]$ helm repo list helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
[root@nginx ~]$ helm repo update
[root@nginx ~]$ helm repo list
NAME URL
rancher-stable https://releases.rancher.com/server-charts/stable
下载本地
[root@nginx ~]$ helm fetch rancher-stable/rancher --version=v2.5.8
Rancher Server 在默认情况下被设计为安全的,并且需要 SSL/TLS 配置。对于才接触 Rancher 的用户,很多都是卡在了证书的配置上。其实 Rancher 的证书配置非常简单,一共分为以下三种:
cert-manager
。 Rancher 利用?cert-manager
?签发并维护证书。Rancher 将生成自己的 CA 证书,并使用该 CA 签署证书。然后?cert-manager
?负责管理该证书。cert-manager
。但是,在这种情况下,cert-manager 与 Let's Encrypt 的特殊颁发者相结合,该颁发者执行获取 Let's Encrypt 颁发的证书所需的所有操作(包括请求和验证)。此配置使用 HTTP 验证(HTTP-01
),因此负载均衡器必须具有可以从公网访问的公共 DNS 记录。tls.crt
和tls.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 的运维成本。
Rancher 中国技术支持团队建议您使用 “已有的证书”?ingress.tls.source=secret
?这种方式,从而减少对 cert-manager 的运维成本。
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.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 2.4.5 · helm/rancher-stable?
我们建议将负载均衡器配置为 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 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
说明:
[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
发现没有私有证书问题,删除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
在 NGINX 0.25 中,NGINX 关于转发头和外部 TLS 终止的行为已更改。因此,如果你同时使用 NGINX 0.25 和外部 TLS 终止配置,你必须编辑?cluster.yml
?来为 Ingress 启用?use-forwarded-headers
?选项。
ingress:
provider: nginx
options:
use-forwarded-headers: 'true'
Host
X-Forwarded-Proto
X-Forwarded-Port
X-Forwarded-For
1800 seconds
1800 seconds
30 seconds
?
[root@nginx cert]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
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;
proxy_read_timeout 900s;
proxy_buffering off;
}
}
}