K8s上的数据库私有云之旅:KubeBlocks架构设计与实践 曹伟丨云猿生数据创始人/CEO 演讲者:曹伟 云猿生数据创始人/CEO 前阿里云数据库总经理(研究员),阿里云RDS的架构师,云原生数据库PolarDB创始人。中国计算机学会数据库专委会、开源专委会执行专委,获得2020年中国电子学会科技进步一等奖,在SIGMOD、VLDB、ICDE、FAST、USENIXATC等数据库与存储国际顶级学术会议发表论文20余篇。 内容大纲 •公共云、私有云,K8s和数据库的演进趋势 •dbPaaS的挑战 •KubeBlocks的设计理念及核心特点 •数据库容器化的常见问题 •数据库私有云平台案例 数据库行业发展方向 Serverless 适合小规模且难以预测的负载 On-Prem 适合中大型规模且波动较为规律的负载 公共云全托管 适合中小型规模且波动较为规律的负载 公有云vs.私有云的选择 合规性要求 内因成本控制 定制化和可控性 外因云原生和K8s技术的发展 趋势一 私有云正在从时代全面进化到 趋势二 K8s发展带动技术水平追赶 趋势三 K8s正在统一公共云和私有云的 K8s:构建PaaS的基础 App 业务层 PaaS层 MiddlewareWorkflow K8s CI/CDBigDataAI IaaS透明调度器 服务发现 配置管理 POD service PVC/PV secret configmap Taint Affinity event Toleration Anti-Affinity ACK EKS GKE AKSOpenShiftRancher 声明式API 阿里云AWSGCPAzure物理机 K8sPaaS全景图里还缺最后一块: dbPaaS的挑战 数据库种类太多运维操作复杂 研发和运维人力不足 陷阱:烟囱式架构 HA 备份恢复 扩缩容 迁移 升级 容灾 账号 授权 监控报警 审计 ClickHouse, MySQL PG Redis MongoDB ES, K, …… afka 运维操作 引擎 开发和维护成本高引入新引擎成本高 调度 虚拟机 物理机 容器 存储 网络 环境 数据库容器化后 能不能像一样在K8s上进行管理呢? 首先思考:如何解决软件工程复杂性问题 文件系统的模型 K8s扩展的模型 网络系统的模型 APP Systemcall POSIX -open() -read() -write() VFS ext4 nfs zfs s3fs 抽象抽象分层 CRICSICNI xfs fuse KubeBlocks通过抽象和分层管理数据库 KubeBlocksAddons …… KubeBlocksOperator实现 ClusterController ComponentController InstanceSet Controller …… Instance InstanceSet Component Cluster KubeBlocksCloud kbcli KubeBlocksAPI Pod Service PVC Secret Configmap K8sAPI … AddonAPI ClusterDefintion ComponentDefinitionComponentVersion KubeBlocks通过抽象和分层管理数据库 KubeBlocksOperator实现 ClusterControllerComponentControllerInstanceSet Controller…… KubeBlocksAddons …… KubeBlocksAPI:数据库容器化的标准 kbcli KubeBlocksCloud Instance InstanceSet Component Cluster KubeBlocksAPI Pod Service PVC Secret Configmap K8sAPI … AddonAPI ClusterDefintion ComponentDefinitionComponentVersion KubeBlocks通过抽象和分层管理数据库 KubeBlocksAddons …… 数据库引擎无关的Operator实现 KubeBlocksOperator实现 kbcli KubeBlocksCloud Instance InstanceSet Component Cluster ClusterController ComponentController InstanceSet Controller …… KubeBlocksAPI Pod Service PVC Secret Configmap K8sAPI … AddonAPI ClusterDefintion ComponentDefinitionComponentVersion KubeBlocks通过抽象和分层管理数据库 KubeBlocksOperator实现 ClusterController ComponentController InstanceSet Controller …… AddonAPI ClusterDefintion ComponentDefinitionComponentVersion KubeBlocksAddons …… kbcli KubeBlocksAPI KubeBlocksCloud Cluster Instance InstanceSet Component K8sAPI Pod Service PVC Secret Configmap … 把KubeBlocksAPI映射到数据库–MySQL Cluster:MySQL Component:ProxyComponent:MySQLComponent:Orchestrator InstanceSetInstanceSetInstanceSet InstanceInstance PodService InstanceInstanceInstance PodPVC Service Instance InstanceInstance PodService 把KubeBlocksAPI映射到数据库–Redis主备 Cluster:Redis Component:RedisComponent:Sentinel InstanceInstance PodService Instance InstanceInstance PodService InstanceSetInstanceSet 把KubeBlocksAPI映射到数据库–Redis集群 Cluster:RedisCluster Component:Redis Component:Redis Component:Redis Component:Redis Component:Redis InstanceSet InstanceSet InstanceSet InstanceSet InstanceSet InstanceInstance InstanceInstance InstanceInstance InstanceInstance InstanceInstance PodService PodService PodService PodService PodService 把KubeBlocksAPI映射到数据库–Kafka Cluster:Kafka Component:BrokerComponent:ControllerComponent:Exporter InstanceSetInstanceSetInstanceSet InstanceInstanceInstance PodPVC Service InstanceInstanceInstance PodPVC Service Instance PodService KubeBlocks通过抽象和分层管理数据库 KubeBlocksOperator实现 ClusterController ComponentController InstanceSet Controller …… KubeBlocksAPI Cluster kbcliComponent InstanceSet KubeBlocksCloudInstanceK8sAPI PodService PVCSecretConfigmap … KubeBlocksAddons …… AddonAPI 通过YAML低代码的集成多种数据库容器 ClusterDefintion ComponentDefinitionComponentVersion 02 主从+Sentinel HA 03 RedisProxy+主从+Sentinel HA Proxy (e.g.TwemProxy/Camellia) 04 RedisCluster 例子:RedisAddon支持Redis的多种部署形态 01 单节点 https://github.com/apecloud/kubeblocks-addons/tree/main/addons/redis Sentinel Sentinel Sentinel Sentinel Sentinel Sentinel 1.编写ComponentDefinition:Redis/Sentinel/RedisProxy kind:ComponentDefinitionmetadata: name:redisspec: serviceKind:redisserviceVersion:7.0.6services: ports: -port:6379volume: -name:data… roles: -name:primary… -name:secondary… configs:…scripts:…logConfigs:…exporter:…systemAccounts: -name:default… cmpd-redis.yaml cmpd-redis.yaml lifecycleActions: -roleProbe:… -postProvision:… -accountProvision:… -… vars: -name:REDIS_ADVERTISED_PORT… -name:SENTINEL_SERVICE_PORT… -name:SENTINEL_POD_NAME_LIST… runtime:containers: -name:redisimage:…command:…env:…ports:… volumeMounts:… -name:metricsimage:… https://github.com/apecloud/kubeblocks-addons/blob/main/addons/redis/templates/componentdefinition-redis.yaml 2.编写ComponentDefinition:Redis/Sentinel/RedisProxy cmpd-redis-sentinel.yaml kind:ComponentDefinitionmetadata: name:redis-sentinelspec: serviceKind:redis-sentinelserviceVersion:7.0.6services: ports: -port:26379volume: -name:data… configs:…scripts:…log