Rancher 2.x 部署 管理k8s集群


中文文档:https://docs.rancher.cn/rancher2x/

https://rancher2.docs.rancher.cn/docs/releases/v2.4.5/

https://cloud.tencent.com/developer/article/1633991

Rancher 是一个全栈式的 Kubernetes 容器管理平台,也是一个可以在任何地方都能成功运行 Kubernetes 的工具。

产品介绍

Platform

Rancher Server 架构

Rancher Server 由认证代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 节点和集群 Agent(Cluster Agent) 组成。除了集群 Agent 以外,其他组件都部署在 Rancher Server 中。

图中描述的是用户通过 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和托管的 Kubernetes 集群的(EKS)集群的流程。以用户下发指令为例,指令的流动路径如下:

  1. 首先,用户通过 Rancher UI(即 Rancher 控制台) Rancher 命令行工具(Rancher CLI)输入指令;直接调用 Rancher API 接口也可以达到相同的效果。
  2. 用户通过 Rancher 的代理认证后,指令会进一步下发到 Rancher Server 。
  3. 与此同时,Rancher Server 也会执行容灾备份,将数据备份到 etcd 节点。
  4. 然后 Rancher Server 把指令传递给集群控制器。集群控制器把指令传递到下游集群的 Agent,最终通过 Agent 把指令下发到指定的集群中。

如果 Rancher Server 出现问题,我们也提供了备用方案,您可以通过授权集群端点管理集群。

考虑到性能表现和安全因素,我们建议您使用两个 Kubernetes 集群,分开部署 Rancher Server 和工作负载。部署 Rancher Server 后,您可以创建或导入集群,然后在这些集群上运行您的工作负载。

通过Rancher认证代理管理 Kubernetes 集群

Architecture

​ 您可以在单个节点或高可用的 Kubernetes 集群上安装 Rancher。由于单节点安装只适用于开发和测试环境,而且单节点和高可用集群之间无法进行数据迁移,所以我们建议您从一开始就使用高可用的 Kubernetes 集群来部署 Rancher Server,而且您需要分开部署运行 Rancher Server 的集群和运行自己业务的下游集群

与下游集群交互

本小节通过两个用户 Bob 和 Alice 的案例,讲解 Rancher 启动和管理下游集群的具体过程,和每个 Rancher 组件的作用。

下图演示了集群控制器、集群 Agent 和 Node Agent 是如何允许 Rancher 控制下游集群的。

与下游集群通信

Rancher Components

Separation of Rancher Server from User Clusters

Kubernetes 的安装环境

我们强烈建议您使用云服务提供商的虚拟机,如 AWS EC2、Goolge Compute Enginee (GCE)、AliCloud ECS 等,安装 Kubernetes 集群,然后在集群中安装 Rancher。

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

我们不建议在托管的 Kubernetes 集群上,如 EKS 和 GKE,安装 Rancher。 这些托管的 Kubernetes 集群不会将 etcd 暴露给 Rancher ,达到 Rancher 可以管理的程度,而且它们的特殊改动可能与 Rancher 的操作冲突。

快速入门

Rancher 提供这些快速入门手册的目的是帮助您快速地建造一个 Rancher 的沙盒,您可以在这个沙盒中评估 Rancher 是否满足您的需求。请注意,快速入门手册不适用于正式的生产环境,请参考安装介绍获取适用于正式的生产环境的操作指导。

目前 Rancher 提供了以下三本快速入门手册:

  • 部署 Rancher Server:使用对您来说最方便的方式运行 Rancher Server。
  • 部署工作负载:部署一个简单的工作负载,然后暴露工作负载,这样您就可以从集群外部访问工作负载。
  • 命令行工具:使用kubectl或 Rancher 命令行工具(Rancher CLI)管理 Rancher 实例。

https://rancher2.docs.rancher.cn/docs/installation/k8s-install/_index

安装 Docker

1
curl https://releases.rancher.com/install-docker/18.09.sh | sh

要了解某个 Docker 版本是否有可用的安装脚本,请参考这个GitHub 仓库,这里包含了 Rancher 的所有 Docker 安装脚本。

需要的 CLI 工具

此安装需要以下 CLI 工具。请确保这些工具已经安装并在$PATH中可用

  • kubectl - Kubernetes 命令行工具.
  • rke - Rancher Kubernetes Engine,用于构建 Kubernetes 集群的 cli。
  • k3s - Rancher K3s。
  • helm - Kubernetes 的软件包管理工具。请参阅Helm 版本要求选择 Helm 的版本来安装 Rancher。

配置基础设置

https://rancher2.docs.rancher.cn/docs/installation/k8s-install/create-nodes-lb/_index

1、Linux主机配置

3、配置负载均衡器

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

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

