k8s yaml编写规范

yaml简介

yaml 是专门用来写配置文件的语言

yaml文件也是一种配置文件类型,后缀名是.yaml或.yml都可以

yaml语法规则

  • 大小写敏感
  • 使用缩进表示层级关系(不能用Tab,只能用空格)
  • 相同层级的元素左对齐
  • #号表示单行注释
  • 字符串可以不用引号标注
  • 数组(列表)是使用 – 开头的清单形式,- 后面必须加空格
  • 表示对象的 : 和表示数组(列表)的 – 后面都必须要有空格。可以使用 – 回车- 回车-回车 在一个文件里分隔多个 YAML 对象

Yaml语法实例

数组(列表)实例; 短横线加空格(- )
 

- linux

- name

- windows

Yaml 对象(字典)实例;用冒号加空格连接键和值(: )
 

Kubernetes:

linux: vim

name: 张三

windows: steam

Yaml 数组 对象结合(列表中的字典)实例;短横线加空格(- ),用冒号加空格连接键和值(: )
 

containers:

- image: mysql5.7.38

name: mysql

restart: always

ports:

- 6379:6379

volumes:

- /etc/localtime:/etc/localtime

Yaml格式说明与实例

格式说明

pod.yaml

 

# yaml格式的pod定义问件完整内容:

apiVersion: v1 #必选,版本号,例如v1

kind: Pod #必选,Pod

metadata: #必选,元数据

name: string #必选,Pod名称

namespace: string #必选,Pod所属的命名空间

labels: #自定义标签

- name: string #自定义标签名字

annotations: #自定义注释列表

- name: string

spec: #必选,Pod中容器的详细定义

containers: #必选,Pod中容器列表

- name: string #必选,容器名称

image: string #必选,容器的镜像名称

imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像

command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令

args: [string] #容器的启动命令参数列表

workingDir: string #容器的工作目录

volumeMounts: #挂载到容器内部的存储卷配置

- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名

mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符

readOnly: boolean #是否为只读模式

ports: #需要暴露的端口库号列表

- name: string #端口号名称

containerPort: int #容器需要监听的端口号

hostPort: int #容器所在主机需要监听的端口号,默认与Container相同

protocol: string #端口协议,支持TCP和UDP,默认TCP

env: #容器运行前需设置的环境变量列表

- name: string #环境变量名称

value: string #环境变量的值

resources: #资源限制和请求的设置

limits: #资源限制的设置

cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数

memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数

requests: #资源请求的设置

cpu: string #Cpu请求,容器启动的初始可用数量

memory: string #内存清楚,容器启动的初始可用数量

livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种

exec: #对Pod容器内检查方式设置为exec方式

command: [string] #exec方式需要制定的命令或脚本

httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port

path: string

port: number

host: string

scheme: string

HttpHeaders:

- name: string

value: string

tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式

port: number

initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒

timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒

periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次

successThreshold: 0

failureThreshold: 0

securityContext:

privileged:false

restartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出

nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定将该Pod调度到包含这个label的node上,以key:value的格式指定

imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定

- name: string

hostNetwork:false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络

volumes: #在该pod上定义共享存储卷列表

- name: string #共享存储卷名称(volumes类型有很多种)

emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值

hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录

path: string #Pod所在宿主机的目录,将被用于同期中mount的目录

secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部

scretname: string

items:

- key: string

path: string

configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部

name: string

items:

- key: string

deployment.yaml

 

apiVersion: extensions/v1beta1 #接口版本

kind: Deployment #接口类型

metadata:

name: cango-demo #Deployment名称

namespace: cango-prd #命名空间

labels:

app: cango-demo #标签

spec:

replicas: 3

strategy:

rollingUpdate: #由于replicas为3,则整个升级,pod个数在2-4个之间

maxSurge: 1 #滚动升级时会先启动1个pod

maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数

template:

metadata:

labels:

app: cango-demo #模板名称必填

sepc: #定义容器模板,该模板可以包含多个容器

containers:

- name: cango-demo #镜像名称

image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #镜像地址

command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #启动命令

args: #启动参数

- '-storage.local.retention=$(STORAGE_RETENTION)'

- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'

- '-config.file=/etc/prometheus/prometheus.yml'

- '-alertmanager.url=http://alertmanager:9093/alertmanager'

- '-web.external-url=$(EXTERNAL_URL)'

#如果command和args均没有写,那么用Docker默认的配置。

#如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。

#如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。

#如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。

imagePullPolicy: IfNotPresent #如果不存在则拉取

livenessProbe: #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉

httpGet:

path: /health #如果没有心跳检测接口就为/

port: 8080

scheme: HTTP

initialDelaySeconds: 60 #启动后延时多久开始运行检测

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 5

readinessProbe:

httpGet:

path: /health #如果没有心跳检测接口就为/

port: 8080

scheme: HTTP

initialDelaySeconds: 30 ##启动后延时多久开始运行检测

timeoutSeconds: 5

successThreshold: 1

failureThreshold: 5

resources: ##CPU内存限制

requests:

cpu: 2

memory: 2048Mi

limits:

cpu: 2

memory: 2048Mi

env: ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量

- name: LOCAL_KEY #本地Key

value: value

- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,

valueFrom:

configMapKeyRef:

name: special-config #configmap中找到name为special-config

key: special.type #找到name为special-config里data下的key

ports:

- name: http

containerPort: 8080 #对service暴露端口

volumeMounts: #挂载volumes中定义的磁盘

- name: log-cache

mount: /tmp/log

- name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录

mountPath: /data/media

- name: nfs-client-root #直接挂载硬方法,如挂载下面的nfs目录到/mnt/nfs

mountPath: /mnt/nfs

- name: example-volume-config #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下

mountPath: /etc/config

- name: rbd-pvc #高级用法第2种,挂载PVC(PresistentVolumeClaim)

#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容

volumes: # 定义磁盘给上面volumeMounts挂载

- name: log-cache

emptyDir: {}

- name: sdb #挂载宿主机上面的目录

hostPath:

path: /any/path/it/will/be/replaced

- name: example-volume-config # 供ConfigMap文件内容到指定路径使用

configMap:

name: example-volume-config #ConfigMap中名称

items:

- key: log-script #ConfigMap中的Key

path: path/to/log-script #指定目录下的一个相对路径path/to/log-script

- key: backup-script #ConfigMap中的Key

path: path/to/backup-script #指定目录下的一个相对路径path/to/backup-script

- name: nfs-client-root #供挂载NFS存储类型

nfs:

server: 10.42.0.55 #NFS服务器地址

path: /opt/public #showmount -e 看一下路径

- name: rbd-pvc #挂载PVC磁盘

persistentVolumeClaim:

claimName: rbd-pvc1 #挂载已经申请的pvc磁盘

services.yaml

 

apiVersion: v1

kind: Service

matadata: #元数据

name: string #service的名称

namespace: string #命名空间

labels: #自定义标签属性列表

- name: string

annotations: #自定义注解属性列表

- name: string

spec: #详细描述

selector: [] #label selector配置,将选择具有label标签的Pod作为管理

#范围

type: string #service的类型,指定service的访问方式,默认为

#clusterIp

clusterIP: string #虚拟服务地址

sessionAffinity: string #是否支持session

ports: #service需要暴露的端?列表

- name: string #端口名称

protocol: string #端口协议,支持TCP和UDP,默认TCP

port: int #服务监听的端口号

targetPort: int #需要转发到后端Pod的端口号

nodePort: int #当type = NodePort时,指定映射到物理机的端口号

status: #当spce.type=LoadBalancer时,设置外部负载均衡器的地址

loadBalancer: #外部负载均衡器

ingress: #外部负载均衡器

ip: string #外部负载均衡器的Ip地址值

hostname: string #外部负载均衡器的主机名

job.yaml

 

apiVersion: batch/v1

kind: Job

metadata:

name: job-demo

spec:

template:

metadata:

name: job-demo

spec:

restartPolicy: Never #Job的RestartPolicy仅支持Never和OnFailure两种,不支持Always,我们知道Job就相当于来执行一个批处理任务,执行完就结束了

containers:

- name: counter

image: busybox

command:

- "bin/sh"

- "-c"

- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done

Cronjob.yaml

CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。

一个CronJob对象其实就对应中crontab文件中的任务,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。

 

#crontab的格式如下:

#分时日月周要运行的命令第1列分钟0~59 第2列时0~23)第3列日1~31 第4列月1~12 第5列周0~7(0和7表示星期天)第6列要运行的命令

apiVersion: batch/v2alpha1

kind: CronJob

metadata:

name: cronjob-demo

spec:

schedule: "*/1 * * * *"

jobTemplate:

spec:

template:

spec:

restartPolicy: OnFailure

containers:

- name: hello

image: busybox

args:

- "bin/sh"

- "-c"

- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

我们这里的Kind是CronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate, 用来指定需要运行的任务,格式当然和Job是一致的。

还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job,默认没有限制,所有成功和失败的Job都会被保留。

然后,当运行一个Cron Job时,Job可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job完成后将不会被保留。

实例

cs.yaml

 

apiVersion: v1 #API版本号,用于迭代我们的更新版本

kind: Pod #资源对象的类型,有pod,Node,Job,Service

metadata: #资源元数据,标记对象,方便管理

name: hll-pod #给pod起名称

labels: #给pod打标签,方便找

env: demo #注入容器内的环境变量

owner: feifei

spec: #资源规格,pod内容器相关信息

replicas: 1 #副本数量

selector: #标签选择器

matchLabels:

app: web

template: #pod模板

metadata: #pod元数据

labels: #给pod打标签,方便找

app: web

spec: #pod规格

containers: #容器配置

- image: nll:v1 #运行容器镜像

name: nll #容器名称

ports: #端口号

- containerPort: 80 #容器端口号

- 8090:8221 #容器内服务映射端口

volumes: #容器持久化

- /etc/localtime:/etc/localtime #容器内服务映射路径

restart: always #重启容器直接重启服务

k8s yaml文件创建和删除

 

kubectl apply -f cs.yml

kubectl delete -f cs.yml

docker-compose文件创建

 

docker-compose -f cs.yaml up -d

上一篇:大模型与生成式AI结合:HelpLook引领零售增长新篇章


下一篇:contact form 7设置方法与详细步骤