YAML語法規範;在kubernetes k8s中如何經過yaml文件建立pod,以及pod經常使用字段詳解html
K8S 裏全部的資源或者配置均可以用 yaml 或 Json 定義。YAML 是一個 JSON 的超集,任何有效的 JSON 文件也都是一個有效的YAML文件。node
具體參見:「YAML 語言教程與使用案例」nginx
在Kubernetes的 yaml文件中,最好不要出現下劃線,能夠有中橫線。docker
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 protocol: TCP 23 volumeMounts: #定義容器掛載內容 24 - name: nginx-site #使用的存儲卷名稱,跟下面volume字段的某個name值相同,這裏表示使用volume的nginx-site這個存儲卷 25 mountPath: /usr/share/nginx/html #掛載至容器中哪一個目錄 26 readOnly: false #讀寫掛載方式,默認爲讀寫模式false 27 - name: nginx-log 28 mountPath: /var/log/nginx/ 29 readOnly: false 30 volumes: #volumes字段定義了paues容器關聯的宿主機或分佈式文件系統存儲卷 31 - name: nginx-site #存儲卷名稱 32 hostPath: #路徑,爲宿主機存儲路徑 33 path: /data/volumes/nginx/html/ #在宿主機上目錄的路徑 34 type: DirectoryOrCreate #定義類型,這表示若是宿主機沒有此目錄,則會自動建立 35 - name: nginx-log 36 hostPath: 37 path: /data/volumes/nginx/log/ 38 type: DirectoryOrCreate
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
由上可知 pod nginx-demo 被調度到了 k8s-node02 節點。那麼對應的volume信息以下:vim
站點信息api
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
查看指定pod的基本信息。獲得了該pod的IP網絡
1 [root@k8s-master k8s_study]# 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 k8s_study]# curl http://10.244.2.16 # curl 訪問站點 5 <h1>Test</h1>
同時在k8s-node02節點機器也可見訪問日誌,信息以下:app
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" "-"
特別說明:注意格式,層級與縮進。curl
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 protocol: string #端口協議,支持TCP和UDP,默認TCP 28 env: #容器運行前需設置的環境變量列表 29 - name: string #環境變量名稱 30 value: string #環境變量的值 31 resources: #資源限制和資源請求的設置(設置容器的資源上線) 32 limits: #容器運行時資源使用的上線 33 cpu: string #CPU限制,單位爲core數,容許浮點數,如0.1等價於100m,0.5等價於500m;所以若是小於1那麼優先選擇如100m的形式,精度爲1m。這個數字用做 docker run 命令中的 --cpu-quota 參數。 34 memory: string #內存限制,單位:E,P,T,G,M,K;或者Ei,Pi,Ti,Gi,Mi,Ki;或者字節數。將用於docker run --memory參數 35 requests: #容器啓動和調度時的限制設定 36 cpu: string #CPU請求,容器啓動時初始化可用數量,單位爲core數,容許浮點數,如0.1等價於100m,0.5等價於500m;所以若是小於1那麼優先選擇如100m的形式,精度爲1m。這個數字用做 docker run 命令中的 --cpu-shares 參數。 37 memory: string #內存請求,容器啓動的初始化可用數量。單位:E,P,T,G,M,K;或者Ei,Pi,Ti,Gi,Mi,Ki;或者字節數 38 # 參見官網地址:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ 39 livenessProbe: #對Pod內各容器健康檢查的設置,當探測無響應幾回後將自動重啓該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器【只需設置其中一種方法便可】 40 exec: #對Pod內容器健康檢查方式設置爲exec方式 41 command: [string] #exec方式須要制定的命令或腳本 42 httpGet: #對Pod內容器健康檢查方法設置爲HttpGet,須要制定Path、port 43 path: string #訪問 HTTP 服務的路徑 44 port: number #訪問容器的端口號或者端口名。若是數字必須在 1 ~ 65535 之間。 45 host: string #當沒有定義 "host" 時,使用 "PodIP" 46 scheme: string #當沒有定義 "scheme" 時,使用 "HTTP",scheme 只容許 "HTTP" 和 "HTTPS" 47 HttpHeaders: #請求中自定義的 HTTP 頭。HTTP 頭字段容許重複。 48 - name: string 49 value: string 50 tcpSocket: #對Pod內容器健康檢查方式設置爲tcpSocket方式 51 port: number 52 initialDelaySeconds: 5 #容器啓動完成後,kubelet在執行第一次探測前應該等待 5 秒。默認是 0 秒,最小值是 0。 53 periodSeconds: 60 #指定 kubelet 每隔 60 秒執行一次存活探測。默認是 10 秒。最小值是 1 54 timeoutSeconds: 3 #對容器健康檢查探測等待響應的超時時間爲 3 秒,默認1秒 55 successThreshold: 1 #檢測到有1次成功則認爲服務是`就緒` 56 failureThreshold: 5 #檢測到有5次失敗則認爲服務是`未就緒`。默認值是 3,最小值是 1。 57 restartPolicy: [Always|Never|OnFailure] #Pod的重啓策略,默認Always。Always表示一旦無論以何種方式終止運行,kubelet都將重啓;OnFailure表示只有Pod以非0退出碼退出才重啓;Nerver表示再也不重啓該Pod 58 nodeSelector: #定義Node的label過濾標籤,以key:value的格式指定。節點選擇,先給主機打標籤kubectl label nodes kube-node01 key1=value1 59 key1: value1 60 imagePullSecrets: #Pull鏡像時使用的secret名稱,以name:secretKeyName格式指定 61 - name: string 62 hostNetwork: false #是否使用主機網絡模式,默認爲false。若是設置爲true,表示使用宿主機網絡,不使用docker網橋 63 # volumes 和 containers 是同層級 ****************************** 64 # 參見官網地址:https://kubernetes.io/zh/docs/concepts/storage/volumes/ 65 volumes: #定義了paues容器關聯的宿主機或分佈式文件系統存儲卷列表 (volumes類型有不少種,選其中一種便可) 66 - name: string #共享存儲卷名稱。 67 emptyDir: {} #類型爲emtyDir的存儲卷,與Pod同生命週期的一個臨時目錄。當Pod由於某些緣由被從節點上刪除時,emptyDir卷中的數據也會永久刪除。 68 hostPath: string #類型爲hostPath的存儲卷,表示掛載Pod所在宿主機的文件或目錄 69 path: string #在宿主機上文件或目錄的路徑 70 type: [|DirectoryOrCreate|Directory|FileOrCreate|File] #空字符串(默認)用於向後兼容,這意味着在安裝 hostPath 卷以前不會執行任何檢查。DirectoryOrCreate:若是給定目錄不存在則建立,權限設置爲 0755,具備與 Kubelet 相同的組和全部權。Directory:給定目錄必須存在。FileOrCreate:若是給定文件不存在,則建立空文件,權限設置爲 0644,具備與 Kubelet 相同的組和全部權。File:給定文件必須存在。 71 secret: #類型爲secret的存儲卷,掛載集羣預約義的secre對象到容器內部。Secret 是一種包含少許敏感信息例如密碼、token 或 key 的對象。放在一個 secret 對象中能夠更好地控制它的用途,並下降意外暴露的風險。 72 secretName: string #secret 對象的名字 73 items: #可選,修改key 的目標路徑 74 - key: username #username secret存儲在/etc/foo/my-group/my-username 文件中而不是 /etc/foo/username 中。【此時存在spec.containers[].volumeMounts[].mountPath爲/etc/foo】 75 path: my-group/my-username 76 configMap: #類型爲configMap的存儲卷,掛載預約義的configMap對象到容器內部。ConfigMap 容許您將配置文件與鏡像文件分離,以使容器化的應用程序具備可移植性。 77 name: string #提供你想要掛載的 ConfigMap 的名字
對於每個資源,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示例以下:
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^-) !