访问 Kubernetes 上的 TiDB 集群

在 Kubernetes 集群内访问 TiDB 时,使用 TiDB service 域名 <release-name>-tidb.<namespace> 即可。若需要在集群外访问,则需将 TiDB 服务端口暴露出去。在 tidb-cluster Helm chart 中,通过 values.yaml 文件中的 tidb.service 字段进行配置:

tidb:
  service:
    type: NodePort
    # externalTrafficPolicy: Cluster
    # annotations:
    # cloud.google.com/load-balancer-type: Internal

NodePort

在没有 LoadBalancer 时,可选择通过 NodePort 暴露。NodePort 有两种模式:

  • externalTrafficPolicy=Cluster:集群所有的机器都会给 TiDB 分配 TCP 端口,此为默认值

    使用 Cluster 模式时,可以通过任意一台机器的 IP 加同一个端口访问 TiDB 服务,如果该机器上没有 TiDB Pod,则相应请求会转发到有 TiDB Pod 的机器上。

    注意:

    该模式下 TiDB 服务获取到的请求源 IP 是主机 IP,并不是真正的客户端源 IP,所以基于客户端源 IP 的访问权限控制在该模式下不可用。

  • externalTrafficPolicy=Local:只有运行 TiDB 的机器会分配 TCP 端口,用于访问本地的 TiDB 实例

    使用 Local 模式时,建议打开 tidb-scheduler 的 StableScheduling 特性。tidb-scheduler 会尽可能在升级过程中将新 TiDB 实例调度到原机器,这样集群外的客户端便不需要在 TiDB 重启后更新配置。

查看 NodePort 模式下对外暴露的 IP/PORT

查看 Service 分配的 Node Port,可通过获取 TiDB 的 Service 对象来获知:

kubectl -n <namespace> get svc <release-name>-tidb -ojsonpath="{.spec.ports[?(@.name=='mysql-client')].nodePort}{'\n'}"

查看可通过哪些节点的 IP 访问 TiDB 服务,有两种情况:

  • externalTrafficPolicyCluster 时,所有节点 IP 均可

  • externalTrafficPolicyLocal 时,可通过以下命令获取指定集群的 TiDB 实例所在的节点

    kubectl -n <namespace> get pods -l "app.kubernetes.io/component=tidb,app.kubernetes.io/instance=<release-name>" -ojsonpath="{range .items[*]}{.spec.nodeName}{'\n'}{end}"

LoadBalancer

若运行在有 LoadBalancer 的环境,比如 GCP/AWS 平台,建议使用云平台的 LoadBalancer 特性。

访问 Kubernetes Service 文档,了解更多 Service 特性以及云平台 Load Balancer 支持。