2

我正在打包一个 Python 应用程序以在 Kubernetes 集群中使用。在代码库中存在此方法:

   def get_pymongo_client(self):
        username = test;
        password = 'test';
        url = ‘test
        conn_str = "mongodb+srv://" + username + ":" + password + “/”+ url

        return pymongo.MongoClient(conn_str)

我正在尝试保护用户名、密码和 URL 字段,以便它们在 src 代码中不可见。为此,我计划使用秘密。

URL https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kubectl/详细说明了如何创建密钥。但我不确定如何从 Python 应用程序中读取秘密。

我的应用程序的 .Dockerfile:

#https://docs.docker.com/language/python/build-images/

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

在 swarm 中阅读Python 烧瓶应用程序对 docker 机密的访问详细说明了 docker-compose 文件中机密的使用,Kubernetes 是否也需要这样做?为了从 Python src 代码文件中读取秘密参数,涉及哪些步骤?

4

2 回答 2

3

传统方式是通过环境变量

spec:
  containers:
  - name: your-app
    # ...
    env:
    - name: PYMONGO_USERNAME
      valueFrom:
        secretKeyRef:
           name: your-secret-name-here
           key: PYMONGO_USERNAME

或者,您可以使用格式正确的 Secret 和“envFrom:”字段来减少 yaml 的繁琐

kind: Secret
metadata:
  name: pymongo
stringData:
  PYMONGO_USERNAME: test
  PYMONGO_PASSWORD: sekrit
---
spec:
  containers:
  - name: your-app
    envFrom:
    - secretRef:
        name: pymongo
    # and now the pod has all environment variables matching the keys in the Secret

然后你的代码会像往常一样从它的环境中读取它

   def get_pymongo_client(self):
        username = os.getenv('PYMONGO_USERNAME')
        password = os.getenv('PYMONGO_PASSWORD')
        # etc

另一种类似的想法是将 Secret 挂载到文件系统上,然后像文件一样读取值

spec:
  containers:
  - name: your-app
    env:
    # this part is 100% optional, but allows for easier local development
    - name: SECRETS_PATH
      value: /secrets
    volumeMounts:
    - name: pymongo
      mountPath: /secrets 
  volumes:
  - name: pymongo
    secret:
      secretName: your-secret-name-here

然后:

   def get_pymongo_client(self):
        sec_path = os.getenv('SECRETS_PATH', './secrets')
        with open(os.path.join(sec_path, 'PYMONGO_USERNAME')) as fh:
            username = fh.read()
于 2021-04-01T16:03:10.673 回答
0

如果可能,使用pydantic

Pydantic 设置支持 docker 机密,k8s 机密的工作方式相同。 https://pydantic-docs.helpmanual.io/usage/settings/#use-case-docker-secrets

来自文档的示例:

from pydantic import BaseSettings

class Settings(BaseSettings):
    my_secret_data: str

    class Config:
        secrets_dir = '/run/secrets'

如果你有超过 1 个 k8s 机密容器,pydantic 设置也从 env vars 中读取,但似乎只支持 1 个机密文件夹。

于 2021-09-10T18:44:10.140 回答