YAML基础
Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式)
而是希望你用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:
$ kubectl apply -f
配置文件
这么做最直接的好处是,你会有一个文件能记录下 Kubernetes 到底"run"了什么。
使用YAML用于K8s的定义的好处:
• 便捷性: 不必添加大量的参数到命令行中执行命令
• 可维护性:YAML文件可以通过源头控制,跟踪每次操作
• 灵活性: YAML可以创建比命令行更加复杂的结构
YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。
后文会说明定义YAML文件创建Pod和创建Deployment。
YAML语法规则:
大小写敏感
使用缩进表示层级关系
缩进时不要使用Tab键,只使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
"#" 表示注释,从这个字符一直到行尾,都会被解析器忽略
在Kubernetes中,只需要知道两种结构类型即可:
- Lists
- Maps
Maps:字典
即key:value键值对信息.如:
---
apiVersion: v1
kind: Pod
Maps的值既可以是一个字符串,也可以是一个Map,如:
metadata:
name: kube100-site
labels:
app: web
上面这个例子的metadata这个键值就是一个map,而嵌套的labels键的值又是一个map
Lists:列表
类似于数组.如:
args:
- beijing
- shanghai
- shenzhen
- guangzhou
可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与父元素之间存在缩进。
在JSON格式中,表示如下:
{
"args": ["beijing", "shanghai", "shenzhen", "guangzhou"]
}
Lists的子项也可以是Maps,Maps的子项也可以是List,例如:
---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: flaskapp-demo
image: jcdemo/flaskapp
ports: 8080
这个例子中定义了containers的List对象,每个子项都由name、image、ports组成,每个ports都有一个KEY为containerPort的Map组成
现在然我们复习一下,我们有:
• maps,键值对
• lists,单独的项
• maps的maps
• maps的lists
• lists的lists
• lists的maps
基本上,无论你想要什么样结构,你都可以通过这两个结构去组合实现
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers