了解 Kubernetes 机密

已完成

使用分布式应用程序时最大的考量之一是如何管理敏感信息,如密码、连接和类似数据。 Kubernetes 让你可以使用名为“机密”的资源来保护这些数据。

了解机密

在 Kubernetes 中,机密让你可以使用比 Pod 和部署中的纯文本格式更安全的方式存储敏感信息。 机密旨在存储密码和其他敏感数据。

Kubernetes 机密以 base64 格式对数据进行编码。 虽然 base64 不是加密算法,但 Kubernetes 可以看到信息已编码,并且可以在命令输出中隐藏此信息,例如 kubectl describe。 此过程不会在纯文本配置中发生。 机密始终限定于单个命名空间,以避免敏感数据进一步暴露给群集中的其他工作负载。

机密类型

有不同的机密类型。 最常见也是默认的类型是 Opaque,它可以保存用户定义的任意数据。 其他常见类型包括:

  • kubernetes.io/service-account-token:定义一个服务帐户令牌,它在创建新的服务帐户时自动创建。
  • kubernetes.io/basic-auth:基本身份验证的凭据。
  • kubernetes.io/tls:例如,TLS 客户端或服务器数据,用于从入口资源中提供 HTTPS 连接。

提示

有关详细信息,请参阅官方 Kubernetes 机密文档

创建和使用机密

根据官方的 Kubernetes 机密文档,可以通过三种不同的方式使用机密:

  • 作为卷中的文件装载在 Pod 或部署中的容器上。
  • 在 Pod 或部署规范中作为环境变量引用。
  • 当 Kubelet 通过 Pod 规范中的 imagePullSecret 密钥从私有注册表中提取图像时使用。

可以使用 YAML 清单文件或 kubectl 命令像创建任何其他 Kubernetes 资源一样创建机密。 机密规范如下所示:

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
data:
  key_name: "key value in base64 format"

对于具有此规范的机密,需要在创建该机密之前对值进行编码。 如果你想用纯文本值创建机密并让 Kubernetes 对其进行自动编码,则可以使用 stringData 而不是 data

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
stringData:
  key_name: "key value in plain format"

应用程序会接收解码后的机密字符串作为传递给它的值,而不是编码后的机密字符串。

机密更新

在 pod 中,作为卷装载的所有机密会在其值发生更改时自动进行更新。 由于 Kubelet 配置的原因,此项更改可能不会立即发生,但它会自动发生,因此无需重启 Pod。

如果机密绑定到环境变量,则它们不会自动更新,因此需要重启 Pod 才能使更改生效。

知识检查

1.

为什么 Kubernetes 机密比纯文本值更安全?

2.

如何在应用程序中使用机密?

3.

如何在机密中使用 base64?