什么是Yaml 文件?

Yaml 是一种用来写配置文件的语言。结构上它有两种可选的类型:Lists [1,2,3,4] 和 Maps {1:111}。List 用 -(破折号)来定义每一项,Map 则是一个 key:value 的键值对来表示。

Yaml文件的写法是什么样的

  1. 大小写敏感(区分大小写)
  2. 使用缩进表示层级关系
  3. 缩进时不允许使用Tab键,只允许使用空格
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  5. "#"表示注释,从这个字符一直到行尾,都会被解析器忽略
  6. “—” 为可选的分隔符(三个横线,一般我们会把配置svc和deployment写在一起)

Yaml的结构图解

在Kubernetes中,Yaml支持两种结构类型即可:Lists、Maps


Yaml文件看起来难但是转换成常见格式之后你就会熟悉

  1. Yaml 转 Properties https://www.toyaml.com/index.html
  2. Yaml 转 Json http://nodeca.github.io/js-yaml/

Kubernetes通过Yaml创建资源

如果需要通过yaml 文件创建Kubernetes 对象,需要配置如下的字段:

apiVersion - 创建该对象所使用的 Kubernetes API 的版本
kind - 想要创建的对象的资源类型
metadata - 帮助识别对象唯一性的数据,包括一个 name 字符串、UID 和可选的 namespace

案例一: Kubernetes pod编排文件讲解

  • Pod在程序中运行的必须的编排文件
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性   name: test-pod #资源的名字,在同一个namespace中必须唯一   labels: #设定资源的标签 k8s-app: apache   version: v1   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.192.21.18:5000/test/chat:latest #容器使用的镜像地址   imagePullPolicy: Never # Kubernetes 拉取镜像策略command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT   args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数   env: #指定容器中的环境变量   - name: str #变量的名字   value: "/etc/run.sh" #变量的值   resources: #资源管理 requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行   cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m) memory: 32Mi #内存使用量   limits: #资源限制   cpu: 0.5   memory: 1000Mi   ports:   - containerPort: 80 #容器开放对外的端口 name: httpd  #名称 protocol: TCP   livenessProbe: #pod内容器健康检查的设置 httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常   path: / #URI地址   port: 80     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

Pod属性值速查表

