Kubernetes K8S之經過yaml文件建立Pod與Pod經常使用字段詳解

 

YAML語法規範;在kubernetes k8s中如何經過yaml文件建立pod,以及pod經常使用字段詳解html

 

YAML 語法規範

K8S 裏全部的資源或者配置均可以用 yaml 或 Json 定義。YAML 是一個 JSON 的超集,任何有效的 JSON 文件也都是一個有效的YAML文件。node

具體參見:「YAML 語言教程與使用案例nginx

 

經過yaml建立nginx pod對象

yaml文件

在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

 

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信息以下: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

 

nginx站點訪問

查看指定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" "-"

 

K8S Pod Yaml文件參數詳細說明

特別說明:注意格式,層級與縮進。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 秒,最小值是 053       periodSeconds: 60       #指定 kubelet 每隔 60 秒執行一次存活探測。默認是 10 秒。最小值是 1
54       timeoutSeconds: 3       #對容器健康檢查探測等待響應的超時時間爲 3 秒,默認1秒
55       successThreshold: 1       #檢測到有1次成功則認爲服務是`就緒`
56       failureThreshold: 5       #檢測到有5次失敗則認爲服務是`未就緒`。默認值是 3,最小值是 157     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 的名字

  

資源需求(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

 

相關閱讀

一、YAML 語言教程與使用案例

完畢!

 

 


 

 

———END———
若是以爲不錯就關注下唄 (-^O^-) !

相關文章
相關標籤/搜索