Overview
Atlas API 服务帐户提供一种安全的、基于令牌的替代方案,可用于使用 Atlas Administration API 对 Atlas Kubernetes Operator 进行身份验证,代替 程序化 API 密钥。服务帐户使用源自 clientId 和 clientSecret 对的短期访问令牌,降低长期凭证曝光的风险。
MongoDB 建议对新部署使用服务账户而不是程序化 API 密钥。服务账户具有以下优点:
由操作符托管的带自动令牌刷新的基于令牌的身份验证。
支持组织级别和项目级别范围。
可审计的独立身份,适用于 Atlas Kubernetes Operator 工作负载。
重要
服务帐户密钥过期
与 API 密钥不同,服务账户秘钥是可过期的。您可以设置最长一年的 TTL。您必须在服务账户秘钥过期之前轮换服务账户秘钥,以维护不间断的访问。随着过期日期的临近,Atlas 会自动发出“服务账户秘钥即将过期”警报。请相应地规划轮换安排。
这适用于组织级和项目级服务账户。
先决条件
在开始之前,请确保您具备以下内容:
具有组织级服务账户的 Organization Owner 角色或项目级服务账户的 Project Owner 角色的 Atlas 账户。
安装了 Atlas Kubernetes Operator 的运行中 Kubernetes 集群。
kubectl访问运行 Atlas Kubernetes Operator 的 Kubernetes 集群。
步骤
在 Atlas 中创建服务帐户
使用 Atlas 用户界面或 Atlas Administration API 在 Atlas 中创建服务帐户。要了解如何创建组织级服务帐户,请参阅在组织中创建服务帐户。要了解如何创建项目级服务帐户,请参阅在项目中创建服务帐户。
复制clientId和clientSecret。安全存储它们,因为创建后您无法再次检索clientSecret。
创建 Kubernetes 连接秘密
创建包含 orgId、clientId 和 clientSecret的 Kubernetes secret。
对于
globalAtlas Kubernetes Operator 密钥,运行以下命令:注意
globalAtlas Kubernetes Operator密钥的名称必须符合预定义的格式。Atlas Kubernetes Operator部署的默认名称是mongodb-atlas-operator。因此,密钥 应命名为mongodb-atlas-operator-service-account。kubectl create secret generic mongodb-atlas-operator-service-account \ --from-literal="orgId=<the_atlas_organization_id>" \ --from-literal="clientId=<the_service_account_client_id>" \ --from-literal="clientSecret=<the_service_account_client_secret>" \ -n <operator_namespace> kubectl label secret mongodb-atlas-operator-service-account \ atlas.mongodb.com/type=credentials \ -n mongodb-atlas-system 对于
projectAtlas Kubernetes Operator 密钥,运行以下命令:kubectl create secret generic my-project-connection \ --from-literal="orgId=<the_atlas_organization_id>" \ --from-literal="clientId=<the_service_account_client_id>" \ --from-literal="clientSecret=<the_service_account_client_secret>" \ -n <atlas_project_namespace> kubectl label secret my-project-connection \ atlas.mongodb.com/type=credentials \ -n <atlas_project_namespace>
参考 Secret 来源 AtlasProject
使用 spec.connectionSecretRef.name 从 自定义资源参考 秘密 。AtlasProject
如果您创建了 global 秘密,则所有项目都会默认使用它,无需进行额外配置。
如果创建了 project 秘密,请将 connectionSecretRef 添加到 AtlasProject 自定义资源中:
apiVersion: atlas.mongodb.com/v1 kind: AtlasProject metadata: name: my-project spec: name: "My Project" connectionSecretRef: name: my-project-connection
验证操作符使用服务账户
配置 秘密 后,验证 Atlas Kubernetes Operator 是否成功认证:
kubectl get atlasproject my-project -o jsonpath='{.status.conditions}'
检查 Ready 条件是否为 True。如果 Atlas Kubernetes Operator 无法使用 Service Account 凭证进行身份验证,条件中将显示描述该问题的错误。
YAML 示例
以下示例展示为服务账户配置的连接秘密:
apiVersion: v1 kind: Secret metadata: name: my-project-connection namespace: atlas-operator labels: atlas.mongodb.com/type: credentials type: Opaque stringData: orgId: "5d39f0719ccf646554345678" clientId: "mdb_sa_id_67890abcdef1234567890abc" clientSecret: "mdb_sa_sk_abcdef1234567890abcdef12"
Considerations
令牌管理
Atlas Kubernetes Operator 自动托管访问令牌。当 Atlas Kubernetes Operator 检测到 Service Account Connection Secret 时,它会从 Atlas Administration API 获取访问令牌,并将其存储在单独的 Kubernetes secret 中。请勿手动编辑或删除 Access Token Secret。Atlas Kubernetes Operator 会根据需要刷新令牌。
凭证轮换
在 Atlas 中轮换服务账户秘密时:
使用新的
clientSecret更新 Kubernetes 连接秘密。Atlas Kubernetes Operator 会检测到变更,并在下一个协调周期中获取新的访问令牌。无需重启。
重要
服务账户秘密的最大 TTL 为一年。监控 Atlas 中的“服务账户秘密即将过期”警报,并在秘密过期前进行轮换,以避免身份验证失败。这适用于组织级和项目级服务账户。
IP 访问列表
服务帐户的 API 访问列表必须包括 Atlas Kubernetes Operator pod 使用的出口 IP 地址或 CIDR 块,与 程序化 API 密钥相同。如果操作符 pod 的出口 IP 不在服务帐户访问列表中,API 请求将失败。