11|YAML:Kubernetes世界里的通用语
声明式与命令式是怎么回事
- 深入了解
- 翻译
- 解释
- 总结
Kubernetes中的YAML语言在描述API对象时扮演着重要角色。本文首先介绍了声明式与命令式工作方式的区别,以及YAML语言的特点和优势。YAML是JSON的超集,支持多种数据类型,语法简单清晰。文章通过示例展示了YAML的数组和对象的表示方式。接着,介绍了Kubernetes中的API对象,包括ConfigMap、Pod、Service等,强调了Kubernetes 1.23版本拥有50多种API对象,全面地描述了集群的节点、应用、配置、服务、账号等信息。文章还介绍了如何编写YAML文件的实用技巧,包括使用`kubectl api-resources`和`kubectl explain`命令,以及使用`--dry-run=client -o yaml`参数生成YAML模板。总结指出,Kubernetes采用YAML作为工作语言,能够更准确地描述系统状态,适合CI/CD,而声明式的语言与Kubernetes高度自动化的内部结构相得益彰。读者通过本文可以快速了解YAML在Kubernetes中的应用,以及如何使用YAML描述API对象,同时掌握了编写YAML文件的实用技巧。
《Kubernetes 入门实战课》,新⼈⾸单¥59
全部留言(30)
- 最新
- 精选
- nada1. 因为空调的使用是我们设置温度,然后空调尽量去达成设置的温度,即我们设置的是我们想要达成的效果,而不像电视遥控器,每次操作都发送一个指令,声明式还有一个特点是容易 patch,拿空调举例,当前气温 30 度,我们先设置了 24 度,然后升高到 26 度,空调并不会先降低到 24 度,再升高到 26 度,而是将两次传递的意图 patch,直接降低到 26 度,k8s 也是这样 2. yaml 转换 json 的过程基本上字段一一对应,除了最后会把当前的 json 再序列化为字符串,存储到 "kubectl.kubernetes.io/last-applied-configuration" 这个 annotations 中
作者回复: great
2022-07-15425 - psoracle回答一下作业 1. 你是如何理解“命令式”和“声明式”的?为什么说空调是“声明式”的? 我现在从kubernetes相关知识点中学习并理解到的“声明式”一个最直白的地方是新增与修改两个命令式操作写成apply,如果创建对象不存在则创建、对象已存在就比较spec进行相应变更,当然k8s的修改实际上是先delete再create。至于kubectl create、kubectl edit、kubectl delete等都是"命令式"操作,告诉k8s应该怎么做。 空调是“声明式”的原因是我不知道当前温度是多少,只需要我知道应该开成多少度即可,即我们在操作遥控器之前就知道我们要将空调调成多少度,这是预期值。 2. 使用 --v=9 参数,试着解释一下 YAML 是如何被 kubectl 转换成 HTTP 请求的。 虽然yaml格式是json的超集,但在k8s中的yaml文件最终都是被转换为json格式字符串放在request body中提交到apiserver的,从`kubectl -v=9`对各种操作的调试中可以看到。 除此之外,还发现一些有规律的地方,如下: 可见简单对象(如pod, configmap, secret, serviceaccount等)调用的接口形式如 `/api/<apiVersion>/namespaces/<namespace>/<kinds>[/<name>]`,其中对象类型为复数形式即`kubectl api-resources`中的name字段,修改、删除与查询具体对象时在URL中有`/<name>`部分,其它如创建、查询所有就没有。对于复合对象(简单对象的包装对象,如replicaset, deployment, statefulset, cronjob等)的URL不同的是以`/apis`开头,说明是属于复合型的接口(组合服务)。
作者回复: awesome
2022-07-1511 - 陶乐思请问一下老师, —dry-run=client -o yaml生成的YAML默认情况下会将文件保存在哪里啊?没有找到呢…环境:windows+minikube
作者回复: 它直接输出在屏幕上,需要用一个重定向功能,命令后面加上 > xxx.yml,或者直接鼠标选择文本。
2022-07-1528 - aoe终于对一头雾水的yaml文件有了一个正确的了解,感谢老师
作者回复: my pleasure。
2022-07-216 - 安迪密恩这门课太棒了,以前接触的杂乱的知识点在学完这一章之后逐渐变得脉络清晰!
作者回复: 欢迎分享学习心得。
2022-07-204 - 郑海成有了刚才 YAML 语言知识“打底”,相信你基本上能够把它看明白,知道它是一个 Pod,要使用 nginx:alpine 镜像创建一个容器,开放端口 80,而其他的部分,就是 Kubernetes 对 API 对象强制的格式要求了。 ———— 查了一下官方文档,其实不是“开放”,好像是是“说明”容器中暴露的端口是80
作者回复: 知道这个意思就行,不用太咬文嚼字。
2022-07-2223 - aLong首先感谢老师三个技巧。这块配置的内容我确实很头大啊。初学时看书都想跳过去看看后面内容。今天看完老师讲的有点意思啊。尤其是我喜欢那种比喻生动的多。 两种方式进行比较: 命令:简单、直观、快捷,上手快。 适合临时测试或实验。 yaml文件:文件描述了What,即应用最终要达到的状态。配置文件提供了创建资源的模板,能够重复部署。可以像管理代码一样管理部署。适合正式的、跨环境的、规模化部署。这种方式要求熟悉配置文件的语法,有一定难度。 另外 kubectl apply不但能够创建Kubernetes资源,也能对资源进行更新,非常方便。 空调这种有些需求没办法直接达到预期工作,比如制冷、制热、温度调整。 反观:电视,你想换台就换了,声音控制多少按+ -就行了。 所以空调很多功能更像是声明式。
作者回复: awesome!
2023-01-06归属地:上海2 - bruceapiVersion: v1 kind: Pod metadata: name: ngx-pod labels: env: demo owner: chrono spec: containers: - image: nginx:alpine name: ngx ports: - containerPort: 80 metadata里的name和spec里的name有啥区别?
作者回复: 可以用kubectl explain看看这两个字段的说明,一个是对象名字,一个是容器名字。
2022-12-20归属地:北京22 - pyhhou有两个问题想请教老师, 1. 通过 `kubectl api-resources` 看到的资源名称中其实没有 pod 而是 pods,但是我们依旧可以通过 pod 来访问对应的资源,这里是否可以理解为 k8s 自动帮忙做了单复数转换? 2. 没有看到 images 相关的资源,k8s 是如何管理 image 的呢?还是说对应的镜像管理被细分到 pod 的字段中? 3. 文章中(在 “什么是 YAML” 的结尾处)给的最后一个复杂的 YAML 例子,我试着在 https://www.bejson.com/json/json2yaml/ 上面转换成 JSON,但是平台会报如下错误: yaml错误: TypeError: Cannot read properties of undefined (reading 'split') 感觉像是缩进的问题
作者回复: 1. pod/pods/po在Kubernetes里都是同义词,至于单复数的语法问题我就不太好解释了。 2.是的,image在Pod的container里,见下一讲。 3.我试了可以转换,再查一下看是哪里有问题。
2022-07-2122 - 赤色闪电“声明式”:空调遥控器操控空调设定想要的温度和模式即可。“命令式”:电视遥控器操控电视,按一个钮换一个台。
作者回复: good
2022-07-152