Azure AKS 部署

本文将指导您使用 Azure 和 AKS 的特定功能来修改您的 Bitwarden 自托管 Helm Chart 部署

要求

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

  • 已安装 kubectl

  • 已安装 Helm 3

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

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

  • 一个支持 ReadWriteMany 的存储类

  • 您有一个从 https://bitwarden.com/host 获取到的安装 ID 和密钥。

无根模式要求

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

  • 部署外部 MSSQL 数据库,而不是 Helm 图表中默认包含的 SQL 容器。

  • 使用服务账户、pod 安全上下文或其他方法为包含的 SQL 容器分配高级权限。

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

入口控制器

本部分介绍了可在 Azure AKS 部署中使用的入口控制器的 2 个选项:

  • 使用 Azure nginx 入口控制器可选择与 Azure DNS 集成以进行区域管理,并与 Azure Key Vault 集成以进行证书颁发。

  • 使用 Azure 应用程序网关入口控制器 (AGIC) 在应用程序负载均衡器后面部署 Bitwarden。

Azure nginx

Azure 提供了一个 nginx 入口控制器选项,该选项支持应用程序路由插件,并且可以选择与 Azure DNS 集成以进行区域管理,以及与 Azure Key Vault 集成以进行证书颁发。如果您使用此选项:

1、创建一个「托管」 nginx 入口控制器

2、在 my-values.yaml 文件中,将 generic.ingress.className: 设置为 webapprouting.kubernetes.azure.com

3、在 my-values.yaml 文件中,取消注释以下值:

完成后,您可以使用命令 kubectl get ingress -n bitwarden 获取分配给 Azure nginx 入口控制器的 IP 地址。部署后可能需要几分钟时间才能填充您的 IP 地址。

Azure 应用程序网关

Azure 客户可能更倾向于使用 Azure 应用程序网关作为他们 AKS 集群的入口控制器。

安装图表前

如果您喜欢这个选项,在安装图表之前,您必须:

1、为您的群集启用 Azure 应用程序网关入口控制器

2、更新您的 my-values.yaml 文件,特别是 general.ingress.className:general.ingress.annotations:general.ingress.paths:

3、如果您要使用提供的 Let's Encrypt 示例来生成 TLS 证书,请将此处链接的脚本中的 spec.acme.solvers.ingress.class: 的值更新为 "azure/application-gateway"

4、在 Azure 门户中为应用程序网关创建一个空的重写集:

  1. 转到 Azure 门户中的负载均衡应用程序网关,选择您的应用程序网关。

  2. 选择重写选项卡。

  3. 选择重写集按钮。

  4. 在此示例中,将名称设置为 my-values.yamlappgw.ingress.kubernetes.io/rewrite-rule-set: 指定的值,即 bitwarden-ingress

  5. 选择下一步然后选择创建

安装图表后

安装图表之后,您还需要为重写集创建规则:

1、重新打开您在安装图表之前创建的空重写集。

2、选择所有以 pr-bitwarden-self-host-ingress... 开头的路由路径,取消选择任何不以该前缀开头的路径,然后选择下一步

3、选择添加重写规则按钮。您可以为重写规则指定任何名称和任何顺序。

4、添加以下条件:

  • 要检查的变量类型:服务器变量

  • 服务器变量:uri_path

  • 区分大小写:否

  • 操作符:等于 (=)

  • Pattern to match^(\/(?!admin)(?!identity)(?!sso)[^\/]*)\/(.*)

5、添加以下操作:

  • 重写类型:URL

  • 操作类型:设置

  • 组件:URL 路径

  • URL 路径值/{var_uri_path_2}

  • 重新评估路径图:未选中

6、选择创建

创建存储类

部署需要使用您提供的支持 ReadWriteMany 的共享存储类。以下示例是一个可以在 Azure Cloud Shell 中运行的脚本,用于创建满足要求的 Azure 文件存储类。

您必须在 my-values.yaml 中设置 sharedStorageClassName 的值,值应与您给予类的名称相同,在本例中为:

使用 Azure Key Vault CSI 驱动程序

部署需要使用 Kubernetes secrets 对象为您的部署设置敏感值。虽然 kubectl create secret 命令可用于设置机密,但 Azure 客户可能更倾向于使用 Azure Key Vault 和 AKS Secrets Store CSI Driver。

1、使用以下命令为您的集群添加 Secrets Store CSI Driver 支持:

该插件创建了一个用户分配的托管身份,您可以用它来进行密钥库的身份验证,然而您还有其他选择来进行身份访问控制。如果您使用已创建的用户分配的托管身份,您需要显式地为其分配 Secret > Get 的访问权限(点击这里了解)。

2、创建一个 SecretProviderClass,就像以下示例中所示。请注意,这个示例包含了必须替换的 <REPLACE> 占位符,其取决于您使用的是附带的 SQL pod 还是使用您自己的 SQL 服务器。

3、使用下列命令在密钥库中设置所需的机密值:

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

  • secrets.secretName :将此值设置为 SecretProviderClass 中定义的 secretName 值。

  • secrets.secretProviderClass :将此值设置为 SecretProviderClass 中定义的 metadata.name 值。

最后更新于