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