如何使用 Kubernetes 密钥管理敏感数据

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Kubernetes 密钥(Secrets)是一项强大的功能,它使你能够以安全且可扩展的方式管理敏感数据,例如密码、API 密钥和 SSL/TLS 证书。本教程将探讨 Kubernetes 密钥的基础知识,包括其用途、类型,以及如何创建和管理它们。你还将学习如何在实践中应用 Kubernetes 密钥来保护你的应用程序。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/get -.-> lab-419023{{"如何使用 Kubernetes 密钥管理敏感数据"}} kubernetes/create -.-> lab-419023{{"如何使用 Kubernetes 密钥管理敏感数据"}} kubernetes/apply -.-> lab-419023{{"如何使用 Kubernetes 密钥管理敏感数据"}} kubernetes/describe -.-> lab-419023{{"如何使用 Kubernetes 密钥管理敏感数据"}} kubernetes/config -.-> lab-419023{{"如何使用 Kubernetes 密钥管理敏感数据"}} end

Kubernetes 密钥基础

Kubernetes 密钥(Secrets)是一项强大的功能,它使你能够以安全且可扩展的方式管理敏感数据,例如密码、API 密钥和 SSL/TLS 证书。对于任何需要使用敏感信息的基于 Kubernetes 的应用程序而言,密钥都是一个基本构建块。

在本节中,我们将探讨 Kubernetes 密钥的基础知识,包括其用途、类型,以及如何创建和管理它们。

理解 Kubernetes 密钥

Kubernetes 密钥是在 Kubernetes 集群中存储和管理敏感数据的一种方式。它们旨在提供一种安全且高效的方式来处理敏感信息,例如:

  • 密码
  • API 密钥
  • SSL/TLS 证书
  • 数据库连接字符串
  • 其他机密数据

密钥存储在 Kubernetes API 服务器中,集群内经过授权的 Pod 可以访问它们。它们在静止时进行加密,确保即使底层存储受到破坏,敏感数据也能得到保护。

Kubernetes 密钥类型

Kubernetes 支持多种类型的密钥,每种类型都针对特定用例设计:

  1. 不透明密钥(Opaque Secrets):这些是默认的密钥类型,可用于存储任何类型的敏感数据。
  2. 服务账户令牌(Service Account Tokens):这些密钥由 Kubernetes 自动创建并用于 Pod 向 API 服务器进行身份验证。
  3. Docker 配置密钥(Docker Config Secrets):这些密钥用于存储 Docker 镜像仓库凭证,允许 Pod 从私有镜像仓库拉取镜像。
  4. TLS 密钥(TLS Secrets):这些密钥用于存储 SSL/TLS 证书和密钥,实现 Pod 之间或与外部客户端之间的安全通信。

创建和管理密钥

可以使用 Kubernetes API 或通过在 YAML 清单中定义来创建 Kubernetes 密钥。以下是使用 kubectl 命令行工具创建不透明密钥的示例:

kubectl create secret generic my-secret \
  --from-literal=username=myuser \
  --from-literal=password=mypassword

然后,你可以在 Kubernetes Pod 中通过在 Pod 的规范中引用它来使用此密钥:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-container
      image: my-app:v1
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password

在此示例中,USERNAMEPASSWORD 环境变量使用 my-secret 密钥中的值进行填充。

管理 Kubernetes 密钥

有效管理 Kubernetes 密钥对于确保应用程序的安全性和可靠性至关重要。在本节中,我们将探讨管理密钥的各个方面,包括创建、更新和删除密钥,以及使用它们的最佳实践。

创建密钥

如前所述,可以使用 Kubernetes API 或通过在 YAML 清单中定义来创建密钥。创建密钥时,遵循最佳实践以确保其安全性和可访问性很重要:

  1. kubectl create secret 命令中使用 --from-literal--from-file 选项,以避免在 YAML 清单中存储敏感数据。
  2. 确保密钥数据以正确的 Base64 格式编码,因为 Kubernetes 密钥以此格式存储数据。
  3. 将密钥大小限制在建议的最大 1MB,以避免性能问题。

更新密钥

