在kubernetes的江湖里,一直流传YAML的传说,它是Yet Another Markup Language的英文缩写,用来配置k8s里的各类资源.。通常,你可以选择YAML或JSON来完成声明式的配置文件,这种方式便于复用和保存,但命令式的方式有一定的局限性,仅有部分kubernetes资源可以使用命令式方式。本秘笈将从招式(语法)和心法(思路)出发,从四个方面阐述YAML文件的秘密,快速提高内力,增强kubernetes学习信心。
第一式: 仙人指路
永远不要尝试记住所有API或命令,计算机技术重要的是理解和实践。API、命令、类名等等只需在理解的基础上,然后有目的的去查阅、调用,最终解决问题。在书写Kubernetes的YAML文件时,同样会遇到例如apiVersion,kind这样的键,具体的值均不需要记忆,利用相关的命令即可快速查询得到。先去
用kubectl api-resources查询到的结果
从上图可以看到kubernetes的资源名称,快捷键,版本号,Kind等信息列表,在书写YAML文件时,如果不知道具体的API版本或KIND可以用这个命令获得。APIVERSION主要分为core,apps这两个大组,像pod,secert,service,configmap等都是kubernetes的核心资源,因此在书写与这类资源相关的Yaml文件时,仅需写版本号。而对于像deployment,daemonset,statefulset,replicaset这类集合,与应用部署强关联的资源,需要先加上apps这个组,然后再写版本号,例如:apiVersion:apps/v1。
用kubectl edit deploy nginx-deployment获得所有参数
利用kubectl edit不仅可以修改原有的资源,还可以看到相关资源的所有参数,用原来的文件来给我们指导,正是仙人指路的本意。
第二式: 唯我独尊
对于Yaml文件后面的部分,同样有规律可循。kubernetes的Yaml文件主要想表达两种状态,一个是期望状态,一个是实际状态。其中,期望状态以结果为导向,比如replica副本的数量,用户只需要告诉api-server自己希望的结果,很有一种唯我独尊重的感觉。在yaml文件的spec部分,表达了这种期望。而真实状态很多时候不需要用户去写,利用相关的命令可以查询到。spec部分的内容同样不需要去记,可以用相关的命令查询到。
用kubectl explain pod解释pod资源
利用explain可以解释kubernetes所有资源,上图是以pod资源为例,可以告诉用户pod资源具体的对象或类,其中就包括spec,让我们乘胜追击,看看spec具体可以包含哪些键。
kubectl explain pod.spec
在书写yaml文件时,可以利用explain了解每个资源的细节,摒弃死记硬背的同时也可以加深理解。
第三式: 凌波微步
所谓凌波微步,意思是yaml文件的书写要挖掘缩进规律,从上图这个Deployment的yaml文件可以看出。但凡是map的键均顶格来写,而map的值均有两格缩写。yaml的数据结构有两种map和list,上图只有containers是list,其余全是map.在yaml中,这两种数据结构自身通常嵌套,对于list的值,顶格写,且要先加上-。
第四式: 虎鹤双形
书写kubernetes的配置文件,可以以yaml格式,也可以以json,这两种方式通常可以互相转换,但是yaml由于其语法可读性更强,已取得支配地位。
json和yaml对比
用-o json把已有资源导成json格式
无论是yaml还是json,其实底层都只不过是go和kubernetes API的交互,比如下面的代码
总之,yaml文件仅是用来与kubernetes api互动的一种方式,只要勤于练习,定能从中发现规律,提高书写效率。
评论记录:
回复评论: