K8S Learning(10)——Pod配置
pod.spec.containers屬性是pod配置中最為關鍵的一項配置。
kubectl explain pod.spec.containers KIND: ? ? Pod VERSION: v1 RESOURCE: containers <[]Object> ? # 數組,代表可以有多個容器 FIELDS:name <string> ? ? # 容器名稱image <string> ? ? # 容器需要的鏡像地址imagePullPolicy <string> # 鏡像拉取策略 command <[]string> # 容器的啟動命令列表,如不指定,使用打包時使用的啟動命令args ? ? <[]string> # 容器的啟動命令需要的參數列表env ? ? <[]Object> # 容器環境變量的配置ports ? <[]Object> ? ? # 容器需要暴露的端口號列表resources <Object> ? ? ?# 資源限制和資源請求的設置一、基本配置
創建pod-mix.yaml文件,內容如下:
apiVersion: v1 kind: Pod metadata:name: pod-mixnamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:lastest- name: busyboximage: busybox:lastest上面定義了一個比較簡單Pod的配置,里面有兩個容器:
-
tomcat:用lastest版本的tomcat鏡像創建,(tomcat是一個java web容器)
-
busybox:用lastest版本的busybox鏡像創建,(busybox是一個小巧的linux命令集合)
二、鏡像拉取
創建pod-pull-image.yaml文件,內容如下:
apiVersion: v1 kind: Pod metadata:name: pod-pull-imagenamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:jre8-openjdk-slim-busterimagePullPolicy: Never # 用于設置鏡像拉取策略- name: busyboximage: busybox:lastestimagePullPolicy,用于設置鏡像拉取策略,kubernetes支持配置三種拉取策略:
-
Always:總是從遠程倉庫拉取鏡像(一直遠程下載)
-
IfNotPresent:本地有則使用本地鏡像,本地沒有則從遠程倉庫拉取鏡像(本地有就本地 本地沒遠程下載)
-
Never:只使用本地鏡像,從不去遠程倉庫拉取,本地沒有就報錯 (一直使用本地)
默認值說明:
如果鏡像tag為具體版本號, 默認策略是:IfNotPresent
如果鏡像tag為:latest(最終版本) ,默認策略是always
# 創建Pod kubectl create -f pod-pull-image.yaml? # 查看Pod詳情 # 此時明顯可以看到tomcat鏡像有一步Pulling image "pull-image"的過程 kubectl describe pod pod-pull-image -n mk?
三、啟動命令
在前面的例子中,busybox容器一直沒有成功運行,因為busybox并不是一個程序,而是類似于一個工具類的集合,kubernetes集群啟動管理后,它會自動關閉。解決方法就是讓其一直在運行,這就用到了command配置。
創建pod-command.yaml文件,內容如下:
apiVersion: v1 kind: Pod metadata:name: pod-commandnamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:lastest- name: busyboximage: busybox:lastestcommand: ["/bin/sh","-c","touch /tmp/busybox.log; while true;do /bin/echo $(date +%F %T) >> /tmp/busybox.log; sleep 5; done;"] command,用于在pod中的容器初始化完畢之后運行一個命令。 # 創建Pod kubectl create -f pod-command.yaml ? # 查看Pod狀態 kubectl get pods pod-command -n mk ? # 進入pod中的busybox容器,查看文件內容 # 補充一個命令: kubectl exec pod名稱 -n 命名空間 -it -c 容器名稱 /bin/sh 在容器內部執行命令 kubectl exec pod-command -n dev -it -c busybox /bin/sh tail -f /tmp/busybox.log 特別說明:通過上面發現command已經可以完成啟動命令和傳遞參數的功能,為什么這里還要提供一個args選項,用于傳遞參數呢?這其實跟docker有點關系,kubernetes中的command、args兩項其實是實現覆蓋Dockerfile中ENTRYPOINT的功能。1 如果command和args均沒有寫,那么用Dockerfile的配置。2 如果command寫了,但args沒有寫,那么Dockerfile默認的配置會被忽略,執行輸入的command3 如果command沒寫,但args寫了,那么Dockerfile中配置的ENTRYPOINT的命令會被執行,使用當前args的參數4 如果command和args都寫了,那么Dockerfile的配置被忽略,執行command并追加上args參數四、環境變量
創建pod-env.yaml文件,內容如下:
apiVersion: v1 kind: Pod metadata:name: pod-envnamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:lastestenv: # 設置環境變量列表- name: "jdkVersion"value: "1.8"- name: "tomcatVersion"value: "tomcat8" env,環境變量,用于在pod中的容器設置環境變量。 # 創建Pod kubectl create -f pod-env.yaml? # 進入容器,輸出環境變量kubectl exec pod-env -n mk -c tomcat -it /bin/shecho $jdkVersionecho $tomcatVersion這種方式不是很推薦,推薦將這些配置單獨存儲在配置文件中。
五、端口設置
容器的端口設置containers的ports選項。
ports支持的子選項:
kubectl explain pod.spec.containers.ports KIND: ? ? Pod VERSION: v1 RESOURCE: ports <[]Object> FIELDS:name ? ? ? ? <string> ?# 端口名稱,如果指定,必須保證name在pod中是唯一的 containerPort<integer> # 容器要監聽的端口(0<x<65536)hostPort ? ? <integer> # 容器要在主機上公開的端口,如果設置,主機上只能運行容器的一個副本(一般省略) hostIP ? ? ? <string> ?# 要將外部端口綁定到的主機IP(一般省略)protocol ? ? <string> ?# 端口協議。必須是UDP、TCP或SCTP。默認為“TCP”。創建pod-ports.yaml
apiVersion: v1 kind: Pod metadata:name: pod-portsnamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:lastestports: # 設置容器暴露的端口列表- name: tomcat-portcontainerPort: 8080protocol: TCP # 創建Pod kubectl create -f pod-ports.yaml ? # 查看pod kubectl get pod pod-ports -n mk -o yaml訪問容器中的程序需要使用的是PodIP:containerPort
六、資源配額
容器中的程序要運行,肯定是要占用一定資源的,比如cpu和內存等,如果不對某個容器的資源做限制,那么它就可能吃掉大量資源,導致其它容器無法運行。針對這種情況,kubernetes提供了對內存和cpu的資源進行配額的機制,這種機制主要通過resources選項實現,他有兩個子選項:
-
limits:用于限制運行時容器的最大占用資源,當容器占用資源超過limits時會被終止,并進行重啟
-
requests :用于設置容器需要的最小資源,如果環境資源不夠,容器將無法啟動
可以通過上面兩個選項設置資源的上下限。
接下來,編寫一個測試案例,創建pod-resources.yaml
apiVersion: v1 kind: Pod metadata:name: pod-portsnamespace: mklabels:owner: mk spec:containers:- name: tomcatimage: tomcat:lastestresources: # 資源配額limits: ?# 限制資源(上限)cpu: "2" # CPU限制,單位是core數memory: "10Gi" # 內存限制requests: # 請求資源(下限)cpu: "1" ?# CPU限制,單位是core數memory: "100Mi" ?# 內存限制在這對cpu和memory的單位做一個說明:
-
cpu:core數,可以為整數或小數
-
memory: 內存大小,可以使用Gi、Mi、G、M等形式
總結
以上是生活随笔為你收集整理的K8S Learning(10)——Pod配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 256GB 版低过两千元:荣耀 80 G
- 下一篇: 入门级轻薄本都真的只是徒有轻薄而毫无性能