更新密钥是一个简单的过程,类似于创建密钥。你可以使用 kubectl edit secret 命令来修改现有密钥的内容。更新密钥时,请确保更新使用该密钥的任何 Pod 或其他资源,以确保它们拥有最新数据。

删除密钥

可以使用 kubectl delete secret 命令删除密钥。请记住,删除密钥也将删除使用该密钥的任何 Pod 或其他资源,因此仔细规划和协调删除过程很重要。

管理密钥的最佳实践

为确保有效且安全地管理 Kubernetes 密钥,请考虑以下最佳实践:

  1. 限制密钥大小:如前所述,将密钥大小保持在建议的 1MB 限制内,以避免性能问题。
  2. 定期轮换密钥:定期轮换或更新密钥,以最小化未经授权访问或暴露的风险。
  3. 限制访问:实施基于角色的访问控制(RBAC),仅将对密钥的访问限制到必要的 Pod 和用户。
  4. 使用命名空间密钥:只要可能,使用命名空间密钥来限制访问范围并降低意外暴露的风险。
  5. 审核和监控密钥:定期审核和监控密钥的使用和访问,以确保它们按预期使用。

通过遵循这些最佳实践,你可以有效地管理 Kubernetes 密钥并确保应用程序的安全性和可靠性。

在实践中应用 Kubernetes 密钥

既然我们已经对 Kubernetes 密钥有了扎实的理解,那么让我们来探讨如何在实际场景中应用它们。在本节中,我们将涵盖各种用例,并演示如何将密钥集成到你的 Kubernetes 应用程序中。

在 Pod 中使用密钥

在 Kubernetes 中使用密钥最常见的方法之一是将它们作为环境变量公开,或者作为文件挂载到 Pod 中。以下是如何将密钥用作环境变量的示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-container
      image: my-app:v1
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password

或者,你可以将密钥作为文件挂载到 Pod 中:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-container
      image: my-app:v1
      volumeMounts:
        - name: secret-volume
          mountPath: /etc/secrets
  volumes:
    - name: secret-volume
      secret:
        secretName: my-secret

在这两种情况下,密钥数据都会安全地提供给 Pod,使你的应用程序能够访问它所需的敏感信息。

与服务账户一起使用密钥

Kubernetes 会为每个命名空间自动创建一个默认服务账户,你也可以创建自定义服务账户。服务账户与提供认证凭证(如 API 密钥或令牌)的密钥相关联。你可以在 Pod 中使用这些服务账户密钥来向 Kubernetes API 服务器或其他外部服务进行身份验证。

使用密钥进行 Docker 镜像仓库认证

如果你的应用程序需要从私有 Docker 镜像仓库拉取镜像,你可以使用 Docker 配置密钥来存储必要的凭证。以下是如何创建一个 Docker 配置密钥并在 Pod 中使用它的示例:

kubectl create secret docker-registry my-registry-secret \
  --docker-server= \
  --docker-username=myusername \
  --docker-password=mypassword
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-container
      image: my-registry/my-app:v1
  imagePullSecrets:
    - name: my-registry-secret

使用密钥存储 TLS 证书

Kubernetes 还支持 TLS 密钥,可用于存储 SSL/TLS 证书和密钥。这些密钥可用于在 Pod 之间或你的应用程序与外部客户端之间启用安全通信。

通过探索 Kubernetes 密钥的这些实际应用,你可以有效地将它们集成到基于 Kubernetes 的应用程序中,确保敏感数据的安全处理,并提高基础架构的整体安全性和可靠性。

总结

在本教程中,你已经学习了 Kubernetes 密钥(Secrets)的基础知识,包括它们的用途、类型,以及如何创建和管理它们。你已经探索了 Kubernetes 支持的不同类型的密钥,例如不透明密钥(Opaque Secrets)、服务账户令牌(Service Account Tokens)、Docker 配置密钥(Docker Config Secrets)和 TLS 密钥(TLS Secrets)。此外,你还学习了如何使用 Kubernetes API 和 YAML 清单来创建和管理密钥。通过理解和应用 Kubernetes 密钥,你可以确保敏感数据在基于 Kubernetes 的应用程序中得到安全存储和访问。