新闻详情

新闻详情

首页 / 资讯中心 / 详情

DjangoBlog Kubernetes 部署实战:基于 local-storage 与 Ingress 的云原生博客服务栈搭建指南

发布时间:2026/9/28 2:23:54来源:尧图网络
DjangoBlog Kubernetes 部署实战:基于 local-storage 与 Ingress 的云原生博客服务栈搭建指南
后端前端CMS【免费下载链接】DjangoBlog基于Django的博客系统项目地址https://gitcode.com/gh_mirrors/dj/DjangoBlog点击查看免费下载本文基于 DjangoBlog 仓库 docs/k8s.md 编写围绕仓库自带的 deploy/k8s 目录下整套 YAML 配置从架构设计、环境准备、持久化存储到服务编排与外部暴露逐步讲解如何在 Kubernetes 集群上部署一套包含 DjangoBlog 应用、Nginx、MySQL、Redis 与 Elasticsearch 的完整博客服务栈。读完本文你将掌握本地 PV 的静态绑定方式、ConfigMap 驱动的环境变量注入、Deployment 健康探针与 Ingress 流量入口的配置方法并能在首次运行后完成数据库初始化与管理员账号创建。架构概览微服务化的云原生部署DjangoBlog 的 Kubernetes 部署采用微服务化的云原生架构每个核心服务都以独立的Deployment运行整体资源组织遵循如下原则核心组件DjangoBlog 应用、Nginx、MySQLdb、Redis、Elasticsearch 五个核心服务各自作为一个独立Deployment运行互不耦合。配置管理Nginx 的配置文件与 Django 应用的环境变量通过ConfigMap统一管理文档明确提示敏感信息如数据库密码、Secret Key建议改用Secret管理避免明文暴露在 ConfigMap 中。服务发现所有服务都通过ClusterIP类型的Service在集群内部暴露服务之间通过 Kubernetes 服务名如db、redis、djangoblog直接通信无需感知 Pod IP 变化。外部访问使用Ingress资源将外部 HTTP 流量路由到 Nginx 服务Nginx 作为整个博客应用的统一入口对外暴露 80 端口。数据持久化采用基于节点本地路径的local-storage方案。需要预先在指定 K8s 节点上手动创建存储目录并通过PersistentVolumePV与PersistentVolumeClaimPVC进行静态绑定。这一架构的全部编排细节都沉淀在 deploy/k8s 目录下 7 个 YAML 文件中下文将按部署步骤逐一解读。1. 环境准备在开始部署前请确认以下前提条件一个正在运行的 Kubernetes 集群任意发行版均可配置对 K8s 版本依赖不大deployment.yaml使用apps/v1gateway.yaml使用networking.k8s.io/v1kubectl命令行工具已安装并能够连接到目标集群集群中已安装并配置好Nginx Ingress ControllerIngress 规则依赖它实现流量路由对集群中的一个节点默认是master节点见 pv.yaml 中nodeAffinity的取值拥有文件系统访问权限以便创建本地存储目录。2. 部署步骤步骤 1创建命名空间建议将 DjangoBlog 相关的所有资源部署在独立的命名空间中便于统一管理与后续清理# 创建一个名为 djangoblog 的命名空间 kubectl create namespace djangoblog后续所有kubectl apply的 YAML 中metadata.namespace均写为djangoblog因此该命名空间必须先于其他资源创建。步骤 2配置持久化存储local-storage 静态绑定本方案使用Local Persistent Volume存储目录必须预先在物理节点上创建。默认情况下四个 PV 全部绑定在master节点对应目录如下存储用途PV 名称节点路径容量MySQL 数据local-pv-db/mnt/local-storage-db10GiDjangoBlog 静态文件local-pv-djangoblog/mnt/local-storage-djangoblog5Gi站点资源文件local-pv-resource/mnt/resource/5GiElasticsearch 数据local-pv-elasticsearch/mnt/local-storage-elasticsearch5Gi先登录节点创建目录# 登录到您的 master 节点 ssh usermaster-node # 创建所需的存储目录 sudo mkdir -p /mnt/local-storage-db sudo mkdir -p /mnt/local-storage-djangoblog sudo mkdir -p /mnt/resource/ sudo mkdir -p /mnt/local-storage-elasticsearch # 退出节点 exit注意若希望将数据存储在其他节点或使用不同路径必须同步修改 pv.yaml 中每个 PV 的nodeAffinitykubernetes.io/hostname的values和local.path两处配置否则 Pod 会因调度节点与 PV 所在节点不匹配而无法挂载。创建目录后依次应用存储相关配置# 应用 StorageClass kubectl apply -f deploy/k8s/storageclass.yaml # 应用 PersistentVolume (PV) kubectl apply -f deploy/k8s/pv.yaml # 应用 PersistentVolumeClaim (PVC) kubectl apply -f deploy/k8s/pvc.yaml三个文件的分工从源码中可以清晰看到storageclass.yaml 定义了名为local-storage的 StorageClassprovisioner为kubernetes.io/no-provisioner即本地存储不提供动态供给PV 必须由管理员预先创建并带有storageclass.kubernetes.io/is-default-class: true注解声明其为默认存储类。pv.yaml 中每个 PV 都设置了storageClassName: local-storage、persistentVolumeReclaimPolicy: Retain删除 PVC 后 PV 保留防止误删数据以及volumeMode: Filesystem、accessModes: ReadWriteOnce。pvc.yaml 中每个 PVC 通过volumeName字段显式指定绑定到哪个 PV如db-pvc绑定local-pv-db这是静态绑定的关键PVC 的storageClassName、accessModes与容量请求必须与对应 PV 匹配。步骤 3配置应用ConfigMap 环境变量注入部署应用前需要编辑 configmap.yaml修改其中的敏感信息与个性化配置。该文件实际包含两个 ConfigMap1web-nginx-config以多数据项的形式内嵌了 Nginx 主配置nginx.conf、站点配置djangoblog.conf、资源站点配置resource.lylinux.net.conf及缓存规则lylinux.resource.conf。其中djangoblog.conf定义了博客的对外虚拟主机/static/直接别名到/code/djangoblog/collectedstatic/其余请求通过proxy_pass http://djangoblog:8000;反向代理到 Django 应用 Service同时为robots.txt、ads.txt、favicon.ico、搜索引擎验证文件等提供了独立的静态定位规则。2djangoblog-env以键值对形式注入 Django 与 MySQL 的运行环境变量这些变量与 djangoblog/settings.py 中的os.environ.get(...)读取逻辑一一对应变量含义settings.py 中的使用DJANGO_DEBUGDjango 调试模式开关False控制 DEBUG 及模板调试DJANGO_SECRET_KEYDjango 签名密钥由 settings.py 读取用于 session、csrf 等安全签名DJANGO_MYSQL_DATABASE/DJANGO_MYSQL_USER/DJANGO_MYSQL_PASSWORDMySQL 库名 / 用户 / 密码对应 settings.py 中 DATABASES 配置DJANGO_MYSQL_HOST/DJANGO_MYSQL_PORTMySQL 服务地址 / 端口db/3306同上HOST 为集群内 Service 名dbDJANGO_REDIS_URLRedis 地址redis:6379由 settings.py 拼装成redis://redis:6379作为缓存 LOCATIONMYSQL_ROOT_PASSWORD/MYSQL_DATABASE/MYSQL_PASSWORDMySQL 容器自身的初始化参数供 mysql 镜像初始化数据库与 root 密码强烈建议修改以下字段DJANGO_SECRET_KEY修改为一个随机且复杂的字符串仓库中为k8s-test-secret-key-12345678仅作演示绝不可直接用于生产DJANGO_MYSQL_PASSWORD和MYSQL_ROOT_PASSWORD替换为自定义的强数据库密码且两处需保持一致。修改后应用配置# 编辑 ConfigMap 文件 vim deploy/k8s/configmap.yaml # 应用配置 kubectl apply -f deploy/k8s/configmap.yaml另外可以观察到DjangoBlog 的 Elasticsearch 集成同样通过环境变量驱动见 settings.py 中的DJANGO_ELASTICSEARCH_HOST、ELASTICSEARCH_USERNAME、ELASTICSEARCH_PASSWORD、ELASTICSEARCH_CA_CERTS等若需要为 ES 启用认证可自行在 ConfigMap 中补充对应变量。步骤 4部署应用服务栈Deployment 与 Service现在部署所有核心服务# 部署 Deployments (DjangoBlog, MySQL, Redis, Nginx, ES) kubectl apply -f deploy/k8s/deployment.yaml # 部署 Services (为 Deployments 创建内部访问端点) kubectl apply -f deploy/k8s/service.yamldeployment.yaml中共定义 5 个 Deployment值得关注的工程细节有djangoblog镜像liangliangyy/djangoblog:latestreplicas: 3应用层支持水平扩容通过envFrom.configMapRef整体注入djangoblog-env环境变量同时挂载djangoblog-pvccollectedstatic与resource-pvc/resource两个数据卷。健康探针DjangoBlog 与 Elasticsearch 均配置了readinessProbe与livenessProbe对/health/Django与/ES9200 端口发起 HTTP 探测。其中/health/对应 djangoblog/urls.py 中内置的health_check视图该接口以JsonResponse返回{status: healthy, timestamp: ...}正是为容器编排探针设计的轻量健康检查端点。dbMySQL通过exec方式执行mysqladmin ping完成就绪与存活探测数据目录/var/lib/mysql挂载db-pvc。nginx镜像nginx:latest将web-nginx-config这个 ConfigMap 的多个数据项通过subPath分别挂载为/etc/nginx/nginx.conf、/etc/nginx/conf.d/default.conf等配置文件实现“配置即代码”。elasticsearch镜像为liangliangyy/elasticsearch-analysis-ik:8.6.1内置 IK 中文分词插件通过环境变量设置discovery.typesingle-node、ES_JAVA_OPTS-Xms256m -Xmx256m、xpack.security.enabledfalse等数据目录挂载elasticsearch-pvc。资源配额各容器均声明requests如cpu: 10m、memory: 100Mi与limits应用与数据库类容器为cpu: 2、memory: 2GiRedis 为cpu: 200m便于集群调度与资源隔离。service.yaml为 5 个 Deployment 各创建一个ClusterIPService端口映射分别为djangoblog:8000、nginx:80、redis:6379、db:3306、elasticsearch:9200。selector通过app标签如app: djangoblog关联对应 Pod集群内各服务即可通过服务名互相访问——这正是 ConfigMap 中DJANGO_MYSQL_HOSTdb、DJANGO_REDIS_URLredis:6379能被正确解析的底层机制。部署需要一些时间可实时观察 Pod 状态kubectl get pods -n djangoblog -w直到所有 Pod 的 STATUS 变为Running注意DjangoBlog 与 MySQL 由于探针initialDelaySeconds为 60/30 秒就绪需要一定时间。步骤 5暴露应用到外部Ingress通过 Ingress 规则将外部流量引导至 Nginx 服务# 应用 Ingress 规则 kubectl apply -f deploy/k8s/gateway.yamlgateway.yaml 定义的 Ingress 资源要点如下ingressClassName: nginx指定由集群中的 Nginx Ingress Controller 处理单条规则将所有路径/pathType: Prefix转发到nginxService 的 80 端口由此 Nginx 成为博客的统一入口外部流量 → Ingress Controller → Nginx Service → Nginx Pod反代到djangoblog:8000。部署完成后获取 Ingress Controller 的外部访问地址kubectl get ingress -n djangoblog将输出中的 ADDRESSIngress Controller 的 IP 或域名填入本地浏览器或 DNS 解析即可访问博客首页。步骤 6首次运行的初始化操作与 Docker Compose 部署类似首次运行需要进入 DjangoBlog 应用的 Pod 执行数据库迁移、创建管理员等初始化操作。需要说明的是仓库的 deploy/entrypoint.sh 在容器启动时已经自动执行了makemigrations、migrate、collectstatic --noinput、compress --force、build_index、compilemessages等命令并最终以 gunicorn--worker-class gevent拉起应用因此进入 Pod 后只需完成数据初始化与账号创建# 首先获取 djangoblog pod 的名称 kubectl get pods -n djangoblog | grep djangoblog # 进入其中一个 Pod (将 [pod-name] 替换为上一步获取到的名称) kubectl exec -it [pod-name] -n djangoblog -- bash # 在 Pod 内部执行以下命令: # 创建超级管理员账户 (请按照提示操作) python manage.py createsuperuser # (可选) 创建测试数据 python manage.py create_testdata # (可选如果启用了 ES) 创建索引 python manage.py rebuild_index # 退出 Pod exit其中create_testdata与rebuild_index分别对应仓库 blog/management/commands 目录下的create_testdata.py与build_index.py管理命令若你的部署未启用 Elasticsearch 索引rebuild_index可跳过。部署完成后的验证与运维提示至此DjangoBlog 已成功部署在 Kubernetes 集群上。可进一步做如下验证与运维操作服务健康检查直接访问任一 djangoblog Pod 的http://pod-ip:8000/health/应返回{status: healthy, ...}的 JSON该端点同时被 Deployment 探针持续监控服务异常时 K8s 会自动重启或摘除流量。查看资源状态kubectl get deploy,svc,pv,pvc,ingress -n djangoblog可一览所有资源kubectl logs -n djangoblog pod-name用于排查 gunicorn 与应用日志。扩容与更新由于应用镜像固定为liangliangyy/djangoblog:latest且imagePullPolicy: Always可通过修改replicas或更新镜像完成滚动发布配置变更只需修改 ConfigMap 后重新kubectl apply并滚动重启相关 Deployment。生产加固建议将DJANGO_SECRET_KEY、MYSQL_ROOT_PASSWORD等敏感字段迁移至Secret并以secretKeyRef注入同时建议为 Ingress 配置 TLS 证书将server_name、443 监听等补充到 Nginx 配置与 Ingresstls段并依据实际业务量调整各容器的资源limits。小结本文完整梳理了 DjangoBlog 在 Kubernetes 上的部署全流程从 local-storage 本地 PV 的静态绑定、ConfigMap 驱动的环境变量与 Nginx 配置注入到五大服务的 Deployment/Service 编排、健康探针设计与 Ingress 统一入口最后完成首次运行的数据初始化。整套方案以 deploy/k8s 目录下的 YAML 文件为单一事实来源既可整体kubectl apply一键部署也可按需修改后复用是理解“应用 中间件”云原生编排的完整实战样例。所有配置文件、入口脚本与健康检查接口均可在当前仓库中直接查阅与复用。赞分享后端前端CMS【免费下载链接】DjangoBlog基于Django的博客系统项目地址https://gitcode.com/gh_mirrors/dj/DjangoBlog点击查看免费下载相关推荐ZincSearch Kubernetes部署终极指南5分钟搭建云原生搜索服务ZincSearch Kubernetes部署终极指南5分钟搭建云原生搜索服务 ZincSearch 是一款轻量级、高性能的全文搜索引擎是 Elastics搜索引擎后端全文检索掌握静态代码分析Semgrep如何重塑你的代码安全防线掌握静态代码分析Semgrep如何重塑你的代码安全防线 你可能面临这样的挑战在快速迭代的开发节奏中如何确保代码安全漏洞不被引入如何让安全工具真正融入开发SAST应用安全静态分析开发工具代码质量如何永久保存微信聊天记录WeChatMsg完整指南与隐私保护方案如何永久保存微信聊天记录WeChatMsg完整指南与隐私保护方案 你是否曾担心重要的微信聊天记录会因手机丢失或系统升级而永远消失那些珍贵的家庭对话、重要的工上一篇cc-mirror完全指南如何创建隔离的Claude Code变体与自定义AI提供商下一篇llama-68m模型性能测试CPU与昇腾NPU推理速度对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

