了解 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 才能使更改生效。