You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python读取K8s命名空间中ConfigMap内的变量(Flask场景)

在Flask中读取K8s ConfigMap的两种方式

1. 用os.getenv()(推荐,轻量简洁)

K8s支持将ConfigMap的键值对直接注入为Pod的环境变量,这种情况下你完全不需要引入K8s Python模块,直接用os.getenv()读取即可,这也是最符合12-factor应用规范的做法。

步骤示例:

1.1 定义ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: flask-config
data:
  DB_HOST: "db.example.com"
  DB_PORT: "5432"
  DEBUG: "true"

1.2 在Deployment中注入环境变量

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - name: flask-container
        image: your-flask-image:latest
        env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: flask-config
              key: DB_HOST
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: flask-config
              key: DB_PORT
        - name: DEBUG
          valueFrom:
            configMapKeyRef:
              name: flask-config
              key: DEBUG

1.3 Flask代码中读取

import os
from flask import Flask

app = Flask(__name__)

# 读取环境变量,可设置默认值
db_host = os.getenv("DB_HOST")
db_port = os.getenv("DB_PORT", "5432")
debug_mode = os.getenv("DEBUG", "false").lower() == "true"

@app.route('/')
def hello():
    return f"DB Host: {db_host}, DB Port: {db_port}, Debug: {debug_mode}"

if __name__ == '__main__':
    app.run(debug=debug_mode, host='0.0.0.0')

2. 用Kubernetes Python客户端(直接读取ConfigMap资源)

只有当你需要动态读取ConfigMap(无需重启Pod更新配置),或者直接操作K8s资源时,才需要引入K8s Python模块。

步骤示例:

2.1 安装依赖

pip install kubernetes

2.2 Flask代码中直接读取ConfigMap

from flask import Flask
from kubernetes import client, config

app = Flask(__name__)

# 加载K8s配置:Pod内运行用incluster配置,本地调试用kubeconfig
try:
    config.load_incluster_config()
except config.ConfigException:
    config.load_kube_config()

v1 = client.CoreV1Api()

def get_configmap(namespace="default", cm_name="flask-config"):
    return v1.read_namespaced_config_map(cm_name, namespace).data

@app.route('/')
def hello():
    config_data = get_configmap()
    db_host = config_data.get("DB_HOST")
    db_port = config_data.get("DB_PORT", "5432")
    return f"DB Host: {db_host}, DB Port: {db_port}"

if __name__ == '__main__':
    app.run(host='0.0.0.0')

2.3 配置Pod权限

需要给Pod的ServiceAccount添加读取ConfigMap的权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: configmap-reader
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: flask-cm-reader
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: Role
  name: configmap-reader
  apiGroup: rbac.authorization.k8s.io

总结

  • 90%的场景下,优先用os.getenv(),不需要依赖K8s Python模块,代码更简洁,运维成本更低。
  • 只有动态配置、直接操作K8s资源等特殊需求时,才需要使用Kubernetes Python客户端。

内容的提问来源于stack exchange,提问作者Jayco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:35:36