Kubernetes 系列(四):如何編寫k8s yaml文件


 

yaml基礎

yaml編寫規則

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進時不允許使用Tal鍵,只允許使用空格
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • ”#” 表示注釋,從這個字符一直到行尾,都會被解析器忽略
  • YAML只有兩種結構類型需要知道: lists, maps

 YAML Maps

Maps的value既能夠對應字符串也能夠對應一個Maps。例如:
apiVersion: v1
kind: Pod
metadata:
  name: test-site
  labels:
    app: web

注:上述的YAML文件中,metadata這個KEY對應的值為一個Maps,而嵌套的labels這個KEY的值又是一個Map。實際使用中可視情況進行多層嵌套。

YAML處理器根據行縮進來知道內容之間的關聯。上述例子中,使用兩個空格作為縮進,但空格的數據量並不重要,只是至少要求一個空格並且所有縮進保持一致的空格數 。例如,name和labels是相同縮進級別,因此YAML處理器知道他們屬於同一map;它知道app是lables的值因為app的縮進更大。

注意:在YAML文件中絕對不要使用tab鍵

因此,如果我們將上述yaml內容翻譯成JSON,它看起來結果如下所示:

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
               "name": "test-site",
               "labels": {
                          "app": "web"
                         }
              }
}

 YAML Lists

List即列表,說白了就是數組,例如:

args
  - sleep
  - "1000"
  - message
  - "Bring back Firefly!"
正如你可以看到,你可以有任何數量的項在列表中,項的定義以破折號(-)開頭,並且與父元素之間存在縮進。在JSON格式中,它將表示如下:
{
   "args": ["sleep", "1000", "message", "Bring back Firefly!"]
}
當然,list的子項也可以是maps,maps的子項也可以是list如下所示:
---
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88
正如你所看到的,我們有一個叫container的list對象,每個子項都由name、image、ports組成,每個ports都由一個key為containerPort map組成
如下所示,是上述內容的JSON格式:
{
   "apiVersion": "v1",
   "kind": "Pod",
   "metadata": {
                 "name": "rss-site",
                 "labels": {
                             "app": "web"
                           }
               },
    "spec": {
       "containers": [{
                       "name": "front-end",
                       "image": "nginx",
                       "ports": [{
                                  "containerPort": "80"
                                 }]
                      }, 
                      {
                       "name": "rss-reader",
                       "image": "nickchase/rss-php-nginx:v1",
                       "ports": [{
                                  "containerPort": "88"
                                 }]
                      }]
            }
}

Pod YAML參數定義

Pod是K8S的最小單元,它的信息都記錄在了一個YAML文件里。那么這個YAML文件到底怎么寫呢?里面有哪些參數?如何去修改YAML文件?帶着這幾個問題我們來了解下。

Pod YAML有哪些參數?

K8S的YAML配置文件我們初學者看了后都覺得很長,然后也覺得沒什么規律。其實,我們可以梳理下從兩個方面去了解。第一個是哪些是必寫項,第二個是YAML包含哪些主要參數對象。

哪些是必寫項

注意,一個YAML文件,下面幾個參數是必須要聲明,不然絕對會出錯:

參數名

字段類型

說明

version

String

這里是指的是K8S API的版本,目前基本上是v1,可以用kubectl api-versions命令查詢

kind

String

這里指的是yaml文件定義的資源類型和角色,比如:Pod

metadata

Object

元數據對象,固定值就寫metadata

metadata.name

String

元數據對象的名字,這里由我們編寫,比如命名Pod的名字

metadata.namespace

String

元數據對象的命名空間,由我們自身定義

Spec

Object

詳細定義對象,固定值就寫Spec

spec.containers[]

list

這里是Spec對象的容器列表定義,是個列表

spec.containers[].name

String

這里定義容器的名字

spec.containers[].image

String

這里定義要用到的鏡像名稱

以上這些都是編寫一個YAML文件的必寫項,一個最基本的YAML文件就包含它們。

關於apiVersion

Kubernetes的官方文檔中並沒有對apiVersion的詳細解釋,而且因為K8S本身版本也在快速迭代,有些資源在低版本還在beta階段,到了高版本就變成了stable。

