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

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和list ConfigMap的权限,不要给超出需求的权限,避免安全风险。
  • 异常处理:代码里添加了ApiException的捕获,实际生产环境可以根据需求优化错误处理逻辑。
  • 镜像依赖:确保Docker镜像里正确安装了kubernetes和flask依赖,否则会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:22:39