YAML語法規范;在kubernetes k8s中如何通過yaml文件創建pod,以及pod常用字段詳解
YAML 語法規范
K8S 里所有的資源或者配置都可以用 yaml 或 Json 定義。YAML 是一個 JSON 的超集,任何有效的 JSON 文件也都是一個有效的YAML文件。
具體參見:「YAML 語言教程與使用案例」
通過yaml創建nginx pod對象
yaml文件
在Kubernetes的 yaml文件中,最好不要出現下划線,可以有中橫線。
1 [root@k8s-master test]# pwd 2 /root/k8s_practice/test 3 [root@k8s-master test]# cat nginx_demo.yaml 4 apiVersion: v1 5 kind: Pod 6 metadata: 7 name: nginx-demo 8 namespace: default 9 labels: 10 k8s-app: nginx 11 environment: dev 12 annotations: 13 name: nginx-demo 14 spec: 15 containers: 16 - name: nginx 17 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 18 imagePullPolicy: IfNotPresent 19 ports: 20 - name: httpd 21 containerPort: 80 22 #除非絕對必要,否則不要為 Pod 指定 hostPort。 將 Pod 綁定到hostPort時,它會限制 Pod 可以調度的位置數 23 #DaemonSet 中的 Pod 可以使用 hostPort,從而可以通過節點 IP 訪問到 Pod;因為DaemonSet模式下Pod不會被調度到其他節點。 24 #一般情況下 containerPort與hostPort值相同 25 hostPort: 8090 #可以通過宿主機+hostPort的方式訪問該Pod。例如:pod在/調度到了k8s-node02【172.16.1.112】,那么該Pod可以通過172.16.1.112:8090方式進行訪問。 26 protocol: TCP 27 volumeMounts: #定義容器掛載內容 28 - name: nginx-site #使用的存儲卷名稱,跟下面volume字段的某個name值相同,這里表示使用volume的nginx-site這個存儲卷 29 mountPath: /usr/share/nginx/html #掛載至容器中哪個目錄 30 readOnly: false #讀寫掛載方式,默認為讀寫模式false 31 - name: nginx-log 32 mountPath: /var/log/nginx/ 33 readOnly: false 34 volumes: #volumes字段定義了paues容器關聯的宿主機或分布式文件系統存儲卷 35 - name: nginx-site #存儲卷名稱 36 hostPath: #路徑,為宿主機存儲路徑 37 path: /data/volumes/nginx/html/ #在宿主機上目錄的路徑 38 type: DirectoryOrCreate #定義類型,這表示如果宿主機沒有此目錄,則會自動創建 39 - name: nginx-log 40 hostPath: 41 path: /data/volumes/nginx/log/ 42 type: DirectoryOrCreate
Pod常見操作
1 [root@k8s-master test]# pwd 2 /root/k8s_practice/test 3 [root@k8s-master test]# ll 4 total 4 5 -rw-r--r-- 1 root root 1317 Jul 29 16:42 nginx_demo.yaml 6 # 創建pod 7 [root@k8s-master test]# kubectl apply -f nginx_demo.yaml 8 pod/nginx-demo created 9 # 查看pod。根據結果可見被調度到了 k8s-node02 節點 10 [root@k8s-master test]# kubectl get pod -o wide # 或者 kubectl get pod -n default -o wide 因為名稱空間為default 11 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 12 nginx-demo 1/1 Running 0 10s 10.244.2.16 k8s-node02 <none> <none> 13 # 查看pod描述 14 [root@k8s-master test]# kubectl describe pod -n default nginx-demo # 由於是默認名稱空間,因此可以省略 -n default 15 ………… 16 # 查看指定pod的基本信息,並顯示標簽信息 17 [root@k8s-master test]# kubectl get pod nginx-demo -o wide --show-labels 18 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 19 nginx-demo 1/1 Running 0 61s 10.244.2.16 k8s-node02 <none> <none> environment=dev,k8s-app=nginx 20 # 刪除pod 21 [root@k8s-master test]# kubectl delete -f nginx_demo.yaml # 或者 kubectl delete pod nginx-demo 22 pod "nginx-demo" deleted
volume查看
由上可知 pod nginx-demo 被調度到了 k8s-node02 節點。那么對應的volume信息如下:
站點信息
1 [root@k8s-node02 nginx]# ll /data/volumes/nginx/html/ # 宿主機目錄已經被創建 2 total 4 3 -rw-r--r-- 1 root root 14 May 20 22:50 index.html 4 [root@k8s-node02 nginx]# vim /data/volumes/nginx/html/index.html # 然后我們創建該文件,用於后續站點訪問 5 <h1>Test</h1>
日志信息
1 [root@k8s-node02 nginx]# ll /data/volumes/nginx/log/ # 宿主機目錄已經被創建,且下面的兩個日志文件也是容器啟動時創建的 2 total 4 3 -rw-r--r-- 1 root root 0 May 20 23:04 access.log 4 -rw-r--r-- 1 root root 0 May 20 22:47 error.log
nginx站點訪問
查看指定pod的基本信息。得到了該pod的IP
1 [root@k8s-master test]# kubectl get pod nginx-demo -o wide 2 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 3 nginx-demo 1/1 Running 0 61s 10.244.2.16 k8s-node02 <none> <none> 4 [root@k8s-master test]# curl http://10.244.2.16 # curl 訪問站點 5 <h1>Test</h1> 6 # 由於pod調用到了k8s-node02【172.16.1.112】節點,因此可以通過節點+hostPort端口方式訪問 7 [root@k8s-master test]# curl 172.16.1.112:8090 8 <h1>Test</h1>
同時在k8s-node02節點機器也可見訪問日志,信息如下:
1 [root@k8s-node02 nginx]# cat /data/volumes/nginx/log/access.log 2 10.244.0.0 - - [20/May/2020:15:04:42 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-" 3 10.244.0.0 - - [20/May/2020:15:34:50 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-" 4 172.16.1.110 - - [20/May/2020:15:35:50 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-" 5 172.16.1.110 - - [20/May/2020:15:36:50 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-"
K8S Pod Yaml文件參數詳細說明
特別說明:注意格式,層級與縮進。
1 apiVersion: v1 #必選,版本號,例如v1,可以用 kubectl api-versions 查詢到 2 kind: Pod #必選,指yaml文件定義的k8s 資源類型或角色,比如:Pod 3 metadata: #必選,元數據對象 4 name: string #必選,元數據對象的名字,自己定義,比如命名Pod的名字 5 namespace: string #必選,元數據對象的名稱空間,默認為"default" 6 labels: #自定義標簽 7 key1: value1 #自定義標簽鍵值對1 8 key2: value2 #自定義標簽鍵值對2 9 annotations: #自定義注解 10 key1: value1 #自定義注解鍵值對1 11 key2: value2 #自定義注解鍵值對2 12 spec: #必選,對象【如pod】的詳細定義 13 containers: #必選,spec對象的容器信息 14 - name: string #必選,容器名稱 15 image: string #必選,要用到的鏡像名稱 16 imagePullPolicy: [Always|Never|IfNotPresent] #獲取鏡像的策略;(1)Always:意思是每次都嘗試重新拉取鏡像;(2)Never:表示僅使用本地鏡像,即使本地沒有鏡像也不拉取;(3) IfNotPresent:如果本地有鏡像就使用本地鏡像,沒有就拉取遠程鏡像。默認:Always 17 command: [string] #指定容器啟動命令,由於是數組因此可以指定多個。不指定則使用鏡像打包時指定的啟動命令。 18 args: [string] #指定容器啟動命令參數,由於是數組因此可以指定多個 19 workingDir: string #指定容器的工作目錄 20 volumeMounts: #指定容器內部的存儲卷配置 21 - name: string #指定可以被容器掛載的存儲卷的名稱。跟下面volume字段的name值相同表示使用這個存儲卷 22 mountPath: string #指定可以被容器掛載的存儲卷的路徑,應少於512字符 23 readOnly: boolean #設置存儲卷路徑的讀寫模式,true或者false,默認為讀寫模式false 24 ports: #需要暴露的端口號列表 25 - name: string #端口的名稱 26 containerPort: int #容器監聽的端口號 27 #除非絕對必要,否則不要為 Pod 指定 hostPort。 將 Pod 綁定到hostPort時,它會限制 Pod 可以調度的位置數 28 #DaemonSet 中的 Pod 可以使用 hostPort,從而可以通過節點 IP 訪問到 Pod;因為DaemonSet模式下Pod不會被調度到其他節點。 29 #一般情況下 containerPort與hostPort值相同 30 hostPort: int #可以通過宿主機+hostPort的方式訪問該Pod。例如:pod在/調度到了k8s-node02【172.16.1.112】,hostPort為8090,那么該Pod可以通過172.16.1.112:8090方式進行訪問。 31 protocol: string #端口協議,支持TCP和UDP,默認TCP 32 env: #容器運行前需設置的環境變量列表 33 - name: string #環境變量名稱 34 value: string #環境變量的值 35 resources: #資源限制和資源請求的設置(設置容器的資源上線) 36 limits: #容器運行時資源使用的上線 37 cpu: string #CPU限制,單位為core數,允許浮點數,如0.1等價於100m,0.5等價於500m;因此如果小於1那么優先選擇如100m的形式,精度為1m。這個數字用作 docker run 命令中的 --cpu-quota 參數。 38 memory: string #內存限制,單位:E,P,T,G,M,K;或者Ei,Pi,Ti,Gi,Mi,Ki;或者字節數。將用於docker run --memory參數 39 requests: #容器啟動和調度時的限制設定 40 cpu: string #CPU請求,容器啟動時初始化可用數量,單位為core數,允許浮點數,如0.1等價於100m,0.5等價於500m;因此如果小於1那么優先選擇如100m的形式,精度為1m。這個數字用作 docker run 命令中的 --cpu-shares 參數。 41 memory: string #內存請求,容器啟動的初始化可用數量。單位:E,P,T,G,M,K;或者Ei,Pi,Ti,Gi,Mi,Ki;或者字節數 42 # 參見官網地址:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ 43 livenessProbe: #對Pod內各容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器【只需設置其中一種方法即可】 44 exec: #對Pod內容器健康檢查方式設置為exec方式 45 command: [string] #exec方式需要制定的命令或腳本 46 httpGet: #對Pod內容器健康檢查方法設置為HttpGet,需要制定Path、port 47 path: string #訪問 HTTP 服務的路徑 48 port: number #訪問容器的端口號或者端口名。如果數字必須在 1 ~ 65535 之間。 49 host: string #當沒有定義 "host" 時,使用 "PodIP" 50 scheme: string #當沒有定義 "scheme" 時,使用 "HTTP",scheme 只允許 "HTTP" 和 "HTTPS" 51 HttpHeaders: #請求中自定義的 HTTP 頭。HTTP 頭字段允許重復。 52 - name: string 53 value: string 54 tcpSocket: #對Pod內容器健康檢查方式設置為tcpSocket方式 55 port: number 56 initialDelaySeconds: 5 #容器啟動完成后,kubelet在執行第一次探測前應該等待 5 秒。默認是 0 秒,最小值是 0。 57 periodSeconds: 60 #指定 kubelet 每隔 60 秒執行一次存活探測。默認是 10 秒。最小值是 1 58 timeoutSeconds: 3 #對容器健康檢查探測等待響應的超時時間為 3 秒,默認1秒 59 successThreshold: 1 #檢測到有1次成功則認為服務是`就緒` 60 failureThreshold: 5 #檢測到有5次失敗則認為服務是`未就緒`。默認值是 3,最小值是 1。 61 nodeSelector: #定義Node的label過濾標簽,以key:value的格式指定。節點選擇,先給主機打標簽kubectl label nodes kube-node01 key1=value1 62 key1: value1 63 imagePullSecrets: #Pull鏡像時使用的secret名稱,以name:secretKeyName格式指定 64 - name: string 65 hostNetwork: false #是否使用主機網絡模式,默認為false。如果設置為true,表示使用宿主機網絡,不使用docker網橋 66 restartPolicy: [Always|Never|OnFailure] #Pod的重啟策略,默認Always。Always表示一旦不管以何種方式終止運行,kubelet都將重啟;OnFailure表示只有Pod以非0退出碼退出才重啟;Nerver表示不再重啟該Pod 67 # volumes 和 containers 是同層級 ****************************** 68 # 參見官網地址:https://kubernetes.io/zh/docs/concepts/storage/volumes/ 69 volumes: #定義了paues容器關聯的宿主機或分布式文件系統存儲卷列表 (volumes類型有很多種,選其中一種即可) 70 - name: string #共享存儲卷名稱。 71 emptyDir: {} #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。當Pod因為某些原因被從節點上刪除時,emptyDir卷中的數據也會永久刪除。 72 hostPath: string #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的文件或目錄 73 path: string #在宿主機上文件或目錄的路徑 74 type: [|DirectoryOrCreate|Directory|FileOrCreate|File] #空字符串(默認)用於向后兼容,這意味着在安裝 hostPath 卷之前不會執行任何檢查。DirectoryOrCreate:如果給定目錄不存在則創建,權限設置為 0755,具有與 Kubelet 相同的組和所有權。Directory:給定目錄必須存在。FileOrCreate:如果給定文件不存在,則創建空文件,權限設置為 0644,具有與 Kubelet 相同的組和所有權。File:給定文件必須存在。 75 secret: #類型為secret的存儲卷,掛載集群預定義的secre對象到容器內部。Secret 是一種包含少量敏感信息例如密碼、token 或 key 的對象。放在一個 secret 對象中可以更好地控制它的用途,並降低意外暴露的風險。 76 secretName: string #secret 對象的名字 77 items: #可選,修改key 的目標路徑 78 - key: username #username secret存儲在/etc/foo/my-group/my-username 文件中而不是 /etc/foo/username 中。【此時存在spec.containers[].volumeMounts[].mountPath為/etc/foo】 79 path: my-group/my-username 80 configMap: #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部。ConfigMap 允許您將配置文件與鏡像文件分離,以使容器化的應用程序具有可移植性。 81 name: string #提供你想要掛載的 ConfigMap 的名字
資源需求(Requests)和限制(Limits)說明
對於每一個資源,container可以指定具體的資源需求(requests)和限制(limits)。
requests申請范圍是0到node節點的最大配置,而limits申請范圍是requests到無限,即0 <= requests <=Node Allocatable,requests <= limits <= Infinity。
對於CPU,如果pod中服務使用CPU超過設置的limits,pod不會被kill掉但會被限制。如果沒有設置limits,pod可以使用全部空閑的cpu資源。
對於內存,當一個pod使用內存超過了設置的limits,【一個Pod可能有多個container】pod中container的進程會被kernel因OOM kill掉。當container因為OOM被kill掉時,系統傾向於在其原所在的機器上重啟該container或本機或其他重新創建一個pod。
volumeMounts和volumes區別
volumeMounts示例如下:
1 volumeMounts: #定義容器掛載內容 2 - name: nginx-site #使用的存儲卷名稱,跟下面volume字段的某個name值相同,這里表示使用volume的nginx-site這個存儲卷 3 mountPath: /usr/share/nginx/html #掛載至容器中哪個目錄 4 readOnly: false #讀寫掛載方式,默認為讀寫模式false 5 - name: nginx-log 6 mountPath: /var/log/nginx/ 7 readOnly: false
volumes示例如下:
1 volumes: #volumes字段定義了paues容器關聯的宿主機或分布式文件系統存儲卷 2 - name: nginx-site #存儲卷名稱 3 hostPath: #路徑,為宿主機存儲路徑 4 path: /data/volumes/nginx/html/ #在宿主機上目錄的路徑 5 type: DirectoryOrCreate #定義類型,這表示如果宿主機沒有此目錄,則會自動創建 6 - name: nginx-log 7 hostPath: 8 path: /data/volumes/nginx/log/ 9 type: DirectoryOrCreate
相關閱讀
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !