Rancher 安装及使用

环境信息

  • centos7 3.10.0
  • kubernetes Server Version: v1.21.2
  • Helm 3.10.0
  • Rancher 2.6

安装

官方安装文档

安装 Helm

安装文档官网参考

helm 安装及使用

安装 Ingress-nginx-controller

安装文档官网参考

ingress-nginx 安装配置

添加 Helm Chart 仓库

添加最新版本,生产环境建议使用稳定版本

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest

为 Rancher 创建命名空间

你需要定义一个 Kubernetes 命名空间,用于安装由 Chart 创建的资源。这个命名空间的名称为 cattle-system

kubectl create namespace cattle-system

安装 cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml

# 添加 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 \
--create-namespace \
--version v1.7.1

安装完 cert-manager 后,你可以通过检查 cert-manager 命名空间中正在运行的 Pod 来验证它是否已正确部署:

$ kubectl get pods -n cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-5b97785fbd-vvscn 1/1 Running 0 77s
cert-manager-cainjector-c8657d84f-6b8qr 1/1 Running 0 77s
cert-manager-webhook-8564679744-hjgkx 1/1 Running 0 77s

通过 Helm 安装 Rancher

helm install rancher rancher-stable/rancher --namespace cattle-system \
--set hostname=rancher.my.com --set bootstrapPassword=admin \
--set ingress.ingressClassName=nginx

安装成功后,输出结果如下

NAME: rancher
LAST DEPLOYED: Wed Oct 12 10:22:25 2022
NAMESPACE: cattle-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Rancher Server has been installed.

NOTE: Rancher may take several minutes to fully initialize. Please standby while Certificates are being issued, Containers are started and the Ingress rule comes up.

Check out our docs at https://rancher.com/docs/

If you provided your own bootstrap password during installation, browse to https://rancher.my.com to get started.

If this is the first time you installed Rancher, get started by running this command and clicking the URL it generates:

```
echo https://rancher.my.com/dashboard/?setup=$(kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}')
```

To get just the bootstrap password on its own, run:

```
kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ "\n" }}'
```


Happy Containering!

根据提示,浏览器中访问 https://rancher.my.com/dashboard/?setup=admin,正常情况下,显示如下页面

根据页面提示,保持密码,登陆。

常见错误

helm 版本不支持最新的 kubernetes 版本

使用 helm 命令报错

$ helm install rancher rancher-stable/rancher --namespace cattle-system --set hostname=rancher.my.org --set bootstrapPassword=admin
Error: INSTALLATION FAILED: chart requires kubeVersion: < 1.25.0-0 which is incompatible with Kubernetes v1.25.0

最新版本 helm 不支持最新版本的 Kubernetes,需按照 helm 提示使用 相应版本

Error: INSTALLATION FAILED: execution error at (rancher/templates/validate-psp-install.yaml:4:5): The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding.

环境信息

  • centos7 5.4.242-1
  • kubernetes v1.25.4
  • helm v3.11.3
  • rancher v2.7

执行以下命令安装 rancher,结果报错

$ helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.my.com \
--set bootstrapPassword=admin \
--set ingress.ingressClassName=nginx
Error: INSTALLATION FAILED: execution error at (rancher/templates/validate-psp-install.yaml:4:5): The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proceeding

对于 Kubernetes 版本等于或高于 1.25 的安装,需要添加选项 --set global.cattle.psp.enabled=false [2]

$ helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.my.com \
--set bootstrapPassword=admin \
--set ingress.ingressClassName=nginx \
--set global.cattle.psp.enabled=false

Rancher 中对 Pod 执行 Execute Shell 时无法连接到容器

