K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南

#作者:闫乾苓

文章目录

  • 1.问题及背景
  • 2.方案说明
  • 3.部署步骤
    • 3.1 制作TLS/SSL私有证书
    • 3.2 创建访问nginx账户密码文件并创建secret
    • 3.3 为TLS/SSL私有证书创建secret
    • 3.4 为Nginx 配置文件创建confimap
    • 3.5 使用deployment,svc部署nginx
    • 3.6 客户端curl上传下载文件

1.问题及背景

  1. 中间件巡检脚本生成报告需统一汇总至一台服务器,便于集中分析与管理。
  2. 巡检脚本需要集中存放,支持客户端下载更新,提高维护效率和一致性。

2.方案说明

  1. 在集中汇总服务器部署 Nginx,启用 WebDAV 模块以支持客户端使用 curl 上传巡检日志。
  2. Nginx 默认支持 HTTP 文件下载,用于客户端获取巡检脚本。
  3. 上传与下载过程通过 HTTP Basic 认证进行账户密码验证,确保安全性。
  4. 为加强数据传输安全,使用https。

3.部署步骤

3.1 制作TLS/SSL私有证书

使用自有CA签发的私有证书(Private CA + Signed Certificate),需要创建一个根CA(Root CA),然后用这个CA去签发服务器证书。

这样做的好处是:你可以将CA证书安装到多个客户端的信任库中,这样所有由该CA签发的证书都会被信任。更适合内部网络、企业内网服务、局域网部署等。

3.1.1生成自有CA私钥
需要使用openssl命令,如果系统中没有,可以使用如下命令进行安装:

~# yum install openssl~# openssl genpkey -algorithm RSA -out ca.key -aes256
记录输入的密码(生成环境部署时,密码请自行替换):abc@888.com

命令执行完成后生成如下文件:

-rw------- 1 root root 1.9K  6月  6 11:12 ca.key

3.1.2 生成CA证书(自签)
交互式命令需要提供的内容请参考以下内容:

~# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:InternalCA
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:MyInternalRootCA
Email Address []:mail@cmc.com
执行完成后,会生成一个根CA证书文件:
-rw-r--r-- 1 root root 1.5K  6月  6 11:14 ca.crt(可选)查看证书内容
~# openssl x509 -in ca.crt -text -noout
这会显示证书详细信息,包括颁发者、有效期、公钥、指纹等。
3.1.3生成服务器私钥和CSR
~# openssl genpkey -algorithm RSA -out server.key
生成的私钥
-rw------- 1 root root 1.7K  6月  6 11:15 server.key~# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany IT Department
Organizational Unit Name (eg, section) []:SA    
Common Name (e.g. server FQDN or YOUR name) []:report.server.com
Email Address []:mail@server.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

注意:Common Name (e.g. server FQDN or YOUR name) []: 输入的内容需要和nginx要使用的域名保持一致。

以下两行直接回车,可以不输入。

A challenge password []:
An optional company name []:

命令执行完成后生成如下文件:

-rw-r--r-- 1 root root 1.1K  6月  6 11:21 server.csr

3.1.4使用自有CA签发服务器证书

-days 3650 指定证书有效期为10年
~# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Signature ok
subject=C = CN, ST = Beijing, L = Beijing, O = MyCompany IT Department, OU = SA, CN = report.server.com, emailAddress = mail@server.com
Getting CA Private Key
Enter pass phrase for ca.key:  #输入第一步创建CA私钥时的密码

命令执行完成后生成的文件如下:

-rw------- 1 root root 1.7K  6月  6 11:15 server.key
-rw-r--r-- 1 root root 1.4K  6月  6 11:27 server.crt

3.2 创建访问nginx账户密码文件并创建secret

安装htpasswd命令的软件包:

~# yum install -y httpd-tools

使用htpasswd命令创建账户并设置密码,-c 指定文件名,user为用户名,请自行替换。

~# htpasswd -c htpasswd user
New password: 
Re-type new password: 
Adding password for user user

在k8s环境为此文件创建secret

~# kubectl create secret generic nginx-webdav-basic-auth --from-file=htpasswd~# kubectl get secret
NAME                      TYPE     DATA   AGE
nginx-webdav-basic-auth   Opaque   1      11s

