Kubernetes Init 容器:实现 Nginx 和 PHP 对 MySQL 的依赖检查

devtools/2025/3/23 23:39:19/

在设计 Kubernetes Pod 时,如果需要在启动 Nginx 和 PHP 之前等待 MySQL 启动完成,可以通过 初始化容器(initC) 来实现。初始化容器可以用于检查 MySQL 是否可用,只有在 MySQL 可用后,才会继续启动主容器(Nginx 和 PHP)。


设计思路

  1. 初始化容器(initC):

    • 使用一个简单的脚本或工具(如 mysql-client)来检查 MySQL 服务是否可用。

    • 如果 MySQL 可用,初始化容器成功退出(返回码 0),Kubernetes 会继续启动主容器。

    • 如果 MySQL 不可用,初始化容器会失败(返回码非 0),Kubernetes 会重试,直到 MySQL 可用或超时。

  2. 主容器:

    • 主容器包括 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
  1. 创建 ConfigMap:

    kubectl apply -f init-scripts-configmap.yaml
  2. 创建 Pod:

    kubectl apply -f web-app-pod.yaml

5. 运行逻辑

  1. 初始化容器:

    • 初始化容器会运行 wait-for-mysql.sh 脚本,检查 MySQL 服务是否可用。

    • 如果 MySQL 可用,初始化容器成功退出。

    • 如果 MySQL 不可用,初始化容器会不断重试,直到 MySQL 可用或超时。

  2. 主容器:

    • 当初始化容器成功退出后,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。这种方式非常适合依赖外部服务的应用场景,能够有效避免主容器启动时依赖服务未就绪的问题。


http://www.ppmy.cn/devtools/169166.html

相关文章

ATT 汇编常用指令

汇编常用指令# 1、操作数 立即数:表示常数值 表示方法:"$"标准C表示法表示的整数 例:$0x1F 寄存器:表示某个寄存器的内容 表示方法:"%"寄存器的名称 例:%eax 内存引用:会…

前端小食堂 | Day17 - 前端安全の金钟罩

🛡️ 今日盾牌:XSS/CSRF 攻防全解析 1. XSS 防御の三重结界 // 🚫 危险操作:直接渲染未过滤内容 document.getElementById(content).innerHTML userInput; // ✅ 安全姿势一:文本转义 const escapeHTML (str)…

AI+视频赋能智慧农业:EasyCVR打造全域可视化农场监管平台

随着科技的飞速发展,传统农业正加速向智慧农业转型,农场管理也迎来了前所未有的变革机遇。在这一进程中,如何有效整合先进的信息技术,实现农场的精准化、智能化管理,成为了摆在农场主和农业管理者面前的关键课题。 基于…

清华大学第12弹:《DeepSeek政务应用场景与解决方案》.pdf(文末附免费下载地址)

大家好,我是吾鳴。 之前吾鳴给大家分享由清华大学出品的11份DeepSeek的报告,它们分别是: 《DeepSeek从入门到精通》 《AIGC发展研究》 《DeepSeek:赋能品牌传播与营销》 《DeepSeekDeepResearch:让科研像聊天一样简…

【RabbitMQ】RabbitMQ如何保证消息不丢失?

为了保证消息不丢失,需要在生产者、RabbitMQ本身和消费者三个环节采取相应措施。 1.生产者端:确保消息发送成功 1.1开启消息确认机制(Publisher Confirms) 原理: 生产者发送消息后,RabbitMQ会返回一个确认(ACK),表示消息已成功…

云计算赛题私有云服务搭建题目

【任务 1】私有云服务搭建[5 分] 【题目 1】1.1.1 基础环境配置[0.2 分] 1.控制节点主机名为 controller,设置计算节点主机名为 compute; 2.hosts 文件将 IP 地址映射为主机名。 使用提供的用户名密码,登录提供的 OpenStack 私有云平台,在当前租户下,使用 CentOS7.9 镜…

e2studio开发RA4L1(15)----配置RTC时钟及显示时间

e2studio开发RA4L1.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callbac…

001 你好LabVIEW

打开LabVIEW 新建一个工程 界面功能 保存 新建一个VI 认识前面板与程序框图 前面板工具介绍 添加一个按钮和一个指示灯 程序框图工介绍 编写一个简单的程序 添加 LED灯 选择,右键,取消标签显示 右键,转为数组 选中数组,鼠标放到…