使用TiDB Operator在Rancher管理的私有Kubernetes集群上部署TiDB, 无法通过NodePort访问到TiDB服务

【 TiDB 使用环境`】测试环境
【 TiDB 版本】5.4.0
【遇到的问题】使用TiDB Operator在Rancher管理的私有Kubernetes集群上部署TiDB, 无法通过NodePort访问到TiDB服务
【复现路径】Rancher应用商店中添加pingcap的helm chart仓库,根据官方文档指导部署TiDB Operator和TiDB Cluster。所有Pod节点均正常。
【问题现象及影响】无法通过NodePort访问到TiDB服务。通过https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/network-issues这部分指导,发现${cluster_name}-tidb Service的endpoints对象为None,但“检查 Pod 的健康状态以及 kube-controller-manager ”未发现异常。不清楚该再怎么排除故障?
【TiDB Operator 版本】:1.3.2
【K8s 版本】:1.20.11
【Docker 版本】:20.10.15
【节点系统版本】:CentOS7.9.2009 内核版本3.10.0-1160.62.1.el7.x86_64
【Rancher 版本】:2.5.8

@CuteRay 快上~

能看一下你nodeport的配置吗?

还有就是,TiDB Operator CRDs,安装了吗?其次就是TiDB Cluster是用helm chart里面现有的,还是用官方提供的yaml,用kubectl安装的?

1.TiDB Operator CRDs 已安装,使用官方教程中的
https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.2/manifests/crd.yaml
该yaml文件,执行kubectl create安装。

> kubectl get crd 
NAME                                                  CREATED AT
backups.pingcap.com                                   2022-05-11T02:52:44Z
backupschedules.pingcap.com                           2022-05-11T02:52:44Z
dmclusters.pingcap.com                                2022-05-11T02:52:44Z
tidbclusterautoscalers.pingcap.com                    2022-05-11T02:52:44Z
tidbclusters.pingcap.com                              2022-05-11T02:52:44Z
tidbinitializers.pingcap.com                          2022-05-11T02:52:44Z
tidbmonitors.pingcap.com                              2022-05-11T02:52:44Z
tidbngmonitorings.pingcap.com                         2022-05-11T02:52:45Z
  1. TiDB Cluster 使用Rancher 配置的PingCap商店中的Helm Chart安装,有配置longhorn块存储作为StorageClass.
> kubectl get po -n tidb-cluster
NAME                                      READY   STATUS    RESTARTS   AGE
tidb-cluster-discovery-65cbc864d7-kf4fb   1/1     Running   0          3h6m
tidb-cluster-monitor-9779f77c8-9nrfm      3/3     Running   0          3h6m
tidb-cluster-pd-0                         1/1     Running   0          3h6m
tidb-cluster-pd-1                         1/1     Running   0          3h6m
tidb-cluster-pd-2                         1/1     Running   1          3h6m
tidb-cluster-tidb-0                       2/2     Running   0          3h3m
tidb-cluster-tidb-1                       2/2     Running   0          3h3m
tidb-cluster-tikv-0                       1/1     Running   0          3h4m
tidb-cluster-tikv-1                       1/1     Running   0          3h4m
tidb-cluster-tikv-2                       1/1     Running   0          3h4m
  1. NodePort配置
    没有单独配置,而是使用的Helm Chart中的TiDB Cluster的默认配置。部分生成配置如下:
spec:
  clusterIP: 10.43.181.65
  clusterIPs:
  - 10.43.181.65
  externalTrafficPolicy: Cluster
  ports:
  - name: mysql-client
    nodePort: 32328
    port: 4000
    protocol: TCP
    targetPort: 4000
  - name: status
    nodePort: 32535
    port: 10080
    protocol: TCP
    targetPort: 10080
  selector:
    app.kubernetes.io/component: tidb
    app.kubernetes.io/instance: tidb-cluster
    app.kubernetes.io/name: tidb-cluster
    io.cattle.field/appId: tidb-cluster
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
  1. 其他信息
> kubectl get service tidb-cluster-tidb -n tidb-cluster
NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                          AGE
tidb-cluster-tidb   NodePort   10.43.181.65   <none>        4000:32328/TCP,10080:32535/TCP   3h7m
> kubectl -n tidb-cluster get endpoints tidb-cluster-tidb
NAME                ENDPOINTS   AGE
tidb-cluster-tidb   <none>      3h8m

monitor的那几个端口你能直接打开访问吗?

monitor端口可正常打开,也可以telnet通。TiDB的nodeport 32328、32535端口,无法在远端telnet通。(尝试了很多次,随机生成的TiDB的nodeport 端口都无法telnet通,其他monitor之类的端口都正常)

另外 K8s节点的主机由于没有外网环境,在创建私有K8s集群时,配置了网络代理。其中NO_PROXY的设定为:localhost,127.0.0.1,0.0.0.0,10.0.0.0/8,192.168.10.0/24,.svc,.cluster.local。不清楚是否网络代理对TiDB的访问有没有影响。

是否有设置白名单?

不清楚所说的白名单是怎么设置?是说的官方文档中的这部分吗

在 ${cluster_name}/tidb-initializer.yaml 中设置 permitHost: ${mysql_client_host_name} 配置项来设置允许访问 TiDB 的主机 host_name。如果不设置,则允许所有主机访问。详情请参考 MySQL GRANT host name。

如果是这部分的话,是直接使用的TiDB cluster Helm Chart中的默认配置,看说明中默认是不配置的,也就是允许所有主机可访问TiDB

我在在我的Rancher环境搭一套跟你一样的,不过我的Rancher是v2.5.5,影响应该不大。
遇到的问题跟你相同,我认为这可能是个bug?可以考虑提一个issue。
我的解决方法是,在rancher的service界面,克隆tidb-cluster-tidb的service,把select选择更改成 One or more workloads,如下图


这样登录是OK的,如下:

我认为可能是自动生成的 service 中 selector 规则未生效,至于为什么,我也不是很清楚。

1 个赞


向monitor的selector规则就是正常的,所以在workloads界面中,monitor的workloads下会显示有哪些端口是可以访问的,但是tidb下面就没有,说明rancher不能准确识别到那个service的应该归属于哪个服务。

在rancher中克隆出tidb-cluster-tidb service时,在保存配置时报这种错误,想了解下你那边有遇到这种错误吗?

Validation failed in API: Service "test" is invalid: spec.clusterIPs: Invalid value: []string{"10.43.155.191"}: must be empty when clusterIP is empty

没遇到过,方便告诉我你具体怎么操作的吗?

点击tidb-cluster-tidb 这个service界面中的克隆,然后按照你所说的设置为 One or more workloads,其他配置与被克隆的service配置相同,点击保存报上述错误。我在rancher的ui界面中貌似看不到配置或者设置clusterip的地方(可能是rancher版本的问题),不清楚在yaml配置文件中该如何调整修改?方便把你克隆出来的service的yaml配置粘贴看下吗?

可否帮贴下yaml的配置参考下,我这边UI操作一直无法成功。我参考下你的yaml文件的配置在yaml文件中修改下试试

我是直接在页面上操作的,我就直接导出给你了
s-rz5g5.yaml (2.8 KB)

按上述方法操作,已成功连接到TiDB 服务,非常感谢:+1:。另: 感觉可直接在该service修改升级,我这边按直接修改升级操作的,使用的rancher版本估计有bug,克隆出来的一直保存不了:sweat:

:rofl: 我rancher从2.4.0升到2.5.5就没敢动了,感觉2.5.5后面的小问题挺多的。2.6的UI风格不习惯,后面再考虑升级,不过TiDB连上就行。目前官方好像不太推荐用helm chart里面的tidb-cluster,之前一直以为官方chart库就一个operator,太久没关注了。