調整副本、資源與健康檢查
設定服務的副本數、CPU 和記憶體、健康檢查、啟動指令,以及容器能以 root 執行與否。
服務跑得慢、記憶體不夠,或想讓壞掉的副本自動重新啟動時,到服務 設定 調整 運算資源 和 健康檢查,改完從頁面下方 檢查變更 並套用。安全性 決定容器能不能以 root 執行,選了就會直接開啟檢查畫面。
- 有權修改這個服務。服務由 Helm、Argo CD 或 Flux 管理時,這些欄位無法編輯,要回到原本的 values 或 Git 儲存庫修改。
- 副本數以外的設定都寫在 Pod template 上,改了會替換副本。只有一個副本的服務,替換時可能中斷幾秒。
到服務 設定 → 運算資源,修改 副本數(0 到 1000)。副本數是 0 時服務停止,不會刪除任何設定或資料。
調整 CPU 和記憶體
Section titled “調整 CPU 和記憶體”填入 CPU 保留量、CPU 上限、記憶體保留量 和 記憶體上限,例如 CPU 保留 0.25 核心、記憶體保留 256 MiB、上限 512 MiB。
- 保留量:節點替每個副本留出這麼多資源,排程時也依這個數字找節點。留白時不保留。
- 上限:記憶體超過上限時容器會重新啟動,CPU 超過上限時會降速。留白時不設上限。
欄位下方寫出叢集裡 最大的節點 有多少核心和記憶體,保留量超過它時,副本會排不上任何節點。
從映像檔或 Git 建立服務時選的 規格,就是這幾個欄位的初始值:
| 規格 | CPU 保留量 | 記憶體保留量 | 記憶體上限 |
|---|---|---|---|
| 小 | 0.1 核心 | 128 MiB | 256 MiB |
| 中 | 0.25 核心 | 256 MiB | 512 MiB |
| 大 | 0.5 核心 | 512 MiB | 1 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 等級。
用 kubectl 做同樣的事
Section titled “用 kubectl 做同樣的事”這些設定都是 Deployment 或 StatefulSet 的標準欄位,移除 Zeabur 之後照樣生效。以下以專案 demo、服務 web 為例。
副本數和資源:
kubectl -n demo scale deployment/web --replicas=2kubectl -n demo set resources deployment/web -c web --requests=cpu=250m,memory=256Mi --limits=memory=512Miset resources 只改指令裡列出的項目,沒列的會保留,例如原本的 cpu 上限。
健康檢查、啟動指令和安全性一起寫在 Pod template 上:
apiVersion: apps/v1kind: Deploymentmetadata: name: web namespace: demo labels: app.kubernetes.io/name: webspec: 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 webkubectl -n demo get deployment web -o jsonpath='{.spec.template.spec.containers[0].resources}'kubectl -n demo describe pod -l app.kubernetes.io/name=webget 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 使用者執行的映像檔。 |