ExternalSecretOperator 可以帮助您将统一存储和管理在 腾讯云凭据管理系统(SSM)中的密钥凭据,以 K8S 原生 Secret 对象的形式导入到集群中,并实现密钥数据的自动同步,实现由 SSM 来统一存储和管理密钥的生命周期。 限制条件
使用 ExternalSecrets 组件需要 Kubernetes 版本大于等于1.19。
操作系统镜像支持 x86 架构。
启用外部密钥访问能力
安装扩展组件
2. 为集群安装 ExternalSecrets(外部密钥访问组件)组件。
如果您还没有创建集群,可以在创建集群的时候安装 ExternalSecrets 组件。详情请参见 通过集群创建页安装。 如果您需要给已创建好的集群开启外部密钥访问能力,请在组件管理中安装 ExternalSecrets 组件。详情请参见 通过组件管理页安装。 3. 在组件管理页面查看组件状态。如组件状态为“成功”,代表组件部署完成。如下图所示:
使用方式
方式一:通过 AKSK 授权
步骤1:通过 AKSK 授权方式配置认证信息
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建。
3. 在按策略语法创建页面,选择空白模板,如下图所示:
4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}
5. 单击完成即可添加策略。
6. 在策略页面查看已创建的自定义策略,选择自定义策略 > 关联用户/组/角色,如下图所示:
在关联用户/组/角色页面,选择需要绑定的用户,如下图所示:
7. 单击确定。
步骤2:组件使用说明
该组件涉及两种自定义资源(CRD):SecretStore 用于存放访问凭据,ExternalSecret 用于指定 SecretStore 并存放需要同步的凭据基础信息。通过这种方式,权限和数据得到分离,提高了使用的灵活性。
在 SSM 凭据管理系统中,您需要添加以下凭据:
SecretName: hello-test
SecretData: {"name":"jack","password":"123"}
VersionId: v1
注意:
以下 secret、SecretStore、ExternalSecret 均在 default 命名空间中。
1. 创建 secret。
您可以使用以下命令创建 secret:
echo -n 'KEYID' > ./accessKeyId
echo -n 'SECRETKEY' > ./accessKeySecret
kubectl create secret generic tencent-credentials --from-file=./accessKeyId --from-file=./accessKeySecret
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 文件中:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: my-secretstore
spec:
provider:
tencent:
regionID: ap-guangzhou
auth:
secretRef:
accessKeyIDSecretRef:
name: tencent-credentials
key: accessKeyId
accessKeySecretSecretRef:
name: tencent-credentials
key: accessKeySecret
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 文件中:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: my-externalsecret
spec:
refreshInterval: 1m
secretStoreRef:
kind: SecretStore
name: my-secretstore
target:
name: my-secret-key-to-be-created
creationPolicy: Owner
data:
- secretKey: secret-key-to-be-managed
remoteRef:
key: hello-test
version: v1
property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-secretstore.yaml
kubectl apply -f my-externalsecret.yaml
5. 使用获取的凭据。
您可以将以下内容保存到 my-pod.yaml 文件中:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox
command:
- /bin/sh
- -c
- 'echo "Secret value: ${SECRET_KEY_TO_BE_MANAGED}"'
env:
- name: SECRET_KEY_TO_BE_MANAGED
valueFrom:
secretKeyRef:
name: my-secret-key-to-be-created
key: secret-key-to-be-managed
restartPolicy: Never
然后,使用以下命令部署 Pod 资源:
kubectl apply -f my-pod.yaml
最后,使用以下命令查看获取的凭据:
您将看到获取的凭据信息:
方式二:通过 AKSK 与角色扮演授权
步骤1:创建获取 SSM 凭据的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建。
3. 在按策略语法创建页面,选择空白模板,如下图所示:
4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}
5. 单击完成即可添加策略。
步骤2:为子账号赋予扮演角色策略
2. 在用户列表页面,单击新建用户。新建用户流程详情请参见 新建子用户。 步骤3:为创建的子用户赋予访问 SSM 凭据的策略
1. 在策略页面查看已创建的自定义策略,选择自定义策略 > 关联用户/组/角色,如下图所示: 2. 在关联用户/组/角色页面,选择需要绑定的子用户,如下图所示:
3. 单击确定。
步骤4:组件使用说明
该组件涉及两种自定义资源(CRD):SecretStore 用于存放访问凭据,ExternalSecret 用于指定 SecretStore 并存放需要同步的凭据基础信息。通过这种方式,权限和数据得到分离,提高了使用的灵活性。
在 SSM 凭据管理系统中,您需要添加以下凭据:
SecretName: hello-test
SecretData: {"name":"jack","password":"123"}
VersionId: v1
注意:
以下 secret、SecretStore、ExternalSecret 均在 default 命名空间中。
1. 创建 secret。
您可以使用以下命令创建 secret:
echo -n 'KEYID' > ./accessKeyId
echo -n 'SECRETKEY' > ./accessKeySecret
kubectl create secret generic tencent-credentials --from-file=./accessKeyId --from-file=./accessKeySecret
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 文件中:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: secretstore-assumerole
spec:
provider:
tencent:
regionID: ap-guangzhou
role: "qcs::cam::uin/12345:roleName/test-assume-role"
auth:
secretRef:
accessKeyIDSecretRef:
name: tencent-credentials
key: accessKeyId
accessKeySecretSecretRef:
name: tencent-credentials
key: accessKeySecret
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 文件中:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: external-secret-assumerole
spec:
refreshInterval: 1m
secretStoreRef:
kind: SecretStore
name: secretstore-assumerole
target:
name: my-secret-key-to-be-created
creationPolicy: Owner
data:
- secretKey: secret-key-to-be-managed
remoteRef:
key: hello-test
version: v1
property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-secretstore.yaml
kubectl apply -f my-externalsecret.yaml
5. 使用获取的凭据。
您可以将以下内容保存到 my-pod.yaml 中:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox
command:
- /bin/sh
- -c
- 'echo "Secret value: ${SECRET_KEY_TO_BE_MANAGED}"'
env:
- name: SECRET_KEY_TO_BE_MANAGED
valueFrom:
secretKeyRef:
name: my-secret-key-to-be-created
key: secret-key-to-be-managed
restartPolicy: Never
然后,使用以下命令部署 Pod 资源:
kubectl apply -f my-pod.yaml
最后,使用以下命令查看获取的凭据:
您将看到获取的凭据信息:
# ExternalSecret中获取的凭据信息如下所示。
Secret value: 123
方式三:通过 TKE OIDC 授权
步骤1:开启 OIDC 资源访问控制能力
2. 在集群管理页面,选择集群 ID,进入集群的基本信息页面。
3. 在集群基本信息中,单击 ServiceAccountIssuerDiscovery 右侧的。如下图所示: 说明:
如果您需要体验 ServiceAccountIssuerDiscovery 功能,请 提交工单 进行申请。 4. 进入修改 ServiceAccountIssuerDiscovery 相关参数页面,若系统提示您无法修改相关参数,请先进行服务授权。
在角色管理页面,查看授权策略 QcloudAccessForTKERoleInOIDCConfig,单击同意授权。 5. 授权完毕后,勾选“创建 CAM OIDC 提供商”和“创建webhook组件”,并填写客户端 ID,单击确定。如下图所示:
说明:
客户端 ID 是选填参数,当不填写时,默认值是 "sts.cloud.tencent.com",本文示例中创建 CAM OIDC 提供商采用默认值。
6. 返回集群详情页,当 ServiceAccountIssuerDiscovery 可再次编辑时,表明本次开启 OIDC 资源访问控制结束。
注意:
"service-account-issuer" 和 "service-account-jwks-uri" 参数值不允许编辑,采用默认规则。
7. 进入修改 ServiceAccountIssuerDiscovery 相关参数页面,系统将提示“您创建的身份提供商已存在,前往查看”。单击前往查看。如下图所示:
8. 在集群信息 > 组件管理中,如在列表看到 pod-identity-webhook 组件状态是“成功”,即表示安装组件成功。如下图所示:
步骤2:创建获取 SSM 凭据的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建。
3. 在按策略语法创建页面,选择“空白模板”,如下图所示:
4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"*"
]
}
],
"version": "2.0"
}
5. 单击完成即可添加策略。
步骤3:新建 OIDC 角色
2. 在角色页面,选择新建角色 > 身份提供商。
3. 在新建自定义角色页面,参考以下信息进行设置。
身份提供商类型:选择 OIDC。
选择身份提供商:选择本次为哪个身份提供商创建角色。
使用条件:填写 oidc:aud 的 value 值。
注意:
身份提供商的 value 值标识为 $my_provider_id。
oidc:aud 的 value 值需要和 CAM OIDC 提供商的客户端 ID value 值保持一致。
oidc:aud 的 value 值标识为$my_pod_audience
,当oidc:aud的 value 值有多个时,任选其中之一即可。
4. 单击下一步,进入配置角色策略页面,选择在 步骤2 中创建并获取 SSM 的策略,如下图所示: 5. 单击下一步,进入配置角色标签页面,若不需要设置标签可直接下一步,如下图所示:
6. 单击下一步,进入审阅页面,编辑角色名称、角色描述,如下图所示:
7. 单击完成。角色创建完成后,进入角色详情页,可以查看 OIDC 角色的 RoleArn 与该角色拥有的权限,如下图所示:
注意:
RoleArn 的 value 值标识为$my_pod_role_arn
。
步骤4:组件使用说明
1. 创建 ServiceAccount。
您可以将以下内容保存到 my-serviceaccount.yaml 中:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
annotations:
tke.cloud.tencent.com/role-arn: $my_pod_role_arn
tke.cloud.tencent.com/audience: $my_pod_audience
tke.cloud.tencent.com/providerID: $my_provider_id
说明:
将 $my_pod_role_arn 替换为 RoleArn 的 value 值。
将 $my_pod_audience 替换为 oidc:aud 的 value 值。
将 $my_provider_id 替换为“身份提供商”。
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 中:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: secretstore-tkeoidc
spec:
provider:
tencent:
regionID: ap-guangzhou
auth:
serviceAccountRef:
name: my-serviceaccount
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 中:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: external-secret-tkeoidc
spec:
refreshInterval: 1h
secretStoreRef:
kind: SecretStore
name: secretstore-tkeoidc
target:
name: my-secret-key-to-be-created
creationPolicy: Owner
data:
- secretKey: secret-key-to-be-managed
remoteRef:
key: hello-test
version: v1
property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-serviceaccount.yaml
kubectl apply -f my-secretstore.yaml
kubectl apply -f my-externalsecret.yaml
5. 查看目标 Secret 是否创建成功,请执行以下命令:
kubectl get secret my-secret-key-to-be-created -o yaml
注意:
在没有关闭同步刷新的前提下,可以修改 SSM 凭据管理系统中的密钥内容,等到刷新时间到达后,目标 secret 会完成同步。
本页内容是否解决了您的问题?