在設計 Kubernetes Pod 時,如果需要在啟動?Nginx?和?PHP?之前等待?MySQL?啟動完成,可以通過?初始化容器(initC)?來實現。初始化容器可以用于檢查 MySQL 是否可用,只有在 MySQL 可用后,才會繼續啟動主容器(Nginx 和 PHP)。
設計思路
-
初始化容器(initC):
-
使用一個簡單的腳本或工具(如?
mysql-client
)來檢查 MySQL 服務是否可用。 -
如果 MySQL 可用,初始化容器成功退出(返回碼?
0
),Kubernetes 會繼續啟動主容器。 -
如果 MySQL 不可用,初始化容器會失敗(返回碼非?
0
),Kubernetes 會重試,直到 MySQL 可用或超時。
-
-
主容器:
-
主容器包括 Nginx 和 PHP,它們會在初始化容器成功完成后啟動。
-
具體實現
1. 編寫初始化容器的腳本
創建一個腳本(如?wait-for-mysql.sh
),用于檢查 MySQL 是否可用。腳本內容如下:
#!/bin/sh
# wait-for-mysql.shset -ehost="$1"
port="$2"
shift 2
cmd="$@"until nc -z -v -w30 "$host" "$port"; doecho "Waiting for MySQL to be available at $host:$port..."sleep 5
doneecho "MySQL is up - executing command"
exec $cmd
-
該腳本使用?
nc
(netcat)工具檢查 MySQL 的端口是否開放。 -
如果 MySQL 不可用,腳本會每 5 秒重試一次,直到 MySQL 可用。
2. 創建 Kubernetes Pod 配置文件
以下是一個示例的 Pod 配置文件,包含初始化容器和主容器:
apiVersion: v1
kind: Pod
metadata:name: web-app
spec:initContainers:- name: wait-for-mysqlimage: busybox:latestcommand: ["sh", "-c", "/scripts/wait-for-mysql.sh mysql 3306"]volumeMounts:- name: scriptsmountPath: /scriptscontainers:- name: nginximage: nginx:latestports:- containerPort: 80- name: phpimage: php:7.4-fpmports:- containerPort: 9000volumes:- name: scriptsconfigMap:name: init-scripts
3. 創建 ConfigMap 存儲腳本
將?wait-for-mysql.sh
?腳本存儲到 Kubernetes 的 ConfigMap 中:
apiVersion: v1
kind: ConfigMap
metadata:name: init-scripts
data:wait-for-mysql.sh: |#!/bin/shset -ehost="$1"port="$2"shift 2cmd="$@"until nc -z -v -w30 "$host" "$port"; doecho "Waiting for MySQL to be available at $host:$port..."sleep 5doneecho "MySQL is up - executing command"exec $cmd
4. 部署 Pod
-
創建 ConfigMap:
kubectl apply -f init-scripts-configmap.yaml
-
創建 Pod:
kubectl apply -f web-app-pod.yaml
5. 運行邏輯
-
初始化容器:
-
初始化容器會運行?
wait-for-mysql.sh
?腳本,檢查 MySQL 服務是否可用。 -
如果 MySQL 可用,初始化容器成功退出。
-
如果 MySQL 不可用,初始化容器會不斷重試,直到 MySQL 可用或超時。
-
-
主容器:
-
當初始化容器成功退出后,Kubernetes 會啟動主容器(Nginx 和 PHP)。
-
Nginx 和 PHP 可以安全地連接到 MySQL,因為 MySQL 已經可用。
-
6. 注意事項
-
MySQL 服務地址: 確保?
wait-for-mysql.sh
?腳本中的 MySQL 地址(mysql
)是正確的。如果 MySQL 運行在另一個 Pod 或外部服務中,需要使用正確的服務名稱或 IP。 -
超時機制: 如果 MySQL 長時間不可用,初始化容器會一直重試。可以通過設置?
activeDeadlineSeconds
?來限制初始化容器的最大運行時間。 -
工具依賴: 確保初始化容器中安裝了?
nc
(netcat)工具,或者使用其他工具(如?curl
?或自定義腳本)來檢查 MySQL 的可用性。
總結
通過初始化容器,可以確保 MySQL 服務可用后再啟動 Nginx 和 PHP。這種方式非常適合依賴外部服務的應用場景,能夠有效避免主容器啟動時依賴服務未就緒的問題。