目录
- 一、YAML语法特性
- 1、缩进
- 2、键值对
- 3、列表
- 4、映射(字典、哈希)
- 5、多行字符串
- 6、引用
- 7、数据类型
- 8、特殊标识符
- 二、YAML在Kubernetes中的应用
- 1、API版本与类型声明
- 2、元数据(Metadata)
- 3、规范(Spec)
- 4、定义应用程序组件
- 5、管理应用程序部署
- 9、StatefulSet、DaemonSet、Job、CronJob
- 三、最佳实践
YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,常用于编写配置文件、数据交换以及与各种编程语言和工具(如Kubernetes、Ansible、Terraform等)交互。YAML设计简洁、易于阅读和编写,尤其适用于表示层次结构复杂的数据。
一、YAML语法特性
1、缩进
YAML采用空格(通常是两个或四个)进行层级缩进,用于表示数据结构中的嵌套关系。缩进的严格一致性对于YAML文件的正确解析至关重要。
2、键值对
YAML的基本数据单元是键值对(key-value pair),通过冒号 :
分隔键和值。例如:
key: value
3、列表
YAML使用短横线 -
表示列表项,相邻的列表项应处于同一缩进级别。例如:
list:
- item1
- item2
- item3
4、映射(字典、哈希)
映射是一组键值对的集合,通过键来唯一标识每个值。映射内的键值对可以按任意顺序排列,且每个键在整个映射中必须唯一。例如:
map:
key1: value1
key2: value2
5、多行字符串
YAML支持折叠式(folded)和Literal(块)两种多行字符串表示方式:
-
折叠式(>):保留换行,但折叠连续的空白行。
description: > This is a folded multi-line string. The consecutive blank lines will be merged into one.
-
Literal(|):完全保留原始的换行和空格。
script: | #!/bin/bash echo "Hello, World!" # A blank line is preserved here
6、引用
YAML支持使用引号(单引号 '
或双引号 "
)来包裹字符串,以避免特殊字符被解析为YAML标记或转义。双引号允许内嵌变量插值和特殊字符转义。
7、数据类型
YAML支持多种数据类型,包括:
- 字符串:最常用的类型,可以包含字母、数字、标点符号等。
- 布尔值:
true
、false
。 - 整数:如
-123
,0
,42
。 - 浮点数:如
-3.14
,0.0
,1.2e6
。 - 时间日期:遵循ISO 8601标准,如
2023-0¼-¾T12:34:56Z
。 - null:表示空值,可写作
null
或~
。 - 列表:一系列有序的值,如上面所示。
- 映射:键值对的集合,如上面所示。
8、特殊标识符
-
锚点(&)与别名(*):用于重复引用相同的复杂数据结构,减少冗余。
common_config: &common param1: value1 param2: value2 instance1: config: *common instance2: config: *common
-
合并键(<<):将一个映射的内容合并到另一个映射中。
defaults: color: red size: large specific: <<: *defaults size: medium
二、YAML在Kubernetes中的应用
在Kubernetes中,YAML被用来定义和配置各种资源对象,如Pods、Deployments、Services、ConfigMaps、Secrets等。这些YAML文件构成了Kubernetes集群的声明式配置,用于描述应用程序的期望状态,Kubernetes则负责确保实际状态与所声明的状态保持一致。
1、API版本与类型声明
-
指明所描述资源的Kubernetes API版本和类型。
apiVersion: apps/v1 kind: Deployment
2、元数据(Metadata)
包括名称、命名空间、标签、注解等。
metadata:
name: my-app-deployment
namespace: default
labels:
app: my-app
annotations:
example.com/description: "This is a sample deployment"
3、规范(Spec)
定义资源的具体配置,如Pod模板、副本数量、服务端点等。
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: myregistry/myapp:v1.0
ports:
- containerPort: 80
4、定义应用程序组件
- Pods:YAML文件可以用来定义一个或多个紧密协作的容器集合(Pod),包括容器镜像、环境变量、资源请求与限制、端口映射、生命周期钩子等配置项。
```yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
spec:
containers:
- name: my-app-container
image: example.com/my-app:v1.0
ports:
- containerPort: 8080
env:
- name: APP_ENV
value: production
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "0.5"
memory: 256Mi
```
5、管理应用程序部署
- Deployments:通过YAML文件可以创建Deployment对象,用于声明式地管理Pod副本集的更新、回滚、扩缩容等操作。
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: example.com/my-app:v1.0
ports:
- containerPort: 8080
```
6、暴露与访问服务
- Services:使用YAML定义Service资源,为一组具有相同标签的Pod提供稳定的网络入口和负载均衡。
```yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
```
7、存储配置与敏感数据
- ConfigMaps:用于存储非敏感的应用配置数据,可注入到Pod作为环境变量、命令行参数或挂载为卷。
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-config
data:
config_key: config_value
```
- **Secrets**:用于存储敏感数据,如密码、密钥等,同样可通过多种方式注入到Pod中。
```yaml
apiVersion: v1
kind: Secret
metadata:
name: my-app-secret
type: Opaque
data:
password: cGFzc3dvcmQ=
```
8、高级调度与策略
- HorizontalPodAutoscaler:定义自动水平扩展策略,基于CPU或自定义指标调整Pod数量。
```yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
```
9、StatefulSet、DaemonSet、Job、CronJob
分别用于管理有状态应用、在每个节点上运行单个实例、执行一次性任务以及定时任务等。
三、最佳实践
-
保持一致的缩进:推荐使用两个空格进行缩进,避免混用制表符和空格。
-
使用空格分隔:键值对之间、列表项之间、映射键值之间均使用空格,而非逗号。
-
避免行尾空格:避免在行尾添加不必要的空格。
-
合理使用缩写:对于较长的布尔值、整数、浮点数,可以适当使用缩写(如
y
代替yes
,on
代替true
)。 -
清晰注释:为关键配置项添加注释,提高文档可读性。
-
遵循Kubernetes命名约定:按照Kubernetes的命名规范为资源命名,如使用小写字母、短划线连接单词、不超过63个字符等。