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 |
安装完 cert-manager
后,你可以通过检查 cert-manager
命名空间中正在运行的 Pod
来验证它是否已正确部署:
kubectl get pods -n cert-manager |
通过 Helm 安装 Rancher
helm install rancher rancher-stable/rancher --namespace cattle-system \ |
安装成功后,输出结果如下
NAME: rancher |
根据提示,浏览器中访问 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 |
最新版本 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 \ |
对于 Kubernetes 版本等于或高于 1.25 的安装,需要添加选项 --set global.cattle.psp.enabled=false
[2]
helm install rancher rancher-latest/rancher \ |
Rancher 中对 Pod 执行 Execute Shell 时无法连接到容器
Kubernetes 集群开启防火墙后,在 Rancher 中想通过 Execute Shell
进入 Pod 中的容器,但是一直无法连接到容器。关闭集群 iptables 防火墙后可以正常连接,可以确定问题出在 iptables 防火墙规则,为了定位到需要放通哪个源及端口,可以通过 iptables 的 日志功能 进行定位。
- 本示例中,iptables 防火墙的
filter
表的INPUT
链的默认规则为DROP
,为了捕获最终被DROP
的数据包,在 iptables 的filter
表的INPUT
链的最后添加记录日志的规则/etc/sysconfig/iptables -A INPUT -j LOG --log-prefix "iptables-input-DROP"
- 规则生效后,检查系统日志
/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=0cni0
,源 IP 为10.244.0.5
,目的 IP 为172.31.29.60
,目的端口为6443/tcp
。继续查看源 IP ,发现其为cattle-cluster-agent
,这是 Rancher 在集群中的 Agent由此可以看出,在开启了 iptables 防火墙后,是因为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>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 |
从 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 一般为 kubernetes
的 service
的 IP
kubectl get services |
因此要解决此问题,只需要更新 kube-apiserver
的证书,参考文档进行更新
常见配置
权限管理配置
配置只读 Role
本示例在 Rancher 上配置有对 Pod 只读权限的 Role,确保绑定了 Role 的用户可以通过 Rancher 读取到 Pod 信息,可以 exec
到 Pod,查看 Pod 日志,无其他 修改 权限。
在 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权限选择:
get
,list
,watch
。填写完成后点击Create
创建,无误后会创建 Role :PodReadOnlyRole
创建用户
在全局面板中进入
Users & Authentication
,选择Users
,创建新用户。
在Global Permissions
中,选择系统预设的 Global Role :User-Base
,此角色仅拥有登陆系统的权限。绑定 User 和 Project/Namespaces Role
Rancher 仅支持对 Rancher 中的
Project
分配Project/Namespaces Role
,所以为了分配权限,需要对不同的项目创建对应的Project
。进入对应的 Cluster,选择要分配权限的
Project
,点击Edit Config
在Members
中选择Add
为Project
绑定User
和Project Permissions
,本示例中,权限选择PodReadOnlyRole
通过以上步骤创建及分配权限后,通过新创建的用户登陆 Rancher,检查新用户对 Pod 的权限。
为 Rancher 管理的 Kubernetes 集群分配管理员
Rancher 提供了一个集中的身份验证和授权机制来管理 Kubernetes 集群的访问。要为 Rancher 管理的 Kubernetes 集群分配管理员,可以按照以下步骤操作
登录 Rancher UI:
打开你的 Rancher UI 并进行登录。
选择你的集群:
在 Home 页面上,选择你想要授权的 Kubernetes 集群。
管理成员:
在集群的仪表盘上,找到并点击 “Cluster Members” 选项。这会显示集群的所有成员和他们的角色。
添加成员:
点击
Add Member
。
在提供的搜索框中输入用户的名称或标识符来查找他们。这个用户可以是单独的用户、团队或组,取决于您的身份验证配置。
选择要分配给该成员的角色。对于管理员权限,您应该选择Cluster Owner
或与之类似的角色。确认权限:
确保新添加的成员现在在成员列表中,并且他们已经被分配了正确的角色。
通知新管理员他们已经获得权限,并让他们登录 Rancher UI 以确认他们现在可以管理该集群。
Rancher 新增访问域名
为 Rancher web UI 新增其他可访问域名,参考以下步骤
使用
使用 cert-manager 申请证书的步骤cert-manager
为新增域名申请证书修改 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 { |