我有 2 个应用程序,每个应用程序都有一个工作舵图表
应用程序 B 需要 API 密钥才能访问应用程序 A。 当(最初)安装我的应用程序时,我当前首先安装应用程序 A,等到它准备好,运行一些 API 调用来生成 API 密钥。然后我手动将 API 密钥存储到一个秘密中,然后由应用程序 B 使用。
我想让安装更容易,并想是否可以在我的舵图中自动执行此操作?
我的第一个想法是向 App B 添加一个 init-container(如果不可用),它会获取 API 密钥并将其保存到秘密中。不幸的是,似乎不可能从 Pod 内创建秘密(我的目标是仅创建密钥一次,而不是每次启动时都创建密钥)
还有其他我还没想到的方法吗?
您可以尝试使用 Helm 图表创建并清空机密,然后使用 init-container 更新它。 init-container 必须有一个具有适当角色的服务帐户才能“修补”秘密。
类似以下内容:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: foo
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames:
[
"foo-key-holder",
]
verbs: ["get", "delete", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: foo
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: foo
subjects:
- kind: ServiceAccount
name: foo
namespace: default
---
apiVersion: v1
kind: Secret
metadata:
name: foo-key-holder
type: Opaque
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: foo
---
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
serviceAccountName: foo
containers:
- name: foo
imagePullPolicy: IfNotPresent
image: bitnami/kubectl:latest
args: ["patch", "secret", "foo-key-holder", "-p", "'{\"data\": {\"key\":\"<base64_encoded_value>\"}}'"]
注意:在我的示例中,我使用 CLI 来修补机密。在您的用例中,您可以用更智能的脚本替换它,该脚本还检查密钥是否已更新。