在安装 Rancher 时(也是在后续步骤中),Rancher 系统将创建一个 Ingress 资源。该 Ingress 通知 Traefik Ingress 控制器侦听发往 Rancher 主机名的流量。Traefik 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 负载均衡器的示例,请参考本页
  • 有关如何设置 Amazon ELB Network Load Balancer 的示例,请参考本页
  • 有关如何配置 F5 作为 Rancher 前端 7 层负载均衡器的示例,请参考本页
  • 有关如何为 F5 启动 WAF 功能的示例,请参考本页

4、配置DNS记录

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

安装 高可用 k3s 集群

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

  • 2 个 Linux 节点,通常是虚拟机,您可以自行选择的基础设施提供商,例如 Amazon EC2,阿里云,腾讯云或者 vShpere 等。
  • 1 个外置数据库,用于存储集群数据。我们建议使用 MySQL。
  • 1 个负载均衡器,用于将流量转发到这两个节点。
  • 一条 DNS 记录,用于将 URL 指向负载均衡器。这将成为 Rancher Server 的 URL,下游集群需要可以访问到这个地址。

准备外置Mysql数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@nna ~]# mkdir -p /data/rancher/ && cd /data/rancher
[root@nna rancher]# wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
[root@nna rancher]# rpm -ivh mysql57-community-release-el7-9.noarch.rpm
[root@nna rancher]# yum install mysql-server -y
[root@nna rancher]# systemctl start mysqld
[root@nna rancher]# systemctl enable mysqld
[root@nna rancher]# grep 'temporary password' /var/log/mysqld.log
# tpp!e.ecj6eP
[root@nna ~]# mysql -uroot -p
mysql> use mysql;
mysql> set global validate_password_policy=LOW;
mysql> set global validate_password_length=6;
mysql> set password=password("123456");
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
mysql> flush privileges;
mysql> create database k3s;

[root@nna rancher]# yum install -y nc
[root@nna rancher]# nc -vz nna 3306

安装 K3s Server

在nna和nns上安装 k3s server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@nna ~]# mkdir -p /data/rancher/ && cd /data/rancher
[root@nna rancher]# yum install -y container-selinux selinux-policy-base
[root@nna rancher]# rpm -i https://rpm.rancher.io/k3s-selinux-0.1.1-rc1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.WXgsrS: Header V4 RSA/SHA1 Signature, key ID e257814a: NOKEY

[root@nna rancher]# curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - server --datastore-endpoint="mysql://root:123456@tcp(nna:3306)/k3s"
[INFO] Finding release for channel stable
[INFO] Using v1.18.4+k3s1 as release
[INFO] Downloading hash https://mirror-k3s.rancher.cn/download/v1.18.4-k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://mirror-k3s.rancher.cn/download/v1.18.4-k3s1/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
[root@nna ~]#


确认 K3s 是否创建成功

要确认已成功设置 K3s,请在任一 K3s Server 节点上运行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@nna ~]# k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
nna Ready master 72s v1.18.4+k3s1
[root@nna ~]# k3s kubectl get nodes
NAME STATUS ROLES AGE VERSION
nna Ready master 4m50s v1.18.4+k3s1
nns Ready master 22s v1.18.4+k3s1

[root@nna ~]# k3s kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system helm-install-traefik-6l8xj 0/1 ContainerCreating 0 6m43s
kube-system metrics-server-7566d596c8-v757d 1/1 Running 0 6m42s
kube-system local-path-provisioner-6d59f47c7-gt6ch 1/1 Running 0 6m42s
kube-system coredns-8655855d6-d9l8x 1/1 Running 0 6m42s
[root@nna ~]#

启动k3s

1
2
3
4
5
6
/usr/local/bin/k3s server --datastore-endpoint=mysql://root:123456@tcp(nna:3306)/k3s

systemctl enable k3s
systemctl status k3s
systemctl start k3s
systemctl stop k3s

卸载 k3s (备用)

如果是通过 install.sh 脚本安装的k3s,默认会在服务中安装一个卸载的脚本文件:

/usr/local/bin/k3s-uninstall.sh (or as k3s-agent-uninstall.sh).

1
2
3
4
[root@nns ~]# ll /usr/local/bin/k3s*
-rwxr-xr-x. 1 root root 53604352 Jul 2 00:52 /usr/local/bin/k3s
-rwxr-xr-x. 1 root root 1710 Jul 2 00:52 /usr/local/bin/k3s-killall.sh
-rwxr-xr-x. 1 root root 881 Jul 2 00:52 /usr/local/bin/k3s-uninstall.sh

安装 kubectl 并配置 kubeconfig

官方文档:https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl

我的系统是centos7.5,选用如下内容

配置 kubeconfig

1
\cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
1
2
3
4
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
kubectl version --client

在 k3s 集群中安装 Rancher

官方文档:https://rancher2.docs.rancher.cn/docs/installation/k8s-install/helm-rancher/_index

1、安装需要的 CLI 工具

