在 Kubernetes (k8s) 中,YAML 文件被广泛用于定义和配置各种资源对象,如 Deployments、Services、Pods 等。YAML 是一种易于阅读和编写的非标记语言,特别适合用来表达层次化的配置数据。下面是一个典型的 Kubernetes YAML 文件的基本结构解析,以 Deployment 为例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.10
ports:
- containerPort: 80
关键字段解释:
-
apiVersion: 指定使用的 Kubernetes API 版本。例如,
apps/v1
表示应用资源的版本。 -
kind: 定义资源的类型。在这个例子中是
Deployment
,意味着要创建一个 Deployment 资源。 -
metadata: 提供资源的元数据,如名称、标签等。这里的
name
定义了 Deployment 的名称,labels
为资源加上标签,便于使用标签选择器(label selectors)来定位资源。 -
spec: 描述资源的具体配置和期望状态。对于 Deployment:
-
replicas: 指定副本集中的期望 Pod 数量。
-
selector: 用于确定哪些 Pod 属于这个 Deployment。
matchLabels
部分定义了标签匹配规则,确保 Deployment 控制的 Pod 与指定标签匹配。 -
template: 定义了新创建的 Pod 的模板。这是非常关键的一部分,因为它描述了每个 Pod 实例的具体配置。
-
metadata: Pod 的元数据,再次定义了 Pod 的标签,确保与 Deployment 的选择器匹配。
-
spec:
- containers: 容器数组,描述了 Pod 中运行的容器。每个容器定义了其名称、镜像、端口等属性。
- name: 容器名称。
- image: 容器使用的镜像及其版本。
- ports: 容器暴露的端口配置,
containerPort
指定了容器内部监听的端口号。
- containers: 容器数组,描述了 Pod 中运行的容器。每个容器定义了其名称、镜像、端口等属性。
-
-
YAML 文件编写时需要注意缩进,它用来表明层级关系。通常推荐使用两个空格作为一级缩进,保持一致性非常重要,因为 YAML 解析器依赖于缩进来理解结构。
此外,YAML 支持多种数据结构,包括 Maps(键值对)、Lists(列表)、Scalars(标量值),这些结构在 Kubernetes 配置中被广泛用来表达复杂的资源定义。