Kubernetes----YAML文件詳解

前言:

  • 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節點

在這裏插入圖片描述

在這裏插入圖片描述

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的資源管理進行着重介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章