文字内容
1. 参数化陷阱与 DSL 缺陷:K8s 声明式应用管理的实践与教训 孙健波 阿里云 技术专家
4. 孙健波 • 阿里云 技术专家 • Kubernetes 项目社区成员 • 《Docker容器与容器云》 • PaaS,容器,K8s,日志平 台,流式计算。 • jianbo.sjb@alibaba-inc.com
5. 1. 阿里巴巴云原生化:Why & How 2. 从容器到应用:K8s “应用”到底是什么? 3. 从应用到应用交付:云原生应用管理体系 4. 支撑应用运行的基石:K8s Workload
6. 阿里巴巴云原生化路径 2011: 容器化 2015: docker容 器化 + 智能调度 •LXC •BU维度的资源 池 •scripts •Docker •内部自研调度 系统 容器化 (围绕容器本身) 2017-18: k8s 基础编排 2019: 云原生 •“富容器” •一个Pod 一个 container •K8s API •Containerd •Pod + sidecars •K8s 全栈 探索 云原生 (围绕K8s API) (标准 + 开放)
7. 当前技术栈 阿里巴巴正在将电商业务全面转型到云上 站在开源界巨人的肩膀上: • Kubernetes • Operator Framework • CNI, CSI, CRI, DevicePlugin … • Prometheus • Containerd • runC + KataContainers • DevOps framework from ACK • ACK = 阿里巴巴的 Kubernetes 容器服务 •…
8. 整体架构 开发者 /PaaS/DevOps 系统 搜索引擎、广告、 物流、中间件 内部应用管理系统 (监控看板、资源计划、双十一) CRDs + Operators 声明式 API/GitOps/Kustomize Admission Hooks Aggregator kube-apiserver kube-controller-manager 阿里 ECS 裸金属服务器 阿里 ECS 裸金属服务器 自定义存储接口 自定义网络接口 containerd kubelet Serverless服务、二 方产品、三方系统 containerd kubelet 云服务商接入 日志 监控 自定义调度器 (Cerebellum) 弹性资源池
9. 历史遗留问题:富容器 2018 以前 • Java • 进程(PID 1) 是 Systemd • 所有组件在同一个容器中 (“富容器”),组件独立升级 • app, sshd, log, monitoring, cache, VIP, DNS, proxy, agent, start/stop scripts … • 传统化的运维工作流 • 启动容器 -> SSH 进到容器 -> 启动应用 • 日志、用户数据等在容器内随意存放 • 自研的编排、调度系统
10. 从“容器”到“应用” • 共享数据卷 • 不同资源不同QoS • 可控的生命周期管理和健康检查
11. 云原生化关键节点:轻量级容器化
12. 标准应用定义 • Helm? 我们在使用 Charts 解决了大部分应用定义的问题。
13. 参数化陷阱 与 DSL 缺陷 • Helm 的好处 1. 应用管理功能完善,尤其是依赖管理和回滚 2. 端到端的使用体验,快速达成部署的目的。 3. 包管理器:解决了应用打包问题 • Helm 的问题 1. 2. 3. 4. Templating 与 Kubernetes 的声明式 API (Patch 方式)不一致 服务端 Tiller (Helm v3会解决) “二层 API”: Helm v3 引入 LUA(或任何类型的 DSL) “一个不能直接使用的模板文件” + “一个没有实际意义的 values 文 件”
14. Kustomize 是什么? V1.14 查看输出 $ kubectl kustomize 执行 $ kubectl –k ,
15. Kustomize 强大的overlay
16. Helm + Kustomize Kustomize 的好处 1. 定制 YAML 的体验很好。 2. 只关注 Templating 环节,从设计上就是被集成的位 置而非盖在 Kubernetes 之上“二层 API”。 3. 与声明式 API 的体感匹配,没有割裂感。 Kustomize 的问题 1. 管理 Kustomize 文件不比管理 Charts 文件轻松。 2. 不提供其他能力,需要与更多的项目配合使用甚至需要 用户自己 DIY pipeline。 Kustomize 解决了我们在规模化 场景下修改 YAML 文件的难题
17. 从应用到应用交付
18. 混合云、多云
19. 应用是一组带有运维属性的、且互相 之间具有关联关系的组件集合。 1. 角色:开发者、应用运维、基础设施运维 2. 组件:可运行单元 3. 工作负载:组件能运行的不同工作负载。 4. 属性:应用参数,运维关心的参数。 5. 应用边界:组件间共有的属性、组件间的依赖关系。 6. 操作配置:组件实例、他们的属性、作用域、参数。
20. 标准应用定义,即将开源!
21. 云原生应用架构
22. 阿里巴巴 K8s 作业管理的多重挑战 应用迁移 稳定性保障 我们正在全面拥抱 云原生! 复杂场景 • 接近一百个站点 • 超过十万个应用 • 将近百万级别的容器 容器运维 帮助 PaaS 拥抱云原生
23. 举例:“双十一”大促 在阿里双十一大促前,我们要准备: 1. 为上千个应用创建 10万+ Pods 2.通过一个离线调度器,计算node数量,提前创建pod 3.通过上述方式, 提升资源利用率、节省CPU、编排隔离/混部应用 等等 在滚动升级时,默认情况下所有的工作负载都会重新创建Pods,可用策 略: • maxSurge/maxUnavailable/partition/… 问题在哪? • 如果我们用默认的更新策略,预期的功能完全不成立: • 拓扑逻辑变化、镜像预热没了、额外开销增加、资源分配混乱 …
24. 更 “高阶” 的 StatefulSet需要什么能 力?
25. 发布策略:原地升级、SidecarSet、BroadcastJob Recreate update 集群确定性 镜像下载性能 资源本身要求 服务重新调度和注册发现 自动恢复 全量字段更新 InPlace update
26. 一起进入云原生架构时代! • 阿里云与 CNCF 联合制作了《CNCF x Alibaba 云原生技 术公开课》,从 K8s 基础开始到进阶再到实践,循序渐 进为你一一分解,欢迎即刻开始学习。 • OpenKruise 开源地址 https://github.com/openkruise/kruise • Cloud Native App Hub https://developer.aliyun.com/hub