配置名稱空間的預設 CPU 請求和限制
本頁面展示瞭如何為一個名稱空間配置預設的 CPU 請求和限制。
Kubernetes 叢集可以劃分為名稱空間。如果你在一個具有預設 CPU 限制的名稱空間中建立一個 Pod,並且該 Pod 中的任何容器都沒有指定自己的 CPU 限制,那麼控制平面將為該容器分配預設的 CPU 限制。
Kubernetes 會分配一個預設的 CPU 請求,但僅在某些條件下(本頁稍後會解釋)。
準備工作
你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一:
你必須有權在叢集中建立名稱空間。
如果你不熟悉 Kubernetes 中 1.0 CPU 的含義,請閱讀CPU 的含義。
建立名稱空間
建立一個名稱空間,以便你在本練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace default-cpu-example
建立一個 LimitRange 和一個 Pod
這是一個示例 LimitRange 的清單。該清單指定了預設的 CPU 請求和預設的 CPU 限制。
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
spec:
limits:
- default:
cpu: 1
defaultRequest:
cpu: 0.5
type: Container
在 default-cpu-example 名稱空間中建立 LimitRange
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example
現在,如果你在 default-cpu-example 名稱空間中建立一個 Pod,並且該 Pod 中的任何容器都沒有指定自己的 CPU 請求和 CPU 限制值,那麼控制平面將應用預設值:CPU 請求為 0.5,預設 CPU 限制為 1。
這是一個包含一個容器的 Pod 的清單。該容器未指定 CPU 請求和限制。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo
spec:
containers:
- name: default-cpu-demo-ctr
image: nginx
建立 Pod。
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example
檢視 Pod 的規範
kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example
輸出顯示 Pod 的唯一容器的 CPU 請求為 500m cpu
(可以讀作“500 毫核”),CPU 限制為 1 cpu
。這些是 LimitRange 指定的預設值。
containers:
- image: nginx
imagePullPolicy: Always
name: default-cpu-demo-ctr
resources:
limits:
cpu: "1"
requests:
cpu: 500m
如果只指定了容器的限制,但未指定其請求怎麼辦?
這是一個包含一個容器的 Pod 的清單。該容器指定了 CPU 限制,但未指定請求。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo-2
spec:
containers:
- name: default-cpu-demo-2-ctr
image: nginx
resources:
limits:
cpu: "1"
建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example
檢視你建立的 Pod 的規範
kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example
輸出顯示容器的 CPU 請求設定為與其 CPU 限制匹配。請注意,該容器未被分配 0.5 cpu
的預設 CPU 請求值。
resources:
limits:
cpu: "1"
requests:
cpu: "1"
如果只指定了容器的請求,但未指定其限制怎麼辦?
這是一個包含一個容器的 Pod 的示例清單。該容器指定了 CPU 請求,但未指定限制。
apiVersion: v1
kind: Pod
metadata:
name: default-cpu-demo-3
spec:
containers:
- name: default-cpu-demo-3-ctr
image: nginx
resources:
requests:
cpu: "0.75"
建立 Pod
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example
檢視你建立的 Pod 的規範
kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example
輸出顯示容器的 CPU 請求被設定為你在建立 Pod 時指定的值(換句話說:它與清單匹配)。然而,同一容器的 CPU 限制被設定為 1 cpu
,這是該名稱空間的預設 CPU 限制。
resources:
limits:
cpu: "1"
requests:
cpu: 750m
預設 CPU 限制和請求的動機
如果你的名稱空間配置了 CPU 資源配額,那麼設定 CPU 限制的預設值會很有幫助。以下是 CPU 資源配額對名稱空間施加的兩個限制:
- 對於在該名稱空間中執行的每個 Pod,其每個容器都必須有一個 CPU 限制。
- CPU 限制在 Pod 所在的節點上應用資源預留。為名稱空間中所有 Pod 保留的 CPU 總量不得超過指定的限制。
當你新增 LimitRange 時
如果該名稱空間中包含容器的任何 Pod 未指定其自己的 CPU 限制,則控制平面將預設 CPU 限制應用於該容器,並且該 Pod 可以被允許在受 CPU ResourceQuota 限制的名稱空間中執行。
清理
刪除你的名稱空間
kubectl delete namespace default-cpu-example