TiDB 在 IPv6 的 K8S 和物理机环境的部署
作者: pepezzzz 原文来源:https://tidb.net/blog/e9b6a169
背景
随着国内对 IPv6 发展的推进,节点环境的地址段逐渐向 IPv6 转换,尤其是云数据中心的集群部署。人民银行、工信部等八部门近日联合下发《关于推进 IPv6 技术演进和应用创新发展的实施意见》,对不同行业的环境部署也做了要求。
TiDB 从 v6.5.1 起,由 v1.4.3 或以上版本的 TiDB Operator 部署的 TiDB 全栈支持 IPv6 地址,这意味着 TiDB 可以支持更大的地址空间,并提供更好的安全性和网络性能。
基于 tidb-operator 的 IPv6 K8S 环境的部署
环境要求
Kubernetes 环境需要支持 IPv6。
如果是双栈的 Kubernetes 环境,tidb-operator 需要使用 1.5 版本,CoreDNS 环境需要支持双栈地址解析,能将 service 域名解析到双栈地址(推荐)。
如果是 IPv6 单栈的 Kubernetes 环境,tidb-operator 需要使用 1.4.3 以上版本,CoreDNS 不能对 ipv4 的响应超时,比如关闭 coredns 对 ipv4 解析的 forward。
TiDB 使用 6.5.1 或者更新的版本,容器使用 containerd 时要使用 6.5.2。
安装过程的关键步骤
TiDB 集群开启支持 IPv6 参数。
双栈环境常见问题
TiKV 启动过程中,连接不上 PD,实际上 pd-ctl 工具是正常工作的。
原因 1:
TiKV GRPC 技术依赖双栈 IP,要求双栈 IP 同时返回。
When host enables IPv6 support, gRPC will try to query both IPv4 and IPv6 addresses and return success only when both requests finish. However DNS doesn’t work properly always. If it can only provide one type of address and hang on the other, it will wait till timeout. The default timeout is 120s, which is longer than any client timeout in TiKV, so all requests will fail even it can provide service as there is still address returned.
Coredns 只返回双栈 svc 的 ipv6 的地址,ipv4 的地址返回超时。
解决方案 1:升级 coredns 到 1.8.1
原因 2:
在 IPv6 优先的双栈 K8S 环境中,SVC 的 IP Family Policy 仅有 SingleStack。
原因分析:
SVC 的默认单栈 IP 由集群的第一段 cluster ip 范围指定。 The address family of a Service defaults to the address family of the first service cluster IP range (configured via the --service-cluster-ip-range flag to the kube-apiserver).
k8s 环境第一段 cluster ip 范围是 ipv6 的地址段。 --service-cluster-ip-range=2001:db8:42:1::/112,10.96.0.0/16
Operator 1.4 调用的 k8s 库只能使用默认情况。
临时方法:
在 Operator 创建 IPv6 地址 的 SVC 后,手工编辑 SVC(包括 tidbclulocal-pd-peer、tidbclulocal-tikv-peer 等),将定义中的 ipFamilyPolicy 改成 PreferDualStack,实现双栈的 SVC。
修改后的效果。
TIKV Pod 内能正确解析到双栈 IP 了。
手工使用 kubectl patch
的方法不能用于生产。
最终方法:
升级 Operator 到 1.5 版本后,可以自动创建 PreferDualStack 的双栈 SVC。
基于 TiUP 的 IPv6 物理机环境的部署
环境要求
TiDB 使用 6.5.1 或者更新的版本。
Tiup cluster 需要 v1.12.1 版本,如果部署指定 listen_host 需要更新的版本(当前的时间点是 nightly)。
离线环境请从上述网址下载解压后,替换 {HOME}/.tiup 目录下的二进制。
部署环境中具备 DNS,能将节点域名解析到 IPv6 地址。
集群节点中已经正确配置 IPv6 地址网段。如下图中的
inet6 2401:1d40:x:x::20a/128
。
安装过程的关键步骤
配置 YAML 文件并指定域名做为节点。
参考常见问题 3,如果 cluster 组件已经更新到最新版本后,可以手工配置 yaml 文件中的节点添加 listen_host 指定为 '::'
。
常见问题
集群启动时,ssh 报错
Invalid argument
。
手工验证 ssh 节点同样的报错
原因:节点没有正确的配置 IPv6 地址,或公有云上没有正确配置 vpc 的 IPv6 网段。主机上的 IPv6 地址信息是 fec0,属于协议规范的本地 IP 段,类似 IPv4 的 169.254.0.0/16。
解决方案:需要配置正确的 IPv6 地址,或公有云正确配置 vpc 的 IPv6 网段。修改后信息如下:
TiUP 部署使用 YAML 文件,节点直接使用 IPv6 地址,部分功能异常。
https://github.com/pingcap/tidb/issues/43286
https://github.com/pingcap/tidb-dashboard/pull/1516
原因:代码上有 IPv6 地址不兼容的地方。
解决方案: 需要在部署时改成域名方式。
TiKV 的监控面板没数据,Prometheus 的 target 内显示连接被拒。
原因:脚本中 status-addr 地址监听只在 ipv4 地址,需要修改为 IPv6 地址。
解决方案: tiup 目前没有类似 tidb-operator 的 preferIPv6 的参数,cluster 组件更新到最新版本后,可以手工配置 yaml 文件中的节点添加 listen_host 指定为 '::'
。
如果 tiup cluster 组件未更新,tiup cluster edit
保存时会报 New topology could not be saved: immutable field changed: TiDBServers.0.ListenHost changed from '' to '::'
。临时方案是在部署完成后手动修改 ~/.tiup/storage/cluster/clusters/{cluster_name}/meta.yaml,再使用 tiup cluster reload
。
IPv6 通讯验证
使用 tcpdump 可以看到包通讯的地址类别。
总结
TiDB 从 v6.5.1 起,由 v1.4.3 或以上版本的 TiDB Operator 部署的 TiDB 全栈支持 IPv6 地址。
通过扩展验证,可以与 K8S 环境中一样使用域名的方式在物理机环境中支持 IPv6 地址。
附:物理机环境实验用 DNS 的配置
配置 bind 的 named.conf 配置文件,主要修改如下:
添加 listen-on 的监听 IP
添加 allow-query 的子网
添加 .tidb 域名的配置
添加 .tidb 域名主机单栈或者双栈的 IP
可选配置 PTR 域名(略)
视业务需要可以配置双栈域名
服务启动
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/567986ca9e989d0599b5a24fe】。文章转载请联系作者。
评论