zoukankan      html  css  js  c++  java
  • 第六章 kuberneters集群YAML文件详解

    一、YAML 文件概述

    Kubernetes只支持YAML和JSON格式创建资源对象
    
    JSON格式用于接口之间消息的传递,YAML格式用于配置和管理
    
    YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。
    
    k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
    

    二、YAML 介绍及优点

    1.YAML 介绍

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

    2.YAML 优点

    1)YAML 文件易于人类阅读,具有表达性和可扩展性。
    
    2)YAML 文件易于实现和使用。
    
    3)可在编程语言之间轻松移植。
    
    4)与敏捷语言的原生数据结构相匹配。
    
    5)YAML 文件具有一致模型,支持通用工具。
    
    6)YAML 文件支持 One-pass 处理。
    
    7)使用方便,因此您无需再将所有的参数添加到命令行中。
    
    8)易于维护 – 可以将 YAML 文件添加到源控件中以跟踪更改。
    
    9)灵活便捷 – 可以使用 YAML 创建更加复杂的结构(相对于使用命令行可以创建的结构)
    

    三、YAML 基本语法

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

    四、YAML与 JSON 和 XML 的关系

    XML 是许多领域的优先采用格式。XML 最初设计为与标准通用标记语言 (SGML) 向后兼容,后者旨在支持结构化文档。因此,XML存在许多设计上的约束。
    
    JSON 的设计理念是简单性和通用性,并且易于生成和解析。JSON 格式的可读性低,但是这种格式的数据每一种现代编程环境都可以轻松处理。
    
    YAML 的设计目标是提升可读性,提供更加完善的信息模型。YAML 的生成和解析更加复杂,因此可以将其视为 JSON 的自然超集。每个
    
    JSON 文件都是一个有效的 YAML 文件。
    
    综上所述,在需要额外功能的情况下,可以轻松地从 JSON 迁移到 YAML。YAML 是从 XML 衍生而来。
    

    五、YAML 文件组成部分

    YAML 文件有两个组成部分:
    	1.控制器定义
    	2.被控制对象
    

    六、YAML 在 Kubernetes 中的使用

    Kubernetes 资源是通过声明的方式创建的,因此可以使用 YAML 文件。
    Kubernetes 资源(比如 Pod、服务和部署)是使用 YAML 文件创建的。
    
    YAML文件开头需要编写标签信息,对应不同资源信息
    

    1.查看kubernetes的api版本

    [root@k8s-master-001 ~]# kubectl api-versions
    admissionregistration.k8s.io/v1beta1
    apiextensions.k8s.io/v1beta1
    apiregistration.k8s.io/v1
    apiregistration.k8s.io/v1beta1
    apps/v1           ##应用资源
    apps/v1beta2      ##测试版本
    authentication.k8s.io/v1
    authentication.k8s.io/v1beta1
    authorization.k8s.io/v1
    authorization.k8s.io/v1beta1
    autoscaling/v1
    autoscaling/v2beta1    ##弹性伸缩资源
    autoscaling/v2beta2
    batch/v1
    batch/v1beta1
    certificates.k8s.io/v1beta1
    coordination.k8s.io/v1beta1
    events.k8s.io/v1beta1
    extensions/v1beta1
    networking.k8s.io/v1
    policy/v1beta1
    rbac.authorization.k8s.io/v1     ##权限控制资源
    rbac.authorization.k8s.io/v1beta1
    scheduling.k8s.io/v1beta1
    storage.k8s.io/v1
    storage.k8s.io/v1beta1
    v1
    

    2.编写Yaml文件

    例如创建一个nginx资源,编写yaml文件
    
    [root@k8s-master-001 ~]# vim nginx-deploy.yaml 
    apiVersion: apps/v1   ##版本号 ,pod资源
    kind: Deployment      ##类型/控制器
    metadata:               		##数据标签
      name: nginx-deployment
      labels:						##子标签
        app: nginx				##业务容器
    spec:
      replicas: 3					##副本集
      selector:						##选择器
        matchLabels:				##匹配标签
          app: nginx					##对应上面的业务容器
      template:					##模板
        metadata:
          labels:
            app: nginx
        spec:
          containers:       ##容器
          - name: nginx     ##对应上面的业务容器
            image: nginx:1.15.4     ##使用镜像信息
            ports:
            - containerPort: 80      ##容器端口信息
    ---
    apiVersion: v1        ##版本号
    kind: Service        ##服务类型
    metadata:
      name: nginx-service
      labels:
        app: nginx
    spec:
      type: NodePort     ##端口映射
      ports:
      - port: 80 		##内部端口
        targetPort: 80   ##映射端口
      selector:       ##选择器/
        app: nginx			##选择业务进行发布
    

    3.执行创建

    #测试yaml文件命令的正确性
    [root@k8s-master-001 ~]# kubectl create -f nginx-deploy.yaml --dry-run
    deployment.apps/nginx-deployment created (dry run)
    service/nginx-service created (dry run)
    
    #执行创建
    [root@k8s-master-001 ~]# kubectl create -f nginx-deploy.yaml 
    deployment.apps/nginx-deployment created
    service/nginx-service created
    

    4.访问pod资源

    [root@k8s-master-001 ~]#  kubectl get svc
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        3h7m
    nginx        NodePort    10.96.95.61   <none>        80:46847/TCP   12s
    
    [root@k8s-master-001 ~]#  curl 192.168.13.110:46847
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

    七、YAML文件模板生成/导出

    1.利用nginx镜像创建资源,生成yaml格式文件

    #1.创建资源生成yaml文件
    [root@k8s-master-001 ~]# kubectl create deployment  web --image=nginx --port=80 --replicas=3 --dry-run -o yaml > my1.yaml
    W0923 18:35:21.730422    2876 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
    
    #2.查看是否生成新的yaml文件
    [root@k8s-master-001 ~]# ll
    total 12
    -rw-r--r--  1 root root  419 Sep 23 18:35 my1.yaml
    
    #3.查看生成的yaml文件
    [root@k8s-master-001 ~]# cat my1.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: web
      name: web
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: web
        spec:
          containers:
          - image: nginx
            name: nginx
            ports:
            - containerPort: 80
            resources: {}
    status: {}
    

    2.利用nginx镜像创建资源,生成json格式文件

    #1.创建资源生成json文件
    [root@k8s-master-001 ~]# kubectl create deployment  web --image=nginx --port=80 --replicas=3 --dry-run -o json > my1.json
    W0923 18:41:00.973387    4925 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
    
    #2.查看是否生成新的json文件
    [root@k8s-master-001 ~]# ll
    total 16
    -rw-------. 1 root root 1350 Jun  9  2020 anaconda-ks.cfg
    drwxr-xr-x  2 root root   76 Sep 16 17:49 delopyment
    -rw-r--r--. 1 root root  497 Aug  5  2020 hostname_ip.sh
    -rw-r--r--  1 root root 1009 Sep 23 18:41 my1.json
    -rw-r--r--  1 root root  419 Sep 23 18:35 my1.yaml
    
    #3.查看生成的json文件
    [root@k8s-master-001 ~]# cat my1.json 
    {
        "kind": "Deployment",
        "apiVersion": "apps/v1",
        "metadata": {
            "name": "web",
            "creationTimestamp": null,
            "labels": {
                "app": "web"
            }
        },
        "spec": {
            "replicas": 3,
            "selector": {
                "matchLabels": {
                    "app": "web"
                }
            },
            "template": {
                "metadata": {
                    "creationTimestamp": null,
                    "labels": {
                        "app": "web"
                    }
                },
                "spec": {
                    "containers": [
                        {
                            "name": "nginx",
                            "image": "nginx",
                            "ports": [
                                {
                                    "containerPort": 80
                                }
                            ],
                            "resources": {}
                        }
                    ]
                }
            },
            "strategy": {}
        },
        "status": {}
    }
    

    3.将现有的资源生成模板导出到指定文件中

    #1.查看现有资源
    [root@k8s-master-001 ~]# kubectl get pods,deploy
    NAME                                  READY   STATUS    RESTARTS   AGE
    pod/nginx-deployment-d55b94fd-5jvtq   1/1     Running   0          16m
    pod/nginx-deployment-d55b94fd-pfb7n   1/1     Running   0          16m
    pod/nginx-deployment-d55b94fd-vtm7t   1/1     Running   0          16m
    
    NAME                                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    deployment.extensions/nginx-deployment   3         3         3            3           16m
    
    #2.导出资源成yaml文件到新的文件中
    [root@k8s-master-001 ~]#  kubectl get deployment/nginx-deployment --export -o yaml > nginx_abc.yaml
    
    #3.验证导出的yaml文件
    [root@k8s-master-001 ~]# cat nginx_abc.yaml 
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      annotations:
        deployment.kubernetes.io/revision: "1"
      creationTimestamp: null
      generation: 1
      labels:
        app: nginx
      name: nginx-deployment
      selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
    spec:
      progressDeadlineSeconds: 600
      replicas: 3
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: nginx
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.15.4
            imagePullPolicy: IfNotPresent
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    status: {}
    

    八、YAML 支持的数据结构

    1.对象

    键值对的集合,又称为映射(mapping) / 哈希(hashes)/ 字典(dictionary)
    
    对象类型:对象的一组键值对,使用冒号结构表示
    name: Tom
    age: 18
    
    Yaml也允许另一种写法,将所有键值对写成一个行内对象
    hash: { name: Tom, age: 18 }
    

    2.数组

    一组按次序排列的值,又称为序列(sequence)/ 列表 (list)
    
    数组类型:一组连词线开头的行,构成一个数组
    Peop1e
    - Tom
    - Jack
    
    数组也可以采用行内表示法
    People: [Tom,Jack]
    

    3.纯量

    纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量
    
    数值直接以字面量的形式表示
    number: 12.30
    
    布尔值用true和false表示
    isset: true
    
    null 用~表示
    parent: ~
    
    时间采用iso8601格式
    iso8601:2021-12-14t21:59:43.10-05:00
    
    日期采用复合iso8601格式的年、月、日表示
    date: 1976-07-31
    
    YAML允许使用两个感叹号,强制转换数据类型
    e: !!str 123
    f: !!str true
    
    字符串默认不使用引号表示
    str: 这是一行字符串
    
    如果字符串之中包含空格或特殊字符,需要放在引号之中
    str: '内容: 字符串'
    
    单引号和双引号都可以使用,双引号不对特殊字符转义
    s1: '内容
    字符串'
    s2: "内容
    字符串'
    
    单引号之中如果还有单引号,必须连续使用两个单引号转义
    str: 'labor''s day'
    
    字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
    str:这是一段
    	多行
    	字符串
    
    多行字符串可以使用|保留换行符,也可以使用>折叠换行
    this: |
    Foo
    Bar
    
    that
    Foo
    Bar
    

    九、资源清单描述方法

    在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML 文件称为资源清单。
    

    1.必须存在的字段

    2.spec 主要对象

    3.额外的参数

    4.举例说明

    ---
    # 创建一个namespace
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    
    ---
    # 创建一个pod
    apiVersion: v1
    kind: pod
    metadata:
      name: pod1
    spec:
      containers:
      - name: nginx-containers
        image: nginx:latest
    
  • 相关阅读:
    AdaBoost学习笔记
    隐马尔科夫模型(HMM)学习笔记二
    隐马尔可夫模型(HMM)学习笔记一
    k-means学习笔记
    pandas练习(四)--- 应用Apply函数
    pandas练习(三)------ 数据分组
    pandas练习(二)------ 数据过滤与排序
    pandas练习(一)------ 了解数据
    Android Studio Error:CreateProcess error=216
    玩QQ游戏,见到好几个图像是美女的QQ,就不始玩
  • 原文地址:https://www.cnblogs.com/jhno1/p/15329208.html
Copyright © 2011-2022 走看看