当前位置: 首页 > article >正文

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》

手把手教你用 Kubernetes 部署高可用 WordPress 博客

本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的全流程,展示了云原生技术栈在实际应用中的完整实现。

1. 网站基本架构

实验采用经典的三层架构设计:

  1. 数据层:MariaDB 数据库容器化部署

  2. 应用层:WordPress 多副本容器部署

  3. 接入层:Nginx 反向代理服务

实验环境(如果只是学习环境也可以只用一个有k8s环境的Master节点完成本实验部署)

  • Kubernetes 集群:1个 Master 节点 + 2个 Worker 节点

  • 容器运行时:Docker

  • 核心组件版本

    • Kubernetes v1.28.2

    • MariaDB 10

    • WordPress 5

    • Nginx (Alpine 版)

img

2. 部署 MariaDB

(1)检查kubelet状态,确认核心组件(如 kube-apiserver)是否以 Pod 形式运行

sudo systemctl status kubeletkubectl get pods -n kube-system

 

(2) 定义一个 MariaDB 数据库的 Kubernetes 部署

mkdir mari-ng-wd
cd mari-ng-wd/
vim maria-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: maria-cm
data:DATABASE: "db"USER: "wp"PASSWORD: "123"ROOT_PASSWORD: "123"
部分1:

maria-cm.yaml - ConfigMap 配置
作用:存储 MariaDB 的配置数据(以键值对形式)。
关键字段:
• DATABASE: 数据库名称(db)
• USER: 数据库用户(wp)
• PASSWORD: 用户密码(123)
• ROOT_PASSWORD: root 用户密码(123)
用途:
将数据库配置(如账号密码)与容器镜像解耦,便于灵活修改(无需重新构建镜像)。 

vim maria-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: marialabels:app: wordpressrole: database
spec:replicas: 1selector:matchLabels:app: wordpressrole: databasetemplate:metadata:labels:app: wordpressrole: databasespec:containers:- name: mariaimage: mariadb:10ports:- containerPort: 3306envFrom:- prefix: "MARIADB_"configMapRef:name: maria-cm
部分2:

maria-deploy.yaml - Deployment 配置
作用:定义如何部署 MariaDB 容器。
关键部分:
• 镜像: mariadb:10(官方 MariaDB 10.x 版本镜像)
• 端口: 暴露 3306(MySQL/MariaDB 默认端口)
• 环境变量注入:
通过 envFrom 将 maria-cm 的所有数据以 MARIADB_ 为前缀注入容器,例如:
◦ DATABASE → MARIADB_DATABASE=db
◦ USER → MARIADB_USER=wp
◦ 其他变量同理。
MariaDB 的自动配置:
MariaDB 官方镜像会识别特定前缀(MARIADB_)的环境变量来自动初始化数据库:
1. 创建指定数据库(db)
2. 创建用户 wp 并设置密码 123
3. 设置 root 密码为 123 


分别用于创建 MariaDB 数据库的配置(ConfigMap)和部署(Deployment)资源 

kubectl create -f maria-cm.yamlkubectl create -f maria-deploy.yaml

(3)获取正确pod名称并查看该 Pod 容器内部的所有环境变量

# 查看 Deployment 是否正常
kubectl get deployments# 查看 Pod 名称及状态
kubectl get pods# 在指定的 Kubernetes Pod 中执行 env 命令,查看该 Pod 容器内部的所有环境变量
kubectl exec maria-88449d778-gv4c4 -- env# 最后需要查看一下mariadb的信息
kubectl get po -o wide

 

出现问题(如果查看成功可以跳过问题解决的这一步):

kubectl exec maria-88449d778-gv4c4 -- env      执行失败

查看节点状态,发现节点状态异常

Master 节点Ready,但有污点(node-role.kubernetes.io/control-plane:NoSchedule),默认不允许调度普通 Pod。

允许 Pod 调度到 Master 节点(临时方案)

