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
相關閱讀
1、YAML 語言教程與使用案例
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/6461.html
標籤:Linux
上一篇:mobaxterm 使用技巧
下一篇:Ubuntu命令基礎
