Kubernetes YAML文件详解

1、yaml 文件概述

      Kubernetes只支持yaml和json格式创建资源对象。JSON格式一般用于接口之间消息的传递,yaml是专门用来写配置文件的语言,非常简洁和强大,可读性高。它实质上是一种通用的数据串行化格式。

      k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(yaml)文件来解决,也就是可以把需要对资源对象操作编辑到 yaml 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署。

2、yaml 语法格式

(1)yaml 介绍
    yaml :仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。
    yaml 是一个可读性高,用来表达数据序列的格式。
(2)yaml基本语法
    * 使用空格做为缩进
    * 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
    * 低版本缩进时不允许使用 Tab 键,只允许使用空格
    * 字符后缩进一个空格,比如冒号,逗号等后面
    * 使用---表示新的yaml文件开始
    * 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
(3)yaml支持的数据结构

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

# 对象类型:对象的一组键值对,使用冒号结构表示
name: Tom
age: 18

# yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: {name: Tom, age: 18}

数组:

# 数组类型:一组连词线开头的行,构成一个数组
People
- Tom
- Jack

# 数组也可以采用行内表示法
People: [Tom, Jack]

3、yaml文件组成部分

(1)、控制器定义(要控制那些事)

 

(2)、被控制对象(控制的具体的事)
包含一些 镜像,版本、端口等

 (3)、常用字段含义

在一个yaml文件的控制器定义中,有很多属性名称

属性名称介绍
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置

4、资源清单描述方法

(1)在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML文件称为资源清单。
  (2)常用字段
    * 必须存在的属性 

 *spec 主要对象

 *额外的参数

 (3)举例说明

5、如何快速编写yaml文件

1、第一种使用kubectl create 命令生成yaml文件

生成yaml文件  格式  不运行

[root@master-node opt]# kubectl create deployment web --image=nginx -o yaml --dry-run

将生成的yaml文件信息输出到一个文件中

[root@master-node opt]# kubectl create deployment web --image=nginx -o yaml --dry-run > nginx.yaml

2、第二种 使用kubectl get 命令导出yaml文件

可以首先查看一个目前已经部署的镜像

[root@master-node opt]#kubectl get deploy

 

 把已经部署好的yaml文件中导出一个来

[root@master-node opt]#kubectl get deploy nginx -o=yaml --export > nginx.yaml

6、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: //挂载到到容器内部的存储 卷设置 
    volumeMounts:    #挂载到容器内部的存储卷配置
    - name: string     #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean    #是否为只读模式
    ports:       #需要暴露的端口库号列表
    - name: string     #端口号名称
      containerPort: int   #容器需要暴露的端口号
      hostPort: int    #容器所在主机需要监听的端口号,默认与Container相同(容器暴露端口映射到宿主机的端口,设置 hostPort 时同一 台宿主机将不能再启动该容器的第 2 份副本) 
      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退出码退出才重启,Nerver表示不再重启该Pod
    nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
   svrtype:basic #为指定节点添加标签 ,kubectl label node test-node svrtype=basic 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

实例文件

示例1:

    apiVersion: apps/v1    #接口版本
    kind: Deployment       #接口类型
    metadata:
      name: iot-edge-manage   #deploymet名称
      namespace: basic-server  #namespace名称
      labels:
        app: iot-edge-manage   #标签
    spec:
      replicas: 1              #副本数量
      selector:
        matchLabels:
          app: iot-edge-manage
      template:
        metadata:
          labels:
            app: iot-edge-manage     #模板名称
        spec:
          hostNetwork: true
          containers:
          - name: iot-edge-manage  #镜像名称
            image: 192.168.16.251:5000/iot-edge-manage:latest  #镜像地址
            imagePullPolicy: IfNotPresent    #如果不存在则拉取
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /app/static/  # 容器内路径
              name: share    # 要与 volume 中 name 匹配
            - mountPath: /var/run/docker.sock
              name: sock
            - mountPath: /etc/timezone
              name: timezone
            - mountPath: /etc/localtime
              name: localtime
            ports:
            - name: manage
              containerPort: 8888
              hostPort: 8888
            resources:         # 资源限制和请求的设置
              limits:               # 资源限制的设置
                cpu: "500m"           # Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
                memory: "200Mi"        # 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
              requests:         # 资源请求的设置
                cpu: "100m"     # Cpu请求,容器启动的初始可用数
                memory: "100Mi"  # 内存清楚,容器启动的初始可用数量
#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容, volumes: #定义磁盘给上面volumeMounts挂载
- name: share #挂载宿主机上面的目录 hostPath: path: /home/edge/static # 使用 pod 所在节点的路径 - name: sock hostPath: path: /var/run/docker.sock - name: timezone hostPath: path: /etc/timezone - name: localtime hostPath: path: /etc/localtime nodeSelector: svrtype:basic

示例2:

apiVersion: extensions/v1beta1   #接口版本
kind: Deployment                 #接口类型
metadata:
  name: ptengine-demo               #Deployment名称
  namespace: ptengine-prd           #namespace 名称
  labels:
    app: ptengine-demo              #标签
spec:
  replicas: 3
   strategy:
    rollingUpdate:  ##由于replicas为3,则整个升级,pod个数在2-4个之间
      maxSurge: 1       #滚动升级时会先启动1个pod
      maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
  template:         
    metadata:
      labels:
        app: ptengine-demo  #模板名称必填
    sepc: #定义容器模板,该模板可以包含多个容器
      containers:                                                                   
        - name: ptengine-demo                                                           #镜像名称
          image: reg.pt1.com/ptengine-prd/ptengine-demo:0.0.1-SNAPSHOT #镜像地址
          CMD: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #启动CMD
          args:                                                                #启动参数
            - '-storage.local.retention=$(STORAGE_RETENTION)'
            - '-web.external-url=$(EXTERNAL_URL)'

          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  #local策略可使用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磁盘

 

posted on 2022-01-27 10:34  uestc2007  阅读(621)  评论(0编辑  收藏  举报

导航