yaml文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析

YAML基本语法

  • 使用空格做为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 一般开头缩进两个空格
  • 字符后面缩进一个空格,比如冒号: ,逗号 等后面
  • 低版本缩进时不允许使用Tab 键,只允许使用空格
  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
  • 使用 — 表示新的yaml文件开始

数据结构

数组和对象可以构成复合结构。

对象

键值对的集合,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)

# 对象类型:对象的一组键值对,使用冒号结构表示
hash: 
 name: Tom
 age: 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文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析_第1张图片

属性说明

在一个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中的ENTRYPOINT
    args: [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,默认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方式,如果其退出码不为0,则认为容器正常 
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,返回200-399之间,则认为容器正常
        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退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject  #设置NodeSelector表示将该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
          path: 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:         	#定义模板,格式大致和pod的metsdata与s
    metadata:
      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: 8080
              scheme: HTTP
            initialDelaySeconds: 60 	#启动后延时多久开始运行检测
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 5
            readinessProbe:
          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磁盘

service.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                 #外部负载均衡器的主机名

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

image-20211108164008729

然后我们导出 nginx的配置

kubectl get deploy nginx -o=yaml > nginx.yaml

然后会生成一个 nginx.yaml 的配置文件

image-20211108164014778

将 yaml 换成 json 即可得到 json 文件

yaml文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析_第2张图片

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.io
  names:
    kind: DeviceModel
    plural: devicemodels
  scope: Namespaced
  validation:
    openAPIV3Schema:	校验工具
      properties:
        apiVersion:  string
        kind:  string
        metadata:  object
        spec:  object
            properties:	 array	# 必需:device属性列表
                properties:  object	# device属性描述
                  name:    string	# 必需:device属性名称
                  type:     string	# 必需:表示属性的类型和数据验证
                    properties:  object
                      int:
                          accessMode:   string 	# 必需:属性的访问模式 ReadWrite | ReadOnly
                          defaultValue:  int64
                          maximum:  int64
                          minimum:  int64
                          unit:  string		# The unit of the property

                      string:   object
                          accessMode:  string	# 必需:属性的访问模式 ReadWrite | ReadOnly
	         			  defaultValue:  string

                      double:   object
                          accessMode:  string	# 必需:属性的访问模式 ReadWrite | ReadOnly
                          defaultValue: double
                          maximum:   double
                          minimum:    double
                          unit:   string

                      float:   object
                          accessMode:  string	# 必需:属性的访问模式 ReadWrite | ReadOnly
                          defaultValue:   float
                          maximum:     float
                          minimum:      float
                          unit:       string

                      boolean:   object
                          accessMode:  string	# 必需:属性的访问模式 ReadWrite | ReadOnly
	                      defaultValue:  boolean

                      bytes:    object
                          accessMode:   string	# 必需:属性的访问模式 ReadWrite | ReadOnly
  version: v1alpha2

counter中的kubeedge-counter-model.yaml

apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:
 name: counter-model
 namespace: default
spec:
 properties:
  - name: status
    description: counter status
    type:
     string:
      accessMode: ReadWrite
      defaultValue: ''

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.io
  names:
    kind: Device
    plural: devices
  scope: Namespaced
  validation:
    openAPIV3Schema:	# 校验工具
      properties:
        apiVersion: string
        kind:	string
        metadata: object
        spec:	object		# 只有deviceModelRef、nodeSelector必需
            deviceModelRef: object	# 必需,模板引用
            nodeSelector:	 object	# 必需,表示将该实例调度到包含这个label的node上,以key:value的格式指定 
            protocol: object	# 连接到设备的协议配置
                bluetooth:	 object	# 蓝牙协议配置
                    macAddress: string	# mac地址,设备的唯一标识符
                modbus:	 object	# modbus协议配置
                    slaveID:	  int64	# 必需:0-255
                      minimum: 0
                      maximum: 255
                opcua: object	# opc-ua协议配置
                    certificate:  string	# 访问opc服务器的证书
                    password:  string	# 密码
                    privateKey:  string	# 私钥
                    securityMode:  string	# 安全模式,默认无
                    securityPolicy:  string	# 默认无
                    timeout:	  int64	# opc服务器连接超时秒数
                    url: string	# 必需:opc服务器endpoint 的URL
                    userName:  string	# 访问opc服务器的用户名
                common:	object	# 协议配置的公共部分
                    com:
                        baudRate: integer	# 必需,波特率115200|57600|38400|19200|9600|4800|2400|1800|1200|600|300|200|150|134|110|75|50
                        dataBits: integer		# 必需,有效值为8、7、6、5
                        parity: string		# 必需,奇偶校验位,有效选项为"none", "even","odd",默认是 none
                        serialPort: string		# 必需,
                        stopBits: integer		# 必需,停止1 | 2的位
                    tcp:   object		
                        ip:      string		# 必需
                        port:	int64		# 必需
                    commType: string		# 通信类型,如tcp客户端、tcp服务器或COM
                    reconnTimeout:  integer	# 超时重连
                    reconnRetryTimes:  integer	# 重连次数
                    collectTimeout:   int64	# mapper 到设备的超时
                    collectRetryTimes:  int64	# mapper 到设备的超时重连次数
                    collectType:  string		# 收集类型,同步或异步sync or async
                    customizedValues:	object	# 协议的自定义值
                customizedProtocol: object		# 自定义协议的协议配置
                    protocolName:  string		# 必需,协议名称
                    configData: object			# 自定义配置数据
            propertyVisitors:			# 属性访问者列表,propertyVisitor必须是propertyVisitor.propertyName唯一的
                  bluetooth:	   object			# Bluetooth协议的一组附加访问者配置字段
                      characteristicUUID:  string 		# 必需:对应操作的唯一ID
                      dataConverter:   object		# 负责将从蓝牙设备读取的数据转换为平台可以理解的形式
                          endIndex:  int64		# 必需:指定要转换数据流的结束索引。指定的值应包括在内。例如,如果指定了3,则它包括第三个索引
                          orderOfOperations:   array		# 指定操作的执行顺序(将传入数据转换为可理解的形式需要执行这些操作)
                                operationType:  string		# 必需:指定要执行的转换操作:Add|Subtract|Multiply|Divide
                                operationValue:  double	# 必需:指定要执行的操作的值
                          shiftLeft: int64			# 如果转换需要左移位操作,则表示要左移位的位数
                          shiftRight:  int64		# 右移
                          startIndex:     int64	# 必需:指定要转换数据字节流的开始索引。例如:开始索引:2,结束索引:3连接传入字节流的第二个和第三个索引处的值。如果我们想颠倒顺序,我们可以把它作为开始索引:3,结束索引:2
                      dataWrite:  object		# '负责将来自平台的数据转换为蓝牙设备可以理解的形式,例如:“开”:[1],“关”:[0]'
                  modbus:	 object		# Modbus协议的一组附加访客配置字段。
                      isRegisterSwap: boolean		# 指示高寄存器和低寄存器是否已交换。默认false
                      isSwap:	  boolean		# 指示是否交换高字节和低字节,默认false
                      limit:   int64		# 必需:限制要读/写的寄存器数量
                      offset:	 int64		# 必需:偏移量表示读取/写入数据的起始寄存器编号
                      register: string		# 必需:寄存器类型:CoilRegister| DiscreteInputRegister |InputRegister |HoldingRegister
                      scale:	 double		# 将原始特性数据转换为最终单位的比例。默认值为1.0
                  opcua:	 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: object
                dataTopic:	  string		# Topic used by mapper,从dataProperties收集的所有数据都应发布到此topic,默认 $ke/events/device/+/data/update'
                dataProperties:  array		# edgecore不需要处理的数据属性列表
                      propertyName:  string	# 必需:desired/reported属性名称,属性应存在于device model中
                      metadata:  object		# 其他元数据(如筛选器策略)
        status:  object
            twins:  array		# 数组结构,包括desired、propertyName、reported
                  desired:	object	# 期望
                      metadata: object
                      value:	 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-model
  nodeSelector:		# 表示将该实例调度到包含这个label的node上,以key:value的格式指定
    nodeSelectorTerms:
    - matchExpressions:
      - key: ''
        operator: In
        values:
        - edge-node

status:		# 状态实际上是一个自定义资源的子资源,用来回应当前 Pod 的整个状态。对该字段的更新并不会触发 Deployment 或 Pod 的重新部署
  twins:
    - propertyName: status
      desired:		# 所需的属性值
        metadata:	# 附加元数据
          type: string
        value: 'OFF'
      reported:
        metadata:
          type: string
        value: '0'

你可能感兴趣的:(k8s,edge,k8s,yaml)