AWS EKS 部署
对应的官方文档地址
本文探讨了如何根据特定于 AWS 和弹性 Kubernetes 服务 (Elastic Kubernetes Service - EKS) 调整您的 Bitwarden 自托管 Helm Chart 部署。
请注意,本文中记录的某些附加组件要求您的 EKS 集群至少已启动一个节点。
要求
在继续安装之前,请确保满足以下要求:
已安装 kubectl。
已安装 Helm 3。
您拥有 SSL 证书和密钥,或者可以通过证书提供商创建 SSL 证书和密钥。
您拥有 SMTP 服务器或可以访问云 SMTP 提供商。
一个支持 ReadWriteMany 的存储类。
您有一个从 https://bitwarden.com/host 获取到的安装 ID 和密钥。
无根模式要求
Bitwarden 会在启动时检测您的环境是否限制了用户容器的运行身份,并在检测到限制时自动以无根模式启动部署。要成功以无根模式部署,需满足以下两个选项之一:
部署外部 MSSQL 数据库,而不是 Helm 图表中默认包含的 SQL 容器。
使用服务账户、pod 安全上下文或其他方法为包含的 SQL 容器分配高级权限。
入口控制器
默认情况下, my-values.yaml 中定义了一个 nginx 控制器,并且需要一个 AWS 网络负载均衡器。目前不推荐使用 AWS 应用负载均衡器 (Application Load Balancer - ALB),因为它们不支持路径重写和基于路径的路由。
要将网络负载均衡器连接到您的集群:
1、按照这些说明创建一个 IAM 策略和角色,然后在集群中安装 AWS 负载均衡器控制器。
2、运行以下命令为您的集群设置一个入口控制器。这将创建一个 AWS 网络负载均衡器。请注意,在此示例命令中,有些值必须替换,以配置为满足您的需求:
3、根据以下示例更新您的 my-values.yaml 文件,确保替换所有 REPLACE 占位符:
创建存储类
部署需要您提供的共享存储类,该存储类必须支持 ReadWriteMany。以下是如何创建符合要求的存储类的示例:
以下假设您已创建了一个 AWS 弹性文件系统 (Elastic File System - EFS)。如果还没有,请立即创建一个。无论哪种情况,请记下您的 EFS 文件系统 ID,在此过程中您将需要用到它。
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 secrets 对象来设置敏感值。虽然可以使用 kubectl create secret 命令来设置 secrets,但 AWS 客户可能倾向于使用 AWS Secrets Manager 和适用于 Kubernetes Secrets Store CSI 驱动程序的 AWS Secrets 和 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 和密钥 。
如果您使用 Bitwarden SQL pod :sapassword
如果您使用自己的 SQL 服务器:dbconnectionString
连接到 Bitwarden 实例的数据库的凭据。所需内容取决于您使用的是附带的 SQL pod 还是外部 SQL 服务器。
1、安全存储您的机密后,安装 ACSP。在 ACSP 安装过程中,您将:
安装 Secrets Store CSI 驱动程序 (
secrets-store-driver-csi)。安装 Secrets Store CSI 驱动程序的 AWS 提供程序 (
secrets-store-driver-csi-provider-aws)。
2、创建权限策略以允许访问您的机密。该策略必须授予 secretsmanager:GetSecretValue 和 secretsmanager: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。
最后更新于