刘林 Kubernetes+Operator+实践:MySQL容器化

cnutcon

2018/12/08 发布于 技术 分类

文字内容
1. Kubernetes Operator 实践 —— MySQL 容器化 刘林 搜狗资深工程师
2. 关于我 刘林 搜狗商业平台研发部 资深开发工程师 l 主要从事商业平台研发工作,在构建高性能、高可用大规模 系统方面有丰富的实践经验 l 目前专注于云计算、DevOps 等相关领域,负责搜狗商业云 平台的设计研发工作
3. 1. 背景介绍 2. Operator 的基本原理 3. MySQL Operator 设计实践 4. 小结
4. 技术体系广 服务多迭代快 质量要求高 业务响应快 故障恢复快 搜狗商业平台 Java 技术体系 商业平台 CRM C++ 搜索广告 广告平台 物料展现 信息流广告 搜狗产品矩阵 Golang JavaScript Python 审核平台 大数据平台 代理商 基础架构 品牌广告 广告主
5. 商业云平台 BizCloud SaaS 搜狗商业平台业务系统 搜索推广 信息流 品牌 搜狗商业平台基础平台 账户 物料 计费 PaaS 管理界面 统一服 统一配 务管理 置中心 BizNginx (Load Balancer) SOA服务框架 Kafka Zookeeper etcd AppEngine(Resin/Tomcat…) 项目 管理 DevOps IaaS Kubernetes Node Node Cluster1 Node Node Cluster2 Registry CI&&CD 编 译 模板管理 测 自动化测试 试 部署中心 发 布 服务发现 灰度发布 授 权 监控中心 监 日志系统 控
6. 有状态服务的需求越来越多 问题 • 弹性伸缩能力不足 • 机器资源利用率不高 • 服务管理复杂 有状态服务容器化
7. 1. 背景介绍 2. Operator 的基本原理 3. MySQL Operator 设计实践 4. 小结
8. 无状态服务 服务调度 带来的新挑战 有状态服务 有状态服务集群 服务调度 状态保存 服务调度 状态保存 集群管理
9. 站在 Kubernetes 的肩膀上 服务调度 状态存储 集群管理 Deployment StatefulSet PV/PVC StorageClass ?? 成员管理 扩缩容 故障迁移 高可用 CoreOS 提出了 operator
10. Operator 是什么 An Operator is an application-specific controller that extends the Kubernetes API to create, configure and manage instances of complex stateful applications on behalf of a Kubernetes user. operator 是特殊的 controller,用来管理复杂的分布式应用 ü custom resource definition(CRD) ü custom controller
11. CRD 的基本原理 • Kubernetes 中一切都可视为资源 • 默认资源类型:如 Pod、Service、Volume 等 • Kubernetes 1.7 之后增加了 CRD 自定义资源 • 二次开发扩展 Kubernetes API
12. Controller 的基本原理 ① 观察资源的当前状态 ② 分析当前状态与期望状态的差别 ③ 调用 API 消除差别 申请扩容 TestCluster app=test 期望副本数:3 当前副本数:1 VS app=test 增加2个副本 app=test 当前副本数:3
13. 1. 背景介绍 2. Operator 的基本原理 3. MySQL Operator 设计实践 4. 小结
14. MySQL 容器化目标 • 快速部署 MySQL 主从集群 • 支持 MySQL 集群高可用 • 支持 MySQL 集群弹性伸缩 • 支持 MySQL 5.5 & 5.7 Master Slave1 Slave2 MySQL 集群:1 主 2 从
15. MySQL 容器化系统架构 REST CLI 0. 创建 CRD Kubernetes Master API Server Controller Manager Scheduler 3. 集群管理 2. 调度 pod mysql pod-0 mysql pod-1 …… mysql pod-N kubelet kube-proxy docker Node1 mysql Pod-T mysql pod-5 mysql pod-6 …… mysql pod-M …… Ceph kubelet kube-proxy docker NodeM Mysql Operator pod NodeN
16. MySQL-Operator 主流程 API Server List/Watch - CRD - Pod Reflector DeltaFIFO Write Callbacks OnAdd OnUpdate OnDelete WorkQueue Local Storage ReadOnly Worker Informer Operator • Informer:监听事件并触发回调函数的二级缓存工具包 • WorkQueue:事件合并、过滤、延时、限速
17. CRD 里有什么 MySQL CRD • Spec:配置 & 期望状态 • Status:当前状态 MySQL 配置 • 版本 • 端口 • 存储信息 • 配置文件 集群配置 • 副本数 • 高可用模式 K8s 调度信息 • 资源套餐 • 亲和性信息 • NodeSelector
18. 使用 CRD 1. 创建 CRD apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: mysqlclusters.example.sogou spec: group: example.sogou names: kind: MySQLCluster plural: mysqlclusters 2. client-go 配套工具 • Clientset • Informers • Listers • DeepCopy code-generator
19. MySQL 容器化系统架构 REST CLI 0. 创建 CRD Kubernetes Master API Server Controller Manager Scheduler 3. 集群管理 2. 调度 pod mysql pod-0 mysql pod-1 …… mysql pod-N kubelet kube-proxy docker Node1 mysql Pod-T mysql pod-5 mysql pod-6 …… mysql pod-M …… Ceph kubelet kube-proxy docker NodeM Mysql Operator pod NodeN
20. Kubernetes 的容器编排 Deployment mysql-5f54tvkj8 mysql-7c46782dr mysql-577ck9s8f StatefulSet mysql-0 mysql-1 mysql-2 • Pod 名随机 • Pod 启动无序 • Pod 扩容无限制 • Pod 名稳定 • Pod 启动有序 • Pod 扩容安全
21. 如何调度 MySQL Deployment 散养 StatefulSet 精养 VS MySQL 更像“宠物”,使用 StatefulSet 调度 MySQL 容器
22. MySQL 容器化系统架构 REST CLI 0. 创建 CRD Kubernetes Master API Server Controller Manager Scheduler 3. 集群管理 2. 调度 pod mysql pod-0 mysql pod-1 …… mysql pod-N kubelet kube-proxy docker Node1 mysql Pod-T mysql pod-5 mysql pod-6 …… mysql pod-M …… Ceph kubelet kube-proxy docker NodeM Mysql Operator pod NodeN
23. MySQL-Operator 集群管理 MySQL 高可用的实现方式 Master High Availability Ø 目前最常用的高可用实现 Ø 支持大多数 MySQL 版本 Ø 使用 mysql 半同步复制 Ø 有数据丢失风险 Mysql Group Replication Ø MySQL 官方提供 Ø 5.7 新特性 Ø 基于 Paxos 协议 Ø 写入延迟相对高
24. MHA 高可用简介 • 节点分为 mha-manager、 mha-node • 节点两两间 ssh 免密登录 • 一个 mha-manager 管理多个 mysql 集群,每个集群对应一 个 manager 进程 mha-manager Master Slave1 Slave2 集群1 Master mha-node Slave1 Slave2 mha-node 集群2
25. MHA 在 operator 的实现 • mha-manager 部署在 operator 容器中 • mha-node 为边车容器 • 镜像中设置 ssh 免密认证 Operator 在集群成员都正常运行 后,启动 manager 进程 CRD mysqlcluster ConfigMap mysql-conf mysql-operator-pod app-container mysql-operator - mha-mgr-3306 - mha-mgr-3420 - …… mysql-pod-1 init-container data-dumper app-container mysql mha-node mysql-pod-2 init-container data-dumper data
26. MHA 故障迁移 • 从库故障 • 主库故障 mha k8s operator 集群切主 调度 pod pod 都正常运行? 重新调度 mha
27. MHA 扩缩容 • 扩容:直接执行 • 缩容:集群 master 是谁? operator 判断 否 是 调用 mha 切主 执行 sts 扩缩容 pod 都正常运行? 判断条件: 缩容操作且 master 为 sts 最后一个 pod 重新调度 mha
28. MGR 高可用简介 • 多主和单主两种工作模式 • MGR 只支持 InnoDB 引擎 • 开启 GTID,ROW 模式 binlog • 每张表必须有检测冲突的主键 • 目前最多只支持 9 个节点 • loose-group_replication_ • group_name • start_on_boot • local_address • group_seeds • bootstrap_group
29. MGR 在 operator 的实现 部署 • Operator 在 pod 启动前注入 MGR 参数 故障迁移 • 依赖 statefulset 自愈 扩缩容 • 直接使用 statefulset 扩缩容
30. MySQL 容器化系统架构 REST CLI 0. 创建 CRD Kubernetes Master API Server Controller Manager Scheduler 3. 集群管理 2. 调度 pod mysql pod-0 mysql pod-1 …… mysql pod-N kubelet kube-proxy docker Node1 mysql Pod-T mysql pod-5 mysql pod-6 …… mysql pod-M …… Ceph kubelet kube-proxy docker NodeM Mysql Operator pod NodeN
31. MySQL-Operator 数据存储 分布式存储 • 使用 Ceph RBD,基于产品线 创建 StorageClass • 优点:可靠性高,容器漂移时 数据不变 • 缺点:读写延迟较高 本地存储 • 基于 Host Path Volumes • 优点:读写延迟低 • 缺点:单点数据,容器漂移时 数据丢失
32. 踩到的坑 • 现象:执行 docker 命令时,docker daemon 无响应,/var/log/messages 大量报错 libceph: osdxx 10.0.0.0:6812 socket closed (con state OPEN) 原因:libceph 触发了 linux 内核 的一个 bug 方案: kernel-3.10.0-449.el7 解决 https://bugzilla.redhat.com/show_bug.cgi?id=1319256 • 现象:PVC 在第一次绑定的时候特别慢 原因:pod 使用未绑定 PVC 时,不会加入使用的 volume,又不 watch PVC,导致只有 超时时才重新处理 方案:k8s v1.10.7 解决 https://github.com/kubernetes/kubernetes/issues/64549
33. MySQL-Operator 调用样例 CLI 方式 kubectl create –f iflow.yaml apiVersion: "mysql.biz.sogou/v1" kind: MySQLCluster metadata: name: dbiflow namespace: default spec: replicas: 3 version: "5.5" port: 3613 REST 方式 curl -H 'Content-Type: application/json' -X POST –d '{ kind: "MySQLCluster", apiVersion: "mysql.biz.sogou/v1", metadata: { name: "dbiflow", namespace: “default"}, spec: { replicas: 3, version: "5.5", port: 3613, storage: {type: "local", size: "80G"}, resources: { request: {cpu: 4, memory:8}}}}' http://***/apis/mysql.biz.sogou/v1/namespaces/default/mysqlclusters
34. 商业云平台集成
35. 1. 背景介绍 2. Operator 的基本原理 3. MySQL Operator 设计实践 4. 小结
36. 回顾 • 商业云平台概况 • Operator 的基本原理 • MySQL-Operator 实践 ü 自定义 controller,使用 CRD ü MHA、MGR 高可用的实现 ü 扩缩容、故障处理流程 ü 分布式存储 ceph
37. 展望 • 优化存储 • 增强 MySQL 的安全性 • 完善数据处理工具