3.3 为TLS/SSL私有证书创建secret

kubectl create secret generic nginx-webdav-tls-certs \--from-file=ca.crt \--from-file=server.crt \--from-file=server.key

它会将本地的三个文件:

  • ca.crt(CA证书)
  • server.crt(服务器证书)
  • server.key(服务器私钥)
    打包成一个 Kubernetes Secret 对象,名为:nginx-webdav-tls-certs
    Pod挂载时Secret 中的每个 key(即文件名)都会被挂载到 /etc/nginx/certs/ 目录下作为一个独立文件。

3.4 为Nginx 配置文件创建confimap

Nginx.conf示例配置文件如下,生产环境请更加实际情况进行调整:

worker_processes 1;events {worker_connections 1024;
}http {include       mime.types;default_type  application/octet-stream;server {listen 443 ssl;server_name report.server.com;ssl_certificate     /etc/nginx/certs/server.crt;ssl_certificate_key /etc/nginx/certs/server.key;ssl_client_certificate /etc/nginx/certs/ca.crt;ssl_verify_client optional;# 文件下载配置location /down/ {alias /data/down/;  # 注意结尾的斜杠autoindex on;                           # 自动列出目录内容(可选)auth_basic "Restricted";auth_basic_user_file /etc/nginx/htpasswd;}# WebDAV相关配置(上传)    location /upload {# 启用WebDAVdav_methods PUT DELETE MKCOL COPY MOVE;# 允许创建新文件和目录create_full_put_path on;# 设置谁可以访问这个位置dav_access user:rw group:rw all:r;# 设置上传文件的存储目录alias /data/nginx_upload_data;# 允许浏览器访问现有文件(GET 请求)autoindex off;  # 关闭目录列表(更安全)add_header Content-Disposition "inline";  # 浏览器内直接显示文件(非强制下载)# 限制仅允许 GET 和 WebDAV 方法if ($request_method !~ ^(GET|HEAD|PUT|DELETE|MKCOL|COPY|MOVE)$) {return 405;}# 可选:限制上传文件的最大尺寸client_max_body_size 50M;# 确保只有授权用户才能进行上传auth_basic "Restricted";auth_basic_user_file /etc/nginx/htpasswd;}}
}

创建configmap

~# kubectl create configmap nginx-webdav-conf --from-file=nginx.conf~# kubectl get cm
NAME                DATA   AGE
nginx-webdav-conf   1      2d18h

3.5 使用deployment,svc部署nginx

deployment示例中只设置了1个pod副本,并通过nodeName指定了pod固定调度的k8s node节点,文件持久存储使用HostPath,如需设置多个副本,为保证文件下载文件统一管理,建议使用nfs等共享存储方案

deployment.yaml 示例内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: report-nginx-webdavlabels:app: report-nginx
spec:replicas: 1selector:matchLabels:app: report-nginxtemplate:metadata:labels:app: report-nginxspec:nodeName: worker3 containers:- name: nginximage: nginx:1.27.5ports:- containerPort: 443volumeMounts:- name: tls-certsmountPath: /etc/nginx/certsreadOnly: true- name: basic-authmountPath: /etc/nginx/htpasswdsubPath: htpasswdreadOnly: true             - name: custom-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confreadOnly: true- name: download-datamountPath: /data/down- name: upload-datamountPath: /data/nginx_upload_datavolumes:- name: tls-certssecret:secretName: nginx-webdav-tls-certs- name: basic-authsecret:secretName: nginx-webdav-basic-auth- name: custom-configconfigMap:name: nginx-webdav-conf- name: download-datahostPath:path: /data/report-nginx-data/downtype: Directory- name: upload-datahostPath:path: /data/report-nginx-data/uploadtype: Directory

svc yaml 示例内容如下,生产环境看根据实际环境调整svc对外开放端口的方式:

apiVersion: v1
kind: Service
metadata:name: nginx-webdav-ssl-svc
spec:type: NodePortselector:app: report-nginxports:- protocol: TCPport: 443targetPort: 443nodePort: 30043namenode指定的主机节点创建hostpath目录,并设置为Nginx pod内nginx 的uid,gid
~# mkdir /data/report-nginx-data/{down,upload} -p
~# chown -R 101:101 report-nginx-data/

部署deployment, svc

~# kubectl apply -f deployment.yaml -f svc.yaml~# kubectl get pod
NAME                          READY   STATUS    RESTARTS        AGE
pod/report-nginx-webdav-5f977c7bfc-mpfcg   1/1     Running   1 (2d21h ago)   2d21h~# kubectl get svc
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
nginx-webdav-ssl-svc   NodePort    10.110.106.124   <none>        443:30043/TCP   2d21h

3.6 客户端curl上传下载文件

客户端访问服务器端https时,需要指定CA证书去验证TLS/SSL证书,所以需要把自签的私有CA证书复制到客户端,在使用curl访问时指定。

-rw------- 1 root root 1.9K  6月  6 11:12 ca.key

另外为将htpasswd创建的基于Nginx Basic Auth 的账户和密码,访问的服务器域名存入一个文件中,方便使用。

~# vim .netrc 
machine report.server.com
login user
password abc.888.com

上传文件到服务器upload目录示例命令:

~# curl --cacert ca.crt --netrc-file .netrc --upload-file file01.txt https://report.server.com:30043/upload/

从服务器down目录下载脚本到本地示例命令:

~# curl --cacert ca.crt --netrc-file .netrc -o file02.sh https://report.server.com:30043/down/file02.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89216.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Day 7-N17】Python函数(1)——函数定义、位置参数调用函数、关键字参数调用函数、函数的默认值

挑战14天学会Python&#xff0c;第7天学习笔记&#xff01;加油&#xff01; 一、概述 函数&#xff08;Function&#xff09;是 Python 中用于封装可重用代码块的基本结构。通过定义函数&#xff0c;我们可以将复杂逻辑拆分为更小、更易管理的单元&#xff0c;并通过参数传递…

STM32 驱动 ADS1015 单端 差分 多通道模式 ADC 转换

文章目录 一、ADS1015简介二、引脚功能三、寄存器介绍1.Conversion Register 转化数据存放寄存器2.Config Register 配置寄存器 四、IIC时序1.写寄存器2.读寄存器 五、程序六、实验现象1.单端模式2.差分模式3.伪多通道模式 一、ADS1015简介 ADS1015 是一款由德州仪器&#xff…

RabbitMQ 消费幂等性与消息重放实现

一、幂等性实现 1.1 什么是幂等性&#xff1f; 幂等性是指同一条消息无论被消费多少次&#xff0c;业务结果都只生效一次&#xff0c;防止重复扣款、重复发货等问题。 RabbitMQ 的投递模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消费者处理失败或者没有及…

【HarmonyOS 5】鸿蒙TEE(可信执行环境)详解

【HarmonyOS 5】鸿蒙TEE&#xff08;可信执行环境&#xff09;详解 一、TEE是什么&#xff1f; 1、TEE的定义&#xff1a; 可信执行环境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;简称TEE&#xff0c;是存在于智能手机、平板或任意移动设备主处理器…

算法: 冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;通过相邻元素的比较和交换&#xff0c;使较大的元素逐渐"浮"到数组末尾。 时间复杂度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空间复杂度:O(1) 稳定性:稳定 应用场景/前提条件 适用于小规模数据对几乎已排序的数据效率较高…

基于SpringBoot的家电销售展示平台

源码编号&#xff1a;S567 源码名称&#xff1a;基于SpringBoot的家电销售展示平台 用户类型&#xff1a;双角色&#xff0c;用户、管理员 数据库表数量&#xff1a;14 张表 主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 运行环境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.…

Docker 入门教程(三):镜像操作命令

文章目录 &#x1f433; Docker 入门教程&#xff08;三&#xff09;&#xff1a;镜像操作命令获取镜像&#xff1a;docker pull查看镜像&#xff1a;docker images删除镜像&#xff1a;docker rmi搜索镜像&#xff1a;docker search镜像打标签&#xff1a;docker tag镜像详情与…

如何修改discuz文章标题字数限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主题&#xff09;标题字数的限制可以通过修改数据库结构以及后台配置来实现&#xff0c;以下是完整的修改方法&#xff0c;将标题长度限制改为 255 个字符&#xff1a; ✅ 一、修改数据库字段长度 Discuz 默认标题字段是 subje…

基于BP神经网络的26个英文字母识别

本课题旨在设计并实现一个基于BP&#xff08;反向传播&#xff09;神经网络的英文字母识别系统&#xff0c;实现对手写或打印的26个英文字母&#xff08;A-Z&#xff09;的自动分类识别。项目首先对字母图像进行预处理&#xff08;如灰度化、归一化、二值化和特征提取&#xff…

系统架构设计师论文分享-论云原生技术的应用

我的软考历程 摘要 2023年2月&#xff0c;我所在的公司做了开发纱线MES系统的决定&#xff0c;该系统为国内纱线工厂提供SAAS服务&#xff0c;旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师&#xff0c;全面掌管该项目的架构设计工作。该项目涉…

重置 MySQL root 密码

引言 在linux可能存在安装mysql安装失败&#xff0c;一直不出现默认密码 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面试八股---HTML

面试八股 1、HTML 1.1 src和href的区别 src 用于替换当前元素&#xff0c;href 用于在当前文档和引用资源之间确立联系。 核心区别在于 href 关联的资源&#xff08;主要是 CSS&#xff09;是用于描述页面外观的&#xff0c;浏览器可以先生成内容再应用样式&#xff0c;因此…

气候智能体:AI如何重构人类应对气候危机的决策体系?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 《气候智能体&#xff1a;AI如何重构人类应对气候危机的决策体系&#xff1f;》 展开全景式论述。文章结合2025年最新技术突破与…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用详情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;苹果引入了安全区域&#xff08;Safe Area&#xff09;的概念,当UITableView的frame超出了安全区域,系统会自定调整SafeAreaInsets的值,它可以自动调整内容的内边距&#xff0c;使得内容不会被导航栏遮挡。…

腾讯云RayData全新推出“行业解决方案模板”,一键快捷制作3D数据可视化作品

点击蓝字⬆ 关注我们 本文共计958字 预计阅读时长3分钟 腾讯云RayData Plus是一款专注于高视效的3D数据可视化的实时渲染工具。 功能全面&#xff1a;提供了三维、二维、动画、数据、交互逻辑等各类能力&#xff1b; 零代码制作&#xff1a;灵活的节点式创作&#xff0c;即便没…

深度解析基于贝叶斯的垃圾邮件分类

贝叶斯垃圾邮件分类的核心逻辑是基于贝叶斯定理&#xff0c;利用邮件中的特征&#xff08;通常是单词&#xff09;来计算该邮件属于“垃圾邮件”或“非垃圾邮件”的概率&#xff0c;并根据概率大小进行分类。它是一种朴素贝叶斯分类器&#xff0c;因其假设特征&#xff08;单词…

WPF 3D 开发全攻略:实现3D模型创建、旋转、平移、缩放

&#x1f3ae; WPF 3D 入门实战&#xff1a;从零打造一个可交互的立方体模型 标题&#xff1a; &#x1f680;《WPF 3D 开发全攻略&#xff1a;实现旋转、平移、缩放与法线显示》 &#x1f4a1; 引言 在现代图形应用中&#xff0c;3D 可视化已经成为不可或缺的一部分。WPF 提供…

Ruby 安装使用教程

一、Ruby 简介 Ruby 是一种简单快捷的面向对象脚本语言&#xff0c;以优雅、简洁、易读著称。它常被用于 Web 开发&#xff08;如 Ruby on Rails 框架&#xff09;、自动化脚本、DevOps、命令行工具等领域。 二、Ruby 安装教程 2.1 支持平台 Ruby 支持跨平台运行&#xff0c…

python | numpy小记(五):理解 NumPy 中的 `np.arccos`:反余弦函数

python | numpy小记&#xff08;五&#xff09;&#xff1a;理解 NumPy 中的 np.arccos&#xff1a;反余弦函数 一、函数签名与核心参数二、数学定义与取值范围三、基础使用示例四、与 Python 内建 math.acos 的对比五、常见问题与注意事项六、典型应用场景1. 三维向量夹角计算…