如何在 Kubernetes 中部署机密信息

KubernetesKubernetesBeginner
立即练习

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

简介

在 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-419025{{"如何在 Kubernetes 中部署机密信息"}} kubernetes/create -.-> lab-419025{{"如何在 Kubernetes 中部署机密信息"}} kubernetes/apply -.-> lab-419025{{"如何在 Kubernetes 中部署机密信息"}} kubernetes/describe -.-> lab-419025{{"如何在 Kubernetes 中部署机密信息"}} kubernetes/config -.-> lab-419025{{"如何在 Kubernetes 中部署机密信息"}} end

Kubernetes 中的机密信息基础

什么是 Kubernetes 机密信息?

Kubernetes 机密信息是用于帮助管理敏感信息的对象,如密码、OAuth 令牌、SSH 密钥及其他机密数据。它们提供了一种将敏感配置数据与容器镜像和 Pod 规范分离的方式,从而增强了应用程序部署中的安全性和灵活性。

Kubernetes 机密信息的类型

Kubernetes 支持多种类型的机密信息,以适应不同的用例:

机密信息类型 描述 用例
Opaque 默认机密信息类型 通用键值对
Docker Registry 存储 Docker 镜像仓库凭证 拉取私有镜像
TLS 存储 TLS 证书 HTTPS 及安全通信
Service Account 自动创建的令牌 向 API 服务器进行身份验证

机密信息创建机制

机密信息可通过多种方法创建:

graph TD A[机密信息创建方法] --> B[kubectl 命令] A --> C[YAML 配置] A --> D[Kubernetes API] A --> E[Helm 图表]

1. 使用 kubectl 命令

直接从命令行创建机密信息:

## 创建一个通用机密信息
kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=mysecretpassword

## 从文件创建机密信息
kubectl create secret generic ssl-cert \
  --from-file=tls.crt=server.crt \
  --from-file=tls.key=server.key

2. YAML 配置

在 YAML 文件中定义机密信息以进行版本控制部署:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
stringData:
  username: admin
  password: mysecretpassword

机密信息编码

机密信息采用 Base64 编码,以确保安全存储和传输:

## 编码一个值
echo -n "mysecretpassword" | base64

## 解码一个值
echo "bXlzZWNyZXRwYXNzd29yZA==" | base64 --decode

关键注意事项

  • 机密信息是命名空间作用域的
  • 机密信息的最大大小为 1MB
  • 机密信息存储在 etcd 中,并且可以在静态存储时进行加密
  • 避免将机密信息提交到版本控制系统

用例

  1. 数据库连接凭证
  2. API 密钥和令牌
  3. TLS 证书
  4. Docker 镜像仓库认证

通过了解这些基础知识,你可以按照 LabEx 推荐的最佳实践,在你的 Kubernetes 集群中有效地管理敏感信息。

机密信息配置

机密信息配置方法

1. 从字面量值创建机密信息

## 使用字面量值创建通用机密信息
kubectl create secret generic app-credentials \
  --from-literal=DB_USERNAME=myuser \
  --from-literal=DB_PASSWORD=mysecretpassword

2. 从文件创建机密信息

## 从单个文件创建机密信息
kubectl create secret generic ssl-certs \
  --from-file=tls.crt=./server.crt \
  --from-file=tls.key=./server.key

## 从整个目录创建机密信息
kubectl create secret generic config-files \
  --from-file=./config-directory

机密信息配置策略

graph TD A[机密信息配置] --> B[直接创建] A --> C[声明式 YAML] A --> D[环境变量] A --> E[卷挂载]

3. 声明式 YAML 配置

apiVersion: v1
kind: Secret
metadata:
  name: database-secret
type: Opaque
stringData:
  DB_HOST: localhost
  DB_PORT: "5432"
  DB_USERNAME: admin
  DB_PASSWORD: securepassword

在 Pod 中使用机密信息

环境变量注入

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: myapp
      image: myapp-image
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: database-secret
              key: DB_USERNAME

卷挂载配置

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
    - name: myapp
      image: myapp-image
      volumeMounts:
        - name: secret-volume
          mountPath: "/etc/secrets"
          readOnly: true
  volumes:
    - name: secret-volume
      secret:
        secretName: database-secret

机密信息类型与配置

机密信息类型 用例 配置方法
Opaque 通用键值对机密信息 kubectl create/YAML
Docker Registry 镜像拉取凭证 kubectl create-secret-docker-registry
TLS SSL/TLS 证书 kubectl create secret tls

高级机密信息管理

不可变机密信息

apiVersion: v1
kind: Secret
metadata:
  name: immutable-secret
type: Opaque
immutable: true
stringData:
  key: value

Base64 编码注意事项

## 手动编码机密信息值
echo -n "mysecretvalue" | base64

机密信息配置的最佳实践

  1. 使用特定于环境的机密信息
  2. 定期轮换机密信息
  3. 限制对机密信息的访问
  4. 使用外部机密信息管理工具

借助 LabEx 的全面指南,你可以有效地配置和管理 Kubernetes 机密信息,以增强应用程序安全性。

机密信息最佳实践

安全建议

1. 静态加密

apiVersion: v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64编码后的密钥>

2. 访问控制策略

graph TD A[机密信息访问控制] --> B[基于角色的访问控制(RBAC)策略] A --> C[命名空间隔离] A --> D[最小权限原则]

机密信息管理技术

轮换机密信息

## 机密信息轮换脚本示例
#!/bin/bash
NEW_PASSWORD=$(openssl rand -base64 16)
kubectl create secret generic db-credentials \
  --from-literal=password=$NEW_PASSWORD \
  --dry-run=client -o yaml | kubectl apply -f -

外部机密信息管理

工具 功能 集成方式
HashiCorp Vault 高级机密信息管理 原生Kubernetes集成
AWS Secrets Manager 云原生机密信息 外部机密信息存储库
Azure Key Vault 微软生态系统 Kubernetes容器存储接口(CSI)驱动程序

安全的机密信息处理

避免常见错误

## 不良实践
apiVersion: v1
kind: Secret
metadata:
  name: bad-secret
stringData:
  password: "明文密码"  ## 避免这样做!

## 良好实践
apiVersion: v1
kind: Secret
metadata:
  name: good-secret
type: Opaque
data:
  password: base64编码后的值

监控与审计

机密信息访问日志记录

## 启用API服务器审计日志记录
kube-apiserver \
  --audit-log-path=/var/log/kubernetes/audit.log \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3

最佳实践清单

  1. 切勿将机密信息提交到版本控制系统
  2. 使用短期凭证
  3. 实施自动轮换
  4. 尽量减少机密信息暴露
  5. 使用外部机密信息管理工具

高级安全配置

Pod安全策略

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted-secrets
spec:
  readOnlyRootFilesystem: true
  forbiddenSysctls:
    - "*"

实际建议

  1. 使用特定于环境的机密信息
  2. 实施严格的基于角色的访问控制(RBAC)策略
  3. 对静态机密信息进行加密
  4. 定期审计机密信息访问
  5. 尽可能使用不可变机密信息

借助LabEx的全面指南,你可以在Kubernetes中实施强大的机密信息管理,确保最大程度的安全性和合规性。

总结

在Kubernetes中理解并实施恰当的机密信息管理,对于维护应用程序安全和操作完整性至关重要。通过遵循上述最佳实践,开发者和DevOps专业人员能够有效地保护敏感信息,将安全风险降至最低,并确保机密凭证在Kubernetes集群中无缝部署。