在没有独立的环境变量系统的情况下,如何从Helm局部获取值?

2024-04-26 11:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用Helm和Kubernetes部署的Python应用程序。我想把硬编码的变量从主.py让他们在头盔里可以配置。问题是如果我把它们从主.py然后我就失去了用python3 main.py运行代码的能力。然后我就失去了快速测试和迭代的能力,因为我需要在3-4个位置为每个参数维护两个独立的系统。你知道吗

main.py在提取硬编码变量之前:

HOST = "http://host" 
PORT = 1234
if __name__ == '__main__':
    connect_to_server(HOST, PORT)

新建值.yaml

host: "http://host"
port: "1234"

新模板(例如,容器底部)cronjob.yaml文件):

根据Helm docs,对环境变量integer使用字符串。你知道吗

env:
  - name: HOST
    value: {{ required "host is required!" .Values.host | quote }}
  - name: PORT
    value: {{ required "port is required!" .Values.port | quote }}

main.py提取硬编码变量后::


if __name__ == '__main__':
    try:
        HOST = os.environ['HOST']
        PORT = int(os.environ['PORT'])
        connect_to_server(HOST, PORT)
    except IndexError as e:
        print("Unable to run app! No env vars defined outside Helm!")
        raise e

如果我保持上面的设置不变,它将不会在执行python main.py时运行。如果我想用普通的旧的python3 main.py运行它,那么我需要建立一个完全独立的并行系统来本地管理我的环境变量。这不太理想,而且管理起来很麻烦。我希望能够继续在本地快速测试,而不必在整个应用程序中为环境变量添加一堆try/catch异常。我知道我可以通过各种方式导入env变量,但是我不想用相同的信息维护两个不同的系统。如何在本地Python应用程序中灵活地添加Helm图表中的env变量?有没有办法导入我的本地values.yaml并将它们设置为与中同名的环境变量cronjob.yaml文件(即主机)?或者对于这个用例有没有其他我不知道的解决方案?你知道吗


Tags: tonamepyenv应用程序hostyaml编码
1条回答
网友
1楼 · 发布于 2024-04-26 11:01:39

您可以选择的一个选项是继续允许环境变量,但在未设置环境变量的情况下提供默认值。使用get()方法可以很容易地做到这一点:

if __name__ == '__main__':
    HOST = os.environ.get('HOST', 'http://host')
    PORT = int(os.environ.get('PORT', '1234'))
    connect_to_server(HOST, PORT)

相关问题 更多 >