Kubernetes 集群开启防火墙后,在 Rancher 中想通过 Execute Shell 进入 Pod 中的容器,但是一直无法连接到容器。关闭集群 iptables 防火墙后可以正常连接,可以确定问题出在 iptables 防火墙规则,为了定位到需要放通哪个源及端口,可以通过 iptables 的 日志功能 进行定位

  1. 本示例中,iptables 防火墙的 filter 表的 INPUT 链的默认规则为 DROP,为了捕获最终被 DROP 的数据包,在 iptables 的 filter 表的 INPUT 链的最后添加记录日志的规则
    /etc/sysconfig/iptables
    -A INPUT -j LOG --log-prefix "iptables-input-DROP"
  2. 规则生效后,检查系统日志 /var/log/messages,看到了以下被 DROP 的数据包信息
    /var/log/messages
    iptables-input-DROPIN=cni0 SRC=10.244.0.5 DST=172.31.29.60 PROTO=TCP SPT=59196 DPT=6443 WINDOW=26733 RES=0x00 SYN URGP=0 
    iptables-input-DROPIN=cni0 SRC=10.244.0.5 DST=172.31.29.60 PROTO=TCP SPT=59196 DPT=6443 WINDOW=26733 RES=0x00 SYN URGP=0
    从以上数据包中可以看到,数据包流经的网卡为 cni0,源 IP 为 10.244.0.5,目的 IP 为 172.31.29.60,目的端口为 6443/tcp。继续查看源 IP ,发现其为 cattle-cluster-agent,这是 Rancher 在集群中的 Agent
    $ kubectl get pods -A -o wide | grep 10.244.0.5
    cattle-system cattle-cluster-agent-7c7dd4b97f-9wcbh 1/1 Running 0 57d 10.244.0.5 master <none> <none>
    由此可以看出,在开启了 iptables 防火墙后,是因为 cattle-cluster-agent 无法访问集群的 API Server 端口 6443/tcp,从而导致 Rancher 无法通过其 Agent 连接到 Pod 中的容器。在 iptables 中添加防火墙规则允许此类数据包通过,开启 iptables 后 Rancher 可正常连接到 Pod 中的容器
    /etc/sysconfig/iptables
    -A INPUT -s 10.244.0.0/16 -p tcp -m multiport --dports 6443 -j ACCEPT -m comment --comment "for kubernetes API Server from Rancher Agent"

Cluster agent is not connected

Rancher 管理的集群状态 Unavailable,Rancher 显示的原因为 Cluster agent is not connected

Rancher Server 通过和 Kubernetes 集群中部署的 Rancher Agent (cattle-cluster-agent) 互相通信来获取集群状态及对集群进行操作,Rancher Agent (cattle-cluster-agent) 需要向 Rancher Server 上报心跳信息以使 Rancher Server 知道集群的状态。这个错误出现意味这 Rancher Server 和 Rancher Agent 之间的通信存在问题。Rancher Server 和 Rancher Agent 不直接通过固定端口通信,Rancher Server 和 Kubernetes 只需要和 Kubernetes API Server 通信,Rancher Agent 需要访问 Rancher Server 以上报心跳及集群状态信息

要定位此问题原因,首先检查 Rancher Agent (cattle-cluster-agent) 的日志

$ kubectl get pods -A -o wide | grep -i agent
cattle-fleet-system fleet-agent-5b5ddb87d-znc8t 1/1 Running 0 80d 10.244.9.222 work1 <none> <none>
cattle-system cattle-cluster-agent-79dff8f5d-qnvqn 0/1 CrashLoopBackOff 4 107s 10.244.8.12 work2 <none> <none>
cattle-system cattle-cluster-agent-79dff8f5d-td8tq 0/1 CrashLoopBackOff 3 107s 10.244.16.12 work4 <none> <none>


