yaml
1、什么是yaml
yaml语言创建于2001年,支持整数、浮点数、布尔、字符串、数组和对象等数据类型。
在K8S中,yaml与json同时用于对资源的定义,与json相比,yaml的语法更加简洁,主要语法如下:
- 使用空格缩进表示层次,同一层级空格数一致
- 使用 “#” 书写注释
- 数组是使用“-” 开头的清单形式
- 对象的格式与json基本相同,但key不需要使用双引号
- 表示对象的”:“和表示数组的”-“ 后面必须要有空格
- 可以使用 ”—“ 在一个文件中分隔多个yaml内容
2、yaml示例
以下是使用yaml定义一个Deployment资源
apiVersion: apps/v1
kind: Deployment
metadata:
name: busy-box
spec:
replicas: 1
selector:
matchLabels:
app: busy-box
template:
metadata:
labels:
app: busy-box
spec:
containers:
- name: busy-box
image: busybox
command:
- /bin/sh
- -c
- sleep 3000
Pod
K8S中存在多个资源对象,可以使用以下命令查看
kubectl api-resources
pod是K8S中的最小管理单元,其本身是一组容器的集合,一组容器在pod内共享网络、存储等资源。
每一个pod在启动前会创建一个根容器,叫pause容器,主要作用是为了在业务容器启动前创建共享名称空间以及分配资源,并负责管理pod内其他容器的生命周期。
- 网络名称空间共享
- pid名称空间共享(需要特殊配置)
- 生命周期管理
- 保持pod状态
pod的生命周期包括以下几个阶段:
- Pending:表示pod已经被创建,但暂时未进行调度
- Running:表示pod正在运行,注意此状态不代表容器正常
- Succeeded:表示pod中的容器都已成功终止,并且不会再重启
- Failed:表示pod中的容器非正常退出
- Unknown:表示K8S无法判断pod状态
- ContainerCreating:表示正在创建容器
- Terminating:表示容器正在终止
- Terminated:表示容器已经终止
- Waiting:表示容器处于等待状态
- Completed:表示pod已执行完某项工作并正常退出
可以使用以下命令创建一个pod:
kubectl run pod-demo --image=nginx
pod定义文件由五个部分组成,分别是:
- apiVersion:定义调用的api接口以及版本信息
- kind:定义资源类型
- metadata:定义资源的元数据信息
- spec:定义容器相关配置信息
- status:运行后的状态信息(K8S自动生成,不需要手动定义)
以下是导出的正在运行的pod资源文件内容
apiVersion: v1 # 接口版本
kind: Pod # 资源名称
metadata: # 元数据信息
annotations: # 注释信息
cni.projectcalico.org/podIP: 10.64.104.50/32 # 网络插件自动补充注释,部分网络插件可以通过修改注释的方式调整功能
cni.projectcalico.org/podIPs: 10.64.104.50/32 # 网络插件自动补充注释,部分网络插件可以通过修改注释的方式调整功能
ovn.kubernetes.io/logical_router: ovn-cluster # 网络插件自动补充注释,部分网络插件可以通过修改注释的方式调整功能
ovn.kubernetes.io/pod_nic_type: veth-pair # 网络插件自动补充注释,部分网络插件可以通过修改注释的方式调整功能
creationTimestamp: "2023-11-20T09:49:09Z"
generateName: busybox-5f98dbbb9b- # 可选参数,用于自动生成唯一名称
labels: # 资源标签,用于与其他资源进行关联
app: busybox
pod-template-hash: 5f98dbbb9b
name: busybox-5f98dbbb9b-7bvct # 资源名称
namespace: default # 资源所属名称空间
ownerReferences: # 表示此资源是由其他资源自动生成,以下是属主的信息(系统自动生成)
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet # 属主资源名
name: busybox-5f98dbbb9b # 属主名
uid: 5cd1df23-687e-4bba-9c7f-6ac1601f1e3b # 唯一id(系统自动生成)
resourceVersion: "505879" # 资源版本(系统自动生成)
uid: f42ae3e3-9455-4257-8f95-4c3f9e4b84bd # 唯一id(系统自动生成)
spec: # 定义容器模板
containers: # 定义容器模板
- args: # 命令参数
- /bin/sh
- -c
- sleep 10; touch /tmp/healthy; sleep 30000
image: busybox # 镜像地址
imagePullPolicy: Always # 重启策略
name: busybox # 容器名称
readinessProbe: # 定义就绪探针
exec:
command:
- cat
- /tmp/healthy
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
resources: {} # 定义资源分配
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: # 定义文件挂载
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-772v6
readOnly: true
dnsPolicy: ClusterFirst # 定义dns策略
enableServiceLinks: true
nodeName: node2 # 定义运行在哪个主机
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always # 定义重启策略
schedulerName: default-scheduler
securityContext: {} # 定义安全上下文
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30 # 容器停止宽限期
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes: # 数据卷信息
- name: kube-api-access-772v6
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status: # 当前运行状态
conditions:
- lastProbeTime: null
lastTransitionTime: "2023-11-20T09:51:16Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2023-12-04T13:15:32Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2023-12-04T13:15:32Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2023-11-20T09:51:16Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://29103e04c2a6cb8e545e12eeabc4dd7bdf17904c4f3d1775af5e4b5e8bde6ebb
image: docker.io/library/busybox:latest
imageID: docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
lastState:
terminated:
containerID: containerd://72c879dd6772addbe07e61b3ce388294ad7611a81058b86e38a974a7f51f4e5b
exitCode: 255
finishedAt: "2023-12-04T13:14:58Z"
reason: Unknown
startedAt: "2023-12-01T06:10:19Z"
name: busybox
ready: true
restartCount: 9
started: true
state:
running:
startedAt: "2023-12-04T13:15:21Z"
hostIP: 192.168.129.130
phase: Running
podIP: 10.64.104.50
podIPs:
- ip: 10.64.104.50
qosClass: BestEffort
startTime: "2023-11-20T09:51:16Z"
精简后如下,以下文件即可独立启动一个pod
apiVersion: v1 # 接口版本
kind: Pod # 资源名称
metadata: # 元数据信息
labels: # 资源标签,用于与其他资源进行关联
app: busybox
name: busybox-5f98dbbb9b-7bvct # 资源名称
namespace: default # 资源所属名称空间
spec: # 定义容器模板
containers: # 定义容器模板
- args: # 命令参数
- /bin/sh
- -c
- sleep 10; touch /tmp/healthy; sleep 30000
image: busybox # 镜像地址
imagePullPolicy: Always # 重启策略
name: busybox # 容器名称
readinessProbe: # 定义就绪探针
exec:
command:
- cat
- /tmp/healthy
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1