上K8s,研发团队如何从容一点?
前言
本文主要讲4个部分:
- 关于容器技术;
- 难以驾驭的K8s;
- K8s是所有人的良药吗?
- 我的团队该如何上K8s?
一. 关于容器技术
你是否听说过容器技术(以docker和Kubernetes为代表)? 容器技术呱呱坠地到如今,在国内经历了如下3个阶段:
- 婴儿期:2014-2016年的技术探索期;
- 少儿期:2017-2018年的行业试水期;
- 少年期:2019年以后的$\color{red} {规模应用期} $。
容器技术作为技术圈儿中的香饽饽,如果你还没有听说过,建议你立刻了解一下,以免跟不上当今的技术潮流。
容器技术带来的价值,通过它的广泛使用已经不言而喻,因此不再多费文字阐述。这里直接向大家大致介绍容器技术的现状和趋势。
- Kubernetes(K8s)已成为容器技术的事实标准
- 大量企业已经在使用或者计划使用容器云
- K8s从CO走向OS
K8s一直以来被当做容器编排工具(Container Operation, CO),而这些年的发展,K8s已经成了云原生领域事实的操作系统(Operation System, OS)。
二. 难以驾驭的K8s
K8s功能固然强大,但同时从K8s目前的定位——操作系统,就能看出它最大的特征:复杂!!!
复杂真是万恶之源!复杂会带来一些列衍生问题:
- 上手k8s绝非易事,用一个高级点的说法,叫学习曲线陡峭。并且容器技术的更新迭代非常快,Kubernetes衍生出的新概念新工具也在蓬勃发展(有兴趣的朋友可以搜索一下“Kubernetes生态”)。然而更有挑战性的点在于,如果想在实际的工作中用上K8s,不只你一人要学,整个研发团队都需要学,包括开发人员、测试人员、运维人员。
- 市场上,K8s相关人才不多。
- 项目使用K8s的不确定性太高,可能会导致失败。
- 项目切换到K8s的成本太大,导致你的老板可能会叫停这样的变革。
- 你需要适应K8s的工作模式,软件研发本来就是一个复杂的体系,包括了很多人使用很多工具分工合作,而使用K8s,很多工作方式与原来不一样。下面罗列一下,以供参考。
-
在实际使用中,还有很多非常棘手的问题,比如:
- K8s yaml的配置一部分是开发关注的,一部分是运维关注的,如何分工协作?
- ConfigMap/Secret 不支持版本控制,参数多时配置起来很麻烦;
- 集群如何给外部暴露端口?
- 如何做热更新?
- 多K8s集群如何管理?
- K8s集群本身如何备份和恢复?
- 如何对K8s集群进行升级而不影响业务?
- K8s集群如何做资源规划?
三. K8s是所有人的良药吗?
K8s很好,然而用Ta很困难,是不是让人又爱又恨?怎么办?
建议你冷静下来,仔细分析一下更重要的事情——K8s是否适合你、你的项目、你的团队?
建议考虑如下亮点:
- 你的应用是否需要微服务?微服务带来便利的同时,也会给开发人员带来巨大负担,除了维护多个服务之外,可能需要一整套工具来分析解决微服务的问题。还要考虑分布式的一致性问题、服务通信带来的性能问题和安全问题等。如果不需要微服务,大概率也不需要K8s。
- 你的应用需要扩展吗?Kubernetes 的一个关键特性是能对应用程序的各个部分进行横向扩展。流量会自动在各个 Pod 间路由和分配,如果配置完成,Kubernetes 甚至可以自动为你缩放 Pod 。如果你的应用有一个或多个热点组件需要处理突发事件,那这个特性就非常有价值。
如果你的答案是你不需要K8s,那么恭喜你,你可以中止阅读了,你花费了10分钟不到的时间,得到了一个有价值的答案。
如果你的答案是:你需要K8s,请继续阅读,也许对你有些许帮助。我上面列的困难只是战术上的困难,是有办法解决的。
四. 我的团队该如何上K8s?
关于how的问题,有大有小:大如我该如何度过这一生,小则有我该如何学习10以内的加法。而团队该如何上K8s,这就是一个宏大的问题。一般而言,大问题可以拆分为小问题,逐个求解得到答案。但如果我把这个问题逐一细细的拆解,恐怕得一本书才能写完。所以,我仅从大的方面上尝试回答一下该问题。一些具体的小问题,比如我上文表格中的那些工作项,上了K8s该如何做,有时间咱们可以再做探讨,有兴趣的读者也可以给我留言。
言归正传,团队如何上K8s,从大面上,我的答案包含2点,二者缺一不可:
1. 渐进式上K8s;
2. 人员分工 + 第三方产品解决复杂性。渐进式上K8s
渐进式上K8s听上去很简单,但实施起来不然,具体来说包括如下几点:
-
特定项目。选择即将要开发的新项目,简单一点的项目,没有迁移成本。
-
特定完整团队。项目的leader需要有新技术的探索精神,项目中核心成员也有新技术的探索精神。关于特定团队,团队中的研发人员、测试人员、运维人员都需要从一开始就直接或间接使用K8s。直接是上原生K8s,间接是指通过第三方平台上K8s。
笔者曾经碰到很多上了K8s的客户,推进得都无比艰难!除了上述的诸多的难题之外,还有一个最重要的原因——这些客户上K8s是先从运维部门开始。这些客户认为,正是因为K8s如此复杂和不确定性高,所以引入第三方的产品或解决方案,先从一个部门开始使用,再逐步推广到研发部门。而现实是:K8s是涉及研发、测试、运维的整体协作方式变革,引入第三方的产品或解决方案时,要么是研发测试人员没有参与,要么是没有深度参与,导致在推广时,第三方的产品或解决方案不被研发测试人员接受。
-
测试环境。项目先在测试环境以K8s方式部署。
取得成功之后,再扩展至生产环境、其他项目、其他团队。这样的方式,有利于团队积累对K8s的自信心。取得一定的广度成功的同时,在深度上也可以做一定的探索,比如,使用K8s配套的测试工具、运维工具,甚至采用一些开源项目的CRD,比如Open Kruise。甚至编写自己公司特有的CRD。
人员分工 + 封装
人类解决复杂性有2个非常重要的手段:分工、封装。这里就不举例子了,在IT领域,这两个手段的例子俯拾皆是。具体到上K8s体现为:
- 人员分工是指不需要整个团队的人都懂K8s,只需要特定的一两个人懂K8s,研发人员、测试人员只需配合相关的工作,由这一两个人来编写Dockerfile、K8s yaml,也可以由这一两个人写好脚本,开发人员和测试人员直接调用脚本,传递合适参数。
- 封装。有如5种方式封装,第1条是穷人专用,第5条是土豪专用,第2、3、4条是经济适用条款。
- 可以采用脚本或者模板的方式,对开发人员、测试人员屏蔽K8s的复杂性;
- 采用开源的工具来封装操作复杂性,提供了Web UI,比如:OKD、Rancher、KubeSphere等;
- 购买商业化的容器云产品来封装操作复杂性,公有云或私有云的产品都可以,比如AWS/阿里云/腾讯云/华为云上的容器云产品;
- 购买商业化的产品来封装操作复杂性、以及理解复杂性。市面上,既封装了操作复杂性、又封装了理解复杂性的产品不多,比如StarOS,这款产品封装了K8s的概念,无需懂K8s即可使用。;
- 自己团队开发容器云平台来封装操作复杂性、以及理解复杂性,土豪适用。
附注
笔者容器云行业从业好几年,略有心得,聊作分享。如有疏漏,多谢指正,欢迎留言探讨。
引用说明
本文大量数据来源于《艾瑞咨询:2020年中国容器云市场研究报告》
- K8s yaml的配置一部分是开发关注的,一部分是运维关注的,如何分工协作?
原文地址:https://www.cnblogs.com/friendofgod/p/15117772.html
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- 动态创建MySQL Group Replication的节点(r11笔记第84天)
- sysbench压测小记(r11笔记第99天)
- WordPress启用memcached动态缓存以及报错解决
- 升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- 相差数十倍的SQL性能分析(r11笔记第98天)
- shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用holder.js生成美观的网页占位图
- Android studio 3.5.2安装图文教程详解
- Android面试必备的JVM虚拟机制详解,看完之后简历上多一个技能!
- 如何在PHP中JSON在线解析
- Linux下如何克隆磁盘/分区命令dd入门
- Android自定义跑马灯文字效果
- Android实现图片自动切换功能(实例代码详解)
- Android Studio 3.6 正式版终于发布了,快来围观
- android使用ViewPager实现图片自动切换
- Android Studio 3.6 调试 smali的全过程
- Android 10 适配攻略小结
- Android P实现静默安装的方法示例(官方Demo)
- Android studio实现滑动开关
- Android实现TCP客户端支持读写操作
- Android通过命令连接wifi的方法(解决usb不能用问题)