文章目录

  • 前言:
  • 一、YAML文件详解
  • 1.1 K8s资源创建方式
  • 1.2 YAML 简介
  • 1.2.1 YAML语法格式
  • 二、实例创建
  • 2.1 创建Nginx实例
  • 2.2 自动测试
  • 总结:


前言:
  • K8S 里所有的资源或者配置文件都可以用 yaml 或 Json 定义。YAML 是一个 JSON/ 的超集,任何有效 JSON 文件也都是一个有效的YAML文件。
一、YAML文件详解
1.1 K8s资源创建方式
  • K8s由两种创建资源的方式
    ① kubectl :命令创建
    ② yaml/JSON:使用文件方式创建资源对象
    两种格式对比
  • JSON:更偏向于二次开发层面,软件中传的参数都会以json格式传输,此处,需要对api进行一个调用,然后传入json格式给k8s进行有效操作。
    特点:用于接口之间消息的传递,更适用于开发
  • YAML:如果要对K8s进行有效维护,可以使用此格式对K8s的资源(Pod)进行管理
    特点:用于配置和管理,如果基于k8s运维的话,更适合使用此格式文件
    本问主要介绍YAML格式,所以此处介绍以下YAML格式的优势
  • 完整性:配置文件描述了一个资源的完整状态,可以很清楚地知道一个资源的创建背后究竟做了哪些事;
  • 灵活性:配置文件可以创建比命令行更复杂的结构;
  • 可维护性:配置文件提供了创建资源对象的模板,能够重复使用;
  • 可扩展性:适合跨环境、规模化的部署。
1.2 YAML 简介
  • YAML 是一种简洁的非标记性语言,yaml 又被称为是 json 的超集,使用起来比 json 更方便
  • 结构上它有两种可选的类型:Lists 和 Maps。
    List:用 -(破折号) 来定义每一项
    Map:则是一个 key:value 的键值对来表示
1.2.1 YAML语法格式
  • 语法格式
  • ① 缩进标识层级关系
  • ② 不支持制表符(tab键)缩进,使用空格缩进
  • ③ 通常开头缩进两个空格
  • ④ 字符后缩进一个空格,如冒号,逗号、短横杠等
  • ⑤ “—” 表示YAML 格式,一个文件的开始
  • ⑥ “#” 表示注释
  • ⑦ 三个“.” 表示整个文档的结束
  • 说到语法格式,要谈到pod资源发布的过程,假如使用kubectl expose 发布,流程如下:
  • expose----》创建一个service资源做端口映射,把服务提供出去
  • 在创建POD资源之前,需要创建service资源
  • 而pods和service都可以使用YAML格式写出来
  • 先写pods资源
  • 再写service资源
  • 中间以“—“进行分隔,表示创建的是两个资源
  • 标签开头
    语法:kubectl api-versions(标签)
    根据不同的资源,使用不同的标签/版本
    PS:标签/v1beta1,beta表示测试版本标题,如果标签中未指定,可以使用apps代替
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
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
  • YAML格式Pod定义文件完整内容
apiVersion: apps/v1		#基本语法,必选(关键字标签/版本)
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	#指定容器端口
  • 小结yaml文件编写顺序
  • ① 开头标签、类型和信息描述
    apiVersion、kind和、metadata
  • ② 指定选择器
    spec
  • ③ 指定容器
    spec:container
  • 需注意:多一个空格,会导致系统认为是上一个标签的子集,会导致报错
二、实例创建
2.1 创建Nginx实例
  • 编写nginx-deployment.yaml文件
[root@master ~]# mkdir demo
[root@master ~]# cd demo/
[root@master demo]# vim nginx-deployment.yaml
apiVersion: apps/v1
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
  • 创建、查看资源
[root@master demo]# kubectl create -f nginx-deployment.yaml 
deployment.apps/nginx-deployment created

#查看资源
[root@master demo]# kubectl get pods
NAME                              READY   STATUS              RESTARTS   AGE
nginx-deployment-d55b94fd-d9sbm   0/1     ContainerCreating   0          10s
nginx-deployment-d55b94fd-vsb6l   0/1     ContainerCreating   0          10s
nginx-deployment-d55b94fd-vvkfv   0/1     ContainerCreating   0          10s
  • 创建service资源(用于发布)
[root@master demo]# vim nginx-service.yaml

apiVersion: v1			#版本
kind: Service			#类型
metadata:			#标签描述
  name: nginx-service	#指定指定资源名称
  labels:			#标签信息
    app: nginx			#自定义标签名
spec:				#发布信息
  type: NodePort		#类型:NodePort
  ports:			#指定端口
  - port: 80			#内部端口
      targetPort: 80	#对外映射端口:80
  selector:			#选择器
    app: nginx			#指定发布的资源名称
----》wq
  • 创建nginx-service资源
[root@master demo]# kubectl create -f nginx-service.yaml
service/nginx-service created
[root@master demo]# kubectl get svc
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        7d19h
nginx-service   NodePort    10.0.0.196   <none>        80:39632/TCP   9s
  • 使用浏览器访问两个node节点

kubernetes yaml编写工具 kubernetes yaml详解_Pod

kubernetes yaml编写工具 kubernetes yaml详解_kubernetes yaml编写工具_02

2.2 自动测试
  • 自动测试命令、并不执行创建
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx-deployment.yaml created (dry run)

#--dry-run 只会尝试运行,不进行操作
#如果由语法问题,会出现提示信息(包括语法提示)
  • 查看生成的yaml格式
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: nginx-deployment.yaml
  name: nginx-deployment.yaml
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx-deployment.yaml
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: nginx-deployment.yaml
    spec:
      containers:
      - image: nginx
        name: nginx-deployment.yaml
        ports:
        - containerPort: 80
        resources: {}
status: {}
  • 查看生成的json格式
kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o json
  • 直接导出格式模标本
[root@master demo]# kubectl run nginx-deployment.yaml --image=nginx --port=80 --replicas=3 --dry-run -o yaml > my-deployment.yaml
  • 将现有的资源生成模板导出
[root@master demo]# kubectl get depolyment/nginx --export -o yaml

#创建nginx    
kubectl run nginx --image=nginx
    
#查看状态    
kubectl get pods -w
  • 查看字段信息
  • 以下命令相当于一个小型的官方文档,可以借助此文档查看编写的格式、语法和可选的内容
[root@master demo]# kubectl explain pods.spec.containers 
KIND:     Pod
VERSION:  v1

RESOURCE: containers <[]Object>

DESCRIPTION:
     List of containers belonging to the pod. Containers cannot currently be
     added or removed. There must be at least one container in a Pod. Cannot be
     updated.

     A single application container that you want to run within a pod.
.....省略部分内容
总结:
  • YMAL文件编写的格式其实不用花太大精力去研究,完全可以导出模板,使用现有的模板进行按需更改,我们更多的需要注重Pod资源管理,之后会对Pod的资源管理进行着重介绍