如何用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
相关产品推荐
相关产品推荐

