Rancher 是为使用容器的公司打造的容器管理平台。Rancher 简化了使用 Kubernetes 的流程,方便开发者可以随处运行 Kubernetes(Run Kubernetes Everywhere),以便于满足 IT 需求规范,赋能 DevOps 团队。
当然 Rancher 2.x 已经完全转向了 Kubernetes。Rancher 2.x 可以部署和管理在任何地方运行的 Kubernetes 集群。
Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,自动创建节点并安装 Kubernetes 集群,或者导入任何已经存在的 Kubernetes 集群。
Rancher 通过支持集群的身份验证和基于角色的访问控制(RBAC),使系统管理员能够从一个位置控制全部集群的访问。Rancher 可以对集群及其资源进行详细的监控和并在需要时发送告警,也可以将容器日志发送给外部日志系统,并通过应用商店与 Helm 集成。
若具有外部 CI/CD 流水线系统,则可以将其与 Rancher 对接,如果没有,Rancher 也提供了简单易用的流水线实现自动部署和升级工作负载。除此之外,Rancher 还有很多开箱即用的功能用于更好的管理集群和业务应用,例如多集群应用,全局 DNS,服务网格,安全扫描,集群模版和基于 OPA 的策略管理等功能。
综上所述,Rancher 是一个全栈式的 Kubernetes 容器管理平台,也是一个可以在任何地方都能成功运行 Kubernetes 的工具。
参考:https://docs.rancher.cn/rancher2x/#_1-what-s-rancher?
https://rancher2.docs.rancher.cn/docs/overview/_index
Rancher API Server 是基于嵌入式 Kubernetes API Server 和 ETCD 数据库建立的,它提供了以下功能:
Rancher Server 由认证代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 节点和集群 Agent(Cluster Agent) 组成。除了集群 Agent 以外,其他组件都部署在 Rancher Server 中。
如上图所示用户通过 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和托管的 Kubernetes 集群的(EKS)集群的流程。以用户下发指令为例,指令的流动路径如下:
如果 Rancher Server 出现问题,我们也提供了备用方案,可以通过授权集群端点管理集群。
提示:考虑到性能和安全因素,通常建议使用两个 Kubernetes 集群,分开用于部署 Rancher Server 和生产环境。部署 Rancher Server 后,可以创建或导入集群,然后使用Rancher Server创建用于生产的 Kubernetes 集群。
提示:可以在单个节点或高可用的 Kubernetes 集群上安装 Rancher。由于单节点安装只适用于开发和测试环境,而且单节点和高可用集群之间无法进行数据迁移,所以建议从一开始就使用高可用的 Kubernetes 集群来部署 Rancher Server,而且需要分开部署运行 Rancher Server 的集群和运行业务的生产 Kubernetes 集群。
参考:https://docs.rancher.cn/rancher2x/infrastructure/
https://rancher2.docs.rancher.cn/docs/overview/architecture/_index
如下图示例,通过两个用户 Bob 和 Alice,理解 Rancher 启动和管理下游集群的具体过程,以及每个 Rancher 组件的作用。
该示例涉及集群控制器、集群 Agent 和 Node Agent等组件。
如上视图中 Bob 的用户希望查看下游集群“User Cluster 1”里面正在运行的 pod。Bob 发起的请求会首先经过认证代理,通过认证之后,Rancher 的 认证代理才会把 API 调用命令转发到下游集群。
认证代理集成了多种认证方式,如本地认证、活动目录认证、GitHub 认证等。在发起每一个 Kubernetes API 调用请求的时候,认证代理会去确认请求方的身份,在转发调用命令前,请设置正确的 Kubernetes impersonation 的消息头。
Rancher 使用 Service Account (Service Accout 提供了一种方便的认证机制)和 Kubernetes 进行交互。
默认状态下,Rancher 生成一个包含认证信息的kubeconfig文件,为 Rancher Server 和下游集群的 Kubernetes API Server 之间的通信提供认证。该文件包含了访问集群的所有权限。
每一个下游集群都有一个集群 Agent 保持下游集群的集群控制器与 Rancher Server 之间的信息畅通。
集群控制器具有以下功能:
提示:默认状态下,集群控制器连接 Agent,Rancher 才可以与下游集群通信。如果集群 Agent 不可用,集群控制器可以连接到Node Agent,通过Node Agent 实现用户和集群之间的通信。
集群 Agent,也叫做“cattle-cluster-agent”,是在下游集群中运行的组件,它具有以下功能:
如果集群 Agent 不可用,下游集群中的其中一个节点 Agent 会创建一个通信管道,由节点 Agent 连接到集群控制器,实现下游集群和 Rancher 之间的通信。
部署节点 Agent 的方式有很多,通常建议使用DaemonSet部署节点 Agent ,这种方式可以确保下游集群内每个节点都成功运行节点 Agent。执行集群操作时,可以使用这种方式将指令下发到下游集群。集群操作包括:升级 Kubernetes 版本、创建 etcd 节点备份和恢复 etcd 节点。
Rancher Server 和下游集群之间有明显的延迟,或 Rancher Server 不可用时,用户可以通过授权集群端点连接下游集群,实现 Rancher Server 和集群之间的通信,降低网络延迟。
需要注意的是,只有 Rancher 部署的 Kubernetes 集群(RKE 集群)可以使用授权集群端点这个功能。其他类型的集群,如导入的集群、托管的集群等,并不能够使用此功能。
kube-api-auth 微服务向授权集群端点提供了用户认证功能。使用 kubectl 访问下游集群时,集群的 Kubernetes API Server 通过 kube-api-auth 对用户进行认证。
与授权集群端点类似, kube-api-auth 认证功能只在 Rancher 部署的 Kubernetes 集群(RKE 集群)中有效。
使用场景举例:假设 Rancher Server 位于美国,用户“Alice”和她管理的下游集群“User Cluster 1”位于澳大利亚。虽然 Alice 可以使用 Rancher 控制台管理 User Cluster 1 中的资源,但是她发出的请求要从澳大利亚发送到美国的 Server 端,然后再由 Server 代理回澳大利亚的集群端,澳大利亚集群端处理完请求后,再返回给美国的 Server 端,最后才能返回给澳大利亚的“Alice”。因为美澳之间的距离非常遥远,所以发送的请求和返回的请求结果都会存在显著的延迟。Alice 可以使用授权集群端点,降低延迟,更好地掌控她的下游集群。
为下游集群开启授权集群端点后,Rancher 会在“kubeconfig”文件中额外生成一段 Kubernetes context,来允许用户直接连接到集群。kubeconfig 这个文件中含有 kubectl 和 helm 的认证信息。
如果 Rancher 出现问题,无法连接,需要使用 kubeconfig 中的 context 帮助访问集群。因此,建议导出一份 kubeconfig 文件副本,保存到本地,以备不时之需。
注意:后两个文件名的“rancher-cluster”部分取决于如何命名 RKE 集群的配置文件。
Rancher通常可以创建如下几种类型的下游 Kubernetes 集群:
Rancher Server:用于管理和配置 Kubernetes 集群。可以通过 Rancher Server 的 UI 与下游 Kubernetes 集群进行交互。
RKE(Rancher Kubernetes Engine):是经过认证的 Kubernetes 发行版,它拥有对应的 CLI 工具可用于创建和管理 Kubernetes 集群。在 Rancher UI 中创建集群时,它将调用 RKE 来配置 Rancher 所创建的 Kubernetes 集群。
K3s (轻量级 Kubernetes): 和 RKE 类似,也是经过认证的 Kubernetes 发行版。它比 RKE 更新,更易用且更轻量化,全部组件都在一个小于 100 MB 的二进制文件中。从 Rancher v2.4 开始,Rancher 可以安装在 K3s 集群上。
高可用 Kubernetes 安装: 建议使用 Kubernetes 程序包管理器 Helm 在专用的 Kubernetes 集群上安装 Rancher。在 RKE 集群中,需要使用三个节点以实现高可用性。在 K3s 集群中,仅需要两个节点即可。
单节点 Kubernetes 安装: 另一个选择是在 Kubernetes 集群上使用 Helm 安装 Rancher,仅在集群中使用单个节点。虽然在这种情况下的 Rancher Server 不具有高可用性,但是这种架构既节省了资源,又保留了可扩展性。如果想在短期内通过使用单个节点来节省资源,同时又保留高可用性迁移路径,最合适的架构就是单节点 Kubernetes 安装。
单节点 Docker 安装: 将 Rancher 与 Docker 一起安装在单个节点上。这种安装方式的优点是开箱即用,建议在测试和演示环境中使用这种架构。它的缺点也非常明显,单节点 Docker 安装和高可用集群安装之间不能进行数据迁移,所以推荐从一开始就使用高可用集群安装的方式安装 Rancher。
提示:本实验基于高可用集群——K3S高可用Kubernetes集群(参考附018.K3S-ETCD高可用部署),同时使用helm来部署Rancher。
节点主机名 | IP | 类型 |
---|---|---|
master01 | 172.24.8.71 | K3S master节点 |
master02 | 172.24.8.72 | K3S master节点 |
master03 | 172.24.8.73 | K3S master节点 |
worker01 | 172.24.8.74 | K3S worker节点 |
worker02 | 172.24.8.75 | K3S worker节点 |
worker03 | 172.24.8.76 | K3S worker节点 |
本实验架构:
本实验 Rancher Server 安装在高可用的 Kubernetes 集群(K3S)上。通常安装 Rancher Server 节点的软件,硬件和网络有如下最低要求。
Rancher 应用可以兼容当前任何流行的 Linux 发行版和流行的 Docker 版本。
Rancher 官方支持并且已在如下操作系统中测试了 Rancher 和 RKE,它们包括 Ubuntu,CentOS,Oracle Linux,RancherOS 和 RedHat Enterprise Linux
本实验的 K3S 几乎可以在任何 Linux 版本上运行。K3S 在以下操作系统及其这些版本后续的非主要版本中进行了测试:
Ubuntu 16.04 (amd64)
Ubuntu 18.04 (amd64)
Raspbian Buster (armhf)
所有受支持的操作系统都是 64-bit x86。
同时建议安装 ntp (Network Time Protocol),这样可以防止在客户端和服务器之间因为时钟不同步而发生证书验证错误。
硬件要求根据 Rancher 部署规模而定,官方对于高可用集群安装的建议如下:
部署规模 | 集群 | 节点 | vCPUs | 内存 |
---|---|---|---|---|
小 | 最多 150 个 | 最多 1500 个 | 2 | 8 GB |
中 | 最多 300 个 | 最多 3000 个 | 4 | 16 GB |
大 | 最多 500 个 | 最多 5000 个 | 8 | 32 GB |
特大 | 最多 1000 个 | 最多 10000 个 | 16 | 64 GB |
超大 | 最多 2000 个 | 最多 20000 个 | 32 | 128GB |
单个节点或 Kubernetes 集群上安装 Rancher,每个节点都应配置一个静态 IP。
为了与下游集群通信,Rancher 要求开放不同的端口,通常Rancher 管理面的端口要求如下图所示:
下表细分了入站和出站流量的端口要求:
Rancher 节点的入站规则
协议 | 端口 | 源 | 描述 |
---|---|---|---|
TCP | 80 | 进行外部 SSL 终止的负载均衡器/代理 | 使用外部 SSL 终止时的 Rancher UI/API |
TCP | 443 | etcd 节点 controlplane 节点 worker 节点 托管的/导入的 Kubernetes 任何需要使用 Rancher UI 或 API 的源 | Rancher Agent,Rancher UI/API,kubectl |
Rancher 节点的出站规则
协议 | 端口 | 目的 | 描述 |
---|---|---|---|
TCP | 22 | 使用主机驱动创建的节点中的任何节点 IP | 使用主机驱动通过 SSH 进行节点配置 |
TCP | 443 | 35.160.43.145/32 35.167.242.46/32 52.33.59.17/32 | git.rancher.io (应用商店) |
TCP | 2376 | 使用主机驱动创建的节点中的任何节点 IP | Docker Machine 使用的 Docker 守护进程的 TLS 端口 |
TCP | 6443 | 托管的/导入的 Kubernetes API | Kubernetes API Server |
为了安装 Rancher 高可用,K3S Server 需要开放 6443 端口供节点访问。
使用 Flannel VXLAN 时,这些节点需要能够通过 UDP 端口 8472 访问其他节点。
如果要使用指标服务器(Metrics Server),则需要在每个节点上打开端口 10250。
Rancher Server 节点的入站规则
协议 | 端口 | 源 | 描述 |
---|---|---|---|
TCP | 6443 | K3s server 节点 | Kubernetes API |
UDP | 8472 | K3s server 和 agent 节点 | Flannel VXLAN 需要 |
TCP | 10250 | K3s server 和 agent 节点 | kubelet |
通常情况下,可以允许全部的出站流量。
提示:本手册基于实验目的,直接关闭所有防火墙。
更多的环境需求参考:https://rancher2.docs.rancher.cn/docs/installation/requirements/_index。
本实验使用helm部署rancher,配套需要提前部署ingress,参考《附020.Nginx-ingress部署及使用》。
任何运行 Rancher Server 的节点上都需要安装 Docker。
有两种安装 Docker 的选择。一种选择是参考官方 Docker 文档来了解如何在 Linux 上安装 Docker。
另一种选择是使用 Rancher 提供的 Docker 安装脚本,该脚本可用于安装较新的 Docker 版本。
例如,此命令可用于在 Ubuntu 上安装 Docker 18.09:
1 curl https://releases.rancher.com/install-docker/18.09.sh | sh
提示:https://github.com/rancher/install-docker描述所有可快速安装Docker的脚本。本实验基于已有的高可用K3S集群,所有Docker均已安装完成。
1 [root@master01 ~]# k3s kubectl get nodes
提示:本实验基于高可用集群——K3S高可用Kubernetes集群(参考附018.K3S-ETCD高可用部署),同时使用helm来部署Rancher。
hlem安装:参考《053.集群管理-Helm工具》。
kubectl安装:参考https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl。
1 [root@master01 ~]# helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
提示:Rancher不同的仓库版本参考:https://rancher2.docs.rancher.cn/docs/installation/options/server-tags/_index/。
1 [root@master01 ~]# kubectl create namespace cattle-system #ns必须为cattle-system
本实验使用免费申请的CA证书,并将证书上传至集群节点。
1 [root@master01 ~]# mkdir rancher
2 [root@master01 ~]# cd rancher
3 [root@master01 rancher]# ll *crt *key
4 -rw-r--r-- 1 root root 3.7K May 24 14:08 rancher.linuxsb.com.crt
5 -rw-r--r-- 1 root root 1.7K May 24 14:08 rancher.linuxsb.com.key
6 [root@master01 rancher]# kubectl -n cattle-system create secret tls tls-rancher-ingress \
7 --cert=rancher.linuxsb.com.crt \
8 --key=rancher.linuxsb.com.key
1 [root@master01 rancher]# helm show values rancher-stable/rancher #查看可配置选项
2 [root@master01 rancher]# vi rancher-custom.yaml #创建helm配置
3 auditLog:
4 level: 1
5 hostname: "rancher.linuxsb.com"
6 ingress.tls.source: "secret"
7 ingress:
8 tls:
9 source: "secret"
10 configurationSnippet: |
11 more_set_input_headers "X-Forwarded-Host: {{ .Values.http_upgrade }}";
12 more_set_input_headers "X-Forwarded-Host: {{ .Values.connection_upgrade }}";
提示:更多Helm部署rancher选项参考:https://rancher2.docs.rancher.cn/docs/installation/options/chart-options/_index。也可通过set命令传入选项,示例如下:
helm install rancher rancher-stable/rancher \
--set hostname=rancher.linuxsb.com \
--set ingress.tls.source=secret
1 [root@master01 ~]# helm install rancher rancher-stable/rancher -f rancher-custom.yaml --namespace cattle-system
2 [root@master01 ~]# helm list -n cattle-system
3 [root@master01 ~]# helm -n cattle-system status rancher
4 [root@master01 rancher]# kubectl -n cattle-system get pods -o wide
5 [root@master01 rancher]# kubectl -n cattle-system get svc -o wide
6 [root@master01 rancher]# kubectl -n cattle-system get ingress -o wide
浏览器访问:https://rancher.linuxsb.com/。
提示:更多Rancher安装文档参考:https://rancher2.docs.rancher.cn/docs/installation/k8s-install/_index。