Rancher是一个开源的企业级容器管理平台,Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
rancher
Rancher 1.x 最初是为了支持多种容器编排引擎而构建的,其中包括自己的容器编排引擎 Cattle。但随着 Kubernetes 在市场上的兴起,Rancher 2.x 已经完全转向了 Kubernetes。Rancher 2.x 可以部署和管理在任何地方运行的 Kubernetes 集群。
Rancher 通过支持集群的身份验证和基于角色的访问控制(RBAC),使系统管理员能够从一个位置控制全部集群的访问。Rancher 可以对集群及其资源进行详细的监控和并在需要时发送告警,也可以将容器日志发送给外部日志系统,并通过应用商店与 Helm 集成。如果您具有外部 CI/CD 流水线系统,则可以将其与 Rancher 对接,如果没有,Rancher 也提供了简单易用的流水线来帮助您自动部署和升级工作负载。除此之外,Rancher 还有很多开箱即用的功能来帮助您更好的管理集群和业务应用,例如多集群应用,全局 DNS,服务网格,安全扫描,集群模版和基于 OPA 的策略管理等功能。
部署
单节点安装
单节点安装只适用于测试和 demo 环境,而且单节点安装和高可用集群安装之间不能进行数据迁移,所以我们推荐从一开始就使用高可用集群(k8s)安装的方式安装 Rancher。
docker安装
sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
直接使用镜像rancher来运行rancher server服务
我们看一下容器中的应用进程的情况
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a1278c071cf rancher/rancher "entrypoint.sh" 2 days ago Up 25 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp thirsty_elbakyan
MacBook-Pro:~ chunyinjiang$ docker exec -ti 9a1278c071cf -- sh
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"--\": executable file not found in $PATH": unknown
$ docker exec -ti 9a1278c071cf /bin/bash
root@9a1278c071cf:/var/lib/rancher# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug06 ? 00:00:03 tini -- rancher --http-listen-port=80 --https-listen-port=443 --audit-log-path=/var/log/auditlog/rancher-api-audit.log --audit-level=0 --audit-log-maxage=10 --audit-log-maxbackup=
root 7 1 0 Aug06 ? 00:05:59 rancher --http-listen-port=80 --https-listen-port=443 --audit-log-path=/var/log/auditlog/rancher-api-audit.log --audit-level=0 --audit-log-maxage=10 --audit-log-maxbackup=10 --aud
root 16 7 4 Aug06 ? 00:38:52 etcd --data-dir=management-state/etcd
root 28 7 38 Aug06 ? 05:27:37 k3s server --no-deploy=traefik --no-deploy=coredns --no-deploy=servicelb --no-deploy=metrics-server --no-deploy=local-storage --disable-agent --datastore-endpoint=http://localhost
root 44 7 0 Aug06 ? 00:00:06 channelserver --config-key=k3s --url https://releases.rancher.com/kontainer-driver-metadata/release-v2.4/data.json --url=/var/lib/rancher-data/driver-metadata/data.json --refresh-
root 81 7 0 Aug06 ? 00:00:03 telemetry client --url https://localhost:443/v3 --token-key telemetry:mcg9bn8r7nwh6gxb4gmwqzwn5xvwb2s2b7m5552sjrv6btkmkxtrnh
root 370 0 1 00:47 pts/0 00:00:00 /bin/bash
root 386 370 0 00:47 pts/0 00:00:00 ps -ef
我们可以看到在新版中rancher-server已经直接是rancher了,这是一个小的变化。
1、登录 Rancher 界面并配置初始设置
您需要先登录 Rancher,然后再开始使用 Rancher。登录以后,您需要完成一些一次性的配置。
- 打开浏览器,输入主机的 IP 地址:https://
,请使用真实的主机 IP 地址替换 。 - 首次登录时,请按照页面提示设置登录密码。
- 设置 Rancher Server URL。URL 既可以是一个 IP 地址,也可以是一个主机名称。请确保您在集群内添加的每个节点都可以连接到这个 URL。如果您使用的是主机名称,请保证主机名称可以被节点的 DNS 服务器成功解析。
2、创建业务集群
完成安装和登录 Rancher 的步骤之后,在 Rancher 中创建第一个 Kubernetes 集群。您可以使用自定义集群选项,使用的任意 Linux 主机(云主机、虚拟机或裸金属服务器)创建集群。
- 访问集群页面,单击添加集群。
- 选择自定义选项。
- 输入集群名称。
- 跳过集群角色和集群选项。
- 单击下一步。
- 勾选主机选项 - 角色选择中的所有角色: Etcd、 Control 和 Worker。可选: Rancher 会自动探查用于 Rancher 通信和集群通信的 IP 地址。您可以通过主机选项 > 显示高级选项中的公网地址和内网地址指定 IP 地址。
- 跳过主机标签参数,因为对快速入门来说,这部分的参数不太重要。
- 复制代码框中的命令。登录您的 Linux 主机,打开命令行工具,粘贴命令,单击回车键运命令。
- 运行完成后,回到 Rancher 界面,单击完成。
到这边就在 Rancher 中创建了一个 Kubernetes 集群。
3、部署工作负载
k8s集群部署好,就可以创建工作负载(workload)。工作负载(workload)即 Kubernetes 对一组 Pod 的抽象模型,用于描述业务的运行载体,包括 Deployment、Statefulset、Daemonset、Job、CronJob 等多种类型。
我们在 Rancher Server 中部署带有 Ingress 的工作负载是一个“Hello-World”应用。
- 访问集群页面,选择您刚刚创建的集群,进入集群页面。
- 从集群页面的主菜单中选择项目/命名空间。
- 打开 项目:Default。
- 单击资源 > 工作负载。如果您使用的是 v2.3.0 之前的版本,请单击 工作负载 > 工作负载。
- 单击部署。
- 输入工作负载的名称。
- 在Docker 镜像一栏,输入rancher/hello-world,请注意区分大小写字母。
- 余下的选项保持默认配置即可。
- 单击运行。
然后就开始部署对应的工作负载。这个过程可能需要几分钟完成。当工作负载部署完成后,它的状态将变为Active,可以从项目的工作负载页面查看工作负载当前的状态。
4、暴露服务
上述步骤帮助您完成了工作负载的部署,现在需要将服务暴露出来,让其他服务可以通过网络连接和调用这个工作负载。
- 访问集群页面,选择您刚刚创建的集群,进入集群页面。
- 从集群页面的主菜单中选择项目/命名空间。
- 打开 项目 > Default。
- 单击资源 > 工作负载 > 负载均衡。如果您使用的是 v2.3.0 之前的版本,请单击 工作负载 > 负载均衡。
- 单击添加 Ingress
- 输入 Ingress 负载均衡的名称,如 “hello”。
- 在目标一栏,从下拉菜单选择您服务的名称。
- 在端口一栏输入 80。
- 余下的选项保持默认配置即可,单击保存。
这个时候这个工作负载分配到了一个xip.io地址,已经暴露出去了。可能需要 1~2 分钟完成服务关联。
高可用集群安装
分开部署 Rancher 与下游集群
可以单点,也可以使用负载均衡来做rancher的高可用,所以我们建议将 Rancher Server 安装在高可用的 Kubernetes 集群上,主要是因为它可以保护 Rancher Server 的数据。在高可用安装中,负载均衡器充当客户端的单点入口,并在集群中的多台服务器之间分配网络流量,这有助于防止任何一台服务器成为单点故障。我们不建议在单个 Docker 容器中安装 Rancher,因为如果该节点发生故障,则其他节点上将没有可用的集群数据副本,并且您可能会丢失 Rancher Server 上的数据。
我们建议使用Helm (Kubernetes 包管理器)在专用的 Kubernetes 集群上安装 Rancher。因为通过在多个节点上运行 Rancher 可以提高可用性,这个安装方式叫做“高可用 Kubernetes 安装”。
高可用的流程
- Rancher 的 DNS 应该解析为 4 层负载均衡器
- 负载均衡器应将端口 TCP/80 和 TCP/443 流量转发到 Kubernetes 集群中的所有 3 个节点。
- Ingress 控制器会将 HTTP 重定向到 HTTPS,并在端口 TCP/443 上终止 SSL/TLS。
- Ingress 控制器会将流量转发到 Rancher deployment 中 Pod 上的端口 TCP/80。
在上面我们多次提到专用的k8s集群,其实就是rancher自身推出的也是经过CNCF认证的轻量级的k8s集群:k3s。这个可以说都是k8s集群,但是现在还是很少用人使用部署业务和k8s还是有差距的,目前也只是用于安装rancher,用于高可用的实现。
k3s集群
K3s 也是 Rancher 发布的经过完全认证的 Kubernetes 发行版,但比 RKE 更新。我们建议在 K3s 上安装 Rancher,因为 K3s 易于使用且更轻量,全部组件都打包在了一个二进制文件里。并且这个二进制文件小于 100 MB。注意:如果在 RKE 集群上安装了 Rancher 之后,目前没有办法将这个高可用迁移到 K3s 集群上。
1、部署要求
- 2 个 Linux 节点,通常是虚拟机,您可以自行选择的基础设施提供商,例如 Amazon EC2,阿里云,腾讯云或者 vShpere 等。
- 1 个外置数据库,用于存储集群数据。我们建议使用 MySQL。
- 1 个负载均衡器,用于将流量转发到这两个节点。
- 一条 DNS 记录,用于将 URL 指向负载均衡器。这将成为 Rancher Server 的 URL,下游集群需要可以访问到这个地址。
2、安装
- 连接到您准备运行 Rancher Server 的 Linux 节点。
在 Linux 节点上,运行以下命令以启动 K3s Server 并将其连接到外部数据库:
curl -sfL https://get.k3s.io | sh -s - server \ --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name" //国内用户,可以使用以下方法加速安装: curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server \ --datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
确认 K3s 是否创建成功,在任一 K3s Server 节点上运行以下命令,如下表示k3s集群已经成功
$ sudo k3s kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-31-60-194 Ready master 44m v1.17.2+k3s1 ip-172-31-63-88 Ready master 6m8s v1.17.2+k3s1 sudo k3s kubectl get pods --all-namespaces
保存并使用 kubeconfig 文件,在每个 Rancher Server 节点上安装 K3s 时,会在节点上/etc/rancher/k3s/k3s.yaml位置创建一个kubeconfig文件。该文件包含用于完全访问集群的凭据,您应该将此文件保存在安全的位置,要使用此kubeconfig文件:
- 安装 Kubernetes 命令行工具kubectl。
- 将文件/etc/rancher/k3s/k3s.yaml复制并保存到本地计算机上的~/.kube/config文件中。
- 在这个 kubeconfig 文件中,server参数为 localhost。您需要手动更改这个地址为负载均衡器的 DNS,并且指定端口 6443。(Kubernetes API Server 的端口为 6443,Rancher Server 的端口为 80 和 443。)以下是一个示例k3s.yaml:
现在可以使用kubectl来管理您的 K3s 集群。如果您有多个 kubeconfig 文件,可以在使用kubectl时通过传递文件路径来指定要使用的 kubeconfig 文件:
kubectl --kubeconfig ~/.kube/config/k3s.yaml get pods --all-namespaces
已确认可以使用kubectl访问集群,并且 K3s 集群正在正确运行。现在,可以在集群上安装 Rancher Server 了。
RKE集群
除了上面说的k3s,我们还可以将rancher运行在真正的k8s上实现高可用,前面我们也说过rancher安装k8s集群的流程,这边就使用到了RKE。RKE是一个用Golang编写的Kubernetes安装程序,rancher就是使用这个工具完成了k8s集群的部署和管理的,一般我们使用RKE部署的k8s集群就叫RKE集群。
1、部署要求
- 3 个 Linux 节点,通常是虚拟机,您可以自行选择的基础设施提供商,例如 Amazon EC2,阿里云,腾讯云或者 vShpere。
- 1 个负载均衡器,用于将流量转发到这三个节点。
- 一条 DNS 记录,用于将 URL 指向负载均衡器。这将成为 Rancher Server 的 URL,下游集群需要可以访问到这个地址。
2、部署
- 那种REK,国内用户,可以导航到 http://mirror.cnrancher.com 下载所需资源
创建 RKE 配置文件rancher-cluster.yml
nodes: - address: 165.227.114.63 internal_address: 172.16.22.12 user: ubuntu role: [controlplane, worker, etcd] - address: 165.227.116.167 internal_address: 172.16.32.37 user: ubuntu role: [controlplane, worker, etcd] - address: 165.227.127.226 internal_address: 172.16.42.73 user: ubuntu role: [controlplane, worker, etcd] services: etcd: snapshot: true creation: 6h retention: 24h # 当使用外部 TLS 终止,并且使用 ingress-nginx v0.22或以上版本时,必须。 ingress: provider: nginx options: use-forwarded-headers: "true"
- address: 公用 DNS 或 IP 地址
- user: 可以运行 docker 命令的用户
- role: 分配给节点的 Kubernetes 角色列表
- internal_address: 内部集群流量的专用 DNS 或 IP 地址
- ssh_key_path: 用于对节点进行身份验证的 SSH 私钥的路径(默认为~/.ssh/id_rsa)
运行 RKE
rke up --config ./rancher-cluster.yml
完成后,它应该以这样一行结束: Finished building Kubernetes cluster successfully.
测试集群
当您运行 rke up 时,RKE 应该已经创建了一个名为kube_config_rancher-cluster.yml的kubeconfig文件。该文件具有kubectl和helm的凭据。如果您已经安装了kubectl,您需要将kubeconfig文件放置在kubectl可以访问的位置。kubeconfig文件包含使用kubectl访问集群所必需的凭证。
kubectl get nodes NAME STATUS ROLES AGE VERSION 165.227.114.63 Ready controlplane,etcd,worker 11m v1.13.5 165.227.116.167 Ready controlplane,etcd,worker 11m v1.13.5 165.227.127.226 Ready controlplane,etcd,worker 11m v1.13.5
保存文件
将以下文件的副本保存在安全的位置:
rancher-cluster.yml: RKE 集群配置文件。 kube_config_rancher-cluster.yml: 集群的Kubeconfig 文件,此文件包含用于访问集群的凭据。 rancher-cluster.rkestate: Kubernetes 集群状态文件,此文件包含用于完全访问集群的凭据。
安装rancher
1、添加 Helm Chart 仓库
helm repo add rancher-<CHART_REPO> https://releases.rancher.com/server-charts/<CHART_REPO>
2、为 Rancher 创建 Namespace
kubectl create namespace cattle-system
3、设置ssl
# 安装 CustomResourceDefinition 资源
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml
# **重要:**
# 如果您正在运行 Kubernetes v1.15 或更低版本,
# 则需要在上方的 kubectl apply 命令中添加`--validate=false`标志,
# 否则您将在 cert-manager 的 CustomResourceDefinition 资源中收到与
# x-kubernetes-preserve-unknown-fields 字段有关的验证错误。
# 这是一个良性错误,是由于 kubectl 执行资源验证的方式造成的。
# 为 cert-manager 创建命名空间
kubectl create namespace cert-manager
# 添加 Jetstack Helm 仓库
helm repo add jetstack https://charts.jetstack.io
# 更新本地 Helm chart 仓库缓存
helm repo update
# 安装 cert-manager Helm chart
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v0.15.0
4、安装rancher
helm install rancher rancher-<CHART_REPO>/rancher \
--namespace cattle-system \
--set hostname=rancher.my.org
架构
Rancher Server 由认证代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 节点和集群 Agent(Cluster Agent) 组成。除了集群 Agent 以外,其他组件都部署在 Rancher Server 中。
图中描述的是用户通过 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和托管的 Kubernetes 集群的(EKS)集群的流程。以用户下发指令为例,指令的流动路径如下:
- 首先,用户通过 Rancher UI(即 Rancher 控制台) Rancher 命令行工具(Rancher CLI)输入指令;直接调用 Rancher API 接口也可以达到相同的效果。
- 用户通过 Rancher 的代理认证后,指令会进一步下发到 Rancher Server 。
- 与此同时,Rancher Server 也会执行容灾备份,将数据备份到 etcd 节点。
- 然后 Rancher Server 把指令传递给集群控制器。集群控制器把指令传递到下游集群的 Agent,最终通过 Agent 把指令下发到指定的集群中。
Agent和k8s的交互流程
使用
Rancher 支持的集群种类繁多:云供应商托管的 Kubernetes 集群、RKE 集群、基础设施提供商创建节点并创建 Kubernetes 集群、在自定义节点上创建 Kubernetes 集群、导入现有 Kubernetes 集群和导入 K3s 集群,都是 Rancher 支持的创建集群的方式。
创建正常的k8s集群
创建k8s集群也就是rancher通过RKE来部署一个自定义的K8s集群
1、在集群页面中,单击添加集群。
2、选择Custom。
3、输入集群名称。
4、通过成员角色来设置用户访问集群的权限。
- 点击添加成员将需要访问这个集群的用户添加到成员中。
- 在角色下拉菜单中选择每个用户的权限。
5、使用集群选项设置 Kubernetes 的版本,网络插件以及是否要启用项目网络隔离。要查看更多集群选项,请单击显示高级选项。
6、点击 下一步 。
7、从节点角色中,选择需要的集群节点角色。
8、可选:点击显示高级选项以指定注册节点时要使用的 IP 地址、重写节点的主机名或添加标签或污点到节点上。
9、复制屏幕上显示的命令到剪贴板。使用 shell 工具登录到您的 Linux 主机,如 PuTTy 等。运行复制到剪贴板的命令。如果要将特定主机专用于特定节点角色,请重复步骤 7-10。根据需要多次重复这些步骤。
10、当您完成在 Linux 主机上运行该命令时,点击 完成。
这个时候一个集群就部署完成了,下面rancher完成下列工作
- 集群已创建并进入为 Provisioning 的状态。Rancher 正在启动您的集群。
- 您可以在集群的状态更新为 Active 后访问它。
- Rancher 为活动的集群分配了两个项目,即 Default(包含命名空间 default)和 System(包含命名空间 cattle-system,ingress-nginx,kube-public 和 kube-system,如果存在)。
导入现有的k8s集群
1、在 集群 页, 点击 添加。
2、选择 导入。
3、输入 集群名称。
4、通过成员角色来设置用户访问集群的权限。
- 点击添加成员将需要访问这个集群的用户添加到成员中。
- 在角色下拉菜单中选择每个用户的权限。
5、单击 创建。
6、这里显示了需要集群管理员特权的先决条件 (请参阅上面的先决条件)的提示,其中包括了达到该先决条件的示例命令。
7、将kubectl命令复制到剪贴板,并在有着指向您要导入的集群的 kubeconfig 的节点上运行它。如果您不确定它是否正确配置,在运行 Rancher 中显示的命令之前,运行kubectl get nodes来验证一下。
8、如果您正在使用自签名证书,您将收到certificate signed by unknown authority消息。要解决这个验证问题,请把 Rancher 中显示的curl开头的命令复制到剪贴板中。并在有着指向您要导入的集群的 kubeconfig 的节点上运行它。
9、在节点上运行完命令后, 单击 完成。
到这里就导入完成,后面还要等一会,rancher自动完如下工作:
- 您的集群创建成功并进入到Pending(等待中)的状态。Rancher 正在向您的集群部署资源。
- 在集群状态变为Active(激活)状态后,您将可以开始访问您的集群。
- 在Active的集群中,默认会有两个项目:Default项目(包括default命名空间)和System项目(包括cattle-system、ingress-nginx、kube-public 和 kube-system)。
- 不能重新导入当前在 Rancher 设置中处于激活状态的集群.