大盘点: KubeCon EU 2019 应用管理领域的新看点!

众所周知,云原生架构的中心项目是 Kubernetes,而 Kubernetes 则围绕着“应用”来展开。让应用部署得更好,让开发者更高效,才能给团队和组织带来切实的利益,才能让云原生技术变革发挥更大的作用。变革的势头既如洪水般吞没着老旧封闭的内部系统,又如春雨般孕育出更多的新开发者工具。在本次 KubeCon 中,就出现了许多有关应用管理与部署的新知识。这些知识中有哪些想法和思路值得借鉴,让我们少走弯路?在它们背后,又预示着什么样的技术演进方向?

在本文中,我们邀请到了阿里云容器平台技术专家、原 CoreOS 公司工程师、 K8s Operator 项目的核心作者之一邓洪超,为读者精选了此次会议“应用管理”领域的精华内容来一一进行分析与点评。

The Config Changed

Kubernetes 上部署的应用一般会把配置存放到 ConfigMap 里,然后挂载到 Pod 文件系统中去。当 ConfigMap 发生更改时,只有 Pod 里挂载的文件会被自动更新。这种做法对某些会自动做热更新的应用(比如 nginx)来说是 OK 的。但是,对于大多数应用开发者来说,他们更倾向于认为更改配置要做一次新的灰度发布、跟 ConfigMap 相关联的容器应该做一次灰度升级。

灰度升级不仅简化了用户代码,增强了安全稳定性,更是体现了不可变基础架构的思想。应用一旦部署,就不再做变更。需要升级时,只要部署一个新版系统,验证 OK 后再摧毁旧版就好了;验证不通过时也容易回滚到旧版。正是基于这样的思路,来自 Pusher 的工程师们研发了 Wave,一款自动监听 Deployment 相关联的 ConfigMap/Secret 并随之改动而触发 Deployment 升级的工具。这款工具的独特之处在于它会自动搜索该 Deployment PodTemplate 里面的 ConfigMap/Secret,然后把里面所有数据计算一次 hash 放到 PodTemplate annotations 里面;当有变动时,会重新计算一次 hash 并更新 PodTemplate annotations,从而触发 Deployment 升级。无独有偶,开源社区里还有另一款工具 Reloader 也做了类似的功能——不同的是,Reloader 还能让用户自己选择填写监听哪几个 ConfigMap/Secret。

分析与点评

升级不灰度,背锅两行泪。不论是升级应用镜像还是更改配置,都要记得做一次新的灰度发布和验证。

另外我们也看到,不可变基础架构给构建云计算应用带来了崭新的视角。朝着这个方向发展,不仅能让架构更安全更可靠,更是能跟其他主要工具结合好,充分发挥云原生社区的作用,对传统应用服务实现“弯道超车”。举个例子,充分结合上面的 wave 项目和 Istio 中 weighted routing 功能,网站就能达到小部分流量对新版配置进行验证的效果。

Server-side Apply

Kubernetes 是一个声明式的资源管理系统。用户在本地定义期望的状态,然后通过 kubectl apply 去跟更新当前集群状态中被用户指定的那一部分。然而它远没有听起来那么简单…

原来的 kubectl apply 是基于客户端实现的。Apply 的时候不能简单地替换掉单个资源的整体状态,因为还有其他人也会去更改资源,比如 controllers、admissions、webhooks。那么怎样保证在改一个资源的同时,不会覆盖掉别人的改动呢?于是就有了现有的 3 way merge:用户把 last applied state 存在 Pod annotations 里,在下次 apply 的时候根据 (最新状态,last applied,用户指定状态) 做 3 way diff,然后生成 patch 发送到 APIServer。但是这样做还是有问题!Apply 的初衷是让个体去指定哪些资源字段归他管理。但是原有实现既不能阻止不同个体之间互相篡改字段,也没有在冲突发生时告知用户和解决。举个例子,笔者原来在 CoreOS 工作时,产品里自带的 controller 和用户都会去更改 Node 对象的一些特殊 labels,结果出现冲突,导致集群出故障了只能派人去修。

