Skip to content
Open Source

調整副本、資源與健康檢查

設定服務的副本數、CPU 和記憶體、健康檢查、啟動指令,以及容器能以 root 執行與否。

服務跑得慢、記憶體不夠,或想讓壞掉的副本自動重新啟動時,到服務 設定 調整 運算資源 和 健康檢查,改完從頁面下方 檢查變更 並套用。安全性 決定容器能不能以 root 執行,選了就會直接開啟檢查畫面。

  • 有權修改這個服務。服務由 Helm、Argo CD 或 Flux 管理時,這些欄位無法編輯,要回到原本的 values 或 Git 儲存庫修改。
  • 副本數以外的設定都寫在 Pod template 上,改了會替換副本。只有一個副本的服務,替換時可能中斷幾秒。

到服務 設定 → 運算資源,修改 副本數(0 到 1000)。副本數是 0 時服務停止,不會刪除任何設定或資料。

填入 CPU 保留量、CPU 上限、記憶體保留量 和 記憶體上限,例如 CPU 保留 0.25 核心、記憶體保留 256 MiB、上限 512 MiB。

  • 保留量:節點替每個副本留出這麼多資源,排程時也依這個數字找節點。留白時不保留。
  • 上限:記憶體超過上限時容器會重新啟動,CPU 超過上限時會降速。留白時不設上限。

欄位下方寫出叢集裡 最大的節點 有多少核心和記憶體,保留量超過它時,副本會排不上任何節點。

從映像檔或 Git 建立服務時選的 規格,就是這幾個欄位的初始值:

規格CPU 保留量記憶體保留量記憶體上限
小0.1 核心128 MiB256 MiB
中0.25 核心256 MiB512 MiB
大0.5 核心512 MiB1 GiB

按頁面下方 檢查變更。檢查畫面會寫出副本數的變化、每個服務會不會中斷,以及節點的空間夠不夠。確認後套用。

Job 只執行一次,運算資源 不能改它,要用 YAML 修改。

運算資源 下方還有 設定檔或機密變數變更時自動重新啟動,用法見讓正在執行的服務讀到新值。這個開關寫在工作負載本身,不會替換副本。

到服務 設定 → 健康檢查,三種檢查各自設定:

檢查用途
就緒檢查只有通過的副本會收到流量。
存活檢查容器持續失敗時,叢集會重新啟動它。
啟動檢查應用程式啟動前,先暫緩其他檢查。

每種檢查在 檢查方式 選 不檢查、HTTP GET、TCP 或 指令:

  • HTTP GET:填 路徑 和 連接埠,例如 /healthz 和 8080。回應 200 到 399 算通過。
  • TCP:填 連接埠,連得上就算通過。
  • 指令:填要在容器裡執行的 指令,結束碼是 0 算通過。

間隔(秒) 是多久檢查一次,失敗次數 是連續失敗幾次才算失敗。服務有宣告連接埠時,表單會出現 HTTP,連接埠 8080 這類按鈕,按一下就填好路徑 / 和那個連接埠。連接埠要是容器宣告過的,否則無法儲存。

改好後,從頁面下方 檢查變更 並套用。只有排程工作和 Job 沒有健康檢查。

Zeabur 沒有啟動指令的欄位。要改容器啟動時執行的指令,到服務 設定,把上方的切換從 設定 換到 YAML,按 編輯,修改容器的 command(取代映像檔的 ENTRYPOINT)和 args(取代 CMD),再檢查並套用:

containers:
- name: web
image: nginxinc/nginx-unprivileged:1.29
command: ["nginx"]
args: ["-g", "daemon off;"]

到服務 設定 → 安全性,選擇容器能做哪些事:

  • 嚴格:以非 root 使用者執行,且無法提升權限。以 root 執行的映像檔(例如 nginx:latest)無法啟動,要改用不需要 root 的版本,例如 nginxinc/nginx-unprivileged。Railpack 建置的映像檔以使用者 1000 執行,可以用嚴格。Dockerfile 要用數字指定非 root 使用者,例如 USER 1000。
  • 相容:允許以 root 執行,但仍無法存取主機或提升權限。

選了之後會直接開啟檢查畫面,確認後套用,副本會換成新的。從映像檔建立服務時,Zeabur 依映像檔設定的使用者預先選好:以數字指定非 root 使用者時選嚴格,其他情況選相容。

服務有超出相容範圍的設定(例如存取主機)時,這裡顯示 不受限,要用 YAML 修改。專案的 Pod Security 等級是 restricted 時,只有嚴格的服務能啟動,見調整 Pod Security 等級。

這些設定都是 Deployment 或 StatefulSet 的標準欄位,移除 Zeabur 之後照樣生效。以下以專案 demo、服務 web 為例。

副本數和資源:

kubectl -n demo scale deployment/web --replicas=2
kubectl -n demo set resources deployment/web -c web --requests=cpu=250m,memory=256Mi --limits=memory=512Mi

set resources 只改指令裡列出的項目,沒列的會保留,例如原本的 cpu 上限。

健康檢查、啟動指令和安全性一起寫在 Pod template 上:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: demo
labels:
app.kubernetes.io/name: web
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: web
template:
metadata:
labels:
app.kubernetes.io/name: web
spec:
automountServiceAccountToken: false
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: web
image: nginxinc/nginx-unprivileged:1.29
command: ["nginx"]
args: ["-g", "daemon off;"]
ports:
- containerPort: 8080
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
memory: 512Mi
readinessProbe:
httpGet:
path: /
port: 8080
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 8080
periodSeconds: 10
failureThreshold: 3
startupProbe:
httpGet:
path: /
port: 8080
failureThreshold: 30
periodSeconds: 2
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]

上面是 嚴格 的寫法。相容 拿掉 Pod 的 runAsNonRoot: true 和容器的 capabilities.drop: [ALL],保留 seccompProfile 和 allowPrivilegeEscalation: false。

運算資源 和 健康檢查 顯示叢集裡目前的值,安全性 標出目前選的是嚴格還是相容。概覽 會顯示副本是否就緒,用量 會畫出保留量和上限,旁邊是實際用量。

kubectl -n demo get deployment web
kubectl -n demo get deployment web -o jsonpath='{.spec.template.spec.containers[0].resources}'
kubectl -n demo describe pod -l app.kubernetes.io/name=web

get deployment 的 READY 是 2/2 這類數字,前後相同表示副本都通過就緒檢查。describe pod 會列出 Readiness、Liveness 和 Startup 的設定,檢查失敗時,Events 會出現 Unhealthy。

畫面或結果接著處理
改了資源後副本一直等待排程保留量超過任何一個節點剩下的空間。調低保留量,或增加節點。
副本一直重新啟動,事件寫 OOMKilled記憶體用量超過上限,調高 記憶體上限。
副本一直重新啟動,事件寫 Liveness probe failed確認存活檢查的路徑和連接埠,或加上啟動檢查給應用程式更多啟動時間。
副本一直不就緒就緒檢查沒通過。看 日誌,確認應用程式在檢查的連接埠回應。
改成嚴格後副本無法啟動,事件寫 container has runAsNonRoot and image will run as root映像檔以 root 執行。改回相容,或換成以非 root 使用者執行的映像檔。