使用 Helm CLI 在 Kubernetes 集群上部署 Rancher(离线安装)

1. 配置基础设施和私有镜像仓库

从 Rancher v2.5 开始,Rancher 可以安装在任何 Kubernetes 集群上。

1.1 RKE 高可用集群

在 RKE 集群中安装 Rancher 高可用,我们建议为高可用安装配置以下基础设施:

  • 3 个 Linux 节点,通常是虚拟机,您可以自行选择的基础设施提供商,例如 Amazon EC2、阿里云、腾讯云或者 vShpere。
  • 1 个负载均衡器,用于将流量转发到这三个节点。
  • 1 条 DNS 记录,用于将 URL 指向负载均衡器。这将成为 Rancher Server 的 URL,下游集群需要可以访问到这个地址。
  • 私有 Docker 镜像仓库,用于为您的节点分发 Docker 镜像。

你可以将这些服务器放在不同的可用区里,但这些节点必须位于相同的区域/数据中心。

为什么要三个节点?

在 RKE 集群中,Rancher Server 数据存储在 etcd 中。这个 etcd 数据库在所有三个节点上运行。

etcd 数据库需要奇数个节点,因此它始终可以选举出被大多数 etcd 节点认可的集群的领导者。如果 etcd 数据库无法选出领导者,则 etcd 可能会遭受脑裂的困扰,这时将需要从备份中恢复集群。如果三个 etcd 节点之一发生故障,则其余两个节点可以选择一个领导者,因为它们占 etcd 节点总数的大部分。

1.1.1 配置 Linux 节点

这些主机可以与 Internet 断开连接,但需要能够与你的私有镜像仓库连接。

确保你的节点满足 操作系统、容器运行时、硬件和网络的常规安装要求。

1.1.1.1 操作系统和容器运行时要求

Rancher 可以兼容当前任何流行的 Linux 发行版。

对于将运行 RKE Kubernetes 集群的节点需要安装 Docker。对于 RancherD 安装 和 RKE2 安装来说,Docker 不是必需的。

所有受支持的操作系统都是 64-bit x86。

为了防止在客户端和服务器之间因为时钟不同步而发生证书验证错误,建议您安装 ntp (Network Time Protocol)。

某些 Linux 发行版可能有默认的防火墙规则,阻止与 Helm 的通信。我们建议禁用 firewalld。对于 Kubernetes 1.19 和 1.20,Firewalld 必须被关闭。

  • RKE 要求

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

请注意,必须应用以下 sysctl 设置:

net.bridge.bridge-nf-call-iptables=1
  • 安装 Docker

