AWS EKS 部署

本文深入探讨了如何根据 AWS 和弹性 Kubernetes 服务 (EKS - Elastic Kubernetes Service) 的具体特性来调整您的 Bitwarden 自托管 Helm Chart 部署

请注意,本文中记录的某些附加组件要求您的 EKS 集群至少已启动一个节点。

要求

在继续安装之前,请确保满足以下要求:

  • 已安装 kubectl

  • 已安装 Helm 3

  • 您拥有 SSL 证书和密钥,或者可以通过证书提供程序创建 SSL 证书和密钥。

  • 您拥有 SMTP 服务器或可以访问云端 SMTP 提供程序。

  • 一个支持 ReadWriteMany 的存储类

  • 您已从 https://bitwarden.com/host 获取了安装 ID 和密钥。

无根模式要求

Bitwarden 会在启动时检测您的环境是否限制了用户容器的运行身份,并在检测到限制时自动以无根模式启动部署。要成功以无根模式部署,需满足以下两个选项之一:

虽然 Microsoft 要求 SQL 容器必须以 root 身份运行,但容器启动后会在执行应用程序代码前逐步降级为非 root 用户。

入口控制器

默认情况下, my-values.yaml 中定义了一个 nginx 控制器,并且需要一个 AWS 网络负载均衡器。目前不推荐使用 AWS 应用程序负载均衡器 (ALB - Application Load Balancer),因为它们不支持路径重写和基于路径的路由。

以下假设您在 AWS 证书管理器中保存有一个 SSL 证书,因为您将需要证书 Amazon 资源名称 (ARN)。

您的集群中还必须至少有一个节点正在运行。

要将网络负载均衡器连接到您的集群:

1、按照这些说明创建一个 IAM 策略和角色,然后在集群中安装 AWS 负载均衡器控制器。

2、运行以下命令为您的集群设置一个入口控制器。这将创建一个 AWS 网络负载均衡器。请注意,在此示例命令中,有些值必须替换,以配置为满足您的需求:

3、根据以下示例更新您的 my-values.yaml 文件,确保替换所有 REPLACE 占位符:

创建存储类

部署需要您提供的共享存储类,该存储类必须支持 ReadWriteMany。以下是如何创建符合要求的存储类的示例:

1、获取适用于您的 EKS 集群的 Amazon EFS CSI 驱动程序插件。这将要求您为您的集群创建一个 OIDC 提供程序,并为驱动程序创建一个 IAM 角色

2、在 AWS CloudShell 中,替换以下脚本中的 file_system_id= "REPLACE" 变量并在 AWS CloudShell 中运行它:

3、将 my-values.yaml 中的 sharedStorageClassName 的值设置为您在 metadata.name: 中指定的类的名称,例如:

使用 AWS Secrets Manager

部署需要使用 Kubernetes 机密对象来设置敏感值。虽然可以使用 kubectl create secret 命令来设置机密,但 AWS 客户可能倾向于使用 AWS Secrets Manager 和适用于 Kubernetes Secrets Store CSI 驱动程序的 AWS Secrets and Configuration Provider (ACSP)。

您需要将以下机密存储在 AWS Secrets Manager 中。请注意,您可以更改此处使用的密钥,但如果您这样做,还必须对后续步骤进行更改:

密钥

installationid

https://bitwarden.com/host 获取到的有效安装 ID。更多信息,请参阅我的安装 ID 和安装密钥是用来干什么的?

installationkey

https://bitwarden.com/host 获取到的有效安装密钥。更多信息,请参阅我的安装 ID 和安装密钥是用来干什么的?

smtpusername

您的 SMTP 服务器的有效用户名。

smtppassword

输入的 SMTP 服务器用户名的有效密码。

yubicoclientid

YubiCloud 验证服务或自托管 Yubico 验证服务器的客户端 ID。如果使用 YubiCloud,请在此处获取您的客户端 ID 和密钥 。

yubicokey

YubiCloud 验证服务或自托管 Yubico 验证服务器的机密密钥。如果使用 YubiCloud,请在此处获取您的客户端 ID 和密钥 。

globalSettings__hibpApiKey

您的 HaveIBeenPwned (HIBP) API 密钥,可在此处获取。此密钥允许用户在创账户时运行数据泄露报告并检查其主密码是否存在泄露。

如果您使用 Bitwarden SQL pod :sapassword

如果您使用自己的 SQL 服务器:dbconnectionString

连接到 Bitwarden 实例的数据库的凭据。所需内容取决于您使用的是附带的 SQL Pod 还是外部 SQL 服务器。

1、安全存储您的机密后,安装 ACSP。在 ACSP 安装过程中,您将:

安装和配置 Secrets Store CSI 驱动程序时,必须启用 syncSecret.enabled=true

  • 安装 Secrets Store CSI 驱动程序 (secrets-store-driver-csi)。

  • 安装 Secrets Store CSI 驱动程序的 AWS 提供程序 (secrets-store-driver-csi-provider-aws)。

2、创建权限策略以允许访问您的机密。该策略必须授予 secretsmanager:GetSecretValuesecretsmanager:DescribeSecret 权限,例如:

3、创建一个可以通过已创建的权限策略访问您的机密的服务账户,例如:

4、接下来,创建 SecretProviderClass,如以下示例所示。请务必:

  • region 替换为您所在的区域。

  • objectName 替换为您创建的 Secrets Manager 机密的名称(步骤 1)。

  • 如果您使用 IRSA,请使用与 EKS Pod 相同的 namespace

5、在您的 my-values.yaml 文件中,设置以下值:

  • secrets.secretName :设置为 SecretProviderClass 中定义的 secretName步骤 4)。

  • secrets.secretProviderClass :设置为 SecretProviderClass 中定义的 metedata.name步骤 4)。

  • component.admin.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.api.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.attachments.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.events.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.icons.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.identity.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.notifications.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.scim.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.sso.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • component.web.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • database.podServiceAccount :设置为为您的服务账户定义的名称(步骤 3)。

  • serviceAccount.name :设置为为您的服务账户定义的名称(步骤 3)。

  • serviceAccount.deployRolesOnly :设置为 true

最后更新于