yaml文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析
YAML基本语法
- 使用空格做为缩进
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 一般开头缩进两个空格
- 字符后面缩进一个空格,比如冒号: ,逗号 等后面
- 低版本缩进时不允许使用Tab 键,只允许使用空格
- 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
- 使用 — 表示新的yaml文件开始
数据结构
数组和对象可以构成复合结构。
对象
键值对的集合,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)
# 对象类型:对象的一组键值对,使用冒号结构表示
hash: name: Tomage: 18# yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: {name: Tom, age: 18}
数组
# 数组类型:一组连词线 - 开头的行,构成一个数组
People
- Tom
- Jack# 数组也可以采用行内表示法
People: [Tom, Jack]
纯量
纯量是最基本的,不可再分的值,包括:
- 字符串 string
- 布尔值 boolean
- 整数 int
- 浮点数 float
- Null
- 时间 date
- 日期 datetime
date:- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
k8s中YAML
查看资源版本标签
属性说明
在一个YAML文件的控制器定义中,有很多属性名称
属性名称 | 介绍 |
---|---|
apiVersion | API版本 |
kind | 资源类型 |
metadata | 资源元数据 |
spec | 资源规格 |
replicas | 副本数量 |
selector | 标签选择器 |
template | Pod模板 |
metadata | Pod元数据 |
spec | Pod规格 |
containers | 容器配置 |
pod.yaml
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据name: string #必选,Pod名称,在同一个namespace中必须唯一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] #容器的启动命令列表,如不指定,使用打包时使用的启动命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINTargs: [string] #容器的启动命令参数列表,对应Dockerfile中CMD参数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,默认TCPenv: #容器运行前需设置的环境变量列表- 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方式,如果其退出码不为0,则认为容器正常 command: [string] #exec方式需要制定的命令或脚本httpGet: #对Pod内个容器健康检查方法设置为HttpGet,返回200-399之间,则认为容器正常path: stringport: numberhost: stringscheme: stringHttpHeaders:- name: stringvalue: stringtcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式port: numberinitialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次successThreshold: 0failureThreshold: 0securityContext:privileged:falserestartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该PodnodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定- name: stringhostNetwork: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: stringpath: stringconfigMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name: stringitems:- key: stringpath: 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个podmaxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数template: #定义模板,格式大致和pod的metsdata与smetadata:labels:app: cango-demo #模板名称必填spec: #定义容器模板,该模板可以包含多个容器containers: - name: cango-demo #容器名称,与标签名要相同image: string #镜像地址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掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;httpGet:path: /health #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 60 #启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5readinessProbe:readinessProbe:httpGet:path: /health #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 30 ##启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5resources: ##CPU内存限制requests:cpu: 2memory: 2048Milimits:cpu: 2memory: 2048Mienv: #通过环境变量的方式,直接传递pod=自定义Linux OS环境变量- name: LOCAL_KEY #本地Keyvalue: value- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,valueFrom:configMapKeyRef:name: special-config #configmap中找到name为special-configkey: special.type #找到name为special-config里data下的keyports:- name: httpcontainerPort: 8080 #对service暴露端口volumeMounts: #挂载volumes中定义的磁盘- name: log-cachemount: /tmp/log- name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录mountPath: /data/media - name: nfs-client-root #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfsmountPath: /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-cacheemptyDir: {}- 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中的Keypath: path/to/log-script #指定目录下的一个相对路径path/to/log-script- key: backup-script #ConfigMap中的Keypath: 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磁盘
service.yaml
apiVersion: v1
kind: Service
matadata: #元数据name: string #service的名称namespace: string #命名空间 labels: #自定义标签属性列表- name: stringannotations: #自定义注解属性列表 - name: string
spec: #详细描述selector: [] #label selector配置,将选择具有label标签的Pod作为管理范围type: string #service的类型,指定service的访问方式,默认为 clusterIpclusterIP: string #虚拟服务地址 sessionAffinity: string #是否支持sessionports: #service需要暴露的端口列表- name: string #端口名称protocol: string #端口协议,支持TCP和UDP,默认TCPport: int #服务监听的端口号targetPort: int #需要转发到后端Pod的端口号nodePort: int #当type = NodePort时,指定映射到物理机的端口号status: #当spce.type=LoadBalancer时,设置外部负载均衡器的地址loadBalancer: #外部负载均衡器 ingress: #外部负载均衡器 ip: string #外部负载均衡器的Ip地址值hostname: string #外部负载均衡器的主机名
YAML.metadata.managedFields
解读 Kubernetes 1.18.0 新特性之 Server-side Apply_
Server-Side Apply | Kubernetes
多个Controller控制一个资源, 通过managedFields
来记录哪个Field被哪个资源控制
不用自己动手写YAML
使用kubectl create命令
这种方式一般用于资源没有部署的时候,我们可以直接创建一个YAML配置文件
# 尝试运行,并不会真正的创建镜像
kubectl create deployment web --image=nginx -o yaml --dry-run
或者我们可以输出到一个文件中
kubectl create deployment web --image=nginx -o yaml --dry-run > hello.yaml
然后我们就在文件中直接修改即可
使用kubectl get命令导出yaml文件
可以首先查看一个目前已经部署的镜像
kubectl get deploy
然后我们导出 nginx的配置
kubectl get deploy nginx -o=yaml > nginx.yaml
然后会生成一个 nginx.yaml
的配置文件
将 yaml 换成 json 即可得到 json 文件
kubeedge中的YAML
kubeedge中的 devices_v1alpha2_device.yaml 与 devices_v1alpha2_devicemodel.yaml 文档分别制订了Device 与 DeviceModel 的 yaml 格式。
devicemodel.yaml
devices_v1alpha2_devicemodel.yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: devicemodels.devices.kubeedge.io
spec:group: devices.kubeedge.ionames:kind: DeviceModelplural: devicemodelsscope: Namespacedvalidation:openAPIV3Schema: 校验工具properties:apiVersion: stringkind: stringmetadata: objectspec: objectproperties: array # 必需:device属性列表properties: object # device属性描述name: string # 必需:device属性名称type: string # 必需:表示属性的类型和数据验证properties: objectint:accessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: int64maximum: int64minimum: int64unit: string # The unit of the propertystring: objectaccessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: stringdouble: objectaccessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: doublemaximum: doubleminimum: doubleunit: stringfloat: objectaccessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: floatmaximum: floatminimum: floatunit: stringboolean: objectaccessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: booleanbytes: objectaccessMode: string # 必需:属性的访问模式 ReadWrite | ReadOnlyversion: v1alpha2
counter中的kubeedge-counter-model.yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:name: counter-modelnamespace: default
spec:properties:- name: statusdescription: counter statustype:string:accessMode: ReadWritedefaultValue: ''
deviceinstance.yaml
定义的CRD创建的相应的实例。
Device的CRD定义yaml文档 devices_v1alpha2_device.yaml ,制订了实例定义的格式。
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:labels:controller-tools.k8s.io: "1.0"name: devices.devices.kubeedge.io
spec:group: devices.kubeedge.ionames:kind: Deviceplural: devicesscope: Namespacedvalidation:openAPIV3Schema: # 校验工具properties:apiVersion: stringkind: stringmetadata: objectspec: object # 只有deviceModelRef、nodeSelector必需deviceModelRef: object # 必需,模板引用nodeSelector: object # 必需,表示将该实例调度到包含这个label的node上,以key:value的格式指定 protocol: object # 连接到设备的协议配置bluetooth: object # 蓝牙协议配置macAddress: string # mac地址,设备的唯一标识符modbus: object # modbus协议配置slaveID: int64 # 必需:0-255minimum: 0maximum: 255opcua: object # opc-ua协议配置certificate: string # 访问opc服务器的证书password: string # 密码privateKey: string # 私钥securityMode: string # 安全模式,默认无securityPolicy: string # 默认无timeout: int64 # opc服务器连接超时秒数url: string # 必需:opc服务器endpoint 的URLuserName: string # 访问opc服务器的用户名common: object # 协议配置的公共部分com:baudRate: integer # 必需,波特率115200|57600|38400|19200|9600|4800|2400|1800|1200|600|300|200|150|134|110|75|50dataBits: integer # 必需,有效值为8、7、6、5parity: string # 必需,奇偶校验位,有效选项为"none", "even","odd",默认是 noneserialPort: string # 必需,stopBits: integer # 必需,停止1 | 2的位tcp: object ip: string # 必需port: int64 # 必需commType: string # 通信类型,如tcp客户端、tcp服务器或COMreconnTimeout: integer # 超时重连reconnRetryTimes: integer # 重连次数collectTimeout: int64 # mapper 到设备的超时collectRetryTimes: int64 # mapper 到设备的超时重连次数collectType: string # 收集类型,同步或异步sync or asynccustomizedValues: object # 协议的自定义值customizedProtocol: object # 自定义协议的协议配置protocolName: string # 必需,协议名称configData: object # 自定义配置数据propertyVisitors: # 属性访问者列表,propertyVisitor必须是propertyVisitor.propertyName唯一的bluetooth: object # Bluetooth协议的一组附加访问者配置字段characteristicUUID: string # 必需:对应操作的唯一IDdataConverter: object # 负责将从蓝牙设备读取的数据转换为平台可以理解的形式endIndex: int64 # 必需:指定要转换数据流的结束索引。指定的值应包括在内。例如,如果指定了3,则它包括第三个索引orderOfOperations: array # 指定操作的执行顺序(将传入数据转换为可理解的形式需要执行这些操作)operationType: string # 必需:指定要执行的转换操作:Add|Subtract|Multiply|DivideoperationValue: double # 必需:指定要执行的操作的值shiftLeft: int64 # 如果转换需要左移位操作,则表示要左移位的位数shiftRight: int64 # 右移startIndex: int64 # 必需:指定要转换数据字节流的开始索引。例如:开始索引:2,结束索引:3连接传入字节流的第二个和第三个索引处的值。如果我们想颠倒顺序,我们可以把它作为开始索引:3,结束索引:2dataWrite: object # '负责将来自平台的数据转换为蓝牙设备可以理解的形式,例如:“开”:[1],“关”:[0]'modbus: object # Modbus协议的一组附加访客配置字段。isRegisterSwap: boolean # 指示高寄存器和低寄存器是否已交换。默认falseisSwap: boolean # 指示是否交换高字节和低字节,默认falselimit: int64 # 必需:限制要读/写的寄存器数量offset: int64 # 必需:偏移量表示读取/写入数据的起始寄存器编号register: string # 必需:寄存器类型:CoilRegister| DiscreteInputRegister |InputRegister |HoldingRegisterscale: double # 将原始特性数据转换为最终单位的比例。默认值为1.0opcua: object # opcua协议的一组附加访客配置字段。browseName: string # opc-ua节点名nodeID: string # 必需:opcua节点的ID,例如“ns=1,i=1005”customizedProtocol: object # 自定义协议protocolName: string # 必需:协议名configData: object # 必需:自定义配置数据propertyName: string # 必需:访问的设备属性名称。引用devicemodel中定义的一个设备属性。reportCycle: int64 # 定义mapper report频率collectCycle: int64 # 定义mapper从device 收集数据的频率customizedValues: object # 所提供协议的访问者的自定义值data: objectdataTopic: string # Topic used by mapper,从dataProperties收集的所有数据都应发布到此topic,默认 $ke/events/device/+/data/update'dataProperties: array # edgecore不需要处理的数据属性列表propertyName: string # 必需:desired/reported属性名称,属性应存在于device model中metadata: object # 其他元数据(如筛选器策略)status: objecttwins: array # 数组结构,包括desired、propertyName、reporteddesired: object # 期望metadata: objectvalue: string # 必需,期望值propertyName: string # 属性名称,存在于设备模型中reported: object # 必需,收到的实际值properties:metadata: object # value: string # 必需,实际值 version: v1alpha2
counter中的kubeedge-counter-instance.yaml
apiVersion: devices.kubeedge.io/v1alpha2 #资源组/版本 == Device定义中spec中的group/version
kind: Device # 自定义CRD的名称
metadata:name: counter # 实例名称labels:description: 'counter'
spec:deviceModelRef: # 模板引用name: counter-modelnodeSelector: # 表示将该实例调度到包含这个label的node上,以key:value的格式指定nodeSelectorTerms:- matchExpressions:- key: ''operator: Invalues:- edge-nodestatus: # 状态实际上是一个自定义资源的子资源,用来回应当前 Pod 的整个状态。对该字段的更新并不会触发 Deployment 或 Pod 的重新部署twins:- propertyName: statusdesired: # 所需的属性值metadata: # 附加元数据type: stringvalue: 'OFF'reported:metadata:type: stringvalue: '0'
yaml文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析相关推荐
- mybatis-plus根据多个字段排序_PHP中Thinkphp5框架的多字段排序
TP5多字段排序 很多人第一时间会想到手册里面的order,今天咱们就几种方法来处理排序的问题! 1.实例化Expression类 标题说了,是多字段排序,OK,没有问题,多字段排序,你只需要在实例化 ...
- 修改mysql表的字段名_mysql中修改表字段名/字段长度/字段类型详解
在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...
- jsp java json解析,jsp中获取json字符串,并解析
JqueryDemo1 function showData() { var str='{ "name": "John" }';//json标准格式 var ob ...
- mysql字段名explain_Mysql中explain用法和结果字段的含义介绍
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 分享一下大神老师的人工智能教程.零基础!通俗易懂!风趣幽默(偶尔开开车,讲讲黄段子)! 大家可以看看是否对自己有帮助,如果你 ...
- 使用D9的SetFVF无法控制数据字段在内存中的顺序,所有字段的顺序都是固定的。自能选择好用还是不用。...
D3DFVF_DIFFUSE是个DWORD哦.4个字节. // Untransformed vertex for unlit, untextured, Gouraud-shaded // conten ...
- shell取mysql字段_shell 脚本中获取mysql多个字段的值
从mysql中查询出的结果为:mysql -Ne "SELECT ip,port FROM op.host WHERE os='linux' and type='支持'" +--- ...
- go解析yaml文件示例
yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...
- 【python】yaml文件操作
1. 读取yaml文件 1-读取yaml文件的操作流程: 前提:pip install PyYAML导包:import yaml打开yaml文件:with open(文件名,模式) as f(变量名) ...
- 使用Jackson处理yaml文件
使用Jackson处理yaml文件 Jackson不仅可以处理json和xml,也可以处理yaml文件,本文带你使用jackson提供的ObjectMapper类读写yaml文件 1. yaml文件及 ...
最新文章
- CSS之布局(盒子的尺寸)
- 实践教程 | TensorRT部署深度学习模型
- android string.xml前后加空格的技巧
- ssh-keys git
- 玩转springboot:整合mybatis实例
- 不同服务器怎么响应ajax,如何从服务器获得响应而无需刷新和使用JQuery/AJAX?
- 非名校学生如何进入一二线互联网公司
- ue4 迁移模型_UE4虚幻引擎学习云笔记(六)-关卡设计入门-[5.地形快速入门]
- 无法从elasticsearch节点检索版本信息_【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?...
- [CTO札记]电纸书,将成为教学、阅读潮流
- table里面用三目_三个方法快速找到SAP后台Table
- Revit二次开发之TaskDialog
- Windows官方系统镜像下载及相关介绍
- HCDA(华为认证数据通信工程师)-华为培训认证
- 共享姨妈巾出来了成为共享家族中的热门产品
- Excel数值函数(4):对指定条件的单元格求和
- 给discuz x增加后台菜单管理功能
- 安全管家2012上半年手机安全分析报告
- AVS3码流结构解析
- 【docker】dbclient远程访问非本机数据库(mysql,oracle,postgres,sqlserver/mssql),测试远程数据库连通性