让 Pod 调度到 Master:

# 去除 Master 的污点
kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-
1.等待 Pod 完全启动:
ContainerCreating 表示正在拉取镜像并启动容器,稍等片刻后再次检查:
kubectl get pods -o wide
如果状态变为 Running,说明 Pod 已正常运行。
2. 进入 Pod 并验证 MariaDB:
使用正确的 Pod 名称(如 maria-88449d778-gv4c4)进入容器:
kubectl exec -it maria-88449d778-gv4c4 -- bash
在容器内验证环境变量和数据库:
echo $MARIADB_DATABASE  # 应输出 "db"
mysql -u wp -p123       # 登录 MariaDB
3. 测试数据库连接:
在 Pod 内执行以下命令验证数据库是否正常:
SHOW DATABASES;
USE db;
SHOW TABLES;

 

3. 部署 Wordpress

(1)定义了一个 Kubernetes 的 ConfigMap 对象

vim wp-cm.yamlapiVersion: v1
kind: ConfigMap
metadata:name: wp-cm
data:HOST: '10.244.0.4'     # 这个IP一定要与mariadb数据库绑定USER: 'wp'PASSWORD: '123'NAME: 'db'

这个 ConfigMap 的作用是存储与 MariaDB 数据库连接相关的配置信息,其他 Kubernetes 资源(如运行 WordPress 的 Deployment)可以通过 envFrom 等方式从这个 ConfigMap 中获取这些配置数据,以便正确连接到 MariaDB 数据库进行数据操作。

(2)定义一个 Kubernetes Deployment 对象,用于部署 WordPress 应用

vim wp-deploy.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: wordpresslabels:app: wordpressrole: web
spec:replicas: 3selector:matchLabels:app: wordpressrole: webtemplate:metadata:labels:app: wordpressrole: webspec:containers:- image: wordpress:5name: wordpressimagePullPolicy: IfNotPresentports:- containerPort: 80envFrom:- prefix: 'WORDPRESS_DB_'configMapRef:name: wp-cm

这个配置文件的核心功能是:

  1. 创建一个名为 wordpress 的 Deployment
  2. 管理 3 个运行 WordPress 的 Pod
  3. 使用 wp-cm ConfigMap 中的数据配置 WordPress 数据库连接信息
  4. 将 WordPress 容器的 80 端口暴露出来


(3)Kubernetes 集群中创建由 wp-cm.yaml 和 wp-deploy.yaml 文件定义的资源

kubectl create -f wp-cm.yaml -f wp-deploy.yaml



(4)获取当前 Kubernetes 集群中 Pod(容器组)的相关信息。
 

kubectl get po

 

4. 设置端口映射

(1)端口映射

nohup kubectl port-forward --address 0.0.0.0 deployments/wordpress 8080:80 &

当前监听127.0.0.1 上的8080是不能够被外部访问的,只能是本机;要想让外部访问到需要端口映射改为:

nohup ... & 忽略输入并将输出追加到 nohup.out,再掉到后台执行,若要关闭可以使用 fg 调到前台,使用 Ctrl+C 停止运行进程。 

(2)jobs 用来查后台进程

可以看到当前后台序号为1;那么杀后台进程的方式为 : kill   %1    ,1为查到的后台进程序号

(3)查看监听端口信息

# 下载工具包
sudo yum install net-tools# netstat -anpt | grep 8080

  • netstat 输出 验证了:
    • 主机的 8080 端口确实在被 kubectl 监听。
    • 之前有过与其他 Pod(IP 为 10.244.0.2 和 10.244.0.3)的通信,可能是 WordPress 容器。

 

5. 部署 Nginx 容器

(1)修改配置文件

WordPress 网站使用了 URL 重定向,直接使用“8080”会导致跳转故障,所以为了让网站正常工作,还应该在 Kubernetes 之外启动 Nginx 反向代理,保证外界看到的仍然是“80”端口号。

