yashandb教程FG190-YashanDB K8s高可用配置
本文档风哥主要介绍YashanDB K8s高可用配置相关知识,包括Kubernetes的概念、高可用架构、YashanDB K8s高可用的优势、规划与环境要求、部署实现、监控、故障排查、生产案例与实战讲解等内容,风哥教程参考YashanDB官方文档Kubernetes部署内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Kubernetes的概念
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用。Kubernetes提供了一套完整的解决方案,包括容器编排、服务发现、负载均衡、自动扩缩容、存储管理等功能。更多视频教程www.fgedu.net.cn
- Pod:Kubernetes的最小部署单位,包含一个或多个容器
- Deployment:管理Pod的副本,确保指定数量的Pod运行
- Service:提供稳定的网络访问点,用于访问Pod
- PersistentVolume (PV):持久化存储卷
- PersistentVolumeClaim (PVC):对PV的请求
- Namespace:逻辑隔离的资源组
- ConfigMap:存储配置信息
- Secret:存储敏感信息
1.2 Kubernetes高可用架构
Kubernetes高可用架构通常包括以下组件:
- 控制平面:包括API Server、etcd、Controller Manager、Scheduler等组件,通常部署多个副本以实现高可用
- 节点:运行Pod的服务器,通常部署多个节点以实现高可用
- 存储:提供持久化存储,通常使用分布式存储以实现高可用
- 网络:提供容器间通信,通常使用CNI插件以实现网络高可用
1.3 YashanDB K8s高可用的优势
YashanDB K8s高可用的优势包括:
- 自动故障转移:当节点或Pod故障时,自动将工作负载转移到其他节点
- 弹性伸缩:根据负载自动调整Pod数量
- 服务发现:自动发现和注册服务,简化服务间通信
- 负载均衡:自动分发客户端请求
- 存储管理:提供持久化存储解决方案
- 配置管理:集中管理配置信息
- 监控告警:集成监控系统,及时发现和解决问题
Part02-生产环境规划与建议
2.1 YashanDB K8s高可用规划
YashanDB K8s高可用规划建议:
– 控制平面高可用:部署多个控制平面节点,确保API Server、etcd等组件的高可用
– 节点高可用:部署多个工作节点,确保Pod的高可用
– 存储高可用:使用分布式存储,确保数据的高可用
– 网络高可用:配置冗余网络,确保网络的高可用
– 应用高可用:部署多个Pod副本,确保应用的高可用
# 高可用架构选择
– 控制平面:至少3个节点,实现etcd集群的高可用
– 工作节点:至少3个节点,实现Pod的高可用
– 存储:使用分布式存储,如Ceph、GlusterFS等
– 网络:使用CNI插件,如Calico、Flannel等
# 资源规划
– 控制平面节点:至少8GB内存,4核CPU
– 工作节点:至少16GB内存,8核CPU
– 存储:根据数据量确定,建议至少200GB
– 网络:至少1Gbps带宽
2.2 YashanDB K8s高可用环境要求
YashanDB K8s高可用环境要求:
– Kubernetes版本:1.18+
– Docker版本:19.03+
– 控制平面节点:至少3个
– 工作节点:至少3个
– 内存:每个节点至少8GB内存
– CPU:每个节点至少4核CPU
– 存储:每个节点至少100GB磁盘空间
– 网络:节点间网络延迟低于10ms
# 存储要求
– 存储类型:SSD
– 容量:根据数据量确定,建议至少200GB
– IOPS:至少1000 IOPS
– 延迟:低于10ms
# 网络要求
– 网络带宽:至少1Gbps
– 网络延迟:节点间延迟低于10ms
– 网络稳定性:99.99%可用性
2.3 YashanDB K8s高可用最佳实践
YashanDB K8s高可用最佳实践:
# 1. 控制平面高可用
– 部署至少3个控制平面节点
– 配置etcd集群,实现数据持久化
– 使用负载均衡器分发API Server请求
# 2. 工作节点高可用
– 部署至少3个工作节点
– 配置节点亲和性,将Pod部署在不同节点
– 配置Pod反亲和性,避免多个Pod副本部署在同一节点
# 3. 存储高可用
– 使用分布式存储,如Ceph、GlusterFS等
– 配置PersistentVolumeClaim,确保数据持久化
– 定期备份数据,确保数据安全
# 4. 网络高可用
– 使用CNI插件,如Calico、Flannel等
– 配置网络策略,确保网络安全
– 实现网络冗余,确保网络可靠性
# 5. 应用高可用
– 部署多个Pod副本
– 配置就绪探针和存活探针
– 使用Service实现负载均衡
– 配置自动扩缩容
Part03-生产环境项目实施方案
3.1 YashanDB K8s高可用部署实现
3.1.1 部署Kubernetes集群
# 1. 安装kubeadm、kubelet、kubectl
$ apt-get update && apt-get install -y kubeadm kubelet kubectl
# 2. 初始化控制平面节点
$ kubeadm init –control-plane-endpoint “vip:6443” –upload-certs
# 3. 加入其他控制平面节点
$ kubeadm join vip:6443 –token
# 4. 加入工作节点
$ kubeadm join vip:6443 –token
# 5. 安装网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 6. 验证集群状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,master 1h v1.20.4
master2 Ready control-plane,master 1h v1.20.4
master3 Ready control-plane,master 1h v1.20.4
worker1 Ready
worker2 Ready
worker3 Ready
3.1.2 部署YashanDB高可用集群
# 1. 创建命名空间
$ kubectl create namespace yashanb
# 2. 创建存储类
$ cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: yashanb-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
iopsPerGB: “10”
encrypted: “true”
reclaimPolicy: Retain
allowVolumeExpansion: true
$ kubectl apply -f storageclass.yaml
# 3. 创建持久卷声明
$ cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yashanb-pvc
namespace: yashanb
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 200Gi
storageClassName: yashanb-storage
$ kubectl apply -f pvc.yaml
# 4. 创建YashanDB主实例
$ cat yashanb-master.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-master
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: master
template:
metadata:
labels:
app: yashanb
role: master
spec:
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
volumeMounts:
– name: yashanb-data
mountPath: /data
volumes:
– name: yashanb-data
persistentVolumeClaim:
claimName: yashanb-pvc
$ kubectl apply -f yashanb-master.yaml
# 5. 创建YashanDB备实例
$ cat yashanb-slave.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-slave
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: slave
template:
metadata:
labels:
app: yashanb
role: slave
spec:
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
– name: REPLICATION_ROLE
value: slave
– name: MASTER_HOST
value: yashanb-master
– name: MASTER_PORT
value: “1521”
– name: MASTER_USER
value: replication
– name: MASTER_PASSWORD
value: replication123
volumeMounts:
– name: yashanb-data-slave
mountPath: /data
volumes:
– name: yashanb-data-slave
persistentVolumeClaim:
claimName: yashanb-pvc-slave
$ kubectl apply -f yashanb-slave.yaml
# 6. 创建Service
$ cat yashanb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: yashanb
namespace: yashanb
spec:
selector:
app: yashanb
ports:
– port: 1521
targetPort: 1521
type: ClusterIP
$ kubectl apply -f yashanb-service.yaml
# 7. 创建Ingress
$ cat yashanb-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yashanb-ingress
namespace: yashanb
spec:
rules:
– host: yashanb.fgedu.net.cn
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: yashanb
port:
number: 1521
$ kubectl apply -f yashanb-ingress.yaml
3.1.3 配置YashanDB K8s高可用
# 1. 配置PodDisruptionBudget
$ cat pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: yashanb-pdb
namespace: yashanb
spec:
minAvailable: 1
selector:
matchLabels:
app: yashanb
$ kubectl apply -f pdb.yaml
# 2. 配置HorizontalPodAutoscaler
$ cat hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: yashanb-hpa
namespace: yashanb
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: yashanb-master
minReplicas: 1
maxReplicas: 3
metrics:
– type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
– type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
$ kubectl apply -f hpa.yaml
# 3. 配置Pod亲和性和反亲和性
$ cat yashanb-master-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-master
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: master
template:
metadata:
labels:
app: yashanb
role: master
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: app
operator: In
values:
– yashanb
topologyKey: “kubernetes.io/hostname”
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
volumeMounts:
– name: yashanb-data
mountPath: /data
volumes:
– name: yashanb-data
persistentVolumeClaim:
claimName: yashanb-pvc
$ kubectl apply -f yashanb-master-affinity.yaml
3.2 YashanDB K8s高可用监控
3.2.1 K8s监控配置
# 1. 部署Prometheus和Grafana
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack
# 2. 查看Prometheus和Grafana服务
$ kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-operated ClusterIP None
prometheus-operator ClusterIP 10.96.0.100
grafana ClusterIP 10.96.0.101
# 3. 访问Grafana
# 端口转发
$ kubectl port-forward svc/grafana 3000:3000 -n monitoring
# 访问http://localhost:3000
# 默认用户名:admin
# 默认密码:prom-operator
# 4. 导入YashanDB监控面板
# 在Grafana中导入面板ID:12345(示例)
3.2.2 YashanDB K8s监控脚本
# k8s_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# K8s监控脚本
# 输出文件
output_file=”/tmp/k8s_monitor_$(date +%Y%m%d_%H%M%S).log”
echo “开始监控YashanDB K8s高可用” > ${output_file}
echo “监控时间: $(date)” >> ${output_file}
echo “” >> ${output_file}
# 查看集群状态
echo “===== 集群状态 ====” >> ${output_file}
kubectl cluster-info >> ${output_file}
echo “” >> ${output_file}
# 查看节点状态
echo “===== 节点状态 ====” >> ${output_file}
kubectl get nodes >> ${output_file}
echo “” >> ${output_file}
# 查看Pod状态
echo “===== Pod状态 ====” >> ${output_file}
kubectl get pods -n yashanb >> ${output_file}
echo “” >> ${output_file}
# 查看Service状态
echo “===== Service状态 ====” >> ${output_file}
kubectl get svc -n yashanb >> ${output_file}
echo “” >> ${output_file}
# 查看存储状态
echo “===== 存储状态 ====” >> ${output_file}
kubectl get pvc -n yashanb >> ${output_file}
echo “” >> ${output_file}
# 查看数据库状态
echo “===== 数据库状态 ====” >> ${output_file}
kubectl exec -it $(kubectl get pods -n yashanb -l app=yashanb,role=master -o name) -n yashanb — bash -c “sqlplus -s fgedu/fgedu123@localhost:1521/fgedudb << EOF
SELECT status FROM v\$instance;
EXIT;
EOF" >> ${output_file}
echo “” >> ${output_file}
echo “监控完成,结果保存至:${output_file}” >> ${output_file}
echo “监控完成,结果保存至:${output_file}”
3.3 YashanDB K8s高可用故障排查
3.3.1 YashanDB K8s故障排查步骤
# 1. 检查集群状态
$ kubectl cluster-info
$ kubectl get nodes
# 2. 检查Pod状态
$ kubectl get pods -n yashanb
$ kubectl describe pod
# 3. 检查Pod日志
$ kubectl logs
$ kubectl logs
# 4. 检查Service状态
$ kubectl get svc -n yashanb
$ kubectl describe svc
# 5. 检查存储状态
$ kubectl get pvc -n yashanb
$ kubectl describe pvc
# 6. 检查网络状态 # 7. 检查数据库状态 # 检查存储 # 检查网络
$ kubectl exec -it
$ kubectl exec -it
$ kubectl exec -it
$ kubectl describe pvc
$ kubectl get networkpolicies -n yashanb
3.3.2 YashanDB K8s常见错误及解决方法
# 错误1:Pod启动失败
ERROR: failed to start container “yashanb”: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”start.sh\”: executable file not found in $PATH”
# 解决方法:检查镜像是否正确,确保启动脚本存在
# 错误2:持久化存储失败
ERROR: failed to mount volume “yashanb-data”: failed to mount volume: timed out waiting for the condition
# 解决方法:检查存储配置,确保存储可用
# 错误3:Service无法访问
ERROR: ORA-12154: TNS:could not resolve the connect identifier specified
# 解决方法:检查Service配置,确保Service名称正确
# 错误4:Pod调度失败
ERROR: 0/6 nodes are available: 3 node(s) had taints that the pod didn’t tolerate, 3 node(s) didn’t match pod affinity/anti-affinity rules.
# 解决方法:检查节点亲和性配置,确保Pod可以调度到节点
# 错误5:资源不足
ERROR: 0/6 nodes are available: 6 Insufficient memory.
# 解决方法:增加节点资源,或调整Pod资源限制
Part04-生产案例与实战讲解
4.1 YashanDB K8s高可用部署案例一
案例背景:某企业需要在Kubernetes集群中部署YashanDB高可用集群,确保数据库服务的可靠性。
# 1. 环境准备
– Kubernetes集群:3个控制平面节点,3个工作节点
– Kubernetes版本:1.20.4
– Docker版本:20.10.8
– 存储:AWS EBS
– 网络:Calico
# 2. 部署步骤
# 创建命名空间
$ kubectl create namespace yashanb
# 创建存储类
$ cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp2
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
iopsPerGB: “10”
encrypted: “true”
reclaimPolicy: Retain
allowVolumeExpansion: true
$ kubectl apply -f storageclass.yaml
# 创建持久卷声明
$ cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yashanb-pvc
namespace: yashanb
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 200Gi
storageClassName: gp2
$ kubectl apply -f pvc.yaml
# 创建YashanDB主实例
$ cat yashanb-master.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-master
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: master
template:
metadata:
labels:
app: yashanb
role: master
spec:
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
volumeMounts:
– name: yashanb-data
mountPath: /data
volumes:
– name: yashanb-data
persistentVolumeClaim:
claimName: yashanb-pvc
$ kubectl apply -f yashanb-master.yaml
# 创建YashanDB备实例
$ cat yashanb-slave.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-slave
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: slave
template:
metadata:
labels:
app: yashanb
role: slave
spec:
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
– name: REPLICATION_ROLE
value: slave
– name: MASTER_HOST
value: yashanb-master
– name: MASTER_PORT
value: “1521”
– name: MASTER_USER
value: replication
– name: MASTER_PASSWORD
value: replication123
volumeMounts:
– name: yashanb-data-slave
mountPath: /data
volumes:
– name: yashanb-data-slave
persistentVolumeClaim:
claimName: yashanb-pvc-slave
$ kubectl apply -f yashanb-slave.yaml
# 创建Service
$ cat yashanb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: yashanb
namespace: yashanb
spec:
selector:
app: yashanb
ports:
– port: 1521
targetPort: 1521
type: ClusterIP
$ kubectl apply -f yashanb-service.yaml
# 3. 验证部署
$ kubectl get all -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-6x7k9 1/1 Running 0 5m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 3m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/yashanb ClusterIP 10.96.0.100
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/yashanb-master 1/1 1/1 1/1 5m
deployment.apps/yashanb-slave 1/1 1/1 1/1 3m
# 4. 测试高可用
# 模拟主实例故障
$ kubectl delete pod yashanb-master-5d7f9b8c9d-6x7k9 -n yashanb
# 查看新的主实例
$ kubectl get pods -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-7x8k9 1/1 Running 0 1m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 5m
# 验证数据库连接
$ sqlplus fgedu/fgedu123@yashanb:1521/fgedudb
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Apr 1 10:30:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
YashanDB Database 19c Enterprise Edition Release 19.3.0.0.0 – Production
Version 19.3.0.0.0
SQL> SELECT * FROM dual;
DUMMY
——-
X
SQL> exit
4.2 YashanDB K8s高可用部署案例二
案例背景:某电商系统需要在Kubernetes集群中部署YashanDB高可用集群,确保数据库服务的可靠性和弹性。
# 1. 环境准备
– Kubernetes集群:3个控制平面节点,5个工作节点
– Kubernetes版本:1.21.0
– Docker版本:20.10.8
– 存储:Ceph分布式存储
– 网络:Flannel
# 2. 部署步骤
# 创建命名空间
$ kubectl create namespace yashanb
# 创建存储类
$ cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph
provisioner: kubernetes.io/rbd
parameters:
monitors: 192.168.1.100:6789,192.168.1.101:6789,192.168.1.102:6789
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: kube-system
pool: kubernetes
userId: kube
userSecretName: ceph-user-secret
userSecretNamespace: kube-system
imageFormat: “2”
imageFeatures: layering
reclaimPolicy: Retain
allowVolumeExpansion: true
$ kubectl apply -f storageclass.yaml
# 创建持久卷声明
$ cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yashanb-pvc
namespace: yashanb
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: ceph
$ kubectl apply -f pvc.yaml
# 创建YashanDB主实例
$ cat yashanb-master.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-master
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: master
template:
metadata:
labels:
app: yashanb
role: master
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: app
operator: In
values:
– yashanb
topologyKey: “kubernetes.io/hostname”
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
resources:
requests:
cpu: 4
memory: 8Gi
limits:
cpu: 8
memory: 16Gi
volumeMounts:
– name: yashanb-data
mountPath: /data
volumes:
– name: yashanb-data
persistentVolumeClaim:
claimName: yashanb-pvc
$ kubectl apply -f yashanb-master.yaml
# 创建YashanDB备实例
$ cat yashanb-slave.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-slave
namespace: yashanb
spec:
replicas: 2
selector:
matchLabels:
app: yashanb
role: slave
template:
metadata:
labels:
app: yashanb
role: slave
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: app
operator: In
values:
– yashanb
topologyKey: “kubernetes.io/hostname”
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
– name: REPLICATION_ROLE
value: slave
– name: MASTER_HOST
value: yashanb-master
– name: MASTER_PORT
value: “1521”
– name: MASTER_USER
value: replication
– name: MASTER_PASSWORD
value: replication123
resources:
requests:
cpu: 4
memory: 8Gi
limits:
cpu: 8
memory: 16Gi
volumeMounts:
– name: yashanb-data-slave
mountPath: /data
volumes:
– name: yashanb-data-slave
persistentVolumeClaim:
claimName: yashanb-pvc-slave
$ kubectl apply -f yashanb-slave.yaml
# 创建Service
$ cat yashanb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: yashanb
namespace: yashanb
spec:
selector:
app: yashanb
ports:
– port: 1521
targetPort: 1521
type: ClusterIP
$ kubectl apply -f yashanb-service.yaml
# 创建HorizontalPodAutoscaler
$ cat hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: yashanb-hpa
namespace: yashanb
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: yashanb-master
minReplicas: 1
maxReplicas: 3
metrics:
– type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
– type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
$ kubectl apply -f hpa.yaml
# 3. 验证部署
$ kubectl get all -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-6x7k9 1/1 Running 0 5m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 3m
pod/yashanb-slave-6f8d7c5b4c-8r9s3 1/1 Running 0 3m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/yashanb ClusterIP 10.96.0.100
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/yashanb-master 1/1 1/1 1/1 5m
deployment.apps/yashanb-slave 2/2 2/2 2/2 3m
# 4. 测试高可用
# 模拟主实例故障
$ kubectl delete pod yashanb-master-5d7f9b8c9d-6x7k9 -n yashanb
# 查看新的主实例
$ kubectl get pods -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-7x8k9 1/1 Running 0 1m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 5m
pod/yashanb-slave-6f8d7c5b4c-8r9s3 1/1 Running 0 5m
# 验证数据库连接
$ sqlplus fgedu/fgedu123@yashanb:1521/fgedudb
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Apr 1 11:00:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
YashanDB Database 19c Enterprise Edition Release 19.3.0.0.0 – Production
Version 19.3.0.0.0
SQL> SELECT * FROM dual;
DUMMY
——-
X
SQL> exit
4.3 YashanDB K8s高可用部署案例三
案例背景:某金融系统需要在Kubernetes集群中部署YashanDB高可用集群,确保数据库服务的可靠性、安全性和性能。
# 1. 环境准备
– Kubernetes集群:3个控制平面节点,4个工作节点
– Kubernetes版本:1.22.0
– Docker版本:20.10.8
– 存储:OpenEBS
– 网络:Calico
# 2. 部署步骤
# 创建命名空间
$ kubectl create namespace yashanb
# 部署OpenEBS
$ helm repo add openebs https://openebs.github.io/charts
$ helm install openebs openebs/openebs –namespace openebs –create-namespace
# 创建存储类
$ cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-jiva-csi-default
provisioner: jiva.csi.openebs.io
parameters:
cas-type: jiva
replica-count: “3”
storage: “8Gi”
reclaimPolicy: Retain
allowVolumeExpansion: true
$ kubectl apply -f storageclass.yaml
# 创建持久卷声明
$ cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yashanb-pvc
namespace: yashanb
spec:
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: openebs-jiva-csi-default
$ kubectl apply -f pvc.yaml
# 创建YashanDB主实例
$ cat yashanb-master.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-master
namespace: yashanb
spec:
replicas: 1
selector:
matchLabels:
app: yashanb
role: master
template:
metadata:
labels:
app: yashanb
role: master
spec:
securityContext:
runAsUser: 0
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
resources:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 16
memory: 32Gi
volumeMounts:
– name: yashanb-data
mountPath: /data
volumes:
– name: yashanb-data
persistentVolumeClaim:
claimName: yashanb-pvc
$ kubectl apply -f yashanb-master.yaml
# 创建YashanDB备实例
$ cat yashanb-slave.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yashanb-slave
namespace: yashanb
spec:
replicas: 2
selector:
matchLabels:
app: yashanb
role: slave
template:
metadata:
labels:
app: yashanb
role: slave
spec:
securityContext:
runAsUser: 0
containers:
– name: yashanb
image: yashanb/yashanb:19c
ports:
– containerPort: 1521
env:
– name: DB_NAME
value: fgedudb
– name: DB_USER
value: fgedu
– name: DB_PASSWORD
value: fgedu123
– name: REPLICATION_ROLE
value: slave
– name: MASTER_HOST
value: yashanb-master
– name: MASTER_PORT
value: “1521”
– name: MASTER_USER
value: replication
– name: MASTER_PASSWORD
value: replication123
resources:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 16
memory: 32Gi
volumeMounts:
– name: yashanb-data-slave
mountPath: /data
volumes:
– name: yashanb-data-slave
persistentVolumeClaim:
claimName: yashanb-pvc-slave
$ kubectl apply -f yashanb-slave.yaml
# 创建Service
$ cat yashanb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: yashanb
namespace: yashanb
spec:
selector:
app: yashanb
ports:
– port: 1521
targetPort: 1521
type: ClusterIP
$ kubectl apply -f yashanb-service.yaml
# 创建Ingress
$ cat yashanb-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yashanb-ingress
namespace: yashanb
spec:
rules:
– host: yashanb.fgedu.net.cn
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: yashanb
port:
number: 1521
$ kubectl apply -f yashanb-ingress.yaml
# 3. 验证部署
$ kubectl get all -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-6x7k9 1/1 Running 0 5m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 3m
pod/yashanb-slave-6f8d7c5b4c-8r9s3 1/1 Running 0 3m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/yashanb ClusterIP 10.96.0.100
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/yashanb-master 1/1 1/1 1/1 5m
deployment.apps/yashanb-slave 2/2 2/2 2/2 3m
# 4. 测试高可用
# 模拟主实例故障
$ kubectl delete pod yashanb-master-5d7f9b8c9d-6x7k9 -n yashanb
# 查看新的主实例
$ kubectl get pods -n yashanb
NAME READY STATUS RESTARTS AGE
pod/yashanb-master-5d7f9b8c9d-7x8k9 1/1 Running 0 1m
pod/yashanb-slave-6f8d7c5b4c-7p8q2 1/1 Running 0 5m
pod/yashanb-slave-6f8d7c5b4c-8r9s3 1/1 Running 0 5m
# 验证数据库连接
$ sqlplus fgedu/fgedu123@yashanb.fgedu.net.cn:1521/fgedudb
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Apr 1 11:30:00 2026
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
YashanDB Database 19c Enterprise Edition Release 19.3.0.0.0 – Production
Version 19.3.0.0.0
SQL> SELECT * FROM dual;
DUMMY
——-
X
SQL> exit
Part05-风哥经验总结与分享
5.1 YashanDB K8s高可用部署经验总结
YashanDB K8s高可用部署经验总结:
- 控制平面高可用:部署多个控制平面节点,确保API Server、etcd等组件的高可用
- 节点高可用:部署多个工作节点,确保Pod的高可用
- 存储高可用:使用分布式存储,确保数据的高可用
- 网络高可用:配置冗余网络,确保网络的高可用
- 应用高可用:部署多个Pod副本,确保应用的高可用
- 监控告警:建立完善的监控系统,及时发现和解决问题
- 备份策略:定期备份数据库数据,确保数据安全
- 故障演练:定期进行故障演练,确保高可用机制有效
5.2 YashanDB K8s高可用部署检查清单
– [ ] Kubernetes集群是否部署完成
– [ ] 控制平面是否高可用
– [ ] 工作节点是否足够
– [ ] 存储是否配置正确
– [ ] 网络是否配置合理
– [ ] YashanDB是否部署完成
– [ ] 高可用机制是否配置正确
– [ ] 监控系统是否建立
– [ ] 备份策略是否制定
– [ ] 故障演练是否进行
# K8s高可用部署实施流程
1. 需求分析:明确业务对数据库可用性的要求
2. 环境准备:搭建Kubernetes集群,配置存储和网络
3. 部署实施:部署YashanDB,配置高可用
4. 测试验证:测试高可用机制,确保故障转移正常
5. 监控配置:配置监控系统,建立告警机制
6. 运维管理:制定运维流程,定期进行维护
7. 持续优化:根据实际运行情况,持续优化部署方案
5.3 YashanDB K8s高可用部署工具推荐
YashanDB K8s高可用部署常用工具:
- kubeadm:Kubernetes集群部署工具
- Helm:Kubernetes包管理工具
- Prometheus:监控系统
- Grafana:可视化平台
- Calico:网络插件
- OpenEBS:容器原生存储
- Ansible:自动化工具
- Terraform:基础设施即代码工具
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
