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

KubeSphere学习笔记:部署nginx


📝本文首发于 栏轩·阁

欢迎访问阅读原文,获取更好的阅读体验。


一、前言

本文在已有 KubeSphere 环境和 K8s 集群的基础上,记录如何通过 KubeSphere 部署一个完整的 Nginx 网站。

适用场景

  • 已在本地通过 Docker Desktop 启用 K8s 集群
  • 已安装 KubeSphere(ks-core)
  • 希望通过可视化界面 + 命令行结合的方式管理网站部署

本文重点

  • 创建配置字典(ConfigMap)管理 Nginx 配置文件
  • 创建持久卷(PVC)挂载网站静态文件
  • 创建工作负载(Deployment)并配置挂载
  • 创建 LoadBalancer 服务暴露到宿主机
  • 通过kubectl cp上传 HTML 文件

二、整体架构

用户访问 → localhost:8888 → envoy 代理容器(LoadBalancer) → K8s NodePort → Pod:80(Nginx) ├── /usr/share/nginx/html (PVC 持久卷) └── /etc/nginx/conf.d/ (ConfigMap 配置)

三、创建配置字典(ConfigMap)

3.1 什么是配置字典

配置字典(ConfigMap)是 K8s 中用来存储配置文件的资源对象。这里用来存储 Nginx 的配置文件,挂载到 Pod 中后 Nginx 可以直接读取。

3.2 创建步骤

在 KubeSphere 项目中进入配置 → 配置字典,点击创建。

3.3 nginx.conf(主配置)

用来控制 Nginx 的全局行为,包括工作进程数、日志格式、事件模型等:

user nginx; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }

3.4 default.conf(站点配置)

用来配置具体的虚拟主机,定义监听端口、站点根目录等:

server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

注意:站点根目录root指向/usr/share/nginx/html,这就是后面要挂载持久卷的位置。


四、创建持久卷(PVC)

持久卷(PersistentVolumeClaim,PVC)用于持久化存储网站静态文件。这样即使 Pod 重启,上传的 HTML 文件也不会丢失。

在 KubeSphere 中创建:进入存储 → 持久卷声明,点击创建。

容量按需设置(本例设为 10Gi),访问模式选择单节点读写(RWO)。存储卷创建后会自动绑定到后端的存储类(StorageClass)。


五、创建应用(工作负载)

5.1 镜像地址

docker.1ms.run/library/nginx:latest

使用国内镜像源加速拉取。如果使用 Docker Hub 官方镜像,地址为nginx:latest

5.2 挂载持久卷

将上一步创建的 PVC 挂载到容器内 Nginx 的网页根目录,用于存放 HTML 静态文件。

字段
挂载路径/usr/share/nginx/html
存储卷选择已创建的 PVC
读写权限读写

5.3 挂载配置字典

Nginx 有两个关键配置文件需要挂载,涉及多个路径,需分别配置:

存储卷容器内挂载路径子路径(Key 名称)
nginx 配置字典/etc/nginx/nginx.confnginx.conf
nginx 配置字典/etc/nginx/conf.d/default.confdefault.conf


六、两种挂载方式的区别

在配置字典挂载时,KubeSphere 提供了两种挂载方式,理解其区别非常重要:

6.1 指定子路径(subPath)

适用于精准挂载单个文件。当配置字典包含多个 Key 时,直接填写目标Key 名称(如nginx.conf),挂载路径填写容器内完整文件路径(如/etc/nginx/nginx.conf)。该方式仅替换指定文件,不会清空目标目录原有内容。

使用场景:只想替换某个配置文件,保留 Nginx 镜像自带的其余默认配置。

6.2 选择指定键(items 模式)

需先指定挂载路径为容器内的父目录,再逐一为配置字典里的每个 Key 单独分配容器内子路径名。该模式会先清空目标父目录,再放入指定文件。

使用场景:需要批量挂载多个配置文件,且不关心容器原有默认配置。

6.3 使用建议

  • 想要保留容器原有文件(如 Nginx 原生配置)、仅替换个别配置文件,优先使用指定子路径
  • 需要批量挂载多个文件、且允许清空目标目录时,再使用选择指定键
  • 二者不要同时勾选,避免挂载异常。

七、创建服务暴露到宿主机

7.1 创建 Service

工作负载部署完成后,需要创建 Service 才能外部访问。在 KubeSphere 中进入服务 → 服务,点击创建:

  • 服务类型:LoadBalancer
  • 端口映射:Pod 端口80→ Service 端口8888(或其他你想要的端口)
  • 注意不需要配置键值对标签,Docker Desktop 会自动创建 envoy 代理容器供外部访问。

7.2 LoadBalancer 原理说明

在 Docker Desktop 的 K8s 环境中,Service 改为 LoadBalancer 类型后,kind-cloud-provider组件会自动创建一个 envoy 代理容器,将宿主机端口映射到集群内部:

localhost:8888 → envoy 容器:8888 → NodePort → Pod:80

⚠️注意:如果 Host 端口和已有的 Docker 容器端口冲突(如本地已有 Nginx 占用了 80 端口),LoadBalancer 会卡在<pending>状态,需要手动指定一个空闲端口。

7.3 查看 Service 状态

kubectl get svc-n<项目名称>

Expected output:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx LoadBalancer 10.96.135.68 172.18.0.6 8888:31056/TCP 2h

EXTERNAL-IP出现 IP 地址(而非<pending>)代表 LoadBalancer 创建成功。


八、上传 HTML 文件

8.1 403 问题

Service 创建成功后访问http://localhost:8888会出现403 Forbidden,原因很简单——页面根目录/usr/share/nginx/html是空的,Nginx 找不到默认页面。

