Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

11|YAML:Kubernetes世界里的通用语

你好,我是 Chrono。
在上次课里,我们一起研究了 Kubernetes 的内部架构和组成,知道它分为控制面和数据面。控制面管理集群,数据面跑业务应用,节点内部又有 apiserver、etcd、scheduler、kubelet、kube-proxy 等组件,它们互相协作来维护整个集群的稳定运行。
这套独特的 Master/Node 架构是 Kubernetes 得以安身立命的根本,但仅依靠这套“内功心法”是不是就能够随意仗剑走天涯了呢?
显然不行。就像许多武侠、玄幻作品里的人物一样,Kubernetes 也需要一份“招式秘籍”才能把自己的“内功”完全发挥出来,只有内外兼修才能够达到笑傲江湖的境界。
而这份“招式秘籍”,就是 Kubernetes 世界里的标准工作语言 YAML,所以今天,我就来讲讲为什么要有 YAML、它是个什么样子、该怎么使用。

声明式与命令式是怎么回事

Kubernetes 使用的 YAML 语言有一个非常关键的特性,叫“声明式”(Declarative),对应的有另外一个词:“命令式”(Imperative)。
所以在详细了解 YAML 之前,我们得先来看看“声明式”与“命令式”这两种工作方式,它们在计算机世界里的关系有点像小说里的“剑宗”与“气宗”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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)

  • 最新
  • 精选
  • nada
    1. 因为空调的使用是我们设置温度,然后空调尽量去达成设置的温度,即我们设置的是我们想要达成的效果,而不像电视遥控器,每次操作都发送一个指令,声明式还有一个特点是容易 patch,拿空调举例,当前气温 30 度,我们先设置了 24 度,然后升高到 26 度,空调并不会先降低到 24 度,再升高到 26 度,而是将两次传递的意图 patch,直接降低到 26 度,k8s 也是这样 2. yaml 转换 json 的过程基本上字段一一对应,除了最后会把当前的 json 再序列化为字符串,存储到 "kubectl.kubernetes.io/last-applied-configuration" 这个 annotations 中

    作者回复: great

    2022-07-15
    4
    25
  • 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-15
    11
  • 陶乐思
    请问一下老师, —dry-run=client -o yaml生成的YAML默认情况下会将文件保存在哪里啊?没有找到呢…环境:windows+minikube

    作者回复: 它直接输出在屏幕上,需要用一个重定向功能,命令后面加上 > xxx.yml,或者直接鼠标选择文本。

    2022-07-15
    2
    8
  • aoe
    终于对一头雾水的yaml文件有了一个正确的了解,感谢老师

    作者回复: my pleasure。

    2022-07-21
    6
  • 安迪密恩
    这门课太棒了,以前接触的杂乱的知识点在学完这一章之后逐渐变得脉络清晰!

    作者回复: 欢迎分享学习心得。

    2022-07-20
    4
  • 郑海成
    有了刚才 YAML 语言知识“打底”,相信你基本上能够把它看明白,知道它是一个 Pod,要使用 nginx:alpine 镜像创建一个容器,开放端口 80,而其他的部分,就是 Kubernetes 对 API 对象强制的格式要求了。 ———— 查了一下官方文档,其实不是“开放”,好像是是“说明”容器中暴露的端口是80

    作者回复: 知道这个意思就行,不用太咬文嚼字。

    2022-07-22
    2
    3
  • aLong
    首先感谢老师三个技巧。这块配置的内容我确实很头大啊。初学时看书都想跳过去看看后面内容。今天看完老师讲的有点意思啊。尤其是我喜欢那种比喻生动的多。 两种方式进行比较: 命令:简单、直观、快捷,上手快。 适合临时测试或实验。 yaml文件:文件描述了What,即应用最终要达到的状态。配置文件提供了创建资源的模板,能够重复部署。可以像管理代码一样管理部署。适合正式的、跨环境的、规模化部署。这种方式要求熟悉配置文件的语法,有一定难度。 另外 kubectl apply不但能够创建Kubernetes资源,也能对资源进行更新,非常方便。 空调这种有些需求没办法直接达到预期工作,比如制冷、制热、温度调整。 反观:电视,你想换台就换了,声音控制多少按+ -就行了。 所以空调很多功能更像是声明式。

    作者回复: awesome!

    2023-01-06归属地:上海
    2
  • bruce
    apiVersion: 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归属地:北京
    2
    2
  • 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-21
    2
    2
  • 赤色闪电
    “声明式”:空调遥控器操控空调设定想要的温度和模式即可。“命令式”:电视遥控器操控电视,按一个钮换一个台。

    作者回复: good

    2022-07-15
    2
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部