这种克苏鲁式的恐惧笼罩着每一个 k8s 用户,而现在我们终于迎来了胜利的曙光——那就是服务器端 apply。APIServer 会做 diff 和 merge 操作,很多原本易碎的现象都得到了解决。更重要的是,相比于原来用 last-applied annotations,服务器端 apply 新提供了一种声明式 API (叫 ManagedFields) 来明确指定谁管理哪些资源字段。而当发生冲突时,比如 kubectl 和 controller 都改同一个字段时,非 Admin(管理员)的请求会返回错误并且提示去解决。

分析与点评

妈妈再也不用担心我 kubectl apply 了。虽然还是 Alpha 阶段,但是服务器端 apply 替代客户端只是时间问题。这样一来,不同组件同时更改同一资源将会变得更加安全可靠。

另外我们也看到,随着系统的发展,尤其是声明式 API 的广泛使用,在本地的逻辑将会变少,而在服务器端的则会变多。在服务器端有诸多好处:许多操作,比如 kubectl dry-run、diff,在服务器端实现会更简单;提供 HTTP endpoint,这样会更容易把 apply 这样的功能构建到其他工具中;把复杂逻辑放到服务器端实现和发布,能够更容易做好管控,让用户享受到安全、一致、高质量的服务。

Gitops

会议中有一个座谈小组讨论了 Gitops 的好处,下面给大家总结一下。

第一,Gitops 让整个团队内部更“民主”了。所有东西都写下来了,想看就看。任何变更在发布前都需要走 pull request,不仅让你知道得清清楚楚,还能让你参与评审输入意见。所有改动、讨论统统都记录在 Github 等工具上,随时可以翻看历史。这些种种让团队协作更流畅和专业化。

第二,Gitops 让发布更安全稳定了。代码不再能够随意发布,需要相关负责人、甚至多人评审。需要回滚时,原来的版本就存在 Git 里面。谁在什么时候发布了什么代码,有审计历史。这些种种发布流程更专业化,让发布结果更稳定可靠。

分析与点评

Gitops 不仅仅是解决一个技术问题,更主要的利用 Github 等工具的版本、历史、审计、权限让,让团队协作和发布流程更专业化和流程化。

Gitops 如果能够广泛推广,对整个业界的影响将是巨大的。比方说,不论去任何公司,任何人都可以快速上手发布代码。

Gitops 里面体现的 Configuration as code 和 Git as the source of truth 的思想,还是非常值得我们学习和实践的。

Automated Canary Rollout

金丝雀发布 (Canary rollout),是指在发布过程中,先将一小部分流量导入到新版本,并分析和验证上线行为是否正常。一切正常的话继续将流量逐渐切换到新版本中,直到旧版没有流量并被摧毁。我们知道,在 Spinnaker 等工具中,会有一个手工验证和通过的步骤。这个步骤其实可以用自动化工具替代掉,毕竟每次检查的东西都挺机械式的,例如检查下成功率和 p99 延时。

基于上述思想,来自 Amadeus 和 Datadog 的工程师分享了如何利用 Kubernetes、Operator、Istio、Prometheus 等工具来做金丝雀发布。思路是整个金丝雀发布被抽象成一个 CRD,然后做一次金丝雀发布的过程就变成了编写一个声明式的 YAML 文件就够了,Operator 收到用户创建的 YAML 文件后会自动完成复杂的运维操作。这里主要步骤分为:

  • 部署新版本服务 (Deployment + Service)
  • 更改 Istio VirtualService 配置切换一部分流量到新版本 ;
  • 检验 Istio metrics 中新版本服务的成功率和 p99 响应时间是否均满足条件 ;
  • 如果满足则整个应用升级到新版本;否则就回滚。

无独有偶,Weave 也开源了自动化金丝雀发布工具 Flagger。不同的是,Flagger 会循序渐进地切流到新版本,比如每次新切 5% 流量过去,等到流量都切过去直接摧毁旧版。

分析与点评

使用金丝雀发布一时爽,一直使用一直爽。金丝雀发布有助于提高发布成功率和系统稳定性,是应用管理的重要流程。

另外我们也看到,云原生时代这些复杂的运维流程将被简化和标准化。通过 CRD 抽象,里面复杂的过程步骤将变成几个短短的 API 对象提供给用户。使用 Operator 做自动化运维,只要在 Kubernetes 标准平台上用户就可以用上这些功能。而 Istio 和 Kubernetes 作为顶级的标准化平台,提供了强大的基础能力让用户更容易上手。

