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

k8s中的服务通过secret访问数据库的实际案例

文章目录

  • 概述
  • 一、完整实现步骤(含 Python Demo)
    • Step 1️⃣:创建 Kubernetes Secret
    • Step 2️⃣:编写 Python 应用(Flask 示例)
    • Step 3️⃣:构建 Docker 镜像(Dockerfile)
    • Step 4️⃣:部署到 Kubernetes(Deployment + Service)
    • Step 5:测试
    • 二、如何“随时变更”数据库密码?

概述

在 Kubernetes 中,将数据库账号密码等敏感配置与代码解耦,并支持动态更新,是标准的安全和运维实践。我将通过(Python 应用 + 阿里云 RDS + 账号 jialh / 密码 Cfeur123)来设计一个完整可运行的 Python Demo。

✅ 推荐方案:使用 Kubernetes Secret + 环境变量注入
这是最简单、安全、且满足“随时变更配置”的方式:

  • 敏感信息存入 Secret
  • Pod 通过环境变量读取
  • 更新 Secret 后,滚动重启 Pod 即可生效(或配合 ConfigMap Reloader 实现热更新,但对 DB 密码通常不需要)

💡 注意:Kubernetes 的 Secret 不会自动热更新到已运行的 Pod 环境变量中(这是设计行为)。但你可以通过 滚动更新
Deployment 实现“配置变更生效”,这在生产中是标准做法。


一、完整实现步骤(含 Python Demo)

Step 1️⃣:创建 Kubernetes Secret

# rds-secret.yamlapiVersion:v1kind:Secretmetadata:name:rds-secrettype:Opaquedata:# 注意:必须是 base64 编码username:amlhbGg=# echo -n "jialh" | base64password:Q2ZldXIxMjM=# echo -n "Cfeur123" | base64
kubectl apply -f rds-secret.yaml

Step 2️⃣:编写 Python 应用(Flask 示例)

# app.pyimportosimportpymysqlfromflaskimportFlask,jsonify app=Flask(__name__)defget_db_connection():host=os.getenv("DB_HOST","localhost")port=int(os.getenv("DB_PORT","3306"))user=os.getenv("DB_USER")password=os.getenv("DB_PASSWORD")database=os.getenv("DB_NAME","test")ifnotuserornotpassword:raiseValueError("DB_USER or DB_PASSWORD not set!")returnpymysql.connect(host=host,port=port,user=user,password=password,database=database,charset='utf8mb4')@app.route('/health')defhealth():try:conn=get_db_connection()conn.close()returnjsonify({"status":"ok","db":"connected"})exceptExceptionase:returnjsonify({"status":"error","message":str(e)}),500if__name__=='__main__':app.run(host='0.0.0.0',port=8080)

Step 3️⃣:构建 Docker 镜像(Dockerfile)

# DockerfileFROM python:3.9-slim WORKDIR /app COPY requirements.txt.RUN pipinstall--no-cache-dir -r requirements.txt COPY app.py.CMD["python","app.py"]
# requirements.txtFlask==2.3.3PyMySQL==1.1.0

构建并推送(假设镜像名为 my-registry/my-app:v1):

docker build -t my-registry/my-app:v1.docker push my-registry/my-app:v1

Step 4️⃣:部署到 Kubernetes(Deployment + Service)

# app-deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:my-appspec:replicas:2selector:matchLabels:app:my-apptemplate:metadata:labels:app:my-appspec:containers:-name:appimage:my-registry/my-app:v1ports:-containerPort:8080env:-name:DB_HOSTvalue:"rm-xxxx.mysql.rds.aliyuncs.com"# 替换为你的 RDS 内网地址-name:DB_PORTvalue:"3306"-name:DB_NAMEvalue:"mydb"-name:DB_USERvalueFrom:secretKeyRef:name:rds-secretkey:username-name:DB_PASSWORDvalueFrom:secretKeyRef:name:rds-secretkey:password---apiVersion:v1kind:Servicemetadata:name:my-app-svcspec:selector:app:my-appports:-protocol:TCPport:80targetPort:8080
kubectl apply -f app-deployment.yaml

Step 5:测试

将 Service 端口映射到本地,直接调用 /health 接口:

kubectl port-forward svc/my-app-svc8080:80

然后在另一个终端执行:

curlhttp://localhost:8080/health

✅ 成功响应示例:

{"status":"ok","db":"connected"}

❌ 失败可能返回:

{"status":"error","message":"(1045,\"Access denied for user 'jialh'@'192.168.x.x' (using password: YES)\")"}

二、如何“随时变更”数据库密码?

场景:RDS 密码从 Cfeur123 改为 NewPass456!
步骤:

  • 更新 Secret
kubectl create secret generic rds-secret\--from-literal=username=jialh\--from-literal=password=NewPass456!\--dry-run=client -o yaml|kubectl apply -f -
  • 触发 Pod 重启(使新环境变量生效)
# 方法1:滚动重启(推荐)kubectl rollout restart deployment/my-app# 方法2:修改 Deployment 注解(也会触发滚动更新)kubectl patch deployment my-app -p"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"restartedAt\":\"$(date+%Y-%m-%dT%H:%M:%S%z)\"}}}}}"
http://www.cnnetsun.cn/news/17651.html

相关文章:

  • 终极指南:5分钟快速部署IoTSharp物联网平台
  • Spring Boot 4.0 + MyBatis-Plus 实战响应式编程的能力实战
  • 2026 等保测评趋势:从被动合规到主动安全的转型路径
  • 微服务架构设计 - 可降级设计
  • 基于SpringBoot的建金粮食供应链管理系统的设计与实现计算机毕业设计项目源码文档
  • 计算机图形学·24 消隐1 深度缓存-扫描线深度缓存-区间扫描线深度缓存
  • 计算机图形学·25 消隐2 区域子分算法-光线投射算法
  • MinerU升级终极指南:避坑技巧与实战解决方案
  • Archery数据库管理平台:5大核心功能深度解析与实战配置指南
  • 学Python有用吗?
  • Onekey终极指南:3分钟学会Steam游戏清单自动下载
  • 程序员:微软的面试流程探讨
  • 爆款!国产开源公众号AI管家ChatWiki全解析
  • 2、Linux 操作系统基础与 Bash 命令行使用指南
  • 网闸厂家排行:安全隔离技术迭代下的选型指南
  • 单北斗变形监测在水库安全中的应用与维护该如何实施?
  • Win11Debloat:终极Windows系统清理优化完整指南
  • 第一季影响设计可靠性的第一性原理(2)
  • 2025年软件工程/计算机科学与技术专业毕业设计选题推荐
  • NTFSTool:在macOS上实现NTFS磁盘完整读写的终极解决方案
  • Qwen3-Reranker-8B:重新定义文本检索效率与精度边界
  • PingFang SC woff2字体:网页中文排版的终极解决方案
  • ModernWMS开源仓库管理系统终极配置与功能详解
  • MPV播放器macOS硬件解码色彩异常终极修复指南
  • Flink自定义函数实战:从入门到精通的完整开发手册
  • 哔哩哔哩漫画下载器技术指南
  • 目标检测数据集 - 穿着服饰检测数据集下载
  • Windows系统终极清理工具:快速免费释放C盘空间
  • Spring AOP场景3——接口防抖(附带源码)
  • 黑客技术水深!普通人不要随便碰