以下 CLI 工具是创建 Kubernetes 集群所必需的。请确保这些工具已安装并在您的$PATH中可用。

请查看 Helm 项目提供的安装指南,来在您的平台上进行安装。

  • kubectl - Kubernetes 命令行工具。
  • helm - Kubernetes 的软件包管理工具。请参阅 Helm 版本要求以选择要安装 Rancher 的 Helm 版本

在 github(https://github.com/helm/helm/releases)下载:

1
2
3
4
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar -zxvf helm-v3.2.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm help

2、添加 Helm Chart 仓库

添加含有 Rancher Chart 的 Helm Chart 仓库

1
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

3、为 Rancher 创建 Namespace

我们需要定义一个 Kubernetes Namespace,在 Namespace 中安装由 Chart 创建的资源。这个命名空间的名称为cattle-system

1
2
[root@nna rancher]# kubectl create namespace cattle-system
namespace/cattle-system created

4、选择您的 SSL 选项

1
2
3
4
5
mkdir -p /data/rancher/certs && cd /data/rancher/certs
touch ~/.rnd
yum install -y openssl
cp /etc/pki/tls/openssl.cnf ./
vim openssl.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[req]
distinguished_name = req_distinguished_name
req_extetions = v3_req
x509_extensions = v3_ca

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
subjectAltName = @alt_names
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = critical,CA:true
subjectAltName = @alt_names

[alt_names]
DNS.1 = local-rancher
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
openssl genrsa -out cakey.pem 2048
openssl req -x509 -new -nodes -key cakey.pem \
-days 36500 \
-out cacerts.pem \
-extensions v3_ca \
-subj "/CN=rancher.local.com" \
-config ./openssl.cnf
openssl genrsa -out server.key 2048
openssl req -new -key server.key \
-out server.csr \
-subj "/CN=local-rancher" \
-config ./openssl.cnf

openssl x509 -req -in server.csr \
-CA cacerts.pem \
-CAkey cakey.pem \
-CAcreateserial -out server.crt \
-days 36500 -extensions v3_req \
-extfile ./openssl.cnf
openssl x509 -noout -in server.crt -text | grep DNS
cp server.crt tls.crt
cp server.key tls.key

ca证书密文

1
2
3
4
kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=./tls.crt --key=./tls.key
kubectl -n cattle-system create secret generic tls-ca \
--from-file=cacerts.pem

部署 Rancher 集群

1
2
3
4
5
6
7
echo '192.168.145.131 local-rancher' >> /etc/hosts

helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=local-rancher \
--set ingress.tls.source=secret \
--set privateCA=true

6、根据您选择的 SSL 选项,通过 Helm 安装 Rancher

1
2
3
4
5
6
7
echo '192.168.145.131 local-rancher' >> /etc/hosts

helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=local-rancher \
--set ingress.tls.source=secret \
--set privateCA=true

7、验证Rancher Server 是否成功部署

等待 Rancher 运行,检查 Rancher Server 是否运行成功::

1
2
3
4
5
kubectl -n cattle-system rollout status deploy/rancher

Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...

deployment "rancher" successfully rolled out

如果看到以下错误: error: deployment "rancher" exceeded its progress deadline, 您可以通过运行以下命令来检查 deployment 的状态:

1
2
3
4
[root@nna ~]# kubectl -n cattle-system get deploy rancher
NAME READY UP-TO-DATE AVAILABLE AGE
rancher 3/3 3 3 23h
[root@nna ~]#

DESIREDAVAILABLE应该显示相同的个数。

8、保存您的选项

请保存您使用的全部--set选项。使用 Helm 升级 Rancher 到新版本时,您将需要使用相同的选项。

安装完成

现在您应该具有一个功能正常的 Rancher Server 了。

打开浏览器,访问您的 DNS,这个 DNS 会将流量转发到您的负载均衡器,您应该会看到一个色彩丰富的登录页面。

遇到了问题?查看故障排查页面。

rancher 中映射的端口无法用lsof或者netstat查看。可以通过iptables -L -t nat -n查看。


使用 Rancher 创建 真正 k8s 集群

1
2
3
4
5
6
7
8
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://k8spv7nq.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl restart docker

文档:https://rancher2.docs.rancher.cn/docs/cluster-provisioning/rke-clusters/custom-nodes/_index

1
2
3
4
5
6
# 删除以前的安装残留
rm -rf /etc/kubernetes/ && rm -rf /var/run/utmp && rm -rf /var/run/lock/ && rm -rf /var/lib/etcd/
docker rm -f xx xx xx ...

# 重新安装
docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.5 --server https://local-rancher --token 27wnwkrq6sd9t9cc7g686jc888w2p84zz4l8755nbkn8crvdstnj2b --ca-checksum 1050e7e484e48667c4d2bb94675302162b302b51157cc8a91235bf1e747f44c3 --internal-address 192.168.145.133 --etcd --controlplane --worker

成功: