让我们快速了解一下 ConfigMaps 和 Secrets 是什么:

  • ConfigMaps:可以把它们看作是应用程序的私人助理,保存所有非敏感的配置数据。
  • Secrets:这是你存放所有机密信息的地方。密码、API 密钥,等等。

现在,你可能会想,“Secrets 不是应该是秘密吗?” 稍安勿躁,我们马上就会讨论这个有趣的部分!

创建 ConfigMaps 和 Secrets:操作指南

让我们卷起袖子,动手写一些 YAML 文件吧。

ConfigMaps:你的配置伙伴

创建一个 ConfigMap 简单得像吃蛋糕。以下是一个 YAML 片段,帮助你入门:


apiVersion: v1
kind: ConfigMap
metadata:
  name: my-awesome-config
data:
  APP_COLOR: blue
  APP_MODE: production

或者,如果你更喜欢命令行:


kubectl create configmap my-awesome-config --from-literal=APP_COLOR=blue --from-literal=APP_MODE=production

Secrets:不一般的秘密

现在,来看看主角——Secrets!以下是创建一个 Secret 的方法:


apiVersion: v1
kind: Secret
metadata:
  name: my-super-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64 编码的 "password123"

或者通过命令行:


kubectl create secret generic my-super-secret --from-literal=DB_PASSWORD=password123

但是,注意这里有个陷阱!你注意到 Secret 的数据只是 base64 编码了吗?稍后我们会详细讨论。

陷阱:不要掉进这些坑!

现在我们已经了解了基础知识,让我们来谈谈一些常见的错误,即使是经验丰富的开发者也会犯。相信我,我也曾经犯过这些错误。

1. “秘密”并不那么秘密

还记得我提到 Secrets 只是 base64 编码吗?这就是我们的第一个陷阱。许多开发者认为 Secrets 是加密的。剧透:它们不是!

“等等,”你可能会说,“base64 编码不够安全吗?” 如果你认为这很安全,那我有座桥要卖给你!

要真正保护你的 Secrets,你需要启用静态加密。以下是一个快速示例:


apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: c2VjcmV0LWtleS1oZXJl
      - identity: {}

2. 环境变量陷阱

使用环境变量存储秘密?这就像把你的房门钥匙放在门垫下。任何获得你 pod 访问权限的人都可以通过一个简单的命令查看所有环境变量:


kubectl exec -it my-pod -- env

相反,考虑将秘密挂载为文件。这不是万无一失的,但比之前好一些:


volumeMounts:
  - name: secret-volume
    mountPath: /etc/secrets
    readOnly: true
volumes:
  - name: secret-volume
    secret:
      secretName: my-super-secret

3. 'kubectl describe' 困境

你知道 kubectl describe secret 会显示 base64 编码的秘密数据吗?是的,暴露你的秘密就是这么简单。为了解决这个问题,使用 RBAC 限制谁可以描述秘密:


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

最佳实践:让你的 Kubernetes 集群像金库一样安全

现在我们已经讨论了不该做的事情,让我们来谈谈一些最佳实践,以确保你的 ConfigMaps 和 Secrets 比冬天松鼠的坚果储藏更安全。

1. 把 Secrets 当作真正的秘密

永远,绝对不要在你的应用程序代码中硬编码秘密。即使是为了在生产环境中进行“快速测试”。我们都经历过,但要抵制这种冲动!

2. 使用秘密管理器

考虑将 Kubernetes 与专用的秘密管理器集成,如 HashiCorp VaultAWS Secrets Manager。这些工具专为安全处理秘密而设计,并且可以无缝集成到 Kubernetes 中。

3. 定期轮换秘密

像对待你的内衣一样对待你的秘密——定期更换!设置一个自动轮换秘密的流程。你的未来自我会感谢你。

4. 监控泄漏

设置监控以检测秘密是否意外暴露。像 GitGuardian 这样的工具可以帮助你在秘密进入生产环境之前捕获它们。

何时使用 ConfigMaps 和 Secrets

现在我们已经讨论了如何和什么,让我们来谈谈何时使用。

使用 ConfigMaps:

  • 非敏感的配置数据
  • 特定环境的设置
  • 配置文件

使用 Secrets:

  • 密码
  • OAuth 令牌
  • SSH 密钥
  • 任何你不想让好奇的同事看到的数据

总结

ConfigMaps 和 Secrets 是 Kubernetes 生态系统中的强大工具,但强大的能力伴随着巨大的责任。明智地使用它们,妥善保护它们,你的应用程序将感谢你保持安全和可配置。

记住,在 Kubernetes 的世界里,多一点点偏执是有好处的。总是假设有人试图访问你的秘密,因为在互联网的狂野世界中,他们可能确实在这样做!

现在,去安全地配置吧,我的 Kubernetes 冒险者们!

“唯一真正安全的系统是一个关闭电源、浇筑在混凝土块中并用武装警卫封闭在铅衬房间中的系统。” - Gene Spafford

附言:如果你觉得这篇文章有帮助,考虑与团队分享。谁知道呢,你可能会拯救某人免于深夜“哎呀,我暴露了我们的生产数据库密码”的事件!