在 Rancher WebUI 中,打开下游集群 “kubectl shell”,无法正常执行 kubectl 命令

Rancher Server 设置

  • Rancher 版本: v2.7.0
  • 安装选项 (Docker install/Helm Chart): Helm Chart
    • RKE1 - 版本:v1.24.8

下游集群信息

  • Kubernetes 版本: v1.24.8
  • Cluster Type (Local/Downstream): Downstream
    • 如果 Downstream,是什么类型的集群?(自定义/导入或为托管 等): RKE 自定义/导入

用户信息

  • 登录用户的角色是什么? (管理员/集群所有者/集群成员/项目所有者/项目成员/自定义): admin

主机操作系统:SLES15 SP3

问题描述:

在 Rancher WebUI → 下游集群中,打开 ‘kubectl shell’,是 connected 状态,但无法正常执行 kubectl 命令,返回信息如下,

kubectl get nodes
Error from server (InternalError): an error on the server (“dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving”) has prevented the request from succeeding

截图:

其他上下文信息:

将下游集群 blue-cluster 的 kubeconfig 文件下载至 Rancher server 所在的宿主机中,可正常执行 kubectl 命令,

rke-master:~/.kube # kubectl get pods --kubeconfig blue-cluster.kubeconfig
NAME READY STATUS RESTARTS AGE
web-server 1/1 Running 0 51m

在 Rancher WebUI → 下游集群 → Workload → Pods 中,对 pod 可正常打开 “Execute Shell”,

root@web-server:/usr/local/apache2# cat htdocs/index.html

It works!

root@web-server:/usr/local/apache2#

日志
blue-master:~ # docker logs k8s_proxy_dashboard-shell-4k2dq_cattle-system_6ecc4f04-e5a7-4ae3-b888-1b9f2b5b8ed9_0
W1230 08:19:59.823135       6 proxy.go:162] Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious
Starting to serve on 127.0.0.1:8001
E1230 08:24:14.331524       6 proxy_server.go:147] Error while proxying request: dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving
E1230 08:24:14.339816       6 proxy_server.go:147] Error while proxying request: dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving
E1230 08:24:14.349768       6 proxy_server.go:147] Error while proxying request: dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving
E1230 08:24:14.357557       6 proxy_server.go:147] Error while proxying request: dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving
E1230 08:24:14.366064       6 proxy_server.go:147] Error while proxying request: dial tcp: lookup kubernetes.default on 10.43.0.10:53: server misbehaving

请帮忙看看是否需要在 Rancher Server 中做哪些设置,谢谢,

我看到你发的其他帖子,我感觉你的环境不是特别标准。
最核心的问题(来自你发的其他帖子):Rancher server的IP和k8s svc CIDR似乎是有冲突的,k8s的pod CIDR和service CIDR要规避你的所有节点网段。

谢谢,我看了一下,Rancher Server 所在的 RKE 集群和下游的 RKE 集群网络是默认的,Pods CIDR 10.42.0.0,Service CIDR 10.43.0.0,我的节点网段是 10.10.10.0,相互没有冲突,

Rancher Server 所在的 RKE 集群,点击 “kubectl shell”,是可以正常返回 kubectl 命令的,

因为是测试, Rancher Server 所在的 RKE 集群中只有1个 Control 节点,前边也没有部署 LoabBalance,直接使用的是 Control 节点的节点 IP 来访问 Rancher Server,

不知与我这个配置是否有关系…

Rancher dashboard的kubectl shell原理是:在下游集群创建一个特殊Pod,Pod使用集群提供的网络,Pod中已经内置了kubectl CLI,并且配置了足够权限service account,Pod的kubectl通过访问Kubernetes default svc(10.43.0.1)来获取执行结果。

从你的截图信息看,这个shell pod无法访问访问到Kubernetes default svc,因为集群内的coredns没有提供其解析记录。

一个正常的集群是可以看到k8s default svc:

# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   15m

并且,使用集群网络的Pod可以通过svc name访问此入口:

/ # nslookup kubernetes.default.svc.cluster.local
Server:         10.43.0.10
Address:        10.43.0.10:53

Name:   kubernetes.default.svc.cluster.local
Address: 10.43.0.1

问题解决了,还是与我的环境没有部署 DNS 有关系,我之前在下游集群中是通过编辑 ‘coredns’ configmap 中的 host {} 项来添加下游到 rancher server url 的解析的,看起来这种方式会影响下游集群中内部的解析,后来全部改为在 cluster-agent 和 node-agent 的 deployment 中添加 hostAliases 项。 下游集群中内部的解析正常,在 rancher server 中,打开下游集群的 kubectl shell,也可以正常执行命令了。

综上,使用 Rancher,如果有 DNS,是最好的了。