fgedu.net.cn
目录
一、基础概念
1.1 容器化定义
容器化是指将应用程序及其依赖打包成容器镜像,在容器环境中运行的技术。容器化可以提供一致的运行环境,简化部署和管理流程。
1.2 Kubernetes
Kubernetes是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。TiDB可以在Kubernetes上部署,利用其强大的编排能力。
1.3 TiDB Operator
TiDB Operator是一个Kubernetes operator,用于在Kubernetes集群上管理TiDB集群的生命周期,包括部署、扩缩容、升级等操作。
1.4 容器化优势
- 一致性:容器镜像提供一致的运行环境
- 便携性:容器可以在不同环境中运行
- 隔离性:容器之间相互隔离
- 可扩展性:通过Kubernetes实现自动扩缩容
- 管理简化:通过Kubernetes统一管理容器
二、规划建议
2.1 环境规划
- Kubernetes集群:准备一个运行中的Kubernetes集群
- 存储:配置持久化存储,如PVC
- 网络:确保Kubernetes集群网络正常
- 资源:根据TiDB集群规模规划CPU和内存资源
2.2 部署模式
- 单集群部署:在单个Kubernetes集群中部署TiDB
- 多集群部署:在多个Kubernetes集群中部署TiDB,实现跨区域容灾
- 混合部署:结合物理机和容器部署
2.3 存储规划
- TiKV存储:使用高性能存储,如SSD
- PD存储:使用可靠的存储
- 监控存储:存储监控数据
三、实施方案
3.1 部署Kubernetes集群
使用k3s部署轻量级Kubernetes
# 安装k3s
curl -sfL https://get.k3s.io | sh -
# 查看节点状态
kubectl get nodes
# 查看集群状态
kubectl cluster-info
NAME STATUS ROLES AGE VERSION k3s-server Ready control-plane,master 1h v1.26.0+k3s1 Kubernetes control plane is running at https://127.0.0.1:6443 CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy Metrics-server is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy
使用kind部署本地Kubernetes集群
# 安装kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/
# 创建集群
kind create cluster --name tidb-cluster
# 查看集群状态
kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443 CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy Metrics-server is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy
风哥提示:
3.2 部署TiDB Operator
使用Helm部署TiDB Operator
# 添加TiDB Operator Helm仓库
helm repo add pingcap https://charts.pingcap.org/
# 更新Helm仓库
helm repo update
# 安装TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-admin --create-namespace
# 查看TiDB Operator状态
kubectl get pods -n tidb-admin
NAME READY STATUS RESTARTS AGE tidb-operator-7f7c5d8b9c-5f6k9 1/1 Running 0 10m tidb-scheduler-5c687f9f74-7b8h6 1/1 Running 0 10m tidb-backup-manager-5d5d9f5c7-9k8z8 1/1 Running 0 10m
3.3 部署TiDB集群
使用Helm部署TiDB集群
# 创建命名空间
kubectl create namespace tidb-cluster
# 部署TiDB集群
helm install tidb-cluster pingcap/tidb-cluster --namespace tidb-cluster --set pd.replicas=3 --set tikv.replicas=3 --set tidb.replicas=2
# 查看集群状态
kubectl get pods -n tidb-cluster
NAME READY STATUS RESTARTS AGE tidb-cluster-pd-0 1/1 Running 0 10m tidb-cluster-pd-1 1/1 Running 0 10m tidb-cluster-pd-2 1/1 Running 0 10m tidb-cluster-tikv-0 1/1 Running 0 10m tidb-cluster-tikv-1 1/1 Running 0 10m tidb-cluster-tikv-2 1/1 Running 0 10m tidb-cluster-tidb-0 1/1 Running 0 10m tidb-cluster-tidb-1 1/1 Running 0 10m tidb-cluster-monitor-0 3/3 Running 0 10m tidb-cluster-grafana-6d8f9f9c4f-8k8k8 1/1 Running 0 10m
查看集群服务
# 查看服务
kubectl get services -n tidb-cluster
# 查看TiDB服务
kubectl get svc tidb-cluster-tidb -n tidb-cluster
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tidb-cluster-pd ClusterIP 10.43.128.1312379/TCP,2380/TCP 10m tidb-cluster-tikv ClusterIP None 20160/TCP,20180/TCP 10m tidb-cluster-tidb ClusterIP 10.43.145.187 4000/TCP,10080/TCP 10m tidb-cluster-monitor ClusterIP 10.43.181.228 9090/TCP,3000/TCP,9093/TCP,9094/TCP 10m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tidb-cluster-tidb ClusterIP 10.43.145.187 4000/TCP,10080/TCP 10m
3.4 访问TiDB集群
端口转发访问TiDB
# 端口转发
kubectl port-forward svc/tidb-cluster-tidb 4000:4000 -n tidb-cluster &
# 连接TiDB
mysql -h 127.0.0.1 -P 4000 -u root -p
# 查看集群状态
SHOW STATUS LIKE 'TiDB%';
# 创建数据库和表
CREATE DATABASE fgedudb;
USE fgedudb;
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT NOT NULL,
created_at DATETIME NOT NULL
);
# 插入数据
INSERT INTO fgedu_users VALUES (1, 'admin', 'admin@example.com', 30, NOW());
INSERT INTO fgedu_users VALUES (2, 'user1', 'user1@example.com', 25, NOW());
# 查询数据
SELECT * FROM fgedu_users;
+------+----------+------------------+-----+---------------------+ | id | username | email | age | created_at | +------+----------+------------------+-----+---------------------+ | 1 | admin | admin@example.com | 30 | 2024-04-09 10:00:00 | | 2 | user1 | user1@example.com | 25 | 2024-04-09 10:00:00 | +------+----------+------------------+-----+---------------------+
学习交流加群风哥QQ113257174
访问Grafana监控
# 端口转发
kubectl port-forward svc/tidb-cluster-monitor 3000:3000 -n tidb-cluster &
# 访问Grafana
# 地址:http://127.0.0.1:3000
# 默认用户名:admin,密码:admin
3.5 集群管理
扩缩容TiDB集群
# 扩缩容TiKV节点
helm upgrade tidb-cluster pingcap/tidb-cluster --namespace tidb-cluster --set tikv.replicas=4
# 扩缩容TiDB节点
helm upgrade tidb-cluster pingcap/tidb-cluster --namespace tidb-cluster --set tidb.replicas=3
# 查看集群状态
kubectl get pods -n tidb-cluster
升级TiDB集群
# 升级TiDB集群
helm upgrade tidb-cluster pingcap/tidb-cluster --namespace tidb-cluster --set imageTag=v7.5.0
# 查看升级状态
kubectl get pods -n tidb-cluster
备份与恢复
# 创建备份
kubectl apply -f backup.yaml
# backup.yaml示例
apiVersion: pingcap.com/v1alpha1
kind: Backup
metadata:
name: backup-example
namespace: tidb-cluster
spec:
backupType: full
br:
cluster: tidb-cluster
clusterNamespace: tidb-cluster
from:
host: tidb-cluster-tidb
port: 4000
user: root
storage:
provider: s3
s3:
provider: aws
region: us-east-1
bucket: tidb-backup
prefix: backup-$(date +%Y%m%d-%H%M%S)
accessKey: AKIA...
secretKey: ...
# 查看备份状态
kubectl get backup -n tidb-cluster
# 执行恢复
kubectl apply -f restore.yaml
# restore.yaml示例
apiVersion: pingcap.com/v1alpha1
kind: Restore
metadata:
name: restore-example
namespace: tidb-cluster
spec:
backupType: full
br:
cluster: tidb-cluster
clusterNamespace: tidb-cluster
to:
host: tidb-cluster-tidb
port: 4000
user: root
storage:
provider: s3
s3:
provider: aws
region: us-east-1
bucket: tidb-backup
prefix: backup-20240409-100000
accessKey: AKIA...
secretKey: ...
# 查看恢复状态
kubectl get restore -n tidb-cluster
四、实战案例
4.1 生产环境容器化部署
场景:企业需要在生产环境中容器化部署TiDB集群,确保高可用和可管理性。
步骤1:准备Kubernetes集群
# 部署生产级Kubernetes集群
# 使用kubeadm部署Kubernetes
# 安装必要的组件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml
# 配置存储类
kubectl apply -f storageclass.yaml
# storageclass.yaml示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
步骤2:部署TiDB Operator
# 添加TiDB Operator Helm仓库
helm repo add pingcap https://charts.pingcap.org/
helm repo update
# 安装TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-admin --create-namespace --set operator.image.tag=v1.5.0
# 查看TiDB Operator状态
kubectl get pods -n tidb-admin
NAME READY STATUS RESTARTS AGE tidb-operator-7f7c5d8b9c-5f6k9 1/1 Running 0 10m tidb-scheduler-5c687f9f74-7b8h6 1/1 Running 0 10m tidb-backup-manager-5d5d9f5c7-9k8z8 1/1 Running 0 10m
步骤3:部署TiDB集群
# 创建命名空间
kubectl create namespace tidb-prod
# 部署TiDB集群
helm install tidb-prod pingcap/tidb-cluster --namespace tidb-prod --values tidb-values.yaml
# tidb-values.yaml示例
pd:
replicas: 3
requests:
cpu: 2
memory: 4Gi
limits:
cpu: 4
memory: 8Gi
tikv:
replicas: 5
requests:
cpu: 4
memory: 8Gi
limits:
cpu: 8
memory: 16Gi
storage:
storageClassName: standard
size: 100Gi
tidb:
replicas: 3
requests:
cpu: 4
memory: 8Gi
limits:
cpu: 8
memory: 16Gi
service:
type: LoadBalancer
monitor:
enabled: true
requests:
cpu: 2
memory: 4Gi
limits:
cpu: 4
memory: 8Gi
# 查看集群状态
kubectl get pods -n tidb-prod
NAME READY STATUS RESTARTS AGE tidb-prod-pd-0 1/1 Running 0 10m tidb-prod-pd-1 1/1 Running 0 10m tidb-prod-pd-2 1/1 Running 0 10m tidb-prod-tikv-0 1/1 Running 0 10m tidb-prod-tikv-1 1/1 Running 0 10m tidb-prod-tikv-2 1/1 Running 0 10m tidb-prod-tikv-3 1/1 Running 0 10m tidb-prod-tikv-4 1/1 Running 0 10m tidb-prod-tidb-0 1/1 Running 0 10m tidb-prod-tidb-1 1/1 Running 0 10m tidb-prod-tidb-2 1/1 Running 0 10m tidb-prod-monitor-0 3/3 Running 0 10m tidb-prod-grafana-6d8f9f9c4f-8k8k8 1/1 Running 0 10m
步骤4:配置访问
# 查看TiDB服务
kubectl get svc tidb-prod-tidb -n tidb-prod
# 配置Ingress
kubectl apply -f ingress.yaml
# ingress.yaml示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tidb-ingress
namespace: tidb-prod
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: tidb.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tidb-prod-tidb
port:
number: 4000
# 配置监控访问
kubectl apply -f monitor-ingress.yaml
# monitor-ingress.yaml示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: monitor-ingress
namespace: tidb-prod
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: monitor.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tidb-prod-monitor
port:
number: 3000
五、经验总结
5.1 容器化部署最佳实践
- 使用TiDB Operator:TiDB Operator简化了TiDB集群在Kubernetes上的管理
- 合理配置资源:根据集群规模和业务需求配置CPU和内存资源
- 使用持久化存储:为TiKV和PD配置持久化存储
- 配置监控:启用监控组件,及时发现和处理问题
- 定期备份:制定完善的备份策略
- 测试升级:在测试环境中测试升级过程
5.2 容器化管理最佳实践
- 使用Helm管理:使用Helm进行应用管理和版本控制
- 自动化部署:使用CI/CD工具实现自动化部署
- 监控容器状态:监控容器的运行状态和资源使用情况
- 日志管理:收集和分析容器日志
- 安全管理:配置容器安全策略
5.3 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Pod启动失败 | 资源不足、配置错误 | 检查资源配置,查看Pod日志 |
| 存储问题 | PVC创建失败、存储类配置错误 | 检查存储类配置,确保存储可用 |
| 网络问题 | 网络策略限制、DNS配置错误 | 检查网络策略,配置DNS |
| 性能问题 | 资源配置不足、存储性能差 | 增加资源配置,使用高性能存储 |
| 升级失败 | 版本不兼容、资源不足 | 检查版本兼容性,确保资源充足 |
5.4 容器化部署检查清单
| 检查项 | 配置要求 | 状态 |
|---|---|---|
| Kubernetes集群 | Kubernetes集群运行正常 | □ |
| TiDB Operator | TiDB Operator部署成功 | □ |
| 存储配置 | 持久化存储配置正确 | □ |
| 资源配置 | CPU和内存资源配置合理 | □ |
| 监控配置 | 监控组件部署成功 | □ |
| 备份策略 | 备份策略配置正确 | □ |
| 访问配置 | 访问方式配置正确 | □ |
| 安全配置 | 安全策略配置正确 | □ |
更多视频教程www.fgedu.net.cn
© 2024 TiDB数据库培训文档
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
