Jupyter AI

18 Kubernetes 入门教程:配置与密钥管理之环境变量与挂载

📅 发表日期: 2024年8月15日

分类: ☸️Kubernetes 入门

👁️阅读: --

在上一篇教程中,我们讨论了配置与密钥管理中的配置文件管理。在这一篇中,我们将深入探讨如何使用环境变量和挂载来管理应用程序中的配置和密钥。这是 Kubernetes 中一个非常重要的主题,能够帮助我们的应用程序在不同的环境中灵活配置,并保持安全性。

环境变量

在 Kubernetes 中,您可以通过环境变量向容器传递配置信息。这种方法尤其适用于需要在应用程序启动时加载的配置数据,例如数据库连接字符串或外部 API 密钥。通过在 Pod 的 YAML 配置文件中定义 env 字段,我们可以将这些环境变量注入到容器中。

示例

假设我们有一个简单的 Node.js 应用,需要连接到 MongoDB 数据库。我们可以在 Pod 的配置中指定相关的环境变量。

apiVersion: v1
kind: Pod
metadata:
  name: mongodb-app
spec:
  containers:
  - name: app-container
    image: your-node-app-image
    env:
    - name: MONGODB_URL
      value: "mongodb://mongodb-service:27017"
    - name: APP_PORT
      value: "3000"

在这个示例中,MONGODB_URLAPP_PORT 是我们定义的环境变量。Node.js 应用程序可以使用process.env来访问这些变量:

const mongodbUrl = process.env.MONGODB_URL;
const appPort = process.env.APP_PORT || 3000;

// 其他代码...

从 ConfigMap 中获取环境变量

除了直接在 Pod 中定义环境变量外,您还可以使用 ConfigMap 来管理配置。当配置数据较多或者需要动态更新时,ConfigMap 是一种更好的选择。

首先,我们创建一个 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  MONGODB_URL: "mongodb://mongodb-service:27017"
  APP_PORT: "3000"

接下来,在 Pod 中引用这个 ConfigMap

apiVersion: v1
kind: Pod
metadata:
  name: mongodb-app
spec:
  containers:
  - name: app-container
    image: your-node-app-image
    env:
    - name: MONGODB_URL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: MONGODB_URL
    - name: APP_PORT
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: APP_PORT

通过这种方式,我们能够把应用程序的配置与代码分开,使得在不同环境中部署变得更加灵活。

挂载秘密(Secrets)

使用 Secrets 是 Kubernetes 的另一种安全管理敏感信息(如密码、API 密钥等)的方法。和 ConfigMap 类似,Secrets 也可以作为环境变量或文件挂载到容器内。

示例

假设我们有一个包含数据库密码的 Secret

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQ=  # 'password' 的 Base64 编码

接下来,可以将这个 Secret 作为环境变量注入到 Pod 中:

apiVersion: v1
kind: Pod
metadata:
  name: secured-app
spec:
  containers:
  - name: app-container
    image: your-secured-app-image
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: DB_PASSWORD

在容器中,应用程序就能够通过process.env.DB_PASSWORD来访问数据库密码。

将 Secrets 挂载为文件

此外,您还可以将 Secrets 挂载为文件到容器中的特定路径:

apiVersion: v1
kind: Pod
metadata:
  name: file-secret-app
spec:
  containers:
  - name: app-container
    image: your-file-secure-app-image
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secret-volume"
  volumes:
  - name: secret-volume
    secret:
      secretName: db-secret

在这个示例中,db-secret 中的密钥将以文件的形式存储在 /etc/secret-volume 目录中,您可以在应用程序中通过读取该文件来获取敏感数据。比如:

const fs = require('fs');

const dbPassword = fs.readFileSync('/etc/secret-volume/DB_PASSWORD', 'utf8');

小结

在本教程中,我们讨论了如何通过环境变量和挂载来进行配置与密钥管理。环境变量和 ConfigMap 提供了一个简单的方式来管理配置信息,而 Secrets 则确保了敏感信息的安全性。通过这些方法,您能够确保您的应用程序在不同环境中灵活且安全地配置。

在下一篇教程中,我们将探讨持久化存储,包括持久卷(PV)和持久卷声明(PVC),以进一步扩展 Kubernetes 的应用管理能力。