上云无忧 > 文档中心 > 腾讯云容器服务实战教程 - 使用 ExternalSecretOperator 导入腾讯云 SSM 凭据
容器服务 TKE
腾讯云容器服务实战教程 - 使用 ExternalSecretOperator 导入腾讯云 SSM 凭据

文档简介:
ExternalSecretOperator 可以帮助您将统一存储和管理在 腾讯云凭据管理系统(SSM)中的密钥凭据,以 K8S 原生 Secret 对象的形式导入到集群中,并实现密钥数据的自动同步,实现由 SSM 来统一存储和管理密钥的生命周期。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠
ExternalSecretOperator 可以帮助您将统一存储和管理在 腾讯云凭据管理系统(SSM)中的密钥凭据,以 K8S 原生 Secret 对象的形式导入到集群中,并实现密钥数据的自动同步,实现由 SSM 来统一存储和管理密钥的生命周期。

限制条件

使用 ExternalSecrets 组件需要 Kubernetes 版本大于等于1.19。
操作系统镜像支持 x86 架构。

启用外部密钥访问能力

安装扩展组件

1. 登录 容器服务控制台
2. 为集群安装 ExternalSecrets(外部密钥访问组件)组件。
如果您还没有创建集群,可以在创建集群的时候安装 ExternalSecrets 组件。详情请参见 通过集群创建页安装
如果您需要给已创建好的集群开启外部密钥访问能力,请在组件管理中安装 ExternalSecrets 组件。详情请参见 通过组件管理页安装

3. 在组件管理页面查看组件状态。如组件状态为“成功”,代表组件部署完成。如下图所示:

使用方式

方式一:通过 AKSK 授权

步骤1:通过 AKSK 授权方式配置认证信息

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择空白模板,如下图所示:

4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
		
		
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"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: SecretSt

ore name: my-secretstore target: name: my-secret-key-to-be-created creation

Policy: Owner data: - secretKey: secret-key-to-be-managed remoteRef: key:

hello-test version: v1 # option 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
最后,使用以下命令查看获取的凭据:
		
		
kubectl logs my-pod
您将看到获取的凭据信息:
		
		
# ExternalSecret中获取的凭据信息如下所示。 Secret value: 123

方式二:通过 AKSK 与角色扮演授权

步骤1:创建获取 SSM 凭据的策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择空白模板,如下图所示:

4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
		
		
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"version": "2.0"
}
说明:
授权接口访问特定资源:创建访问控制策略
5. 单击完成即可添加策略。

步骤2:为子账号赋予扮演角色策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的用户 > 用户列表。
2. 用户列表页面,单击新建用户。新建用户流程详情请参见 新建子用户
3. 为创建的子用户赋予扮演角色的策略。详情请参见 为子账号赋予扮演角色策略

步骤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: accessKeyIDSec

retRef: name: tencent-credentials key: accessKeyId accessKeySecretSecretRef:

name: tencent-credentials key: accessKeySecret

说明:
role 字段在 步骤2 中获取。
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
最后,使用以下命令查看获取的凭据:
		
		
kubectl logs my-pod
您将看到获取的凭据信息:
		
		
# ExternalSecret中获取的凭据信息如下所示。 Secret value: 123

方式三:通过 TKE OIDC 授权

步骤1:开启 OIDC 资源访问控制能力

1. 登录 容器服务控制台,选择左侧导航中的集群
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 凭据的策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择“空白模板”,如下图所示:

4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容。创建访问控制策略,详情请参见创建访问控制策略
		
		
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"version": "2.0"
}
说明:
授权接口访问特定资源:创建访问控制策略
5. 单击完成即可添加策略。

步骤3:新建 OIDC 角色

1. 登录 腾讯云访问管理控制台,选择左侧导航中的角色
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 # option 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 会完成同步。
相似文档
  • 将已容器化的业务部署至 Kubernetes 的过程并不复杂,若业务用于正式生产环境,则需结合业务场景和部署环境进行方案选型及配置调优。
  • 容器的 request 及 limit 需根据服务类型、需求及场景进行灵活设置。本文结合实际生产经验进行分析总结,您可参考下文并进行相应的配置调整。
  • 设置 request 能够使 Pod 调度到有足够资源的节点上,但无法做到更细致的控制。本文介绍通过亲和性、污点与容忍,使 Pod 能够被调度到合适的节点上,让资源得到充分的利用。
  • 本文结合实际生产经验介绍如何在业务中结合弹性伸缩使资源得到充分利用,您可参考下文并进行相应的配置调整。 应对流量突发型业务: 通常业务会有高峰和低谷,为了更合理的利用资源,可为服务定义 HPA,实现根据 Pod 的资源实际使用情况来对服务进行自动扩缩容。在业务高峰期时自动扩容 Pod 数量来支撑服务,在业务低谷时自动缩容 Pod 释放资源,以供其他服务使用。
  • 高可用性(High Availability,HA)是指应用系统无中断运行的能力,通常可通过提高该系统的容错能力来实现。一般情况下,通过设置 replicas 给应用创建多个副本,可以适当提高应用容错能力,但这并不意味着应用就此实现高可用性。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部