前提条件
K8S集群外的服务器节点和K8S集群内的Pod网络必须保持互通(本文采用将物理机节点加入K8S集群然后打污点并驱逐该服务器里边的pod的方式来实现)
K8S机器外的服务器节点必须可以通过添加解析的方式来解析K8S集群内部Pod域名(具体见第一步)
待迁移集群没有开启组件间 TLS 加密通信
环境
目前环境主要配置如下:
序号
环境
集群名称
组件
数量
备注
1
IDC
tidb-idc
tidb
1
2
pd
3
3
tikv
3
4
K8S环境
tidb-test
tidb
2
命名空间为lqbyz
5
pd
3
6
tikv
3
物理机dashboard如下
第一步:在待迁移的物理机集群的所有节点中配置K8S集群内的DNS解析服务
获取K8S集群CoreDNS 或 kube-dns 服务的 endpoints 的 Pod ip 地址列表:
kubectl
describe svc
/kube
-dns
-n kube
-system
修改所有待迁移物理机集群的节点/etc/resolv.conf配置,添加如下配置
search
default.svc
.cluster
.local svc
.cluster
.local cluster
.local
nameserver
<CoreDNS Pod_IP_1
>
nameserver
<CoreDNS Pod_IP_2
>
nameserver
<CoreDNS Pod_IP_n
>
vi
/etc
/resolv
.conf
search
default.svc
.cluster
.local svc
.cluster
.local cluster
.local svc
.cluster
.local
nameserver
10.244.0.32
nameserver
10.244.0.33
通过ping在物理机节点测试K8S集群内域名是否正常访问
第二步:在K8S中创建TiDB集群
查看pd节点的地址和端口号
pd
-ctl
-u http:
//<address>:<port> member | jq .members | .[] | .client_urls
##执行结果如下:
[root
@tiup-172-16-5-144 ctl
]# ./pd-ctl -u http://172.16.5.144:2379 member | jq .members | .[] | .client_urls
[
"http://172.16.5.144:2379"
]
[
"http://172.16.5.198:2379"
]
[
"http://172.16.6.132:2379"
]
在K8S中创建目标TiDB集群(TiKV 节点个数不少于 3 个),并在 spec.pdAddresses 字段中指定待迁移 TiDB 集群的 PD 节点地址(以 http:// 开头)
spec
...
pdAddresses:
- http:
//pd1_addr:port
- http:
//pd2_addr:port
- http:
//pd3_addr:port
### 具体配置如下,仅供参:
apiVersion: pingcap
.com
/v1alpha1
kind: TidbCluster
metadata:
name: tidb
-test
namespace: lqbyz
spec:
version:
"v6.5.0"
timezone: Asia
/Shanghai
hostNetwork:
true
imagePullPolicy: IfNotPresent
enableDynamicConfiguration:
true
configUpdateStrategy: RollingUpdate
pdAddresses:
- http:
//172.16.5.xxx:2379
- http:
//172.16.5.xxx:2379
- http:
//172.16.6.xxx:2379
pd:
baseImage: pingcap
/pd
requests:
cpu:
"100m"
memory:
"400Mi"
storage:
12Gi
limits:
cpu:
"2000m"
memory:
"4Gi"
config:
|
[dashboard
]
internal
-proxy
= true
lease
= 3
enable-prevote
= true
replicas:
3
mountClusterClientSecret:
false
storageClassName:
"local-hostpath"
tidb:
baseImage: pingcap
/tidb
maxFailoverCount:
6
replicas:
2
config: {}
service:
externalTrafficPolicy: Cluster
type: NodePort
mysqlNodePort:
30082
statusNodePort:
30092
tikv:
baseImage: pingcap
/tikv
replicas:
3
requests:
cpu:
"100m"
memory:
"400Mi"
storage:
50Gi
limits:
cpu:
"2000m"
memory:
"4Gi"
maxFailoverCount:
6
mountClusterClientSecret:
false
storageClassName:
"local-hostpath"
config: {}
enablePVReclaim:
false
pvReclaimPolicy:
Delete
tlsCluster: {}
通过apply应用改配置,确认部署在 Kubernetes 内的 TiDB 集群与待迁移物理机 TiDB 集群组成的新集群是否正常运行。
在dashboar上可以查看所有组件信息
第三步:逐步缩容待迁移物理机集群各服务组件
缩容待迁移的集群物理机的 TiDB节点,将TiDB节点缩容至0
如果待迁移集群使用 TiUP 部署,参考缩容 TiDB/PD/TiKV 节点一节。
如果待迁移集群使用 TiDB Ansible 部署,参考缩容 TiDB 节点一节。
若通过负载均衡或数据库访问层中间件的方式接入待迁移 TiDB集群,则先修改配置,将业务流量迁移至目标 TiDB 集群,避免影响业务。
缩容待迁移集群物理机的 TiKV 节点,将TiKV节点缩容至0
如果待迁移集群使用 TiUP 部署,参考缩容 TiDB/PD/TiKV 节点一节。
如果待迁移集群使用 TiDB Ansible 部署,参考缩容 TiKV 节点一节。
依次缩容待迁移集群的 TiKV 节点,等待上一个 TiKV 节点对应的 store 状态变为 "tombstone" 后,再执行下一个 TiKV 节点的缩容操作。
可通过 PD Control 工具查看 store 状态
缩容待迁移集群 PD 节点,将TiKV节点缩容至0
如果待迁移集群使用 TiUP 部署,参考缩容 TiDB/PD/TiKV 节点一节。
如果待迁移集群使用 TiDB Ansible 部署,参考缩容 PD 节点一节。
第四部:删除容器环境下spec.pdAddresses字段
为避免后续对集群进行操作时产生困惑,迁移成功后,建议将新集群的 manifest 中的 spec.pdAddresses 字段删除。
总结
本文介绍通过Tiup部署管理的TiDB集群在不借助备份恢复工具通过和K8S网络打通将TiDB数据库迁移到通过tidb Operator管理的K8S环境中,从而实现由物理机迁移到K8S环境的目的,也可实现物理机和容器共同管理TiDB集群,最后通过缩容物理机实现tidb集群不需要中间工具就可以迁移到容器环境中。