YAML 基础
如果你正在做的事与很多软件领域相关,那么将很难不涉及到YAML,特别是Kubernetes,SDN,和OpenStack。YAML,它代表着另一种标志语言,或者YAML不是标志语言(取决于你问谁)而是特定配置类型基于人类可读的文本格式的信息,例如,在本文中,我们将会分开说说明YAML定义创建Pod和使用Kubernetes创建一个Depolyment。

使用YAML用于k8s的定义将给你一些好处,包括:

便捷性:你将不再需要添加大量的参数到命令行中执行命令
可维护性:YAML文件可以通过源头控制,可以跟踪每次的操作
灵活性:通过YAML你将可以创建比命令行更加复杂的结构
YAML是一个JSON的超集,意味着任何有效JSON文件也都是一个有效的YAML文件。所以一方面,如果你知道JSON,你只是要去写自己的YAML(而不是阅读别人的)也就可以了。另一方面,不太可能,不幸的是,尽管你尝试去网上找到例子,但是他们通常都不是JSON,所以我们可能需要去习惯它。不过,有JSON的情况下可能会更方便,这样你将会很开心你懂得JSON。

幸运的是,YAML只有两种结构类型你需要知道:

Lists
Maps
那就是说,将有可能存在lists的maps和maps的lists,等等,但是,你只要掌握了这两种结构也就可以了。这并不是说你不能做更加复杂的事,但是通常,这些也就够了。

YAML Maps
我们先开始看YAML maps。Maps让你将键值组合,你就可以更加方便的去设置配置信息。例如,你可能有以下这样一个配置信息:


apiVersion: v1
kind: Pod
第一行是分隔符,并且是可选的,除非你试图在单个文件中定义多个结构。从这里你可以看到,我们有两个值,V1和Pod,对应他们的键是apiVersion和kind。

这种比较简单,当然你也可以将之转换为json格式,如下:

{
"apiVersion": "v1",
"kind": "Pod"
}
注意,在我们的YAML版本中,引号是可选的,处理器可以知道你正在查看基于格式化的字符串。

你也可以指定一个复杂的结构,创建一个key其对应的值不是字符串而是一个maps如下所示:


apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
这种情况下,我们有metadata这个key对应的值中又有两个key分别为name和labels。labels 这个key的值又是一个map。你可以根据场景进行多层嵌套。

YAML处理器可以根据行缩进来知道内容之间的关联。在这个例子中我用了两个空格使之可读,但是空格的数量不重要,但是至少要求一个,并且所有缩进都保持一致的空格数。例如,name和labels是相同缩进级别,因此YAML处理器知道他们属于同一map;它知道app是lables的值因为app的缩进更大。

注意:在YAML文件中绝对不要使用tab键

因此,如果我们将上述内容翻译成JSON,它看起来结果如下所示:

{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
}
}
现在让我们来看看lists。

YAML lists
YAML lists 简直是一个序列的对象,例如:

args

  • sleep
  • "1000"
  • message
  • "Bring back Firefly!"
    正如你可以看到,你可以有任何数量的项在列表中,项的定义以破折号(-)开头,并且与父元素之间存在缩进。在JSON格式中,它将表示如下:

{
"args": ["sleep", "1000", "message", "Bring back Firefly!"]
}
当然,list的子项也可以是maps,maps的子项也可以是list如下所示:


apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:

  • name: front-end
    image: nginx
    ports:
    • containerPort: 80
  • name: rss-reader
    image: nickchase/rss-php-nginx:v1
    ports:
    • containerPort: 88
      正如你所看到的,我们有一个叫container的list对象,每个子项都由name、image、ports组成,每个ports都由一个key为containerPort map组成

如下所示,是上述内容的JSON格式:

{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "rss-site",
"labels": {
"app": "web"
}
},
"spec": {
"containers": [{
"name": "front-end",
"image": "nginx",
"ports": [{
"containerPort": "80"
}]
},
{
"name": "rss-reader",
"image": "nickchase/rss-php-nginx:v1",
"ports": [{
"containerPort": "88"
}]
}]
}
}
正如你所看到的,我们写的内容开始变的复杂,甚至我们还没有进入任何特别复杂!难怪YAML代替JSON如此之快。

现在然我们复习一下,我们有:

maps,键值对
lists,单独的项
maps的maps
maps的lists
lists的lists
lists的maps
基本上,无论你想要什么样结构,你都可以通过这两个结构去组合实现。