写在最后

在这篇文章里,我们盘点了本次 KubeCon 中有关应用管理与部署的一些新知识:

  • 当配置文件改动时,做一个新的应用发布的原因和方法。
  • 客户端 kubectl apply 有诸多问题,其中重要一点就是互相篡改资源字段。这些在服务器端 apply 的实现中解决了。
  • Gitops 不仅仅是解决一个技术问题,更主要的让团队协作和发布流程更专业化和流程化。
  • 利用 Kubernetes、Operator、Istio、Prometheus 这些顶级标准化平台,我们能简化金丝雀发布的运维操作,降低了开发者的使用门槛。

这些新的思想,也让我们感慨万千:从前,我们总在羡慕“别人家的基础架构”,它们总是这么优秀而遥不可及。而现在,开源项目和技术标准,正在将这些技术降低门槛,让每一个开发者都使用上。而另一方面,一个微妙的变化也正在发生着——“自研”的基础软件不得不面临着边际效应递减规律,导致越来越多的像 Twitter 这样的公司开始加入到云原生阵营。拥抱开源生态和技术标准,俨然成为当前互联网企业的一个重要机遇和挑战。构建面向云原生的应用与架构,借助云以及开源的力量,才能做好充分准备在这场上云的变革中扬帆远航。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps:从「蒸汽时代」到「高铁时代」,SUNMI DevOps转型之路 | 原力计划

作者 | 文振熙、刘文沣责编 | 徐威龙封图| CSDN 下载于视觉中国商米科技成立于 2013 年,总部位于上海市杨浦区创智天地,是一家具有产品创新基因和互联网基因的公司。商米在短时间内迅速成长为一家近1000人的企业,产品研发人数占比一度超过70%…

SpringBoot2 集成 xxl-job任务调度中心_路由策略

文章目录一、简述二、故障转移演示2.1. 启动2个执行器2.2. 添加执行器ip2.3. 故障转移策略2.4. 启动任务2.5. 模拟8081执行器宕机2.6. 结论三、轮训策略演示3.1. 启动2个执行器3.2. 添加执行器ip3.3. 轮训策略3.4. 启动任务3.5. 日志分析3.6. 故障转移3.7. 重新启动8082执行器四…

Uniapp组件之间传参

1.父组件内引入子组件&#xff0c;并且子组件使用父组件内的数据 将子组件引入到父组件&#xff1a; <uni-pop :opts"defaultOptions"></uni-pop> import uniPop from /components/uniPop/uniPop.vue 子组件使用父组件内的数据&#xff1a; 2------创建…

基于大数据的舆情分析系统架构 - 架构篇

前言 互联网的飞速发展促进了很多新媒体的发展&#xff0c;不论是知名的大V&#xff0c;明星还是围观群众都可以通过手机在微博&#xff0c;朋友圈或者点评网站上发表状态&#xff0c;分享自己的所见所想&#xff0c;使得“人人都有了麦克风”。不论是热点新闻还是娱乐八卦&am…

Java-标识符和关键字

关键字 标识符 https://www.bilibili.com/video/BV12J41137hu?p22&spm_id_frompageDriver

SpringBoot2 集成 xxl-job任务调度中心_阻塞策略

阻塞处理策略&#xff1a;调度过于密集执行器来不及处理时的处理策略&#xff0c;策略包括&#xff1a;单机串行&#xff08;默认&#xff09;、丢弃后续调度、覆盖之前调度 阻塞处理策略说明单机串行&#xff08;默认&#xff09;任务依次排队执行丢弃后续调度当上一个任务没…

反转!Python再次卫冕2020年编程榜,Java和C回落,你怎么看?​

2020年转眼Q1季度快要结束&#xff0c;在近几个月的榜单中&#xff0c;Python持续19年的火爆&#xff0c;走在在卫冕的道路&#xff0c;并且与老牌语言Java、C的差距拉得更远了一些。近期Udemy 制作了一份《2020 年职场学习趋势报告》&#xff0c;指出了哪些技能最受职场人关注…

HTTP状态码415 springboot项目

1.415报错&#xff0c;有可能是parameter写错了&#xff0c;前台不接收这种形式 controller写RequestBody&#xff0c;前台url写&#xff1f;name1&number1就会报错415

