news 2026/6/10 16:24:12

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)\"}}}}}"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 5:08:46

钓鱼即服务驱动下勒索软件入口演变与MFA绕过机制研究

摘要近年来,攻击者持续利用文件格式特性规避传统安全检测机制。2025年9月,Fortinet与BankInfoSecurity披露了一起针对乌克兰政府机构的定向钓鱼活动,其核心特征在于使用可缩放矢量图形(Scalable Vector Graphics, SVG)…

作者头像 李华
网站建设 2026/6/10 8:14:26

头部教培为何悄然布局GEO?一文读懂AI问答流量新规则传统意义上的关键词竞价已经不再是唯一出路取而代之的是另一种看不见却更精准的影响方式简单来说就是当用户向大模型提问的时候谁能在回答中被提到甚至被当作

最近不少教育行业的同行发现一个现象有些奇怪过去家长想报班第一个反应是打开搜索引擎查哪家好或者翻朋友圈看别人推荐现在呢越来越多的人直接问AI比如孩子数学成绩上不去该选哪家机构效果好结果蹦出来的答案里总有一两家名字反复出现看着眼熟但又说不上来具体哪儿见过这背后其…

作者头像 李华
网站建设 2026/6/10 14:11:59

Windows11系统文件SensorsUtilsV2.dll缺失损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/10 12:24:09

54、Linux网络配置与资源连接全解析

Linux网络配置与资源连接全解析 1. 名称解析 在TCP/IP网络中,计算机通过唯一的IP地址来标识自己。然而,由于IP地址难以记忆,这种标识方案对人类来说不太实用。因此,计算机通常使用名称来标识,这些名称被称为主机名。 对于参与互联网的计算机,简单的主机名很少使用,而…

作者头像 李华
网站建设 2026/6/10 12:26:55

电信国际专线宽带真的适合所有企业吗?

提到企业级网络解决方案,电信国际专线宽带无疑是众多选项中的一颗明珠。然而,就像挑选合适的鞋子一样,并不是每家企业都适合穿上这双“水晶鞋”。那么,这种看似高端大气上档次的服务到底适不适合你的公司呢?先从基础说起吧&#…

作者头像 李华
网站建设 2026/6/10 12:22:48

基于SpringBoot的家庭医生服务软件系统计算机毕业设计项目源码文档

项目整体介绍基于SpringBoot的家庭医生服务软件系统,直击“居民找医难、医生管患散、健康数据乱”的核心痛点,依托SpringBoot的高效开发与稳定运行优势,构建“医患精准对接全周期健康管理便捷医疗服务”的一体化平台。传统模式下,…

作者头像 李华