$ kubectl logs -n cattle-system cattle-cluster-agent-79dff8f5d-qnvqn
INFO: Environment: CATTLE_ADDRESS=10.244.8.12 CATTLE_CA_CHECKSUM= CATTLE_CLUSTER=true CATTLE_CLUSTER_AGENT_PORT=tcp://10.1.134.43:80 CATTLE_CLUSTER_AGENT_PORT_443_TCP=tcp://10.1.134.43:443 CATTLE_CLUSTER_AGENT_PORT_443_TCP_ADDR=10.1.134.43 CATTLE_CLUSTER_AGENT_PORT_443_TCP_PORT=443 CATTLE_CLUSTER_AGENT_PORT_443_TCP_PROTO=tcp CATTLE_CLUSTER_AGENT_PORT_80_TCP=tcp://10.1.134.43:80 CATTLE_CLUSTER_AGENT_PORT_80_TCP_ADDR=10.1.134.43 CATTLE_CLUSTER_AGENT_PORT_80_TCP_PORT=80 CATTLE_CLUSTER_AGENT_PORT_80_TCP_PROTO=tcp CATTLE_CLUSTER_AGENT_SERVICE_HOST=10.1.134.43 CATTLE_CLUSTER_AGENT_SERVICE_PORT=80 CATTLE_CLUSTER_AGENT_SERVICE_PORT_HTTP=80 CATTLE_CLUSTER_AGENT_SERVICE_PORT_HTTPS_INTERNAL=443 CATTLE_CLUSTER_REGISTRY= CATTLE_FEATURES=embedded-cluster-api=false,fleet=false,monitoringv1=false,multi-cluster-management=false,multi-cluster-management-agent=true,provisioningv2=false,rke2=false CATTLE_INGRESS_IP_DOMAIN=sslip.io CATTLE_INSTALL_UUID=c9a0cc09-dc90-45eb-8bd9-d6344ffddc88 CATTLE_INTERNAL_ADDRESS= CATTLE_IS_RKE=false CATTLE_K8S_MANAGED=true CATTLE_NODE_NAME=cattle-cluster-agent-79dff8f5d-qnvqn CATTLE_SERVER=https://rancher.test.com CATTLE_SERVER_VERSION=v2.7.1
INFO: Using resolv.conf: nameserver 10.1.0.10 search cattle-system.svc.cluster.local svc.cluster.local cluster.local us-west-1.compute.internal options ndots:5
ERROR: https://rancher.test.com/ping is not accessible (The requested URL returned error: 403)

