ITPub博客

首页 > 数据库 > > 访问 Kubernetes 上的 TiDB 集群

访问 Kubernetes 上的 TiDB 集群

作者:浪花小雨滴 时间:2020-05-15 15:44:14 0 删除 编辑

在 Kubernetes 集群内访问 TiDB 时,使用 TiDB service 域名 ${cluster_name}-tidb.${namespace} 即可。

若需要在集群外访问,则需将 TiDB 服务端口暴露出去。在 TidbCluster CR 中,通过 spec.tidb.service 字段进行配置:

spec:
  ...
  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 ${cluster_name}-tidb -ojsonpath="{.spec.ports[?(@.name=='mysql-client')].nodePort}{'\n'}"

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

  • externalTrafficPolicy 为 Cluster 时,所有节点 IP 均可

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

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

LoadBalancer

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

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3136682/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39969