如Deployment:
1.6版本之前 apiVsersion:extensions/v1beta1
1.6版本到1.9版本之間:apps/v1beta1
1.9版本之后:apps/v1
一.各種apiVersion的含義
alpha
* 該軟件可能包含錯誤。啟用一個功能可能會導致bug
* 隨時可能會丟棄對該功能的支持,恕不另行通知
beta
* 軟件經過很好的測試。啟用功能被認為是安全的。
* 默認情況下功能是開啟的
* 細節可能會改變,但功能在后續版本不會被刪除
stable
* 該版本名稱命名方式:vX這里X是一個整數
* 穩定版本、放心使用
* 將出現在后續發布的軟件版本中
v1
Kubernetes API的穩定版本,包含很多核心對象:pod、service等

apps/v1beta2
在kubernetes1.8版本中,新增加了apps/v1beta2的概念,apps/v1beta1同理
DaemonSet,Deployment,ReplicaSet 和 StatefulSet的當時版本遷入apps/v1beta2,兼容原有的extensions/v1beta1
apps/v1 在kubernetes1.9版本中,引入apps/v1,deployment等資源從extensions/v1beta1, apps/v1beta1 和 apps/v1beta2遷入apps/v1,原來的v1beta1等被廢棄。 apps/v1代表:包含一些通用的應用層的api組合,如:Deployments, RollingUpdates, and ReplicaSets
batch/v1 代表job相關的api組合 在kubernetes1.8版本中,新增了batch/v1beta1,后CronJob 已經遷移到了 batch/v1beta1,然后再遷入batch/v1 autoscaling/v1 代表自動擴縮容的api組合,kubernetes1.8版本中引入。 這個組合中后續的alpha 和 beta版本將支持基於memory使用量、其他監控指標進行擴縮容 extensions/v1beta1 deployment等資源在1.6版本時放在這個版本中,后遷入到apps/v1beta2,再到apps/v1中統一管理 certificates.k8s.io/v1beta1 安全認證相關的api組合 authentication.k8s.io/v1 資源鑒權相關的api組合 二.查看當前可用的API版本 執行 kubectl api-versions kubernetes
1.8 apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1beta1 apps/v1beta1 apps/v1beta2 authentication.k8s.io/v1 authentication.k8s.io/v1beta1 authorization.k8s.io/v1 authorization.k8s.io/v1beta1 autoscaling/v1 autoscaling/v2beta1 batch/v1 batch/v1beta1 certificates.k8s.io/v1beta1 extensions/v1beta1 networking.k8s.io/v1 policy/v1beta1 rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io/v1beta1 settings.k8s.io/v1alpha1 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1 kubernetes 1.11 admissionregistration.k8s.io/v1alpha1 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 batch/v1 batch/v1beta1 certificates.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 settings.k8s.io/v1alpha1 storage.k8s.io/v1 storage.k8s.io/v1alpha1 storage.k8s.io/v1beta1 v1

 

主要參數對象

第一小點里講的都是必選參數,那么還是否有其他參數呢?其他功能的參數,雖然不是必選項,但是為了讓YAML定義得更詳細、功能更豐富,這里其他參數也需要了解下。接下來的參數都是Spec對象下面的,主要分了兩大塊:spec.containers 和 spec.volumes。

spec.containers

spec.containers 是個list數組,很明顯,它代表的是描述container容器方面的參數。所以它下面的參數是非常多的,具體參數看如下表格:

參數名

字段類型

說明

spec.containers[].name

String

定義容器的名字

spec.containers[].image

String

定義要用到的鏡像名稱

spec.containers[].imagePullPolicy

String

定義鏡像拉取策略,有Always、Never、IfNotPresent三個值可選(1)Always:意思是每次都嘗試重新拉取鏡像 (2)Never:表示僅使用本地鏡像 (3)IfNotPresent:如果本地有鏡像就使用本地鏡像,沒有就拉取在線鏡像。 上面三個值都沒設置的話,默認是Always。

spec.containers[].command[]

List

指定容器啟動命令,因為是數組可以指定多個,不指定則使用鏡像打包時使用的啟動命令。

spec.containers[].args[]

List

