Kubernetes之yaml文件详解(汇总-详细)
一、YAML基礎
YAML是專門用來寫配置文件的語言,非常簡潔和強大,使用比json更方便。它實質上是一種通用的數據串行化格式。
YAML語法規則:
大小寫敏感 使用縮進表示層級關系 縮進時不允許使用Tal鍵,只允許使用空格 縮進的空格數目不重要,只要相同層級的元素左側對齊即可 "#" 表示注釋,從這個字符一直到行尾,都會被解析器忽略 在Kubernetes中,只需要知道兩種結構類型即可:Lists Maps1.1 YAML Maps
Map顧名思義指的是字典,即一個Key:Value 的鍵值對信息。例如:
apiVersion: v1 kind: Pod注:---為可選的分隔符 ,當需要在一個文件中定義多個結構的時候需要使用。上述內容表示有兩個鍵apiVersion和kind,分別對應的值為v1和Pod。Maps的value既能夠對應字符串也能夠對應一個Maps。例如:
apiVersion: v1 kind: Pod metadata:name: kube100-sitelabels:app: web注:上述的YAML文件中,metadata這個KEY對應的值為一個Maps,而嵌套的labels這個KEY的值又是一個Map。實際使用中可視情況進行多層嵌套。
YAML處理器根據行縮進來知道內容之間的關聯。上述例子中,使用兩個空格作為縮進,但空格的數據量并不重要,只是至少要求一個空格并且所有縮進保持一致的空格數 。例如,name和labels是相同縮進級別,因此YAML處理器知道他們屬于同一map;它知道app是lables的值因為app的縮進更大。
注意:在YAML文件中絕對不要使用tab鍵
1.2 YAML Lists
List即列表,說白了就是數組,例如:
args-beijing-shanghai-shenzhen-guangzhou可以指定任何數量的項在列表中,每個項的定義以破折號(-)開頭,并且與父元素之間存在縮進。在JSON格式中,表示如下:
{"args": ["beijing", "shanghai", "shenzhen", "guangzhou"] }當然Lists的子項也可以是Maps,Maps的子項也可以是List,例如:
apiVersion: v1 kind: Pod metadata:name: kube100-sitelabels:app: web spec:containers:- name: front-endimage: nginxports:- containerPort: 80- name: flaskapp-demoimage: jcdemo/flaskappports: 8080如上述文件所示,定義一個containers的List對象,每個子項都由name、image、ports組成,每個ports都有一個KEY為containerPort的Map組成,轉成JSON格式文件:
{"apiVersion": "v1","kind": "Pod","metadata": {"name": "kube100-site","labels": {"app": "web"},},"spec": {"containers": [{"name": "front-end","image": "nginx","ports": [{"containerPort": "80"}]}, {"name": "flaskapp-demo","image": "jcdemo/flaskapp","ports": [{"containerPort": "5000"}]}]} }二、說明
定義配置時,指定最新穩定版API
配置文件應該存儲在集群之外的版本控制倉庫中。如果需要,可以快速回滾配置、重新創建和恢復
應該使用YAML格式編寫配置文件,而不是json。YAML對用戶更加友好
可以將相關對象組合成單個文件,通常會更容易管理
不要沒必要指定默認值,簡單和最小配置減小錯誤
在注釋中說明一個對象描述更好維護
三、使用YAML創建Pod
apiVersion: v1 kind: Pod metadata:name: kube100-sitelabels:app: web spec:containers:- name: front-endimage: nginxports:- containerPort: 80- name: flaskapp-demoimage: jcdemo/flaskappports:- containerPort: 5000apiVersion:此處值是v1,這個版本號需要根據安裝的Kubernetes版本和資源類型進行變化,記住不是寫死的。
kind:此處創建的是Pod,根據實際情況,此處資源類型可以是Deployment、Job、Ingress、Service等。
metadata:包含Pod的一些meta信息,比如名稱、namespace、標簽等信息。
spec:包括一些container,storage,volume以及其他Kubernetes需要的參數,以及諸如是否在容器失敗時重新啟動容器的屬性??稍谔囟↘ubernetes API找到完整的Kubernetes Pod的屬性。
??(1)查看apiVersion
# 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 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 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1??(2)下面是一個典型的容器定義:
spec:containers:- name: front-endimage: nginxports:- containerPort: 80上述例子只是一個簡單的最小定義:一個名字(front-end)、基于nginx的鏡像,以及容器將會監聽的指定端口號(80)。
除了上述的基本屬性外,還能夠指定復雜的屬性,包括容器啟動運行的命令、使用的參數、工作目錄以及每次實例化是否拉取新的副本。還可以指定更深入的信息,例如容器的退出日志的位置。容器可選的設置屬性包括:
name、image、command、args、workingDir、ports、env、resource、volumeMounts、livenessProbe、readinessProbe、livecycle、terminationMessagePath、imagePullPolicy、securityContext、stdin、stdinOnce、tty
(3)kubectl創建Pod
# kubectl create -f test_pod.yaml pod "kube100-site" created(4)查看Pod狀態
# kubectl get podNAME READY STATUS RESTARTS AGE kube100-site 2/2 Running 0 2m四、創建Deployment
名詞解釋
#test-pod apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中 kind: Pod #指定創建資源的角色/類型 metadata: #資源的元數據/屬性name: test-pod #資源的名字,在同一個namespace中必須唯一labels: #設定資源的標簽k8s-app: apacheversion: v1kubernetes.io/cluster-service: "true"annotations: #自定義注解列表- name: String #自定義注解名字 spec: #specification of the resource content 指定該資源的內容restartPolicy: Always #表明該容器一直運行,默認k8s的策略,在次容器退出后,會立即創建一個相同的容器nodeSelector: #節點選擇,先給主機打標簽kubectl label nodes kube-node1 zone=node1zone: node1containers:- name: test-pod #容器的名字image: 10.192.21.18:5000/test/char:latest #容器使用的鏡像地址imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,# Always,每次都檢查# Never, 每次都不檢查(不管本地是否有)# IfNotPresent, 如果本地有就不檢查,如果沒有就拉取command: ['sh'] #啟動容器的運行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT args: ["$(str)"] #啟動容器的命令參數,對應Dockerfile中CMD參數 env: #指定容器中的環境變量 - name: str #變量的名字 value: "/etc/run.sh" #變量的值 resources: #資源管理 requests: #容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行 cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m) memory: 32Mi #內存使用量 limits: #資源限制 cpu: 0.5 memory: 1000Mi ports: - containerPort: 80 #容器開發對外的端口 name: httpd #名稱 protocol: TCP livenessProbe: #pod內容器健康檢查的設置 httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常 path: / #URI地址port: 80#host: 127.0.0.1 #主機地址scheme: HTTPinitialDelaySeconds:180 #表明第一次檢測在容器啟動后多長時間后開始 timeoutSeconds: 5 #檢測的超時時間 periodSeconds: 15 #檢查間隔時間 #也可以用這種方法 #exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常 # command: # - cat # - /tmp/health #也可以用這種方法 #tcpSocket: //通過tcpSocket檢查健康 # port: number lifecycle: #生命周期管理postStart: #容器運行之前運行的任務exec:command:- 'sh'- 'yum upgrade -y'preStop: #容器關閉之前運行的任務exec:command: ['service httpd stop']volumeMounts: #掛載持久存儲卷- name: volume #掛載設備的名字,與volumes[*].name 需要對應mountPath: /data #掛載到容器的某個路徑下readOnly: True volumes: #定義一組掛載設備 - name: volume #定一個掛載設備的名字#meptyDir: {}hostPath:path: /opt #掛載設備類型為hostPath, 路徑Wie宿主機下的/opt,這里設備類型支持很多種#nfs(1)創建一個yaml文件
apiVersion: apps/v1beta2 kind: Deployment metadata:name: nginx-deployment spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.10ports:- containerPort: 80(2)創建deployment
[root@master-01 YAML_k8s]# kubectl create -f nginx-deployment.yaml deployment.apps "nginx-deployment" created [root@master-01 YAML_k8s]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 2m 10.20.184.83 master-01 nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 2m 10.20.190.60 node-01 nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 2m 10.20.254.108 node-03 [root@master-01 YAML_k8s]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 3 3 3 2m(3)查看標簽
[root@master-01 YAML_k8s]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360 nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360 nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 3m app=nginx,pod-template-hash=2636081360(4)通過標簽查找Pod
[root@master-01 YAML_k8s]# kubectl get pod -l app=nginx NAME READY STATUS RESTARTS AGE nginx-deployment-6b7b4d57b4-26wzj 1/1 Running 0 6m nginx-deployment-6b7b4d57b4-9w7tm 1/1 Running 0 6m nginx-deployment-6b7b4d57b4-mhh8t 1/1 Running 0 6m(5)deployment創建過程
Deployment 管理的是replicaset-controller,RC會創建Pod。Pod自身會下載鏡像并啟動鏡像
[root@master-01 YAML_k8s]# kubectl describe rs nginx-deployment ... ... ... Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-9w7tmNormal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-26wzjNormal SuccessfulCreate 33m replicaset-controller Created pod: nginx-deployment-6b7b4d57b4-mhh8t [root@master-01 YAML_k8s]# kubectl describe pod nginx-deployment-6b7b4d57b4-26wzj... ... ... Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 36m default-scheduler Successfully assigned nginx-deployment-6b7b4d57b4-26wzj to master-01Normal SuccessfulMountVolume 36m kubelet, master-01 MountVolume.SetUp succeeded for volume "default-token-v5vw9"Normal Pulled 36m kubelet, master-01 Container image "nginx:1.10" already present on machineNormal Created 36m kubelet, master-01 Created containerNormal Started 36m kubelet, master-01 Started container(6) 升級鏡像(nginx1.10->nginx1.11)
[root@master-01 YAML_k8s]# kubectl set image deploy/nginx-deployment nginx=nginx:1.11 deployment.apps "nginx-deployment" image updated[root@master-01 YAML_k8s]# kubectl exec -it nginx-deployment-b96c97dc-2pxjf bash root@nginx-deployment-b96c97dc-2pxjf:/# nginx -V nginx version: nginx/1.11.13升級鏡像的過程是逐步進行的,pod不會一下子全部關閉,而是一個一個升級
(7) 查看發布狀態
[root@master-01 !] kubectl rollout status deploy/nginx-deployment deployment "nginx-deployment" successfully rolled out(8)查看deployment歷史修訂版本
[root@master-01 ~]# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 2 <none># 顯示歷史有兩個版本[root@master-01 ~]# kubectl rollout history deploy/nginx-deployment --revision=1 deployments "nginx-deployment" with revision #1 Pod Template:Labels: app=nginxpod-template-hash=2636081360Containers:nginx:Image: nginx:1.10Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none>[root@master-01 ~]# kubectl rollout history deploy/nginx-deployment --revision=2 deployments "nginx-deployment" with revision #2 Pod Template:Labels: app=nginxpod-template-hash=65275387Containers:nginx:Image: nginx:1.11Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none>(8)編輯deployment
[root@master-01 ~]# kubectl edit deploy/nginx-deployment# 將nginx版本改為1.12 ... ... ...spec:containers:- image: nginx:1.12imagePullPolicy: IfNotPresentname: nginxports:- containerPort: 80升級過程:
[root@master-01 ~]# kubectl rollout status deploy/nginx-deployment Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 2 out of 3 new replicas have been updated... Waiting for rollout to finish: 1 old replicas are pending termination... Waiting for rollout to finish: 1 old replicas are pending termination... deployment "nginx-deployment" successfully rolled out(10)擴容/縮容(指定–replicas的數量)
[root@master-01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-6b47cf4878-8mjkr 1/1 Running 0 1m nginx-deployment-6b47cf4878-kr978 1/1 Running 0 1m nginx-deployment-6b47cf4878-tvhvl 1/1 Running 0 1m[root@master-01 ~]# kubectl scale deploy/nginx-deployment --replicas=5 deployment.extensions "nginx-deployment" scaled[root@master-01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-6b47cf4878-6r5dz 0/1 ContainerCreating 0 4s nginx-deployment-6b47cf4878-7sjtt 0/1 ContainerCreating 0 4s nginx-deployment-6b47cf4878-8mjkr 1/1 Running 0 2m nginx-deployment-6b47cf4878-kr978 1/1 Running 0 2m nginx-deployment-6b47cf4878-tvhvl 1/1 Running 0 2m(11)創建Service提供對外訪問的接口
apiVersion: v1 kind: Service metadata:name: nginx-servicelabels:app: nginx spec:ports:- port: 80targetPort: 80selector:app: nginx#### apiVersion: 指定版本kind: 類型name: 指定服務名稱labels: 標簽port: Service 服務暴露的端口targetPort: 容器暴露的端口selector: 關聯的Pod的標簽創建service
# kubectl create -f nginx-service.yaml
查看service(訪問Pod是有負載均衡的)
[root@master-01 YAML_k8s]# kubectl get svc/nginx-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service ClusterIP 10.254.131.176 <none> 88/TCP 1m # curl 10.254.131.176:88 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;} </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p> </body> </html>對service的描述
# kubectl describe svc/nginx-service Name: nginx-service Namespace: default Labels: app=nginx Annotations: <none> Selector: app=nginx Type: ClusterIP IP: 10.254.131.176 Port: <unset> 88/TCP TargetPort: 80/TCP Endpoints: 10.20.184.19:80,10.20.184.84:80,10.20.190.62:80 + 2 more... Session Affinity: None Events: <none>(12)回滾到以前的版本
# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 2 <none> 3 <none> # kubectl rollout history deploy/nginx-deployment --revision=3 deployments "nginx-deployment" with revision #3 Pod Template:Labels: app=nginxpod-template-hash=2603790434Containers:nginx:Image: nginx:1.12Port: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts: <none>Volumes: <none> # 回滾到上一個版本 # kubectl rollout undo deploy/nginx-deployment deployment.apps "nginx-deployment"# 查看版本 # kubectl describe deploy/nginx-deployment ... ... Labels: app=nginxContainers:nginx:Image: nginx:1.11(13)回滾到指定版本
# kubectl rollout history deploy/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 <none> 3 <none> 4 <none># 指定版本 # kubectl rollout undo deploy/nginx-deployment --to-revision=1 deployment.apps "nginx-deployment"附上一個具體的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
?
總結
以上是生活随笔為你收集整理的Kubernetes之yaml文件详解(汇总-详细)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes NodePort
- 下一篇: Kubernetes的yaml文件中的c