8.2 使用 kubectl cp 上传文件

首先查看 Pod 名称:

kubectl get pods-n<项目名称>

上传本地dist/目录下的文件到 Pod:

kubectlcp./dist/.<Pod名称>:/usr/share/nginx/html/-n<项目名称>

⚠️ 路径注意:

  • ./dist/.—— 把dist目录里面的内容上传到目标路径(正确)
  • ./dist/—— 把dist目录本身上传到目标路径,会变成html/dist/(错误)

8.3 删除或重新上传

如果传错目录结构,需要先清理再重新上传:

kubectlexec-n<项目名称><Pod名称>--rm-rf/usr/share/nginx/html/*

⚠️注意:rm -rf *通配符在部分 shell 环境中可能不生效,改用精确路径更可靠:

kubectlexec-n<项目名称><Pod名称>--rm-rf/usr/share/nginx/html/dist

命令说明:kubectl exec可以进入容器内部执行 Linux 命令,--后面跟的就是要在容器内执行的命令。


8.4 访问验证

文件上传后再次访问http://localhost:8888,可以看到页面正常显示。


九、常用运维命令

9.1 查看 Pod 状态和详情

# 查看项目下所有 Podkubectl get pods-n<项目名称># 查看 Pod 详细信息(包括挂载、事件等)kubectl describe pod-n<项目名称><Pod名称>

9.2 查看配置字典内容

kubectl get configmap-n<项目名称><配置名称>-oyaml

9.3 查看持久卷(PVC)

kubectl get pvc-n<项目名称>

9.4 查看 Service 和 External-IP

kubectl get svc-n<项目名称>

9.5 查看 Pod 内部文件结构

kubectlexec-n<项目名称><Pod名称>--ls-la/usr/share/nginx/html/

十、总结

阶段操作要点
配置创建 ConfigMap挂载时注意区分 subPath 和 items 模式
存储创建 PVC挂载到/usr/share/nginx/html
部署创建 Deployment配置镜像和挂载路径
暴露创建 LoadBalancer Service注意端口冲突,Docker Desktop 自动创建 envoy 代理
上传kubectl cp路径用./dist/.不是./dist/
运维kubectl exec进入容器执行命令,方便调试和管理

通过 KubeSphere 可视化界面结合kubectl命令行,可以很方便地在本地 K8s 环境中完成 Nginx 网站部署。理解 ConfigMap 挂载机制和 LoadBalancer 在 Docker Desktop 下的工作原理,能帮助我们更快排查问题。

http://www.jsqmd.com/news/1341103/

相关文章:

  • 扣子多模态消息的“黑盒”响应逻辑首次公开(附官方未文档化status_code映射表):4类超时/截断/降质错误的精准定位法
  • 2024年企业必看的网站建设风险分析与避坑指南
  • 滚动回测思想
  • [Java]-Redis面试题
  • 重庆大平层全案设计|搭某设计“一户一创意”私宅定制服务 - 甄选测评官
  • 深入理解OS--漫游,流水线,汇编
  • 5分钟搞定Windows风扇控制:FanControl终极免费教程
  • 2026南宁装修**:全案落地还原95%、工地不转包,南宁华浔品味装饰(财富广场店)凭集团背书与独立质检收获南宁业主一致好评 - 推途云
  • 2026云南药店上班没药师证?电大中专中药/药剂专业怎么报名?联系方式多少? - 最新资讯
  • WiFi万能钥匙到底靠不靠谱?安全认证与法律风险,一篇文章说清楚
  • 全国靠谱的中医师承培训机构推荐:我为什么选了阿虎医考师承 - 生活动态圈
  • 【数据库】mysql-修改密码-error-1290 (HY000): The MySQL server is running with the --skip-grant-tables option
  • 南京大学 操作系统 (JYY) 学习笔记:火星上的 Bug 与 Android 移动操作系统的黑客法则
  • Squirrel-RIFE:拯救卡顿视频!3分钟学会用AI让老旧视频流畅如丝
  • 家装空间设计优化动线收纳
  • 深度解密全志H6机顶盒网络适配:Armbian系统跨平台兼容性完整方案
  • 如何快速使用WatermarkRemover:三步轻松去除视频水印的完整指南
  • 2026年河北应急方舱集装箱厂家梳理 沧州智达等企业产品亮点汇总 - 小范同学a
  • 16-Linux学习之旅之网络诊断工具
  • 台州椒江区房屋漏水维修养护贴士(2026 新版):卫生间/厨房/阳台漏水急症随时上门维修 - 超人防水
  • 【踩坑指南】搞定 Claude Code 升级与环境“血崩”:从 npm 到 winget 的完美蜕变
  • 论文发表流程入门指南:从零开始快速掌握学术论文发表的核心步骤与关键要点
  • 汕尾市城区房屋漏水维修养护贴士(2026 新版):卫生间/厨房/阳台漏水急症随时上门维修 - 超人防水
  • Axure RP中文语言包:3步解决英文界面难题,提升设计效率
  • 【免费】人脸识别 智能考勤系统(深度学习+OpenCV DNN+FastAPI+Vue3) 锋哥原创出品,必属精品
  • 一站搞定站酷海洛、Shutterstock高清原图下载,一篇讲明白!
  • Web 安全入门全套基础知识|零基础从入门到精通学习指南
  • 佳能g1800 g1810 g2800 g2810 g3800 g3810 g4800 g4810清零软件5b00,5b02,5b04,1700,1702,1704,p07,e08亲测完美维修。
  • 1个脚本解决9大网盘下载难题:LinkSwift网盘直链下载助手完全指南
  • 萤石轻应用集成指南:WebView方案替代海康SDK实现视频监控