一、YAML简介及说明
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
基本语法:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
数据类型:
YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
这里我们说一下对象映射以及数组
YAML 对象:
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, ...}。
还可以使用缩进表示层级关系;
apiVersion: v1
kind: Pod
metadata:
name: k8s01-prod
labels:
app: test
YAML 数组:
以 - 开头的行表示构成一个数组:
- zhangsan
- lisi
- wangwu
YAML 支持多维数组,可以使用行内表示:
{
key: [zhangsan, lisi, wngwu, ...]
}
数组的子项也可以是数组:
companies:
-
id: 1
name: zhangsan
price: 200W
-
id: 2
name: lisi
price: 500W
id: 3
name: wangwu
price: 1000W
二、k8s下的YAML使用及说明
2.1 YAML创建Deployment
kubectl get nodes # 查看nodes
kubectl get ns # 查看命名空间
kubectl get pods # 查看pods
kubectl creat n s test1 # 创建新的命名空间test1
curl -L https://github.com/ahmetb/kubectx/releases/download/v0.9.1/kubens -o /bin/kubens
chmod +x /bin/kubens # 安装kubens 并给与权限
kubens test1 # 切换命名空间test1
kubectl get deploy # 查看应用
kubectl create deployment test-yaml --image=nginx --dry.run=client -o yaml > test-yaml.yaml
# 创建名为test-yaml的deployment test-yaml.yaml
vim test-yaml.yaml # 编辑yaml
YAML文件详解
#test-yaml
apiVersion: apps/v1 # 指定api版本,此值必须在kubectl apiversion中 ,可通过kubectl api-versions命令查看所有的api版本
kind: Deployment # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: test-pod # 资源的名字,在同一个namespace中必须唯一
labels: # 设定资源的标签
k8s-app: nginx
version: v1
kubernetes.io/cluster-service: "true"
annotations: # 自定义注解列表
- name: String # 自定义注解名字
spec: # specification of the resource content 指定该资源的内容
restartPolicy: Always # 表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器
nodeSelector: # 节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: test-pod # 容器的名字
image: 10.133.133.10:12321/devops/nginx:latest # 容器使用的镜像地址
imagePullPolicy: Never # 三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] # 启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] # 启动容器的命令参数,对应Dockerfile中CMD参数
env: # 指定容器中的环境变量
- name: str # 变量的名字
value: "/etc/run.sh" # 变量的值
resources: # 资源管理
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.5 # CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 500Mi # 内存使用量
limits: # 资源限制
cpu: 1
memory: 1000Mi
ports:
- containerPort: 30000 # 容器开发对外的端口
name: httpd # 名称
protocol: TCP
livenessProbe: # pod内容器健康检查的设置
httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常
path: / # URI地址
port: 80
# host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 # 表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 # 检测的超时时间
periodSeconds: 15 # 检查间隔时间
# 也可以用这种方法
# exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
# 也可以用这种方法
# tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: # 生命周期管理
postStart: # 容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: # 挂载持久存储卷
- name: volume # 挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data # 挂载到容器的某个路径下
readOnly: True
volumes: # 定义一组挂载设备
- name: volume # 定义一个挂载设备的名字
# meptyDir: {}
hostPath:
path: /opt # 挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种
# nfs