您可以按照Docker 官方文档中的步骤安装 Docker。Rancher 也提供了使用命令安装 Docker 的脚本( https://docs.rancher.cn/docs/rancher2.5/installation/requirements/installing-docker/_index )。RancherD 安装 Rancher 不需要 Docker。

1.1.1.2 硬件要求

  • CPU 和 内存

硬件要求根据您的 Rancher 部署规模而定。请根据要求配置每个单独的节点。这些要求具体取决于您是通过单节点容器安装 Rancher,还是在 Kubernetes 集群上安装 Rancher。

  • RKE 和托管 Kubernetes

这些 CPU 和内存要求适用于安装 Rancher Server 的 Kubernetes 集群中的每个主机。

这些要求适用于 RKE Kubernetes 集群以及托管的 Kubernetes 集群,例如 EKS。

1.1.1.3 Ingress

Rancher 安装的 Kubernetes 集群中的每个节点都应该运行一个 Ingress。

Ingress 应被部署为 DaemonSet,以确保你的负载均衡器能够成功地将流量路由到所有节点。

对于 RKE、K3s 和 RancherD 的安装,你不需要手动安装 Ingress,因为它是默认安装的。

对于托管的 Kubernetes 集群(EKS、GKE、AKS)和 RKE2 Kubernetes 安装,你将需要设置 Ingress。

1.1.1.4 磁盘

Rancher 的性能取决于 etcd 在集群中的性能。为了确保最佳速度,我们建议使用 SSD 磁盘来支持 Rancher 管里面的 Kubernetes 集群。在云提供商上,您还需要使用允许最大 IOPS 的最小大小。在较大的集群中,请考虑使用专用存储设备存储 etcd 数据和 wal 目录。

1.1.1.5 网络要求

  • 节点 IP 地址

无论您是在单个节点上还是在 Kubernetes 集群上安装 Rancher,每个节点都应配置一个静态 IP。如果使用 DHCP,则每个节点应具有 DHCP 预留,以确保该节点分配的相同 IP 地址。

  • 端口要求

为了正常运行,Rancher 需要在 Rancher 节点和下游 Kubernetes 集群节点上开放一些端口。端口需求列出了不同集群类型的 Rancher 和下游集群的所有必要端口。详情请参考端口要求( https://docs.rancher.cn/docs/rancher2.5/installation/requirements/ports/_index

1.1.2 配置负载均衡器

你还需要设置一个负载均衡器,以将流量定向到全部节点上的 Rancher 副本。这样可以在某个节点不可用时,继续保障与 Rancher 管理服务器的连接。

在后续步骤中配置 Kubernetes 时,RKE 工具将部署 NGINX Ingress 控制器。该控制器将侦听 worker 节点的 80 端口和 443 端口,以响应发送给特定主机名的流量。

在安装 Rancher 时(也是在后续步骤中),Rancher 系统将创建一个 Ingress 资源。该 Ingress 通知 NGINX Ingress 控制器侦听发往 Rancher 主机名的流量。NGINX Ingress 控制器在收到发往 Rancher 主机名的流量时,会将其转发到集群中正在运行的 Rancher Server Pod。

对于实现,请考虑是否要使用 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 选项。

有关如何设置 NGINX 负载均衡器的示例,请参考本页( https://www.cnblogs.com/varden/p/15018587.html )。

重要提示:安装后,请勿使用 local 集群的 Ingress 对 Rancher 以外的应用进行负载均衡。与其他应用共享此 Ingress 可能会在其他应用的 Ingress 配置重新加载后,导致 Rancher 出现 websocket 错误。我们强烈建议将 local 集群专用于 Rancher,而不应在 local 集群内部署任何其他应用。

1.1.3 配置 DNS 记录

配置完负载均衡器后,你将需要创建 DNS 记录,以将流量发送到该负载均衡器。

根据你的环境,DNS 记录可以是指向负载均衡器 IP 的 A 记录,也可以是指向负载均衡器主机名的 CNAME。无论哪种情况,请确保该记录是你要 Rancher 进行响应的主机名。

在安装 Rancher 时(后续步骤),你需要指定此主机名,并且在以后也无法更改它。确保你的决定是最终决定。

1.1.4 配置私有 Docker 镜像仓库

Rancher 支持使用私有镜像仓库进行离线安装。你必须有自己的私有镜像仓库或使用其他方式将 Docker 镜像分发到节点。

如果你需要有关创建私有 Docker 镜像仓库的帮助,请参阅 官方 Docker 文档( https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry )。

2. 同步镜像到私有镜像仓库

参考:https://docs.rancher.cn/docs/rancher2.5/installation/other-installation-methods/air-gap/populate-private-registry/_index/

默认情况下,Rancher 中所有用于创建 Kubernetes 集群或启动 Rancher 中任何工具(如监控和日志)的镜像都来自 Docker Hub。在 Rancher 的离线安装中,你将需要一个私有镜像仓库,该镜像仓库位于你的 Rancher Server 可访问的某个位置。然后,你将在镜像仓库中加载所有的镜像。

对于创建仅有 Linux 节点的集群的 Rancher Server,请按以下步骤推送镜像到私有镜像库。

  1. 查找您用的 Rancher 版本所需要的资源 https://github.com/rancher/rancher/releases
  2. 搜集 cert-manager 镜像
  3. 将镜像保存到您的工作站中
  4. 推送镜像到私有镜像库

2.1 查找你用的 Rancher 版本所需要的资源

  1. 浏览我们的版本发布页面( https://github.com/rancher/rancher/releases ),查找你想安装的 Rancher v2.x.x 版本。不要下载标记为 rc 或 Pre-release 的版本,因为它们在生产环境下是不稳定的。

  2. 从发行版 Assets 部分下载以下文件,这些文件是离线环境下安装 Rancher 所必需的:

rancher-images.txt 此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。
rancher-save-images.sh 这个脚本会从 DockerHub 中拉取在文件rancher-images.txt中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz。
rancher-load-images.sh 这个脚本会载入文件rancher-images.tar.gz中的镜像,并将它们推送到您自己的私有镜像库。

2.2 收集 cert-manager 镜像

如果你使用自己的证书,或者要在外部负载均衡器上终止 TLS,请跳过此步骤。

在安装高可用过程中,如果选择使用 Rancher 默认的自签名 TLS 证书,则还必须将 cert-manager 镜像添加到 rancher-images.txt 文件中。如果使用自己的证书,则跳过此步骤。

  1. 获取最新的cert-manager Helm chart,解析模板并获取镜像详细信息:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v1.5.1
helm template ./cert-manager-<version>.tgz | awk '$1 ~ /image:/ {print $2}' | sed s/\"//g >> ./rancher-images.txt
  1. 对镜像列表进行排序和唯一化,去除重复的镜像源:
sort -u rancher-images.txt -o rancher-images.txt

2.3 将镜像保存到你的工作站中

  1. 为rancher-save-images.sh 文件添加可执行权限:
chmod +x rancher-save-images.sh
  1. 执行脚本rancher-save-images.sh并以--image-list ./rancher-images.txt 作为参数,创建所有需要镜像的压缩包:
./rancher-save-images.sh --image-list ./rancher-images.txt

提示:国内用户,可以从 http://mirror.rancher.cn --> rancher --> [rancher 版本] 下载 rancher-save-images.sh,该脚本支持通过参数 --from-aliyun true 来指定从阿里云镜像仓库拉去 rancher 镜像(从 rancher/rancher release 下载的 rancher-save-images.sh 不支持该参数),例如:

./rancher-save-images.sh --image-list ./rancher-images.txt --from-aliyun true
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/busybox
Image pull success: registry.cn-hangzhou.aliyuncs.com/rancher/backup-restore-operator:v1.0.4-rc4
...

结果: Docker 会开始拉取用于离线安装所需的镜像。这个过程会花费几分钟时间。完成时,你的当前目录会输出名为rancher-images.tar.gz的压缩包。请确认输出文件是否存在。

2.4 推送镜像到私有镜像库

下一步,你将使用脚本将文件 rancher-images.tar.gz 中的镜像上传到你自己的私有镜像库。

文件 rancher-images.txt 和 rancher-images.tar.gz 应该位于工作站中运行 rancher-load-images.sh 脚本的同一目录下。

  1. 登录私有镜像库:
docker login <REGISTRY.YOURDOMAIN.COM:PORT>
  1. 为 rancher-load-images.sh 添加可执行权限:
chmod +x rancher-load-images.sh
  1. 使用脚本 rancher-load-images.sh提取rancher-images.tar.gz文件中的镜像,根据文件rancher-images.txt中的镜像列表对提取的镜像文件重新打 tag 并推送到你的私有镜像库:
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <REGISTRY.YOURDOMAIN.COM:PORT>`

3. 部署 Kubernetes 集群(RKE)

从 Rancher v2.5 开始,Rancher 可以安装在任何 Kubernetes 集群上,包括托管的 Kubernetes。

我们将使用 Rancher Kubernetes Engine (RKE) 创建一个 Kubernetes 集群。在启动 Kubernetes 集群之前,你需要安装 RKE 并创建 RKE 配置文件。

3.1 安装 RKE

参考:https://www.cnblogs.com/varden/p/15988581.html

3.2 创建 RKE 配置文件

在可以访问你的 Linux 节点上的 22/tcp 端口和 6443/tcp 端口的系统上,使用以下示例创建一个名为 rancher-cluster.yml 的新文件。

该文件是 RKE 配置文件,其中包括了你将要部署的集群的配置。

使用你创建的 3 个节点的 IP 地址或 DNS 名称,替换下面的代码示例中的值。

提示:有关可用选项的更多详细信息,请参见 RKE 配置选项( https://www.cnblogs.com/varden/p/15992425.html )。

nodes:
  - address: 10.10.3.187 # 离线环境节点 IP
    internal_address: 172.31.7.22 # 节点内网 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /home/user/.ssh/id_rsa
  - address: 10.10.3.254 # 离线环境节点 IP
    internal_address: 172.31.13.132 # 节点内网 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /home/user/.ssh/id_rsa
  - address: 10.10.3.89 # 离线环境节点 IP
    internal_address: 172.31.3.216 # 节点内网 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /home/user/.ssh/id_rsa

private_registries:
  - url: <REGISTRY.YOURDOMAIN.COM:PORT> # 私有镜像库地址
    user: rancher
    password: "*********"
    is_default: true

3.3 执行 RKE

配置完rancher-cluster.yml之后,启动你的 Kubernetes 集群:

rke up --config ./rancher-cluster.yml

3.4 保存你的文件

重要: 以下文件需要保存好,可以用来故障排查和升级集群。

将以下文件的副本保存在安全的位置:

  • rancher-cluster.yml:RKE 配置文件
  • kube_config_cluster.yml:集群的 Kubeconfig 文件,该文件包含对集群的完全访问权限的凭据。
  • rancher-cluster.rkestate:Kubernetes 集群状态文件,该文件包含集群的当前状态,包括 RKE 配置和证书。

Kubernetes 集群状态文件仅在使用 RKE v0.2.0 或更高版本时创建。

后两个文件名的 rancher-cluster 部分取决于你如何命名 RKE 集群配置文件。

4. 高可用安装 Rancher

本节介绍如何在 Kubernetes 集群上安装高可用 Rancher,它可能处于防火墙之后或在代理之后。

开启特权模式

当 Rancher server 部署在 Docker 容器中时,容器内会安装一个本地 Kubernetes 集群供 Rancher 使用。因为 Rancher 的很多功能都是以 deployments 的方式运行的,而在容器内运行容器是需要特权模式的,所以你需要在安装 Rancher 时添加--privileged标签,开启特权模式。

4.1 添加 Helm Chart 仓库

从可以访问 Internet 的系统中,获取最新的 Rancher Helm Chart,然后将内容复制到可以访问 Rancher Server 集群的系统中。

  1. 如果您还没有在可以访问互联网的系统上安装 helm,请参考 Helm 版本要求来选择一个 Helm 版本来安装 Rancher。

  2. 使用 helm repo add 来添加仓库,不同的地址适应不同的 Rancher 版本,请替换命令中的<CHART_REPO>,替换为latest,stable或alpha。更多信息请参考如何选择 Rancher 版本。

  • latest: 最新版,建议在尝试新功能时使用。
  • stable:稳定版,建议生产环境中使用。
  • alpha:预览版, 未来版本的实验性预览。
helm repo add rancher-<CHART_REPO> https://releases.rancher.com/server-charts/<CHART_REPO>
  1. 获取最新的 Rancher Chart,您会看到对应的 tgz 文件下载到本地。
helm fetch rancher-<CHART_REPO>/rancher

如果需要下载特定版本 Rancher 的,你可以用--version参数指定版本,例如,以下代码示例通过--version=v2.4.8,指定下载 Rancher 的版本为 v2.4.8:

helm fetch rancher-stable/rancher --version=v2.4.8

4.2 选择您的 SSL 配置

Rancher Server 在默认情况下被设计为安全的,并且需要 SSL/TLS 配置。

当在离线环境的 Kubernetes 中安装 Rancher 时,推荐两种证书生成方式。

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

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

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

4.4 渲染您的 Rancher Helm 模板

根据您在选择您的 SSL 配置做出的选择,完成以下步骤之一。

选项 A - 使用 Rancher 默认的自签名证书

默认情况下,Rancher 会生成一个 CA 并使用 cert-manager 颁发证书以访问 Rancher Server 界面。

注意: 由于 cert-manager 最近的改动,您需要进行升级。如果您要升级 Rancher 并在使用版本低于 v0.11.0 的 cert-manager,请参阅我们的升级 cert-manager 文档( https://docs.rancher.cn/docs/rancher2.5/installation/resources/upgrading-cert-manager/_index )。

  1. 在可以连接互联网的系统中,添加 cert-manager 仓库。
helm repo add jetstack https://charts.jetstack.io
helm repo update
  1. 从 Helm Chart 仓库 中获取最新的 cert-manager Chart。
helm fetch jetstack/cert-manager --version v1.5.1
  1. 使用您期望的参数渲染 chart 模板,需要设置 image.repository 从私有镜像仓库中拉取 Chart。这将生成一个包含相关 YAML 的名为 cert-manager 的目录。
helm template cert-manager ./cert-manager-v1.5.1.tgz --output-dir . \
    --namespace cert-manager \
    --set image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-controller \
    --set webhook.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-webhook \
    --set cainjector.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-cainjector \
    --set startupapicheck.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-ctl
  1. 下载 cert-manager 所需的 CRD 文件。
curl -L -o cert-manager/cert-manager-crd.yaml https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.crds.yaml
  1. 渲染 Rancher 模板,声明您选择的选项。使用下面的参考表替换每个占位符。需要将 Rancher 配置为在由 Rancher 启动 Kubernetes 集群或 Rancher 工具时,使用私有镜像库。

  • RANCHER V2.5.8+
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
    --no-hooks \ # prevent files for Helm hooks from being generated
    --namespace cattle-system \
    --set hostname=<RANCHER.YOURDOMAIN.COM> \
    --set certmanager.version=<CERTMANAGER_VERSION> \
    --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
    --set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
    --set useBundledSystemChart=true # Use the packaged Rancher system charts

可选:要安装特定的 Rancher 版本,请设置 rancherImageTag 值,例如:--set rancherImageTag=v2.5.6

选项 B - 使用已有的证书

  1. 根据您已有的证书创建 Kubernetes 密文来提供 Rancher 使用。证书的 common name 需要与以下命令中的 hostname 选项匹配,否则 ingress controller 将无法为 Rancher 设置站点。

  2. 渲染 Rancher 模板,声明您选择的选项。使用下面表中的参考选项替换每个占位符。Rancher 需要配置为使用私有镜像库,以便配置任何 Rancher 启动的 Kubernetes 集群或 Rancher 工具。

  • RANCHER V2.5.8+
   helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
    --no-hooks \ # prevent files for Helm hooks from being generated
    --namespace cattle-system \
    --set hostname=<RANCHER.YOURDOMAIN.COM> \
    --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
    --set ingress.tls.source=secret \
    --set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
    --set useBundledSystemChart=true # Use the packaged Rancher system charts

如果您使用的是由私有 CA 签名的证书,则在 --set ingress.tls.source=secret 之后添加 --set privateCA=true:

   helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
    --no-hooks \ # prevent files for Helm hooks from being generated
    --namespace cattle-system \
    --set hostname=<RANCHER.YOURDOMAIN.COM> \
    --set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
    --set ingress.tls.source=secret \
    --set privateCA=true \
    --set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \ # Set a default private registry to be used in Rancher
    --set useBundledSystemChart=true # Use the packaged Rancher system charts

可选:要安装指定的 Rancher 版本,请设置rancherImageTag的值,例如:--set rancherImageTag = v2.3.6

然后请参考添加 TLS 密文发布证书文件,以便 Rancher 和 ingress controller 可以使用它们。

4.5 安装 Rancher

将以上配置完毕的内容复制到可以访问 Rancher Server 集群的系统中,准备妥当,完成最后的安装。

使用kubectl创建命名空间并安装配置好的 YAML。

如果您在选择您的 SSL 配置选择了使用 Rancher 默认的自签名证书,则安装 cert-manager。

安装 Cert-manager(仅限使用 Rancher 默认自签名证书)

如果您使用的是 Rancher 默认的自签名证书,请安装 cert-manager:

  1. 为 cert-manager 创建 namespace。
kubectl create namespace cert-manager
  1. 创建 cert-manager CRD。
kubectl apply -f cert-manager/cert-manager-crd.yaml

注意: 如果您在使用 Kubernetes v1.15 或更低的版本,您需要在kubectl apply命令中添加--validate=false。否则您将看到一个关于 cert-manager 的 CRD 资源中的x-kubernetes-preserve-unknown-fields字段的校验错误。这是由于 kubectl 执行资源验证的方式改变产生的良性错误。

  1. 启动 cert-manager。
kubectl apply -R -f ./cert-manager

4.6 使用 kubectl 安装 Rancher

kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher

说明: 如果您不打算发送遥测数据,请在初始登录时选择退出遥测。如果在离线安装的环境中让这个功能处于 active 状态,会导致无法成功打开 socket 的问题。

posted @ 2022-03-12 16:03  Varden  阅读(1877)  评论(0编辑  收藏  举报