属性名称 取值类型 是否必选 取值说明
version String Required(必) 版本号,例如v1
kind String Required pod (资源类型)
metadata Object Required 元数据
metadata.name String Required pod的名称,命名规范须符合RFC 1035规范
metadata.namespace String Required pod的所属命名空间,默认值为default
metadata.labels[] List 自定义标签列表
metadata.annotation[] List 自定义注解列表
Spec Object Required pod中容器的详细定义
spec.containers[] List Required Pod容器列表
spec.containers[].name String Required 容器名称
spec.containers[].image String Required 容器镜像名称
spec.containers[].imagePullPolicy String 获取镜像策略,可选值包括:Always、Never、IfNOtPresent,默认值为Always
Always:表示每次都尝试重新下载镜像
IfNotPresent:表示如果本地有镜像,使用本地镜像,本地镜像不存在时下载镜像
Never:表示仅使用本地镜像
spec.containers[].command[] List 容器启动命令列表,如果不指定,则使用镜像打包是的启动命令
spec.containers[].args[] List 容器启动命令参数列表
spec.containers[].workingDir String 容器工作目录
spec.containers[].volumeMounts[] List 挂载到容器内部的存储卷配置
spec.containers[].volumeMounts[].name String 引用Pod定义的共享存储名称,需要使用volumes[]部分定义的共享存储名称
spec.containers[].volumeMounts[].mountPath String 存储卷在容器内Mount的绝对路径,应少于512字符
spec.containers[].volumeMounts[].readOnly string 是否为只读模式,默认读写模式
spec.containers[].ports[] list 容器需要暴露端口号列表
spec.containers[].ports[].name String 端口名称
spec.containers[].ports[].containerPort lnt 容器需要监听的端口号
spec.containers[].ports[].hostPort Int 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPost时,同一台主机无法启动该容器的第二个副本
spec.containers[].ports[].protocol String 端口协议,支持TCP和UDP,默认TCP
spec.containers[].env[] list 容器运行前需要设置的环境变量列表
spec.containers[].env[].name String 环境变量的名称
spec.containers[].env[].value String 环境变量值
spec.containers[].resources Object 资源限制和资源请求的请求设置
spec.containers[].resources.limits Object 资源限定的设置
spec.containers[].resources.limits.cpu String CPU限制,单位为core数,将用于 docker run --cpu-shares参数
spec.containers[].resources.limits.memory String 内存限制,单位为MIB/GiB等,将用于docker run --memory参数
spec.containers[].resources.requests Object 容器初始化的资源限制设置
spec.containers[].resources.requests.cpu String CPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memory String 内存请求,单位为MIB、GiB容器启动的初始化可用数量
spec.volumes[] list 在该Pod定义共享存储列表
spec.volumes[].name String 共享存储卷的名称;在同一个Pod中每个存储卷定义一个名称,应符合RFC 1035规范。容器定义部分的containers[].
volumeMount[].name 将引用该存储卷法人名称
spec.volumes[].emptyDir Object 类型为emptyDir的存储卷,表示与pod同生命周期的一个临时目录,其值为一个空对象:emptyDir
spec.volumes[].hostPath.path String 类型为hostpash的存储卷,表示挂着pod所在宿主机的目录
spec.volumes[].secret Object 类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
spec.volumes[].configMap Object 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
spec.volumes[].livenessProbe Object 对pod内容器设置健康状态检查的设置,当探测几次无响应后,系统自动重启该容器。可以设置的方法包括:exec、httpGet、
和tcpSocket。对一个容器仅设置一种健康检查方法
spec.volumes[].livenessProbe.exec Object 对pod内部健康状态检查设置exec方式
spec.volumes[].livenessProbe.exec.command[] String exec 需要指定的命令或者脚本
spec.volumes[].livenessProbe.httpGet Object 对Pod内个容器健康状态检查,设置HTTPGet方式。需要指定Path、pod
spec.volumes[].livenessProbe.tcpSocket Object 对pod内各个容器健康检查的设置,tcpSocket方式
spec.volumes[].livenessProbe.initialDelaySeconds Number 容器启动完成后进行首次探测的时间,单位为s
spec.volumes[].livenessProbe.timeoutSeconds Number 对容器健康状态检查的等待响应的超时时间。单位为s,默认为1s,超过该超时时间设置,将认为该容器不健康,将重启容器
spec.volumes[].livenessProbe.periodSeconds Number 对容器健康检查的定期时间设置,单位为s默认为10s探测一次
spec.restartPolicy String pod的重启策略,可选值为Always、OnFailure、默认值Always
OnFailure:只有pod以非零状态终止时,kubelet才会重启容器,如果正常退出则不会重启
Always:pod一旦停止运行,则无论容器是如何终止的。kubelet都将它重启
Never:pod终止后将该pod退出吗;报告给Master,不会再重启pod
spec.nodeSelector Object 设置NodeSelector表示将该pod调度到包含这些label的Node上。以key:value格式指定
spec.imagePullSecret Object pull镜像时使用secret名称,以name:secretkey.格式指定
spec.hostNetwork Boolean 是否使用主机网络模式,默认值为false.。如果设置为true,则表示容器使用宿主机网络,使用Docker网桥,该pod将无法在同一台主机启动第二个副本

案例二: Kubernetes deployment运行

apiVersion: apps/v1   # 1.9.0 之前的版本使用 apps/v1beta2,可通过命令 kubectl api-versions 查看
kind: Deployment    #指定创建资源的角色/类型
metadata:    #资源的元数据/属性name: web-server    #资源的名字,在同一个namespace中必须唯一
spec:replicas: 2    #pod副本数量selector:      #定义标签选择器matchLabels:app: web-server      #符合目标的pod的标签template:               # Deployment 扩容pod 的时候根据此模板metadata:labels:             #Pod的labelapp: web-server       #pod 副本的标签,selector 根据此标签选择pod副本spec:                    # 指定该资源的内容  containers:         # pod内容器定义的部分- name: nginx          #容器的名字  image: nginx:1.12.1   #容器的镜像地址    ports:  - containerPort: 80  #容器暴露的端口
  • 部署