指定容器啟動命令參數,因為是數組可以指定多個。

spec.containers[].workingDir

String

指定容器的工作目錄

spec.containers[].volumeMounts[]

List

指定容器內部的存儲卷配置

spec.containers[].volumeMounts[].name

String

指定可以被容器掛載的存儲卷的名稱

spec.containers[].volumeMounts[].mountPath

String

指定可以被容器掛載的存儲卷的路徑

spec.containers[].volumeMounts[].readOnly

String

設置存儲卷路徑的讀寫模式,ture 或者false,默認為讀寫模式

spec.containers[].ports[]

List

指定容器需要用到的端口列表

spec.containers[].ports[].name

String

指定端口名稱

spec.containers[].ports[].containerPort

String

指定容器需要監聽的端口號

spec.containers[].ports[].hostPort

String

指定容器所在主機需要監聽的端口號,默認跟上面containerPort相同,注意設置了hostPort 同一台主機無法啟動該容器的相同副本(因為主機的端口號不能相同,這樣會沖突)

spec.containers[].ports[].protocol

String

指定端口協議,支持TCP和UDP,默認值為TCP

spec.containers[].env[]

List

指定容器運行前需設置的環境變量列表

spec.containers[].env[].name

String

指定環境變量名稱

spec.containers[].env[].value

String

指定環境變量值

spec.containers[].resources

Object

指定資源限制和資源請求的值(這里開始就是設置容器的資源上限)

spec.containers[].resources.limits

Object

指定設置容器運行時資源的運行上限

spec.containers[].resources.limits.cpu

String

指定CPU的限制,單位為core數,將用於 docker run --cpu-shares參數(這里前面文章Pod資源限制有講過)

spec.containers[].resources.limits.memory

String

指定MEM內存的限制,單位為MIB、GiB

spec.containers[].resources.requests

Object

指定容器啟動和調度時的限制設置

spec.containers[].resources.requests.cpu

String

CPU請求,單位為core數,容器啟動時初始化可用數量

spec.containers[].resources.requests.memory

String

內存請求,單位為MIB、GiB,容器啟動的初始化可用數量

spec.volumes

spec.volumes是個list數組,很明顯,看名字就知道它是定義同步存儲方面的參數。它下面的參數是非常多,具體參數看如下表格:

參數名

字段類型

說明

spec.volumes[].name

String

定義Pod的共享存儲卷的名稱,容器定義部分的spec.containers[].volumeMounts[].name的值跟這里是一樣的。

spec.volumes[].emptyDir

Object

指定Pod的臨時目錄,值為一個空對象:emptyDir:{}

spec.volumes[].hostPath

Object

指定掛載Pod所在宿主機的目錄

spec.volumes[].hostPath.path

String

指定Pod所在主機的目錄,將被用於容器中mount的目錄

spec.volumes[].secret

Object

指定類型為secret的存儲卷,secret意為私密、秘密的意思,很容易理解,它存儲一些密碼,token或者秘鑰等敏感安全文件。掛載集群預定義的secret對象到容器內部。

spec.volumes[].configMap

Object

指定類型為configMap的存儲卷,表示掛載集群預定義的configMap對象到容器內部。

spec.volumes[].livenessProbe

Object

指定Pod內容器健康檢查的設置,當探測無響應幾次后,系統將自動重啟該容器。這個在前面的文章中有說,具體可以設置:exec、httpGet、tcpSocket。

spec.volumes[].livenessProbe.exec

Object

指定Pod內容器健康檢查的設置,確定是exec方式

spec.volumes[].livenessProbe.exec.command[]

String

指定exec方式后需要指定命令或者腳本,用這個參數設置

spec.volumes[].livenessProbe.httpGet

Object

指定Pod內容器健康檢查的設置,確定是httpGet方式

spec.volumes[].livenessProbe.tcpSocket

Object

指定Pod內容器健康檢查的設置,確定是tcpSocket方式

spec.volumes[].livenessProbe.initialDelaySeconds

Number

容器啟動完成后手冊探測的時間設置,單位為s

spec.volumes[].livenessProbe.timeoutSeconds

Number