DTCC 2019 | 阿里云TSDB: 教你解锁时序时空数据库的种种黑科技

阿里云TSDB是阿里自研的一种高性能&#xff0c;低成本&#xff0c;稳定可靠的在线时序时空数据库产品。该产品统一了阿里巴巴集团90%以上的APM数据和事件型数据的存储和计算&#xff0c;并在广泛应用于外部的物联网&#xff0c;工业制造&#xff0c;电力&#xff0c;化工以及IT…

【最全PPT下载+直播回放】DTCC 2019:阿里云数据库8大要点精彩回顾

2019年5月8日-5月10日&#xff0c;由国内知名IT技术社区主办的数据库技术交流盛会——DTCC 2019在北京新云南皇冠假日大酒店召开。数据风云&#xff0c;十年变迁&#xff0c;DTCC见证并铭记了国内数据库技术的关键成长历程。作为DTCC的老朋友和全球领先的云计算厂商&#xff0c…

Windows下安装ab

文章目录1. 官网地址2. 传送门3. 发起压测1. 官网地址 https://www.apachelounge.com/download/ https://www.apachelounge.com/download/ 2. 传送门 快速下载 httpd-2.4.46-win32 快速下载 httpd-2.4.46-win64 3. 发起压测 进入bin目录 模拟100个请求 10个并发 请求慕…

Java 128陷阱+自动装箱拆箱

1.大纲概述 Int 整型为java八大基础类型之一&#xff0c;Integer是它的包装器类型&#xff1b;int的默认值为0&#xff0c;而Integer的默认值为null。 128陷阱&#xff1a;指 Integer类封装的数字在[-128,127]范围内比较可以相等&#xff0c;超过此范围不能相等的现象。如下为代…

Hive 热门数据分析面试题解析

作者 | 数据管道责编 | 徐威龙封图| CSDN 下载于视觉中国SQL中有一类函数叫聚合函数&#xff0c;比如count、sum、avg、min、max等&#xff0c;这些函数的可以将多行数据按照规整聚集为一行&#xff0c;一般聚集前的数据行要大于聚集后的数据行。而有时候我们不仅想要聚集前的数…

Java-数据类型拓展

整数 // 整数拓展&#xff1a; 进制 二进制0b 八进制0 十进制 十六进制0xint i2 0b10; // 二进制int i8 010; // 八进制int i10 10;int i16 0x10; // 十六进制 0~9 A~FSystem.out.println(i2); // 2System.out.println(i8); // 8System.out.println(i10); //…

MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数

InnoDB在设计lock-free的log system时&#xff0c;除了已有的参数外&#xff0c;还通过宏控制隐藏了一些参数&#xff0c;如果你使用源码编译时&#xff0c;打开cmake选项-DENABLE_EXPERIMENT_SYSVARS1, 就可以看到这些参数了。本文主要简单的过一下这些隐藏的参数所代表的含义…

不改代码也能全面 Serverless 化,阿里中间件如何破解这一难题?

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

java中的值传递

1.概述 引用类型中&#xff0c;java中全部都是值传递&#xff0c;传递对象里的值&#xff0c;而不会传递对象本身。 2.代码示例 public class Main {public static void main(String[] args) {Student a new Student();Student b new Student();a.setName("zhangsan&q…

Java-类型转换

类型转换 public static void main(String[] args) {/*由于java是强类型语言&#xff0c;所以进行有些运算时&#xff0c;需要用到类型转换低 ---------------------------------------- 高byte,short,char ->int ->long ->float ->double强制转换 高-->低自…

linux 环境搭建 Sentinel 控制台

文章目录一、搭建Sentinel 控制台1. Sentine文档2. 下载稳定版本3. 启动sentinel4. 登录 sentinel一、搭建Sentinel 控制台 1. Sentine文档 https://github.com/alibaba/Sentinel/wiki/控制台 2. 下载稳定版本 https://github.com/alibaba/Sentinel/releases wget https:/…

甲骨文Java 14来啦!

甲骨文两年来&#xff0c;每六个月如约发布新版本的Java&#xff0c;Oracle JDK 14为开发人员带来创新功能和新特性预览。Oracle JDK 14增加了一些新特性来提高开发人员工作效率&#xff0c;这些新特性包括&#xff1a;对switch表达式的Java语言支持&#xff0c;用于持续监控JD…