[root@master ~]# kubectl create -f nginx.yaml11.10.6 案例三: Kubernetes Services 运行
[root@master ~]# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-service        #service 名称
spec:selector:app: web-server       #匹配service 选择器标签的podports:- protocol: TCPport: 80               #service 端口targetPort: 80           #pod 端口

Services 属性值列表

属性名称 取值类型 是否必选 取值说明
version String Required(必) 版本号,例如v1
kind String Required pod (资源类型)
metadata Object Required 元数据
metadata.name String Required Service的名称,命名规范须符合RFC 1035规范
metadata.namespace String Required Service的所属命名空间,默认值为default
metadata.labels[] List 自定义标签列表
metadata.annotation[] List 自定义注解列表
Spec Object Required 详细描述
spec.selector: [] List Required Label Selector配置,将选择具有指定Label标签的Pod作为管理范围
spec.type String Required Service的类型,指定Service的访问方式,默认为ClusterIP
ClusterIP:虚拟的服务IP地址,改地址用于Kubernetes集群内部的Pod访问,在Node上kube-proxy通过设置iptables规则进行转发
LoadBalancer: 使用外接负载均衡完成到服务的负载分发,需要在spec.status.loadBalancer字段指定外部负载均衡器的IP地址, 并同时定义nodePort和clusterIP,用于公有云环境
spec.clusterIP String 虚拟服务IP地址,当type=ClusterIP时,如果不指定,则系统自动分配,也可以手动指定;当type=LoaderBalancer需要指定
spec.sessionAffinity String 是否支持Session,可选值为ClientIP,默认为空
spec.ports[] List 需要暴露的端口列表
spec.ports[].name String 端口名称
spec.ports[].protocol String 端口协议 支持tcp和udp,默认为tcp
spec.ports[].port Int 服务监听的端口号
spec.ports[].targetPort Int 需要转发到后端Pod的端口号
spec.ports[].nodePort Int 当spec.type=NodePort时,指定映射到物理机的端口号
spec.status 当spec.type=LoadBalancer时,设置外部负载均衡器的地址,用于公有云环境
spec.status.loadBalancer String 外部负载均衡器
spec.status.loadBalancer.ingress String 外部负载均衡器
spec.status.loadBalancer.ingress.ip String 外部负载均衡器的IP地址
spec.status.loadBalancer.ingress.hostname String 外部负载均衡器的主机名

ConfigMap

ConfigMap 允许您将配置文件与属性文件分离,以使容器化的应用程序具有可移植性。

  1. Kubernetes 空间都可以使用
  2. 可以作为变量或者路径文件使用
  3. Pod支持自动更新内容
#获取系统中的ConfigMap
[root@master1 ~]# kubectl get configmap

案例:将ConfigMap中的所有键值对配置为容器环境变量

  • 将ConfigMap中的所有键值对配置为容器环境变量
root@master-1 configmap]# cat configmap-multikeys.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:SPECIAL_LEVEL: L1SPECIAL_TYPE:  Nginx
  • 创建ConfigMap
[root@master-1 configmap]# kubectl apply -f   configmap-multikeys.yaml
configmap/special-config created
  • 查看ConfigMap
[root@master-1 configmap]# kubectl get configmap/special-config -n default
NAME             DATA   AGE
special-config   2      65s
  • 查看详细内容
[root@master-1 configmap]# kubectl describe configmap special-config
Name:         special-config
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","data":{"SPECIAL_LEVEL":"L1","SPECIAL_TYPE":"Nginx"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"special-co...Data
====
SPECIAL_TYPE:
----
Nginx
SPECIAL_LEVEL:
----
L1
Events:  <none

创建容器引用ConfigMap

