Kubernetes K8S之通過yaml文件創建Pod與Pod常用字段詳解


 

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 秒,最小值是 057       periodSeconds: 60       #指定 kubelet 每隔 60 秒執行一次存活探測。默認是 10 秒。最小值是 1
58       timeoutSeconds: 3       #對容器健康檢查探測等待響應的超時時間為 3 秒,默認1秒
59       successThreshold: 1       #檢測到有1次成功則認為服務是`就緒`
60       failureThreshold: 5       #檢測到有5次失敗則認為服務是`未就緒`。默認值是 3,最小值是 161     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^-) !

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM