news 2026/5/26 6:18:14

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/5/25 6:25:35

wl-explorer:重新定义Vue项目中的文件管理开发体验

wl-explorer:重新定义Vue项目中的文件管理开发体验 【免费下载链接】wl-explorer 用于vue框架的文件管理器插件,云盘、网盘。File manager plug-in for vue framework, cloud disk. 项目地址: https://gitcode.com/gh_mirrors/wl/wl-explorer 在…

作者头像 李华
网站建设 2026/5/25 9:56:12

不想让人拷资料,电脑文件和文件夹加密加锁怎么做?小白也能学会

很多人在电脑磁盘中有一些重要的文件需要加密处理,不想让别人随便打开和查看浏览,也不允许别人拷贝出去,如:个人私密保密文件,公司产品研发图档、产品配方、工程项目图纸、客户资料客户图纸、立项文件、财会文件、投资文件、测量报告等,不能让人随便打开和编辑,也不能让…

作者头像 李华
网站建设 2026/5/25 11:35:32

【国产工控系统什么时候才能成为主流?】这是一场“替代”与“跨越”并举的持久战

在制造业数字化转型与供应链安全自主可控的双重浪潮下,国产工控系统何时能成为市场主流,是每一位工业从业者都关心的问题。本文将从技术、生态、市场三个维度展开分析,认为其进程并非简单的时间点,而是一个分行业、分场景的渐进式…

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

GEO 运营商哪家好?2025 年全球 GEO 运营商五强权威榜单

在生成式 AI 全面主导搜索流量分发的 2025 年,GEO(生成式引擎优化)运营商已成为企业构建 AI 时代品牌流量基建的核心伙伴。从高敏感行业的合规曝光,到跨境品牌的本地化渗透,再到中小商户的低成本获客,不同业…

作者头像 李华
网站建设 2026/5/25 7:58:31

直播抠图技术100谈之15--直播抠图后的画面怎样毫无违和感

在绿幕抠图效果精细, 无色差的情况下; 下面讨论是:在抠图好的前提下, 如何做前景和背景融合的场景。答案是: 调节灯光和相机, 调节设计背景图, 尽量不要调抠图图像; 解释 直播不同于影视后期, 可以通过dav…

作者头像 李华
网站建设 2026/5/23 18:16:25

项目经理的 4 个 “幼稚行为”,越坚持越难成事,早改早逆袭

大家好,我是老原。 在职场中,有些项目经理看似履历光鲜、经验丰富,却始终无法扛起核心项目,甚至频频出现项目延期、团队矛盾激化的问题。 其实,这往往不是能力不足,而是思维和行为模式的 “不成熟” 在拖后…

作者头像 李华