在 AKS 上搭建 OpenMetadata

2025-08-31#Kubernetes#Azure

OpenMetadata 是一个开源的数据治理平台,专注于统一数据发现、 lineage 追踪、数据质量监控和团队协作。本文介绍在 AKS 搭建企业级 OpenMetadata 的关键事项。

考虑因素 🔗

  1. 使用 Key Vault 管理密钥(比如 Openmetada 的数据库密码等);而不是使用 Kubernetes secrets
  2. 使用 workload identity 访问 azure 资源(比如 Key Vault)
  3. 使用 Azure File(azurefile)或者 Azure Disk(managed-csi) 持久化数据 (比如 Airflow DAG 等)
  4. 覆写 pod security context 和 container security contxt
  5. 使用 Key Vault 作为 Open Metdata 等密钥管理器;而不是将其保存在数据库中
  6. 启用 Azure SSO
  7. 覆盖 Helm Chart 中的一些硬编码的密钥
  8. 启用 TLS 证书

部署步骤 🔗

创建 Azure Application Registration 🔗

创建 Single-page application,并设置回调地址(比如 https://openmetadata.mydomain.local/callback)。可能需要启用 Implict grant。创建之后,还可能需要在 Enterprise Application 中批准(Approve)它。否则,在配置了 SSO 之后打开页面,可能遇到 Need Admin Approval 的页面。

创建 UAI 🔗

Open Metadata 包含多个组件:Open metadata,Airflow 和 OpenSearch。为了使用 Azure Key Vault 作为密钥管理器(Secret Manager),Open Metadata 需要角色 Key Vault Secrets Officer;而 Airflow 需要角色 Key Vault Secrets User。如果对安全要求不那么高,那么可使用同一个 UAI,授予多个角色;否则应该为每个组件创建独立的 UAI,并授予相应权限。具体见文档 《Azure Key Vault》

创建 Key Vault 🔗

创建 Key Vault 用于存放密钥,以及作为 Open Metadata 的密钥管理器。

创建数据库 🔗

Open Metadata 和 Airflow 都依赖数据库存储数据。简单起见,可共享数据库。比如使用 PostgreSQL 实例。通常应该使用外部的数据库服务。在创建了数据库和用户后,可将密码保存在 Key Vault 里。比如使用如下配置:

数据库数据库用户/角色Secret Name in Key Vault
openmetadata_dbopenmetadata_useropenmetadata-postgres-password
airflow_dbairflow_userairflow-postgres-password

创建 fernet 密钥 🔗

Open Metadata 和 Airflow 都使用 fernet 加密数据。Helm Chart 中硬编码了 fernet 密钥,因此需要重新生成并覆盖。Python 标准库里已经有相关的库了,可运行如下命令2次,生成密钥:

python -c "from cryptography.fernet import Fernet; FERNET_KEY = Fernet.generate_key().decode(); print(FERNET_KEY)"

将生成的密钥保存在 Key Vault 中,比如名称为 openmetadata-fernet-keyairflow-fernet-key

Airflow web server key 🔗

在使用 Open Metadata 时,Airflow 并不会暴露给 AKS 集群之外。但依然可以生成一个随机数,保存在 Key Vault 中的 airflow-web-server-secret-key 中。

更新用于生成 JWT 的密钥对 🔗

openssl genrsa -out private_key.pem 2048
openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt
openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der

注意:生成的 private_key.der 和 public_key.der 都是二进制文件,无法直接保存到 Key Vault。可对其使用 Base64 编码:

cat private_key.der | base64 -w 0
cat public_key.der | base64 -w 0

创建 Helm chart 🔗

创建一个 Helm chart,使其依赖 openmetadataopenmetadata-dependencies。同时创建 SecretProviderClass,用于从 Key Vault 中读取 Secret(数据库密钥等)。

创建 Helm values 🔗

要创建 values 文件,最好还是将 Helm Chart 下载并解压到本地,然后结合官方文档进行配置。下载 Helm 的命令如下:

helm repo add open-metadata https://helm.open-metadata.org
helm pull open-metadata/openmetadata --untar
helm pull open-metadata/openmetadata-dependencies --untar

下面是一些配置要点:

  1. 在 openmetadata 下的 commonLabels 里添加 azure.workload.identity/use: "true" 以启用 workload identity。
  2. 由于 Key Vault 里保存的是使用Base64加密后的密钥对,而 Open Metadata 需要是原始的密钥对。因此可创建 extraInitContainers,在主容器启动前,进行解码。
  3. Airflow 的 dags 和 logs 使用 azurefile 持久化数据;opensearch 使用 managed-csi 持久化数据。
  4. Open Metadata 的大部分配置,可通过环境变量配置,而不是通过配置项。这样不会把这些值在 Kubernetes 中保存一份。比如管理员可使用环境变量 AUTHORIZER_ADMIN_PRINCIPALS 配置。

注意:Airflow 的日志可能增长地很多,需要定期清理。而默认如果开启日志持久化,日志清理会被关闭。

部署 Helm Chart 🔗

使用 helm 命令部署后,以管理员身份通过 SSO 登录,在Services 中创建数据库,确保元数据处理正常。

参考资料 🔗