Kubernetes集群中Flask应用无需创建Deployment和Service获取同命名空间ConfigMap数据的方法
当然可以!完全不用额外创建Deployment或者Service,就能在你的Flask应用里调用Kubernetes集群API拿到目标ConfigMap的数据。下面一步步给你讲清楚:
1. 给Flask Pod配置必要的API访问权限
Kubernetes集群默认不会给Pod开放API访问权限,所以第一步要给你的Flask应用所在的Pod分配仅能读取目标ConfigMap的最小权限(遵循权限最小化原则)。
创建以下三个资源的YAML文件(可以合并成一个文件,或者分开创建):
ServiceAccount(用于Pod身份认证)
apiVersion: v1 kind: ServiceAccount metadata: name: flask-config-reader namespace: 你的命名空间名称 # 替换成你的Flask应用所在的命名空间
Role(定义允许的操作:读取ConfigMap)
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: configmap-reader namespace: 你的命名空间名称 rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list"] # 只给读取权限,不要给修改/删除权限
RoleBinding(把权限绑定到上面的ServiceAccount)
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: flask-config-reader-binding namespace: 你的命名空间名称 subjects: - kind: ServiceAccount name: flask-config-reader namespace: 你的命名空间名称 roleRef: kind: Role name: configmap-reader apiGroup: rbac.authorization.k8s.io
执行命令创建这些资源:
kubectl apply -f 你的yaml文件名.yaml
2. 更新Flask应用的Deployment,绑定ServiceAccount
修改你的Flask应用Deployment的YAML,在spec.template.spec下添加serviceAccountName字段,指定上面创建的ServiceAccount:
spec: template: spec: serviceAccountName: flask-config-reader # 这里填刚才创建的ServiceAccount名称 containers: - name: flask-app image: 你的Flask镜像地址 # 其他容器配置...
更新Deployment:
kubectl apply -f 你的flask-deployment.yaml
3. 在Flask代码中调用Kubernetes API获取ConfigMap
首先,确保你的Flask镜像里安装了Kubernetes Python客户端库。如果是用Docker构建镜像,在Dockerfile里添加:
RUN pip install flask kubernetes
然后编写Flask代码:
from kubernetes import client, config from flask import Flask import os app = Flask(__name__) def fetch_configmap(configmap_name): # 加载集群内部的K8s配置(集群内会自动挂载配置文件到Pod) config.load_incluster_config() core_api = client.CoreV1Api() # 获取当前Pod所在的命名空间(从K8s自动挂载的文件读取) with open('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as ns_file: current_namespace = ns_file.read().strip() try: # 读取指定的ConfigMap configmap = core_api.read_namespaced_config_map(configmap_name, current_namespace) return configmap.data # 返回ConfigMap里的所有键值对 except client.exceptions.ApiException as e: return {"error": f"获取ConfigMap失败: {e.reason}"} @app.route('/get-config') def get_config(): # 替换成你的ConfigMap名称 target_configmap = "你的-configmap名称" return fetch_configmap(target_configmap) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
4. 验证功能
部署更新后的Flask应用后,可以通过以下方式验证:
- 用
kubectl exec进入Flask Pod内部,执行curl http://localhost:5000/get-config,应该能看到ConfigMap的键值对数据。 - 或者用
kubectl port-forward把Pod的5000端口转发到本地,然后在本地浏览器访问http://localhost:5000/get-config查看结果。
注意事项
- 权限最小化:上面的Role只给了
get和listConfigMap的权限,不要给超出需求的权限,避免安全风险。 - 异常处理:代码里添加了ApiException的捕获,实际生产环境可以根据需求优化错误处理逻辑。
- 镜像依赖:确保Docker镜像里正确安装了
kubernetes和flask依赖,否则会报错。
内容的提问来源于stack exchange,提问作者Clueless
相关产品推荐
相关产品推荐