具身智能创新设计方案(30):解决迭代无序、兼容混乱、落地成本高的顽疾 2026/9/28 3:35:38

具身智能创新设计方案(30):解决迭代无序、兼容混乱、落地成本高的顽疾

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

阅读更多 →
具身智能创新设计方案(19):工程化架构破解具身智能产业化痛点 2026/9/28 3:35:38

具身智能创新设计方案(19):工程化架构破解具身智能产业化痛点

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

阅读更多 →
具身智能创新设计方案(18):支撑原生底座的高效神经系统 2026/9/28 3:35:38

具身智能创新设计方案(18):支撑原生底座的高效神经系统

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

阅读更多 →
learnyounode 实战第一课:Baby Steps——用 process.argv 解析命令行参数并求和 2026/9/28 3:35:38

learnyounode 实战第一课:Baby Steps——用 process.argv 解析命令行参数并求和

教程CLI 【免费下载链接】learnyounode Learn You The Node.js For Much Win! An intro to Node.js via a set of self-guided workshops. 项目地址: https://gitcode.com/gh_mirrors/le/learnyounode 点击查看 免费下载 导读:本文围绕 learnyounode 工…

阅读更多 →
具身智能创新设计方案(17):系统级强化学习与协同进化框架 2026/9/28 3:35:37

具身智能创新设计方案(17):系统级强化学习与协同进化框架

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

阅读更多 →
具身智能创新设计方案(31):引领具身智能标准化与规模化跨越式发展 2026/9/28 3:35:31

具身智能创新设计方案(31):引领具身智能标准化与规模化跨越式发展

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