在现代容器化应用程序的开发和部署过程中,环境变量扮演着重要的角色。它们能够为应用程序提供灵活性和可配置性,使我们能够轻松地针对不同的环境(如开发、测试和生产)进行调整。

当您将应用程序部署在 Kubernetes 集群上时,您可以在 Kubernetes 资源定义中声明环境变量,并让您的 Python 应用程序访问这些变量。

在 Kubernetes 中定义环境变量

让我们来看一个示例,演示如何在 Kubernetes 中定义环境变量,并在 Python 代码中使用它们。

首先,让我们看一下 Kubernetes 部署清单中的环境变量定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-image-ai
  namespace: default
spec:
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/name: test-image-ai
    spec:
      containers:
      - name: test-image-ai
        image: 820600610568.dkr.ecr.us-east-1.amazonaws.com/ai/image:20240509070645
        imagePullPolicy: IfNotPresent
        command:
          - python3
          - run.py
        env:
          - name: ENV_NAME
            value: "test"

在此 Kubernetes 部署清单中,我们定义了一个名为 ENV_NAME 的环境变量,并将其值设置为 "test"。这个环境变量将在容器启动时注入到 Python 应用程序中。

在 Python 中使用环境变量

现在让我们看看如何在 Python 代码中使用这个环境变量:

import os

# 获取环境变量的值
env_name = os.getenv("ENV_NAME", "dev")

print(f"Environment name: {env_name}")

在此 Python 代码中,我们使用 os.getenv() 函数来获取环境变量 ENV_NAME 的值。如果环境变量不存在,我们将使用默认值 "dev"

最后,我们打印出环境变量的值,以确认它已被正确地读取。

在 Kubernetes 中部署应用程序

当您在 Kubernetes 中部署这个 Python 应用程序时,它将使用 Kubernetes 中定义的环境变量 ENV_NAME 的值。如果环境变量不存在,则使用默认值 "dev"

您可以根据需要,在 Python 代码中使用这个环境变量来执行不同的逻辑,例如:

  • 根据环境切换不同的配置
  • 调用不同的 API 或服务
  • 记录不同的日志消息
import os
import logging

# 获取环境变量的值
env_name = os.getenv("ENV_NAME", "dev")

# 根据环境切换不同的配置
if env_name == "dev":
    config = {
        "database_url": "mongodb://dev-db:27017/myapp",
        "log_level": logging.DEBUG
    }
elif env_name == "prod":
    config = {
        "database_url": "mongodb://prod-db:27017/myapp",
        "log_level": logging.INFO
    }
else:
    config = {
        "database_url": "mongodb://localhost:27017/myapp",
        "log_level": logging.WARNING
    }

# 根据配置设置日志级别
logging.basicConfig(level=config["log_level"])

# 根据环境调用不同的 API 或服务
if env_name == "dev":
    from dev_apis import get_data
    data = get_data()
elif env_name == "prod":
    from prod_apis import get_data
    data = get_data()
else:
    from local_apis import get_data
    data = get_data()

# 根据环境记录不同的日志消息
logging.info(f"Fetched data: {data}")
logging.debug(f"Environment name: {env_name}")

这样可以使您的应用程序更加灵活和可配置。

通过将环境变量定义为 Kubernetes 资源的一部分,并在 Python 代码中使用它们,您可以轻松地管理应用程序的环境依赖关系,并确保应用程序在不同的环境中正常运行。