對容器健康檢查的探測等待響應的超時時間設置,單位為S,默認為1s。若超過該超時時間設置,則認為該容器不健康,會重啟該容器。

spec.volumes[].livenessProbe.periodSeconds

Number

對容器健康檢查的定期探測時間設置,單位為S,默認10s探測一次。

額外參數對象

除了上面containers和volumes兩個主要參數,剩下有幾個參數:

參數名

字段類型

說明

spec.restartPolicy

String

定義Pod的重啟策略,可選值為Always、OnFailure,默認值為Always。 1.Always:Pod一旦終止運行,則無論容器是如何終止的,kubelet服務都將重啟它。 2.OnFailure:只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常結束(退出碼為0),則kubelet將不會重啟它。 3. Never:Pod終止后,kubelet將退出碼報告給Master,不會重啟該Pod。

spec.nodeSelector

Object

定義Node的Label過濾標簽,以key:value格式指定

spec.imagePullSecrets

Object

定義pull鏡像時使用secret名稱,以name:secretkey格式指定

spec.hostNetwork

Boolean

定義是否使用主機網絡模式,默認值為false。設置true表示使用宿主機網絡,不使用docker網橋,同時設置了true將無法在同一台宿主機上啟動第二個副本。

yaml舉例

# yaml格式的pod定義文件完整內容:
apiVersion: v1       #必選,版本號,例如v1
kind: Pod       #必選,Pod
metadata:       #必選,元數據
  name: string       #必選,Pod名稱
  namespace: string    #必選,Pod所屬的命名空間
  labels:      #自定義標簽
    - name: string     #自定義標簽名字
  annotations:       #自定義注釋列表
    - name: string
spec:         #必選,Pod中容器的詳細定義
  containers:      #必選,Pod中容器列表
  - name: string     #必選,容器名稱
    image: string    #必選,容器的鏡像名稱
    imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
    command: [string]    #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
    args: [string]     #容器的啟動命令參數列表
    workingDir: string     #容器的工作目錄
    volumeMounts:    #掛載到容器內部的存儲卷配置
    - name: string     #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
      mountPath: string    #存儲卷在容器內mount的絕對路徑,應少於512字符
      readOnly: boolean    #是否為只讀模式
    ports:       #需要暴露的端口庫號列表
    - name: string     #端口號名稱
      containerPort: int   #容器需要監聽的端口號
      hostPort: int    #容器所在主機需要監聽的端口號,默認與Container相同
      protocol: string     #端口協議,支持TCP和UDP,默認TCP
    env:       #容器運行前需設置的環境變量列表
    - name: string     #環境變量名稱
      value: string    #環境變量的值
    resources:       #資源限制和請求的設置
      limits:      #資源限制的設置
        cpu: string    #Cpu的限制,單位為core數,將用於docker run --cpu-shares參數
        memory: string     #內存限制,單位可以為Mib/Gib,將用於docker run --memory參數
      requests:      #資源請求的設置
        cpu: string    #Cpu請求,容器啟動的初始可用數量
        memory: string     #內存清楚,容器啟動的初始可用數量
    livenessProbe:     #對Pod內個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
      exec:      #對Pod容器內檢查方式設置為exec方式
        command: [string]  #exec方式需要制定的命令或腳本
      httpGet:       #對Pod內個容器健康檢查方法設置為HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #對Pod內個容器健康檢查方式設置為tcpSocket方式
         port: number
       initialDelaySeconds: 0  #容器啟動完成后首次探測的時間,單位為秒
       timeoutSeconds: 0   #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
       periodSeconds: 0    #對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
    nodeSelector: obeject  #設置NodeSelector表示將該Pod調度到包含這個label的node上,以key:value的格式指定
    imagePullSecrets:    #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
    - name: string
    hostNetwork:false      #是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡
    volumes:       #在該pod上定義共享存儲卷列表
    - name: string     #共享存儲卷名稱 (volumes類型有很多種)
      emptyDir: {}     #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
      hostPath: string     #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
        path: string     #Pod所在宿主機的目錄,將被用於同期中mount的目錄
      secret:      #類型為secret的存儲卷,掛載集群與定義的secre對象到容器內部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部
        name: string
        items:
        - key: string
          path: string

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM