高可用是分布式应用的重要要求,在ACK Serverless集群中,您可以通过K8s原生调度语义实现分布式应用的跨可用区打散,以达到高可用部署的要求。本文档介绍如何在容器服务 Serverless 版上部署有状态的高可用MySQL集群。
前提条件
已创建ACK Serverless集群(含多个虚拟节点)。具体操作,请参见创建ACK Serverless集群。
已开启虚拟节点调度策略。具体操作,请参见开启ACK Serverless集群虚拟节点调度策略。
已安装csi-provisioner组件且版本 >= v1.22.9。
步骤一:从Github拉取用于创建K8s资源的YAML文件
执行以下命令,克隆代码库。
git clone https://github.com/AliyunContainerService/serverless-k8s-examples.git
执行以下命令,进入工作目录,并查看目录下YAML文件列表。
cd serverless-k8s-examples/stateful-mysql ls -al
预期输出:
README.md secret.yaml stateful-mysql.yaml storageclass.yaml
其中
secret.yaml
用于创建Secret,storageclass.yaml
用于创建StorageClass,stateful-mysql.yaml
用于创建MySQL StatefulSet。
步骤二:创建NameSpace、Secret、StorageClass
执行以下命令,创建命名空间
mysql
。kubectl create namespace mysql
预期输出:
namespace/mysql created
执行以下命令,创建MySQL Secret,用于存储MySQL密码。
kubectl apply -n mysql -f secret.yaml
预期输出:
secret/mysql-secret created
以下为该Secret的YAML文件。
执行以下命令,创建StorageClass。
kubectl apply -f storageclass.yaml
预期输出:
storageclass.storage.k8s.io/fast-storageclass created
以下为该StorageClass的YAML文件。
步骤三:配置Pod可用区打散,创建MySQL StatefulSet
执行以下命令,创建MySQL StatefulSet。本示例将创建一个通过配置虚拟节点Pod可用区打散,在多个可用区上均匀分布的StatefulSet。关于如何配置虚拟节点Pod可用区打散,请参见实现ECI Pod可用区打散以及亲和调度。
kubectl apply -n mysql -f stateful-mysql.yaml
预期输出:
statefulset.apps/dbc1 created
以下为该StatefulSet的YAML文件。
步骤四:验证MySQL集群中的Pod部署情况
执行以下命令,验证StatefulSet是否已成功创建。
kubectl get statefulset -n mysql
预期输出:
NAME READY AGE dbc1 3/3 7m21s
执行以下命名,查看Pod详细信息。
kubectl -n mysql get po -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dbc1-0 1/1 Running 0 2m28s 10.1.214.213 virtual-kubelet-cn-hangzhou-j <none> <none> dbc1-1 1/1 Running 0 106s 10.3.146.113 virtual-kubelet-cn-hangzhou-h <none> <none> dbc1-2 1/1 Running 0 64s 10.4.232.78 virtual-kubelet-cn-hangzhou-g <none> <none>
其中NODE列为Pod所在节点,节点名称中包含可用区的信息。从节点名称中可以看到Pod被打散到不同的可用区中。