Skip to content

1.YAML文件概述

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

2.YAML书写格式介绍

YAML:是一种标记语言,为了强调这种语言以数据做为中心,而不是以标记语言为重点,YAML是一个可读性高,用来表达数据序列的格式

3.Yaml组成部分

  1. apiVersion:指定k8s API的版本,例如v1。
  2. kind:定义要创建的资源对象类型,如Pod、Service、Namespace等。
  3. metadata:提供资源对象的元数据,包括名称、命名空间、标签和注解。
  4. spec:详细描述资源对象的期望状态,包括容器配置、端口设置、存储卷等。

由两部分组成,

(1)控制器定义

(2)被控制对象

image-20240513112714422

  • 查看支持版本
shell
[root@kube-master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
[root@kube-master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
coordination.k8s.io/v1
crd.projectcalico.org/v1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
metrics.k8s.io/v1beta1
networking.k8s.io/v1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
shell
[root@kube-master ~]# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
replicationcontrollers            rc           v1                                     true         ReplicationController
resourcequotas                    quota        v1                                     true         ResourceQuota
secrets                                        v1                                     true         Secret
serviceaccounts                   sa           v1                                     true         ServiceAccount
services                          svc          v1                                     true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false        MutatingWebhookConfiguration
。。。。
[root@kube-master ~]# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
replicationcontrollers            rc           v1                                     true         ReplicationController
resourcequotas                    quota        v1                                     true         ResourceQuota
secrets                                        v1                                     true         Secret
serviceaccounts                   sa           v1                                     true         ServiceAccount
services                          svc          v1                                     true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false        MutatingWebhookConfiguration
。。。。

4.YAML基本语法

  • 缩进:使用空格进行缩进,不同级别的数据使用不同数量的空格进行区分。
  • 键值对:使用冒号:分隔键和值。
  • 列表:使用短横线-加上空格来开始列表中的项
  • 开始用三个--- 开始,代表新的yaml资源开始
  • 使用#标识注释

用空格做为缩进

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

低版本缩进时不允许使用Tab键,只允许使用空格

4.1 YAML支持的数据结构

对象

  • 键值对的集合
  • 又称为映射(mapping)/哈希(hashes)/字典(dictionary)
yaml
对象类型:对象的一组键值对,使用冒号结构表示
name:Tom
age:18

Yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash:{name:Tom,age:18}
对象类型:对象的一组键值对,使用冒号结构表示
name:Tom
age:18

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

数组

  • 一组按次序排列的值
  • 又称为序列(sequence)/列表(list)
yaml
数组类型:一组连词线开头的行,构成一个数组

People
-  tom
-  han

数组也可以采用行内表示法
People: [tom,han]
数组类型:一组连词线开头的行,构成一个数组

People
-  tom
-  han

数组也可以采用行内表示法
People: [tom,han]

4.2 查看文档

shell
kubectl api-versions    #查看api版本

kubectl api-resources    #查看api资源

kubectl explain  <资源类>  查看yaml文件字段,用于参考

对于不知道具体意思的字段,可以去k8s官网进行查询
官网查询地址为:https://kubernetes.io/zh/docs/home/

#比如,查看pod
kubectl explain pods
kubectl api-versions    #查看api版本

kubectl api-resources    #查看api资源

kubectl explain  <资源类>  查看yaml文件字段,用于参考

对于不知道具体意思的字段,可以去k8s官网进行查询
官网查询地址为:https://kubernetes.io/zh/docs/home/

#比如,查看pod
kubectl explain pods

4.3 案例

yaml
# cat nginx.yaml 
kind: Deployment  #类型,是deployment控制器,kubectl explain  Deployment
apiVersion: v1  #API版本,# kubectl explain  Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain  Deployment.metadata
  labels: #自定义pod的标签,# kubectl explain  Deployment.metadata.labels
    app: linux66-nginx-deployment-label #标签名称为app值为linux66-nginx-deployment-label,后面会用到此标签 
  name: linux66-nginx-deployment #pod的名称
  namespace: linux66 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain  Deployment.spec
  replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
  selector: #定义标签选择器
    matchLabels: #定义匹配的标签,必须要设置
      app: linux66-nginx-selector #匹配的目标标签,
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label,Deployment.spec.template.metadata.labels
        app: linux66-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
    spec: #定义pod信息
      containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
      - name: linux66-nginx-container #容器名称
        image: nginx #镜像地址
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
        #imagePullPolicy: IfNotPresent  #如果本地有镜像,就使用本地镜像,如果没有就根据指定的镜像去下载镜像
        imagePullPolicy: Always #拉取镜像策略,每次重建容器,无论本地有没有镜像,都会重新下载镜像
        ports: #定义容器端口列表
        - containerPort: 80 #定义一个端口
          protocol: TCP #端口协议
          name: http #端口名称
        - containerPort: 443 #定义一个端口
          protocol: TCP #端口协议
          name: https #端口名称
        env: #配置环境变量
        - name: "password" #变量名称。必须要用引号引起来
          value: "123456" #当前变量的值
        - name: "age" #另一个变量名称
          value: "18" #另一个变量的值
        resources: #对资源的请求设置和限制设置
          limits: #资源限制设置,上限
            cpu: 500m  #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
            memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests: #资源请求的设置
            cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
            memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用

---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
  labels: #自定义标签,service.metadata.labels
    app: linux66-nginx #定义service标签的内容
  name: linux66-nginx-spec #定义service的名称,此名称会被DNS解析
  namespace: linux66 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
  type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
  ports: #定义访问端口, service.spec.ports
  - name: http #定义一个端口名称
    port: 80 #service 80端口
    protocol: TCP #协议类型
    targetPort: 80 #目标pod的端口
nodePort: 30001 #node节点暴露的端口,是部署k8s时指定的端口范围内的端口
#请求转发过程:请求先转发给node,然后由node转发给service,由service转发给pod
  - name: https #SSL 端口
    port: 443 #service 443端口
    protocol: TCP #端口协议
    targetPort: 443 #目标pod端口
    nodePort: 30043 #node节点暴露的SSL端口,是部署k8s时指定的端口范围内的端口
  selector: #service的标签选择器,定义要访问的目标pod
    app: linux66-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels
# cat nginx.yaml 
kind: Deployment  #类型,是deployment控制器,kubectl explain  Deployment
apiVersion: v1  #API版本,# kubectl explain  Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain  Deployment.metadata
  labels: #自定义pod的标签,# kubectl explain  Deployment.metadata.labels
    app: linux66-nginx-deployment-label #标签名称为app值为linux66-nginx-deployment-label,后面会用到此标签 
  name: linux66-nginx-deployment #pod的名称
  namespace: linux66 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain  Deployment.spec
  replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
  selector: #定义标签选择器
    matchLabels: #定义匹配的标签,必须要设置
      app: linux66-nginx-selector #匹配的目标标签,
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label,Deployment.spec.template.metadata.labels
        app: linux66-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels
    spec: #定义pod信息
      containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
      - name: linux66-nginx-container #容器名称
        image: nginx #镜像地址
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
        #imagePullPolicy: IfNotPresent  #如果本地有镜像,就使用本地镜像,如果没有就根据指定的镜像去下载镜像
        imagePullPolicy: Always #拉取镜像策略,每次重建容器,无论本地有没有镜像,都会重新下载镜像
        ports: #定义容器端口列表
        - containerPort: 80 #定义一个端口
          protocol: TCP #端口协议
          name: http #端口名称
        - containerPort: 443 #定义一个端口
          protocol: TCP #端口协议
          name: https #端口名称
        env: #配置环境变量
        - name: "password" #变量名称。必须要用引号引起来
          value: "123456" #当前变量的值
        - name: "age" #另一个变量名称
          value: "18" #另一个变量的值
        resources: #对资源的请求设置和限制设置
          limits: #资源限制设置,上限
            cpu: 500m  #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值
            memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests: #资源请求的设置
            cpu: 200m #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
            memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用

---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
  labels: #自定义标签,service.metadata.labels
    app: linux66-nginx #定义service标签的内容
  name: linux66-nginx-spec #定义service的名称,此名称会被DNS解析
  namespace: linux66 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
  type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
  ports: #定义访问端口, service.spec.ports
  - name: http #定义一个端口名称
    port: 80 #service 80端口
    protocol: TCP #协议类型
    targetPort: 80 #目标pod的端口
nodePort: 30001 #node节点暴露的端口,是部署k8s时指定的端口范围内的端口
#请求转发过程:请求先转发给node,然后由node转发给service,由service转发给pod
  - name: https #SSL 端口
    port: 443 #service 443端口
    protocol: TCP #端口协议
    targetPort: 443 #目标pod端口
    nodePort: 30043 #node节点暴露的SSL端口,是部署k8s时指定的端口范围内的端口
  selector: #service的标签选择器,定义要访问的目标pod
    app: linux66-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels

5. 资源分配

bash
job/cronjob   0.3/512Mi
job/cronjob   0.3/512Mi