问题描述
在使用Helm Charts部署一些Webhook处理程序时遇到了问题。这些处理程序需要连接到它们所在的集群,以便在集群中部署配置。目前已经实现了这个功能,但是在将其中一个步骤移入Helm Chart中时遇到了困难。当Chart创建服务账号时,会为其创建一个随机命名的密钥:
$ oc describe sa sa-build-webhook-realworld
Name: sa-build-webhook-realworld
Namespace: your-eng2
Labels: app=sa-build-webhook-realworld
Annotations:
Image pull secrets: sa-build-webhook-realworld-dockercfg-4qz9g
Mountable secrets: sa-build-webhook-realworld-token-bqtnw
sa-build-webhook-realworld-dockercfg-4qz9g
Tokens: sa-build-webhook-realworld-token-bqtnw
sa-build-webhook-realworld-token-k7lq8
Events: <none>
用户想要将这个密钥声明性地设置在部署配置中。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案
在OpenShift中,你可以通过设置spec.serviceAccountName
字段来为部署配置(DeploymentConfig)指定使用的服务账号,这将自动将密钥挂载到容器中。
以下是在Helm Chart的YAML文件中如何声明性地设置服务账号及挂载密钥的步骤:
- 打开Helm Chart的YAML文件,可以在这里找到相应的文件。
- 找到或添加
spec
部分,添加或修改serviceAccountName
字段,将其设置为你想要使用的服务账号的名称,即sa-build-webhook-realworld
。 - 确保部署配置中的容器可以访问挂载的密钥,你可以在容器的配置中指定挂载路径。
以下是一个示例Helm Chart的YAML片段:
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
name: webhook-realworld
labels:
app: webhook-realworld
spec:
replicas: 1
template:
metadata:
labels:
app: webhook-realworld
spec:
serviceAccountName: sa-build-webhook-realworld
containers:
- name: webhook-container
image: your_webhook_image:latest
volumeMounts:
- name: sa-secret-volume
mountPath: /sa-secret-volume
volumes:
- name: sa-secret-volume
secret:
secretName: sa-build-webhook-realworld-token-bqtnw
在上述示例中,我们将serviceAccountName
字段设置为sa-build-webhook-realworld
,以使用该服务账号。然后,我们在容器配置中指定了挂载路径,并且创建了一个名为sa-secret-volume
的卷,将其挂载为一个密钥类型的Secret。这样,在部署配置中使用这个服务账号时,相关的密钥将会被自动挂载到容器中。
通过这种方式,你可以在Helm Chart的YAML文件中声明性地设置服务账号及挂载密钥,从而实现部署配置和密钥的关联。
注意事项
值得注意的是,对于BuildConfig对象来说,情况稍有不同。它们的spec.serviceAccount
字段命名不一致,设置该字段不会自动挂载与服务账号相关的密钥。另外,需要明确设置构建为“image puller”,否则构建不会自动拉取镜像。在OpenShift 3.11版本中,这个配置选项可能并不实用。
总之,在使用OpenShift时,通过设置spec.serviceAccountName
字段,你可以实现声明性地挂载服务账号密钥,从而实现部署配置和密钥之间的关联。