从 Rancher Agent (cattle-cluster-agent) 的日志中可以看出,Rancher Agent (cattle-cluster-agent) 无法访问 Rancher Server (https://rancher.test.com/ping) 以上报心跳,请求结果为 403

本案例中是因为 Rancher Server 的访问域名有白名单限制,将 Kubernetes 集群中的节点添加到 Rancher Server 的域名加白后恢复正常。

certificate is valid for

Rancher 管理的集群状态 Unavailable,Rancher 显示的原因为 Cluster agent is not connected

检查集群上的 cattle-cluster-agent 日志。报错如下

level=fatal msg="looking up cattle-system/cattle ca/token: failed to find service account cattle-system/cattle: Get \"https://10.1.0.1:443/api/v1/namespaces/cattle-system/serviceaccounts/cattle\": x509: certificate is valid for 10.96.0.1, 172.31.16.114, 54.67.95.96, not 10.1.0.1"

这个错误信息表明,kube-apiserver 的证书中,没有签发给 IP 10.1.0.1,此 IP 一般为 kubernetesservice 的 IP

# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 370d

因此要解决此问题,只需要更新 kube-apiserver 的证书,参考文档进行更新

常见配置

权限管理配置

配置只读 Role

本示例在 Rancher 上配置有对 Pod 只读权限的 Role,确保绑定了 Role 的用户可以通过 Rancher 读取到 Pod 信息,可以 exec 到 Pod,查看 Pod 日志,无其他 修改 权限。

  1. 在 Rancher 上创建具有对 Pod 只读权限的 Role,本示例中为其命名 PodReadOnlyRole

    在全局面板中进入 Users & Authentication,选择 Roles

    选择 Project/Namespaces

    点击 Create Project/Namespaces Role,创建 Role,按照下图,填入对应信息

    需要添加的 Resource 如下:

    pods 
    pods/attach
    pods/exec
    pods/portforward
    pods/proxy
    pods/log
    pods/status

    权限选择:getlistwatch。填写完成后点击 Create 创建,无误后会创建 Role : PodReadOnlyRole

  2. 创建用户

    在全局面板中进入 Users & Authentication,选择 Users,创建新用户。

    Global Permissions 中,选择系统预设的 Global Role : User-Base,此角色仅拥有登陆系统的权限。

  3. 绑定 User 和 Project/Namespaces Role

    Rancher 仅支持对 Rancher 中的 Project 分配 Project/Namespaces Role,所以为了分配权限,需要对不同的项目创建对应的 Project

    进入对应的 Cluster,选择要分配权限的 Project,点击 Edit Config

    Members 中选择 AddProject 绑定 UserProject Permissions,本示例中,权限选择 PodReadOnlyRole

通过以上步骤创建及分配权限后,通过新创建的用户登陆 Rancher,检查新用户对 Pod 的权限。

为 Rancher 管理的 Kubernetes 集群分配管理员

Rancher 提供了一个集中的身份验证和授权机制来管理 Kubernetes 集群的访问。要为 Rancher 管理的 Kubernetes 集群分配管理员,可以按照以下步骤操作

  1. 登录 Rancher UI:

    打开你的 Rancher UI 并进行登录。

  2. 选择你的集群:

    在 Home 页面上,选择你想要授权的 Kubernetes 集群。

  3. 管理成员:

    在集群的仪表盘上,找到并点击 “Cluster Members” 选项。这会显示集群的所有成员和他们的角色。

  4. 添加成员:

    点击 Add Member
    在提供的搜索框中输入用户的名称或标识符来查找他们。这个用户可以是单独的用户、团队或组,取决于您的身份验证配置。
    选择要分配给该成员的角色。对于管理员权限,您应该选择 Cluster Owner 或与之类似的角色。

  5. 确认权限:

    确保新添加的成员现在在成员列表中,并且他们已经被分配了正确的角色。

    通知新管理员他们已经获得权限,并让他们登录 Rancher UI 以确认他们现在可以管理该集群。

Rancher 新增访问域名

为 Rancher web UI 新增其他可访问域名,参考以下步骤

  1. 使用 cert-manager 为新增域名申请证书

    使用 cert-manager 申请证书的步骤
  2. 修改 Rancher 的 Ingress 配置,添加新域名及证书到 Ingress

     spec:
    ingressClassName: nginx
    rules:
    - host: rancher.test.com
    http:
    paths:
    - backend:
    service:
    name: rancher
    port:
    number: 80
    pathType: ImplementationSpecific
    - host: rancher1.test.com
    http:
    paths:
    - backend:
    service:
    name: rancher
    port:
    number: 80
    pathType: ImplementationSpecific
    tls:
    - hosts:
    - rancher.test.com
    secretName: tls-rancher-ingress
    - hosts:
    - rancher1.test.com
    secretName: rancher1-test-com

nginx 反代 Rancher

在集群外部通过 Nginx 反代访问 Rancher,可以使用以下 Nginx 配置 [1]

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

# 用来对 用户 ip 进行映射,以便后面做访问控制
map $http_x_forwarded_for $k8s_admin_access {
default false;
include k8s_admin_access.list;
}

upstream rancher {
server 172.31.27.193:443;
server 172.31.23.72:443;
}
server {
listen 443 ssl;
server_name rancher.test.com;
access_log /home/logs/nginx/access/rancher.access.log main;
error_log /home/logs/nginx/error/rancher.error.log;

ssl_certificate test.com.pem;
ssl_certificate_key test.com.pem;



location / {
if ($k8s_admin_access = false) {
return 403;
}

proxy_pass https://rancher; # 本示例中,rancher 使用 https 访问,必须配置为 https
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

脚注