[root@master-1 configmap]# cat pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-test-configmap
spec:containers:- name: pod-test-configmapimage: busyboxcommand: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_LEVEL- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-configkey: SPECIAL_TYPErestartPolicy: Never
  • 创建pod
[root@master-1 configmap]# kubectl apply -f pod-configmap.yaml
pod/pod-test-configmap created
  • 查看pod日志
[root@master-1 configmap]# kubectl log pod-test-configmap
log is DEPRECATED and will be removed in a future version. Use logs instead.
L1 Nginx

案例二: 将 ConfigMap 数据添加到容器中的特定路径

  • Nginx pod 文件
root@master-1 configmap]# cat nginx.yaml
apiVersion: apps/v1beta2 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:name: nginx-deployment
spec:selector:matchLabels:app: nginx-configmapreplicas: 1template:metadata:labels:app: nginx-configmapspec:containers:- name: nginx-configmapimage: nginxvolumeMounts:- name: config-volumemountPath: /mnt/ports:- containerPort: 80volumes:- name: config-volumeconfigMap:name: special-configitems:- key: SPECIAL_LEVELpath: keys
  • 创建
[root@master-1 configmap]# kubectl apply -f  nginx.yaml
deployment.apps/nginx-deployment created
  • 查看容器内容
[root@master-1 configmap]# kubectl exec -i -t nginx-deployment-69fd86756f-7m2jj bash
root@nginx-deployment-69fd86756f-7m2jj:/ # cd /mnt
root@nginx-deployment-69fd86756f-7m2jj:/mnt# cat keys
L1root
  • 修改ConfigMap 内容(验证pod自动更新)
[root@master-1 configmap]# cat configmap-multikeys.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:SPECIAL_LEVEL: L111SPECIAL_TYPE:  Nginx
  • 应用新配置
[root@master-1 configmap]# kubecel apply -f configmap-multikeys.yaml
[root@master-1 configmap]# kubectl describe configmap special-config
  • 查看容器是否可以自动更新
  • 需要等待1分钟(默认)
[root@master-1 configmap]# kubectl exec -it nginx-deployment-69fd86756f-hh6hm -- cat /mnt/keys
L111

案例三: 将ConfigMap中的所有键值对配置为容器环境变量

  • 定义配置文件
  • 把redis 配置文件存放到configmap
  • kustomize 应用配置管理

[root@master-1 redis]# cat kustomization.yaml
configMapGenerator:
- name: redis-master-configfiles:- redis-config
resources:
- redis-pod.yaml
  • 定义redis配置文件
[root@master-1 redis]# cat redis-config
maxmemory 2mb
maxmemory-policy allkeys-lru
port 6380
  • 定义redis pod 文件
[root@master-1 redis]# cat redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: redis-pod
spec:hostNetwork: truecontainers:- name: redis-podimage: redis:5.0.4imagePullPolicy: IfNotPresentcommand:- redis-server- "/redis-master/redis.conf"env:- name: MASTERvalue: "true"ports:- containerPort: 6380resources:limits:cpu: "0.1"volumeMounts:- mountPath: /redis-master-dataname: data- mountPath: /redis-mastername: configvolumes:- name: dataemptyDir: {}- name: configconfigMap:name: redis-master-configitems:- key: redis-configpath: redis.conf
  • 创建redis
[root@master-1 redis]# kubectl apply -k .
configmap/redis-master-config-k66gtchdm4 configured
pod/ redis-pod configured
  • 获取redis节点地址
[root@master-1 redis]# kubectl get pods -o wide | grep redis
redis-pod  1/1     Running     0          6m10s   192.168.91.21   192.168.91.21   <none>           <none>
  • 连接访问redis
[root@master-19 ~]# yum install epel-release -y
[root@master-19 ~]# yum install redis -y
[root@master-19 ~]# redis-cli -h 192.168.91.21 -p 6380
192.168.91.21:6380> CONFIG GET maxmemory1) "maxmemory"
2) "2097152" #字节
192.168.91.21:6380> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"

