个人理解
想到了命令式语言与声明式语言。
SQL 是命令式语言,写 SQL 时不需要关心 SQL 具体的执行流程,只需要声明想要查询什么。
Kubernete 是声明式系统,那么说明使用 Kubernete 创建服务时,不需要关注 Kubernete 具体的细节,只要声明最终的服务。这个声明是通过 yaml 来实现的。—— 我的理解应该是准备的,这也是看到一些 Kubernete 的管理员称自己为 yaml 工程师。
文章摘要
- 面向 Kubernetes 编程: Kubernetes 是下一代操作系统
软件交付的历史
- 交付「源代码」: 这应该是最早的时代,客户现场的环境(操作系统、机型)都不同,需要带着代码到客户现场编译,然后运行软件。
- 交付 「可运行文件」:像 Java 提出的 “Build once, run everywhere” 概念,在这个时代,我们可以面向一个运行时虚拟机交付软件。或者我们都面向 Linux 交付,我们的使用 Go 编译的二进制,能顺利的部署到大多数的 Linux OS 上。但是这种方案也强依赖客户现场需要装上指定版本的 Java 虚拟机,或者 Linux 特定的版本(应用依赖 Linux 内核特性)。
- 交付 镜像:交付镜像,最大可能的屏蔽了底层 OS, Java 虚拟机的差异。在镜像里面,我们把自己需要的 OS 基础 和 Java 虚拟机也装上了。不再依赖客户现场的 OS 和 Java 虚拟机版本了。
交付镜像就是交付 Docker 镜像了,但是在作者看来,交付镜像也不完美。
在我眼里,镜像做的事情完全不够。原因无非也是这么些:
- 怎么配置启动参数,要交付人员辛苦的读懂启动参数配置说明说吗?
- 怎么做分布式应用的组网、服务发现
- 怎么做容灾
- 怎么做部署的元数据录入: 今天我在客户现场把 A 应用部署到了 节点1 上面,我要把这个信息记在哪儿?
- 自己亲自去做进程拉起、副本健康检查、副本保持等功能。
我非常赞同,当初同事说使用镜像时,我就非常坚持需要写文档,不然镜像如何启动。部署了 Docker 镜像,还是需要配置 Nginx,做监控检查,还需要关心每个节点的副本是不是会挂,也挺烦的。
面向 Kubernetes 交付软件
- CRD,Custom Resource Defines。???
- CR,Custom Resoures,客户资源。CRD 的实例,实际上也就是一个 yaml 文件;
- Operator,即 CRD + CR。—— 这就是声明式??
Operator
- Observe, 观察。当用户提交了 CR 时或者 pod 发生故障时,Observe 就会监控到;
- Analyze 分析,根据 Observe 观察的结果进行分析;
- Action 行动,创建 Pod。