vim nginx.confserver {listen 80;default_type text/html;
​location / {proxy_http_version 1.1;proxy_set_header Host $host;proxy_pass http://127.0.0.1:8080;}
}

(2)启动指定容器

使用 Docker 启动了 Nginx 容器(--net=host),将 80 端口的请求转发到 127.0.0.1:8080,从而实现通过 80 端口访问 WordPress。实现Nginx 反向代理

docker run -d --name nginx --rm --net=host -v ./nginx.conf:/etc/nginx/conf.d/default.conf nginx:alpine
docker run: 这是Docker的基本命令,用于从指定的镜像启动一个新的容器。
-d: 这是“--detach”的简写,意思是让容器在后台运行。
--name nginx: 为这个容器指定一个名称,这里命名为“nginx”。
--rm: 当容器退出时自动删除容器。
--net=host: 使用主机的网络堆栈而不是Docker的默认网络堆栈。这意味着容器将使用主机的网络配置。
-v ./nginx.conf:/etc/nginx/conf.d/default.conf: 这是“--volume”参数,用于挂载文件或目录。这里,它将主机上的“nginx.conf”文件挂载到容器的“/etc/nginx/conf.d/default.conf”路径上。
nginx:alpine: 这是要运行的Docker镜像的名称和标签。

(3)访问测试WordPress

在浏览器中直接输入 http://10.1.1.85 ,Nginx 会把请求代理到 WordPress 服务,正常情况下就能进入如图所示的 WordPress 安装页面 。

过程:通过浏览器访问服务器的公网 IP(如 http://10.1.1.85),Nginx 会将请求转发到 127.0.0.1:8080,最终到达 WordPress Pod。

http://10.1.1.85/wp-admin/install.php

后续自行部署网站,也可使用 PV+PVC 实现 K8S 集群数据持久化

实验结论

  1. 架构验证成功

    • 实现了 WordPress (前端) + MariaDB (后端) + Nginx (反向代理) 的经典三层架构,全部运行在 Kubernetes 集群中,验证了容器化应用的灵活性和可扩展性。

    • 通过 ConfigMap 分离配置与镜像,使数据库账号、密码等关键信息可动态管理。

  2. 关键技术点

    • MariaDB 自动化初始化:利用 MARIADB_ 前缀环境变量自动创建数据库和用户。

    • 跨 Pod 通信:WordPress 通过 ConfigMap 中的数据库 IP (10.244.0.4) 成功连接 MariaDB。

    • Nginx 反向代理:解决 WordPress URL 重定向问题,对外隐藏真实端口(8080→80)。

  3. 问题与解决

    • Pod 调度问题:Master 节点默认污点导致 Pod 无法调度,通过 kubectl taint 临时去除污点解决。

    • 生产环境建议

      • 使用 Secret 替代 ConfigMap 存储密码。

      • 为数据库添加 PersistentVolume 防止数据丢失。

  4. 扩展性验证

    • WordPress 部署了 3 个副本(replicas: 3),验证了 Kubernetes 的横向扩展能力。

相关文章:

《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》

手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...

Ubuntu源码版comfyui的安装

Comfyui也出桌面版了,但是想让大家多个人都使用怎么办呢?也有方法,安装Linux版,启动后会生成个网页地址,打开就能用了。 1、先来看下本地安装环境配置: 系统:Ubuntu 22.04 内存:2…...

多模态RAG与LlamaIndex——1.deepresearch调研

摘要 关键点: 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型,扩展了传统RAG(检索增强生成)的功能。LlamaIndex是一个开源框架,支持多模态RAG,提供处理文本和图像的模型、嵌入和索引功能。研…...

C++ 命令模式详解

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以参数化客户端使用不同的请求、队列或日志请求,以及支持可撤销的操作。 核心概念 设计原则 命令模式遵循以下设计原则: 单…...

制作一款打飞机游戏47:跳转

编辑器的问题 我们开始为不同的敌人编写一些行为,到目前为止进展顺利,一切都很棒。但上次我们遇到了一些问题,我们发现在这个编辑器中编写代码有时有点困难,因为当你想要在某行之间插入内容时,你不得不删除一切然后重…...

本地部署ollama及deepseek(linux版)

一、安装ollama export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download"curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/download|$OLLAMA_MIRROR|g" | shexport OLLAMA_MIRROR&q…...

Java Spring Boot项目目录规范示例

以下是一个典型的 Java Spring Boot 项目目录结构规范示例,结合了分层架构和模块化设计的最佳实践: text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…...

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...

vue H5解决安卓手机软键盘弹出,页面高度被顶起

开发中安卓机上遇到的软键盘弹出导致布局问题 直接上代码_ 在这里插入代码片 <div class"container"><div class"appContainer" :style"{height:isKeyboardOpen? Heights :inherit}"><p class"name"><!-- 绑定…...

CSS专题之自定义属性

前言 石匠敲击石头的第 12 次 CSS 自定义属性是现代 CSS 的一个强大特性&#xff0c;可以说是前端开发需知、必会的知识点&#xff0c;本篇文章就来好好梳理一下&#xff0c;如果哪里写的有问题欢迎指出。 什么是 CSS 自定义属性 CSS 自定义属性英文全称是 CSS Custom Proper…...

问题 | 当前计算机视觉迫切解决的问题

当前计算机视觉领域虽然在技术上取得了显著进展&#xff0c;但仍面临一系列关键挑战。结合最新研究与应用现状&#xff0c;以下是最迫切需要解决的几大问题&#xff1a; 1. 数据质量与多样性不足 高质量标注数据的获取&#xff1a;训练高效模型依赖大量精准标注的数据&#x…...

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…...

Qt6.x检查网络是否在线(与Qt 5.x不同)

Qt 5.x.x 要判断客户端网络是否联通&#xff0c;一般用如下方法&#xff1a; #include <QNetworkConfigurationManager>auto netWorkCheck new QNetworkConfigurationManager(); auto flag netWorkCheck->isOnline(); Qt 6.x.x 废弃了 QNetworkConfigurationManag…...

直接在Excel中用Python Matplotlib/Seaborn/Plotly......

本次分享如何利用pyxll包&#xff0c;实现直接在Excel中使用Python Matplotlib/Seaborn/Plotly等强大可视化工具。 pyxll配置 pyxll安装 pip install pyxll pyxll install pyxll自定义方法 例如&#xff0c;自定义一个计算斐波那契数的方法fib&#xff0c;并使用pyxll装饰器…...

React面试常问问题详解

以下是30个React面试中常见的问题及简要解析&#xff0c;涵盖基础概念、核心原理、性能优化、Hooks、状态管理等方面&#xff0c;适用于初中高级开发者准备面试时参考&#xff1a; 一、React 基础与核心概念 React 是什么&#xff1f; React 是由 Facebook 开发的用于构建用户界…...

【Java】网络编程(Socket)

网络编程 Socket 我们开发的网络应用程序位于应用层&#xff0c;TCP和UDP属于传输层协议&#xff0c;在应用层如何使用传输层的服务呢&#xff1f;在应用层和传输层之间&#xff0c;则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口&#xff0c;应用程…...

思科(Cisco ASA/Firepower)、华三(H3C)、华为(Huawei USG)防火墙 的基础配置

以下是针对 思科&#xff08;Cisco ASA/Firepower&#xff09;、华三&#xff08;H3C&#xff09;、华为&#xff08;Huawei USG&#xff09;防火墙 的基础配置指南&#xff0c;涵盖 区域划分、安全策略、NAT、路由 等核心功能。配置示例基于通用场景&#xff0c;实际部署时需根…...

华为海思系列----昇腾张量编译器(ATC)模型转换工具----入门级使用指南(LINUX版)

由于官方SDK比较冗余且经常跨文档讲解且SDK整理的乱七八糟,对于新手来说全部看完上手成本较高,本文旨在以简短的方式介绍 CAFFE / ONNX 模型转 om 模型,并进行推理的全流程。希望能够帮助到第一次接触华为海思框架的道友们。大佬们就没必要看这种基础文章啦! 注:本…...

supabase 怎么新建项目?

在 Supabase 中新建项目主要通过官方网站的仪表盘 (Dashboard) 来完成。以下是详细步骤&#xff1a; 通过 Supabase 仪表盘新建项目&#xff1a; 注册/登录 Supabase 账户&#xff1a; 访问 Supabase 官网&#xff1a;https://supabase.com/如果你还没有账户&#xff0c;点击 …...

Windows环境下maven的安装与配置

1.检查JAVA_HOME环境变量 Maven是使用java开发的&#xff0c;所以必须知道当前系统环境中的JDK的安装目录。 搜索栏直接输入“cmd” 或者 WinR 输入cmd 在打开的终端窗口输入“echo %JAVA_HOME”&#xff0c;就可以看到jdk的位置了。 如果没有的话&#xff0c;请参考我的文章&a…...

LeetCode:513、找树左下角的值

//递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* t…...

Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组

Vxe UI vue vxe-table 实现表格数据分组功能&#xff0c;不是使用树结构&#xff0c;直接数据分组 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 代码 通过…...

如何禁止chrome自动更新

百度了一下 下面这个方法实测有效 目录 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable 3、验证是否禁止更新成功&#xff1a; 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable GoogleUpdater InternalService…...

阳光学院【2020下】计算机网络原理-A卷-试卷-期末考试试卷

一、单选题&#xff08;共25分&#xff0c;每空1分&#xff09; 1.ICMP协议工作在TCP/IP参考模型的 ( ) A.主机-网络 B.网络互联层 C.传输层 D.应用层 2.下列关于交换技术的说法中&#xff0c;错误的是 ( ) A.电路交换适用于突发式通信 B.报文交换不能满足实时通信 C.报文…...

Spring Boot 使用 OSHI 实现系统运行状态监控接口

在实际开发中&#xff0c;我们经常需要获取服务器的运行状态&#xff0c;例如&#xff1a;CPU 使用率、内存使用情况、磁盘状态、JVM 运行信息等&#xff0c;以便于运维监控和性能分析。本文将基于 Spring Boot OSHI 实现一个系统信息接口&#xff0c;可返回当前服务运行的详细…...

FastAPI+MongoDB+React实现查询博客详情功能

第一部分:FastAPI 和 MongoDB 后端 确保你的 FastAPI 应用已经配置好,并且 MongoDB 数据库已经运行。以下是完整的后端代码: # main.py from fastapi import FastAPI, HTTPException, Depends from motor.motor_asyncio import AsyncIOMotorClient from pydantic import B…...

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程&#xff0c;thread为什么成为线程呢&#xff1f;因为他实现了对线程的一个抽象管理&#xff0c;可以管理这个线程&#xff0c;启动&#xff0c;可以查看各种信息 那么协程呢&#xff1f; public fun CoroutineScop…...

数组和切片的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

WPF内嵌其他进程的窗口

WPF内嵌其他进程窗口的常见方法有 HwndHost SetParent 和 WindowsFormsHost WinForms Panel SetParent 推荐使用自定义HwndHost 两者的对比区别 示例代码 public class MyWndHost : HwndHost {const int WS_CHILD 0x40000000;const int WS_VISIBLE 0x10000000;const i…...

阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web

服务&#xff1a;ECS防火墙要开启、阿里云控制平台&#xff1a;网路端口安全策略要设置 阿里云服务维护 1.安装JDK 查询要安装jdk的版本,命令&#xff1a;yum -y list java* 命令&#xff1a;yum install -y java-1.8.0-openjdk.x86_64 yum install -y java-17-openjdk.x8…...