k8s的 Yaml文件编写与测试用例展示相关推荐

  1. K8S——关于K8S控制台的yaml文件编写(基于上一章多节点K8S部署)

    K8S--关于K8S控制台的yaml文件编写(基于上一章多节点K8S部署) 一.yaml文件编写流程 二.证书自签 一.yaml文件编写流程 rbac.yaml---->secret.yaml- ...

  2. 【云原生--K8S】 yaml文件部署Mysql数据库(一)

    文章目录 前言 一.下载mysql镜像文件 二.创建deployment和service 三.进入docker容器操作mysql 四.Pod volumn存储无法持久化 五.删除deployment和 ...

  3. .net core 上 K8S(三)Yaml文件运行.netcore程序

    正文 上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以 ...

  4. Kubernetes(k8s) YAML文件详解

    文章目录 一.yaml文件简介 1)yaml的语法规则: 2)在Kubernetes中,只需要知道两种结构类型即可: 二.yaml常见语法 1)apiVersion 2)kind 3)metadata ...

  5. yaml文件编写格式

    Yaml提供了多种方法,常用的为yaml.load()和yaml.dump(). 它的基本语法规则如下: 1. 大小写敏感 2. 使用缩进表示层级关系 3. 缩进时不允许使用Tab键,只允许使用空格. ...

  6. k8s各类yaml文件

    (1) deployment.yaml文件详解 apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata:name: c ...

  7. ROS中yaml文件编写格式

    目录 键值对 键值对书写格式 键值对的引用 强制类型转换 字符串 时间与日期 已知偏移时区和当地时间 已知UTC世界时间 数组 普通数组 键值对数组 数组的引用 多维数组 命名空间 命名空间下普通变量 ...

  8. k8s中yaml文件pod的语法(转)

    kubernetes yaml格式的Pod配置文件 # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metada ...

  9. k8s的yaml文件配置详解(三)

    k8s的服务资源文件配置详解 注:本文章只作配置项解释,请灵活运用 --- #Service kind: Service apiVersion: v1 metadata: name: service ...

最新文章

  1. 修复Eclipse在Mac OSX下启动时卡住问题
  2. java 数据库连接池 实例_java数据库连接池和数据库连接示例
  3. Linux解决find /run/user/1000/gvfs
  4. 了解Scaffold Generator (转载)
  5. java获取用户地理位置_java web 通过ip获取当前地理位置
  6. 微信小程序源码下载链接
  7. 常用的匹配正则表达式
  8. ZOJ3805Machine(二叉树左右子树变换)
  9. java递归解决百元百鸡_JS计算输出100元钱买100只鸡问题的解决方法
  10. C++工作笔记-对'xxxxx'未定义的引用的2种情况
  11. 阿里巴巴开源轻量级深度神经网络推理引擎MNN
  12. saetv2.ex.class.php,curl out of memory window下PHP调用curl报内存不够
  13. Android四大组件之Service
  14. 权重计算方法二:熵权法(EWM)
  15. Virtualbox win7虚拟机全屏显示
  16. 【异常解决】DolphinScheduler-2.0.5 工作流实例无法调度和停止异常
  17. 哈 佛 大 学 图 书 馆 训 言
  18. sql server返回是星期几的函数
  19. PCL--学习笔记(持续更新——蜗速)
  20. 数据结构与算法3 树(上)树与树的表示

热门文章

  1. 给企业管理者的忠告《原则》作者瑞·达利欧
  2. 图像特效---漫画滤镜
  3. 7.4用直线拟合一组点
  4. 学习记录375@查询学过“谌燕”老师所教的所有课的同学的学号、姓名-MySQL
  5. 字符串去除空格和回车
  6. 【图形学基础:基本变换】复数、四元数的巩固和图形学基本变换类型的学习
  7. 自动驾驶坐标系变换:欧拉角法
  8. 我生命中的钱事:赚钱与投资!
  9. BZOJ4719 NOIP2016 天天爱跑酷
  10. 【C语言】实现天天酷跑游戏