Helm 中自动生成秘密

Helm 中自动生成秘密

团队 Mail.ru 的 Kubernetes aaS 翻译了一个简短的注释 关于如何在更新时自动生成 Helm Secret。 以下是文章作者——开发SaaS解决方案的公司Intoware的技术总监的文字。

容器很酷。 起初我是反容器的(我不好意思承认),但现在我完全支持使用这项技术。 如果您正在阅读本文,那么您希望已经成功地在 Docker 的海洋中航行,认识到 Kubernetes 的好处,并使用 Helm 让您的生活变得更加轻松。

然而,有些事情显然比需要的更困难。

更新时如何自动生成secret?

Kubernetes 密钥是一种资源,其中包含您想要在代码中使用的键/值对。 这些可能是数据库连接字符串、电子邮件密码等。 通过使用机密,您可以在代码和设置之间创建清晰的分离,使您可以轻松自定义不同的部署,而无需更改代码库。

常见的情况是两个模块必须使用公用密钥进行通信。 集群外部的任何人都不应该知道此密钥,因为它用于集群内的一对一通信。

制造秘密

通常,要在 Helm 中创建机密,您需要:

  • 在值文件中描述秘密;
  • 在部署期间重新定义它;
  • 在部署/pod 中引用它;
  • ... 利润!

它通常看起来像这样:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

使用values.yml中的值的简单Kubernetes秘密

但假设您不想在值文件中指定您的秘密。

当部署需要共享密钥时,有很多选项,该共享密钥必须在安装过程中生成。

在上面的模块到模块通信示例中,不希望在部署之外共享秘密。 因此,Helm 非常需要具有自动生成秘密的机制,而无需直接指定它。

挂钩

挂钩允许您在安装过程中在特定位置运行代码。 首次安装后可能需要运行配置作业,或者在执行任何更新之前可能需要完成清理。

为了解决添加安装过程中生成的密钥的问题,预安装挂钩是理想的选择。 但有一个问题:您无法在更新时自动生成密钥。 Hooks 将在每次更新时起作用。

如果您已经生成了您的秘密并且您的第一次安装尚未发生,那么请停止阅读,预安装挂钩将非常适合您。

但是,如果秘密是更新的一部分(可能是安装过程中不存在的新功能),那么遗憾的是您无法创建只能运行一次的预安装挂钩。

功能

Helm 功能允许您将各种脚本元素添加到部署脚本中。

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

此示例显示 apiKey 密钥的值将是安装期间生成的新 UUID。

Helm 包含一个真正广泛的功能库,它利用令人惊叹的 GO 模板功能和 Sprig 的功能库来创建自定义部署。

查找功能

Helm 3.1 中添加 查找功能,它允许您请求现有部署并且:

  • 检查资源是否存在;
  • 返回现有资源的值以供以后使用。

使用这两种功能,我们可以创建一次性、动态生成的秘密!

# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: some-awesome-secret
type: Opaque

# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
  apiKey: {{ $secret.data.apiKey }}

# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
  apiKey: {{ uuidv4 | quote }}
{{ end }}

每当服务器应用新的更新时,Helm 都会生成新的密钥值(如果还没有密钥)或重用现有值。

祝你好运!

关于该主题还可以阅读什么:

  1. Kubernetes 中的三个级别的自动缩放以及如何有效地使用它们.
  2. 本着盗版精神的 Kubernetes 提供了实施模板.
  3. 我们在 Telegram 中围绕 Kubernetes 的频道.

来源: habr.com

添加评论