Kubernetes資源請求與限制
Request/Limit 基本概念。
K8S支援在容器界別設定Request和Limit來約束容器所使用的CPU和Memory。
- Request表示在應用釋出時,對容器所使用CPU和Memory的預估,提出的申請。K8S會根據當前工作節點的資源情況,進行排程決策,K8S會把POD排程到滿足資源需求的節點上去執行。如果請求的資源不能得到滿足,那釋出的POD會處於Pending狀態。
- Limit表示容器執行時對資源需求的限制,如果容器的CPU使用量達到或超過限制,K8S會限制容器對CPU資源的額外使用。如果容器的記憶體使用量達到或超過限制,K8S會Kill掉POD。
下圖單位:
m為minicore
cpu: “1000m” = “1core”
QOS/POD Kill 策略
三種QOS設定類別的POD以及相應踢出決策。
- Guaranteed CPU&Memory 都需要設定,並且request=limit。這類POD只有在記憶體使用量超過限制的時候才會被Kill掉。
- Burstable 這類POD屬於突發流量型,當節點資源不足的時候,這類POD可能會被Kill掉。
- Best Effort request和limit都不設定,這類POD屬於盡最大努力型,當節點資源不足時,這類POD首先會被Kill掉。
資源檢視命令
檢視本機節點名稱
kubectl get node
檢視本機節點與執行POD的詳情
kubectl describe node node_name
#找到Capacity, CPU, Memory, PODs數量, 已啟動的POD的資源使用與限制。
POD釋出檔案-資源限制配置樣例
注意:本檔案僅為樣例檔案,如需釋出,需要configmap文章中的所有yml檔案。
petclinic-deployment.yml檔案樣例修改。
注意resources為新增配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 1
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.0.RELEASE
resources:
requests:
memory: "128Mi"
# 200 minicore, 1000m = 1core
cpu: "200m"
limits:
memory: "512Mi"
envFrom:
- configMapRef:
name: petclinic-config
---
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port為叢集內部服務前通訊的埠
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面標籤app: petclinic表示本服務會路由指向所有app標籤為petclinic的pod。
app: petclinic
type: NodePort
與其他檔案搭配發布。需要此文件中的YAML檔案一起釋出。
可以再次檢視節點詳情。
檢視本機節點名稱
kubectl get node
檢視本機節點與執行POD的詳情
kubectl describe node node_name
#找到Capacity, CPU, Memory, PODs數量, 已啟動的POD的資源使用與限制。
下面命令用於刪除與當前路徑下yml檔案對應的POD/Service。
kubectl detele -f .
實驗記憶體超限制
petclinic-deployment.yml檔案樣例修改。
修改位置:
- replicas
- requests - memory
- limits -memory
啟動5個POD,每個容器啟動的時候都需要1個G的記憶體。總量接近5個G,實際上本NODE只給了4G記憶體。
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 5
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.0.RELEASE
resources:
requests:
memory: "1024Mi"
# 200 minicore, 1000m = 1core
cpu: "200m"
limits:
memory: "1024Mi"
envFrom:
- configMapRef:
name: petclinic-config
---
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port為叢集內部服務前通訊的埠
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面標籤app: petclinic表示本服務會路由指向所有app標籤為petclinic的pod。
app: petclinic
type: NodePort
釋出服務之後,檢視POD。
kubectl get po
發現pending狀態的POD。由於節點記憶體不夠,所以一直pending。
檢視本機節點名稱
kubectl get node
檢視本機節點與執行POD的詳情
kubectl describe node node_name
#找到Capacity, CPU, Memory, PODs數量, 已啟動的POD的資源使用與限制。
下面命令用於刪除與當前路徑下yml檔案對應的POD/Service。
kubectl detele -f .
實驗限制記憶體過小
petclinic-deployment.yml檔案樣例修改。
修改位置:
- replicas
- requests - memory
- limits -memory
啟動5個POD,每個容器啟動的時候都需要1個G的記憶體。總量接近5個G,實際上本NODE只給了4G記憶體。
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
replicas: 1
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: petclinic
# Run this image
image: spring2go/spring-petclinic:1.0.0.RELEASE
resources:
requests:
memory: "20Mi"
# 200 minicore, 1000m = 1core
cpu: "200m"
limits:
memory: "20Mi"
envFrom:
- configMapRef:
name: petclinic-config
---
apiVersion: v1
kind: Service
metadata:
# Unique key of the Service instance
name: petclinic
spec:
ports:
# Accept traffic sent to port 80
- name: http
# port為叢集內部服務前通訊的埠
port: 8080
targetPort: 8080
nodePort: 31080
selector:
# 下面標籤app: petclinic表示本服務會路由指向所有app標籤為petclinic的pod。
app: petclinic
type: NodePort
釋出服務之後,檢視POD。
kubectl get po
#發現CrashLoopBackOff狀態的POD。Restarts次數為1。因為該應用本身需要的執行記憶體大於20兆。
kubectl get po
#發現OOMKilled狀態的POD。Restarts次數為2。K8S Limit生效,將POD Kill掉。
環境清理。
下面命令用於刪除與當前路徑下yml檔案對應的deployment/Service。
kubectl detele -f .
相關文章
- Kubernetes:容器資源需求與限制(約束)
- 詳解nginx的請求限制(連線限制和請求限制)Nginx
- 如何設定Kubernetes資源限制
- 對請求來源進行白名單限制
- 深入理解Kubernetes資源限制:CPU
- Kubernetes筆記(四):詳解Namespace與資源限制ResourceQuota,LimitRange筆記namespaceMIT
- 深入理解Kubernetes資源限制:記憶體記憶體
- Kubernetes中如何使用CPU請求和限制? - daniele
- 如何使用 Python 請求網路資源Python
- 在kubernetes裡使用AppArmor限制容器對資源的訪問APP
- 對於瀏覽器請求介面限制,是否有必要開發一套請求工作管理員元件,自主的去控制請求的併發,保證在瀏覽器允許的最大併發連線數限制之中,避免請求阻塞和資源搶佔。瀏覽器元件
- nginx如何限制併發連線請求數?Nginx
- CORS跨域限制以及預請求驗證CORS跨域
- 跨域請求cookie資源共享詳解跨域Cookie
- Laravel5.0 限制請求頻率中介軟體Laravel
- 使用 Promise 實現任務佇列傳送請求,實現最大請求數目限制Promise佇列
- Cookie 與 HTTP請求CookieHTTP
- Docker的資源限制Docker
- ajax中POST請求與引數(請求體)設定
- Flutter Http請求開源庫-dioFlutterHTTP
- ThinkPHP 請求與響應PHP
- HTTP 請求與響應HTTP
- Http請求與響應HTTP
- 微信小程式解除 10 個請求併發限制了?!微信小程式
- Flask——請求資料Flask
- HTTP協議的請求與資料抓包HTTP協議
- Spring系列 SpringMVC的請求與資料響應SpringMVC
- kubernetes實踐之七十三:Istio之配置請求路由路由
- Laravel最佳實踐 -- API請求頻率限制(Throttle中介軟體)LaravelAPI
- pyautogui,求資源GUI
- 跨域是什麼?跨域請求資源有哪些方法?跨域
- axios躺坑之路:cookie,簡單請求與非簡單請求。iOSCookie
- DRF之請求與響應
- 同源政策與跨域請求跨域
- POST與GET請求區別
- HTTP的請求與響應HTTP
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- Kubernetes as Database: 使用kubesql查詢kubernetes資源DatabaseSQL