ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

干货!K8S之yaml文件详解

2021-06-04 17:29:51  阅读:318  来源: 互联网

标签:k8s YAML ## yaml 干货 nginx deployment K8S v1beta1


文章目录

一、概述
二、YAML文件优点
三、YAML与 JSON 和 XML 的关系
四、YAML 文件的结构
五、YAML 在 Kubernetes 中的使用
六、YAML文件模板生成/导出

一、概述

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

二、YAML文件优点

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

三、YAML与 JSON 和 XML 的关系

在这里插入图片描述

XML 是许多领域的优先采用格式。XML 最初设计为与标准通用标记语言 (SGML) 向后兼容,后者旨在支持结构化文档。因此,XML存在许多设计上的约束。

JSON 的设计理念是简单性和通用性,并且易于生成和解析。JSON 格式的可读性低,但是这种格式的数据每一种现代编程环境都可以轻松处理。

YAML 的设计目标是提升可读性,提供更加完善的信息模型。YAML 的生成和解析更加复杂,因此可以将其视为 JSON 的自然超集。每个JSON 文件都是一个有效的 YAML 文件。

综上所述,在需要额外功能的情况下,可以轻松地从 JSON 迁移到 YAML。YAML 是从 XML 衍生而来。

四、YAML 文件的结构

键值对 – YAML 文件中的基本条目类型是键值对。键值对的格式是键和冒号,之后是空格,然后是值。

数组/列表 – 列表会在列表名称下列出一些项目。列表的元素以 - 开头。可以有 n 个列表,但是,数组中各个元素的缩进非常重要。

字典/地图 – YAML 文件的更复杂类型是字典和地图。
在这里插入图片描述

在编写 YAML 文件时,切记以下准则:

缩进标识层级关系

不支持制表符缩进,使用空格缩进

通常开头缩进两个空格

字符后缩进一个空格,如冒号,逗号等

“—”表示YAML格式,一个文件的开始

“#”表示注释

五、YAML 在 Kubernetes 中的使用

Kubernetes 资源是通过声明的方式创建的,因此可以使用 YAML 文件。
Kubernetes 资源(比如 Pod、服务和部署)是使用 YAML 文件创建的。

YAML文件开头需要编写标签信息,对应不同资源信息

[root@k8s_master ~]# 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

例如创建一个nginx资源

编写yaml文件

[root@k8s_master ~]# 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			##选择业务进行发布

执行创建

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

##执行创建
[root@k8s_master ~]# kubectl create -f nginx-deploy.yaml 
deployment.apps/nginx-deployment created
service/nginx-service created

访问pod资源

##卡看容器对外端口
[root@k8s_master ~]# kubectl get all

在这里插入图片描述
使用49810端口访问nginx
在这里插入图片描述

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

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

[root@k8s_master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=3 --dry-run -o yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx-deployment
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: nginx-deployment
    spec:
      containers:
      - image: nginx
        name: nginx-deployment
        ports:
        - containerPort: 80
        resources: {}
status: {}

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

[root@k8s_master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=3 --dry-run -o json

{
    "kind": "Deployment",
    "apiVersion": "apps/v1beta1",
    "metadata": {
        "name": "nginx-deployment",
        "creationTimestamp": null,
        "labels": {
            "run": "nginx-deployment"
        }
    },
    "spec": {
        "replicas": 3,
        "selector": {
            "matchLabels": {
                "run": "nginx-deployment"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "run": "nginx-deployment"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "nginx-deployment",
                        "image": "nginx",
                        "ports": [
                            {
                                "containerPort": 80
                            }
                        ],
                        "resources": {}
                    }
                ]
            }
        },
        "strategy": {}
    },
    "status": {}
}

将现有的资源生成模板导出到指定文件中(–export -o)

##查看现有资源
[root@k8s_master ~]# 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

##导出资源成yaml文件到新的文件中
[root@k8s_master ~]#  kubectl get deployment/nginx-deployment --export -o yaml > nginx_abc.yaml

##验证导出的yaml文件
[root@k8s_master ~]# 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: {}

查看字段帮助信息

使用 kubectl explain命令可以查看yaml文件的字段中可以使用那些信息字段

例如:查看pod资源中spec下的containers下的ports可以使用哪些信息字段

[root@k8s_master ~]# kubectl explain pod.spec.containers.ports
KIND:     Pod
VERSION:  v1

RESOURCE: ports <[]Object>

DESCRIPTION:
     List of ports to expose from the container. Exposing a port here gives the
     system additional information about the network connections a container
     uses, but is primarily informational. Not specifying a port here DOES NOT
     prevent that port from being exposed. Any port which is listening on the
     default "0.0.0.0" address inside a container will be accessible from the
     network. Cannot be updated.

     ContainerPort represents a network port in a single container.

FIELDS:
   containerPort	<integer> -required-
     Number of port to expose on the pod's IP address. This must be a valid port
     number, 0 < x < 65536.

   hostIP	<string>
     What host IP to bind the external port to.

   hostPort	<integer>
     Number of port to expose on the host. If specified, this must be a valid
     port number, 0 < x < 65536. If HostNetwork is specified, this must match
     ContainerPort. Most containers do not need this.

   name	<string>
     If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
     named port in a pod must have a unique name. Name for the port that can be
     referred to by services.

   protocol	<string>
     Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".

标签:k8s,YAML,##,yaml,干货,nginx,deployment,K8S,v1beta1
来源: https://blog.csdn.net/ichen820/article/details/117567137

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有