开发者学堂课程【Kubernetes 云原生管理实践:Kubernetes 应用的自动水平扩容】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/751/detail/13221
Kubernetes 应用的自动水平扩容
内容介绍:
一、Kubernetes HPA 扩展应用
一、Kubernetes HPA 扩展应用
1、怎么用 Kubernetes HPA 对应用进行扩展。并不是原生的 Kubernetes HPA,也不是其他的技术,基于 HPA 的一些扩展。主要是关于 OAM,就是开发应用模型,这之间有什么关联。
2、云原生架构为什么要提建设?因为阿里云发表了云原生架构的白皮书,里面特别提到了云原生架构和传统应用架构的不同。作为一个传统的应用,以云原生的眼光来看有三部分内容。一部分是核心的应用代码,这部分应用有些改变,比如以前是放在一起的单一应用,慢慢的变成了分布式应用,也有了微服务的架构。但是这些都是针对业务代码本身做的拆解。还有一部分是对第三方软件依赖性,比如说有的是用数据库,有的是用 macscue,有的是用日志,或者是其他的这些应用。这些应用它的特点是跟业务代码加码令,是可以重复使用的,有第三方的功能。还有一部分就是一些运维的能力,比如说很多时候要写一些关于高可用性,有的要写一些关于 node balancing 这样的代码。在云原生架构的环境下,这些代码都进行了一些组合,业务代码慢慢的变成了微服务,一些第三方的软件变成了云上的一些资源,比如说云上的数据库,去买一个 message ,买一个 christian 等等。还有一些运维能力,这些运维能力慢慢就下沉到了 PaaS 层、也就是平台层。所以在云原生架构的环境下,整个的应用跟传统的架构比是有很大的改变。这些改变也造成了在描述应用的时候,也会产生相应的改变。
3、为什么要采用云原生的架构?主要是为了提升应用交付迭代的速度,当传统的架构越变越大的时候,不得不去把它拆解掉。在拆解的过程中,如果用云原生架构下的一个应用,希望怎样去描述一个应用呢?应用代码把它叫做一个模块,有几个应用代码模块,然后第三方依赖模块,接着就是运维模块。所谓的运维模块,包括课程要讲的 HPA,包括 ingress。所有的对业务的模块进行运维操作的业务能力,都把它叫做运维模块。这种描述方式对于云原生架构的一个很自然、直接的,也是很直观的一种映射。
4、看一下在 Kubernetes 是怎样去描述一个运用的。可以看到这么多 yaml,而且这么多 yaml 文件当中是混在一起的。
比如用一个最常用的 deployment,在 deployment 里面有业务逻辑的部分,比如说它讲了 daughter image 在哪,开了哪一个端口,这个端口名字叫做 http 等等。也有一些运维的操作,replic 是一个,Running updates,发布的策略等等,这些都混在了一起,混在一起的情况是非常难以管理,不但非常难以管理而且很容易造成错误。为什么会产生这种情况?应用发布或者应用交付平台或者说应用部署的方式,是站在一个平台的角度或一个集群的角度,没有去想怎么样站在一个应用的角度去发布。这个当中就带来了很多问题,就像刚才说的,一个是混乱,第二个是职责不清,第三个是很难以管理。在种种弊端的情况下,提出了这样一个开源项目叫 OAM。OAM 就是 Open Application Model,开放的应用模型。这是在云原生应用环境下对应用的一个描述,特别是在平台管理层上对应用进行的描述。这个项目是阿里云和微软、issue 等其他的三方共同开发的。目前已经进入了工具的开发期,他的规范基本上已经成熟和稳定了,现在要把代码实践的部分做好。
5、OAM 分为几部分。
第一部分是组件,比如业务组建、组件1、组件2。在组件中引入一个概念叫 workload,workload 是什么呢?它对应的 Kubernetes 下 workload 的概念加以提升,就是把抽象程度变高了,变好了。Workload 也包含了 service 等等的产生。组件是作为 workload 的模板,把 workload 再往上提升。用这种方式来定义应用本身的组件是非常直观和简洁的
6、第二部分是 traits,叫特征。
这个字是从 rust 语言来的,traits 是对运维属性的一些描述,特别是在 Kubernetes 上一些应用的描述,比如说 scaling、rollout、route 等等。这些运维操作是绑定在 components 上,有一个非常重要的概念,对于应用的描述,比如application configuration,就是把应用完整的放在一起的时候,对于应用进行描述的时候,是把 component 放在那里。比如说我有一个组件,有一个容器,有一个模块,他有哪些操作是直接可以套用的,这种观念和现在的以平台为主视角这种观念是截然不同。
7、application configuration 是另一个例子,他当中讲了有哪些 traits。在这个例子中用的就是 HPA,是原生自带的。HPA 是 Kubernetes 的基本运维操作,是对于deployment 下的 scale 进行操作的。这个操作会去看一些指标,根据这些指标进行扩容和缩容的操作,两部分都有。
这个操作本身来讲,原生的那部分对于一些容器或计算资源作为指标,比如说 CPU 、memory 等等。这些往往是不够的,在这种情况下,需要进行扩展,扩展有不同的项目。