日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K8S Learning(10)——Pod配置

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 kubectl apply -f pod-mix.yaml# 查看Pod狀況 kubectl get pod -n mk? # 可以通過describe查看內部的詳情 kubectl describe pod pod-mix -n mk

二、鏡像拉取

創建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:lastest

imagePullPolicy,用于設置鏡像拉取策略,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等形式

# 運行Pod kubectl create -f pod-resources.yaml ? # 查看發現pod運行正常 kubectl get pod pod-resources -n dev# 接下來,停止Pod kubectl delete -f pod-resources.yaml ? # 編輯pod,修改resources.requests.memory的值為10Gi vim pod-resources.yaml ? # 再次啟動pod kubectl create -f pod-resources.yaml ? # 查看Pod狀態,發現Pod啟動失敗 kubectl get pod pod-resources -n mk -o wide? # 查看pod詳情會發現,如下提示 kubectl describe pod pod-resources -n mk ...... Warning FailedScheduling 55s ? default-scheduler ?0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 Insufficient memory.(內存不足)

總結

以上是生活随笔為你收集整理的K8S Learning(10)——Pod配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。