在 AKS 上搭建 OpenMetadata
OpenMetadata 是一个开源的数据治理平台,专注于统一数据发现、 lineage 追踪、数据质量监控和团队协作。本文介绍在 AKS 搭建企业级 OpenMetadata 的关键事项。
考虑因素 🔗
- 使用 Key Vault 管理密钥(比如 Openmetada 的数据库密码等);而不是使用 Kubernetes secrets
- 使用 workload identity 访问 azure 资源(比如 Key Vault)
- 使用 Azure File(azurefile)或者 Azure Disk(managed-csi) 持久化数据 (比如 Airflow DAG 等)
- 覆写 pod security context 和 container security contxt
- 使用 Key Vault 作为 Open Metdata 等密钥管理器;而不是将其保存在数据库中
- 启用 Azure SSO
- 覆盖 Helm Chart 中的一些硬编码的密钥
- 启用 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_db | openmetadata_user | openmetadata-postgres-password |
airflow_db | airflow_user | airflow-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-key
和 airflow-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,使其依赖 openmetadata
和 openmetadata-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
下面是一些配置要点:
- 在 openmetadata 下的
commonLabels
里添加azure.workload.identity/use: "true"
以启用 workload identity。 - 由于 Key Vault 里保存的是使用Base64加密后的密钥对,而 Open Metadata 需要是原始的密钥对。因此可创建 extraInitContainers,在主容器启动前,进行解码。
- Airflow 的 dags 和 logs 使用 azurefile 持久化数据;opensearch 使用 managed-csi 持久化数据。
- Open Metadata 的大部分配置,可通过环境变量配置,而不是通过配置项。这样不会把这些值在 Kubernetes 中保存一份。比如管理员可使用环境变量
AUTHORIZER_ADMIN_PRINCIPALS
配置。
注意:Airflow 的日志可能增长地很多,需要定期清理。而默认如果开启日志持久化,日志清理会被关闭。
部署 Helm Chart 🔗
使用 helm 命令部署后,以管理员身份通过 SSO 登录,在Services 中创建数据库,确保元数据处理正常。
参考资料 🔗
- Open Metadata Helm chart https://github.com/open-metadata/openmetadata-helm-charts
- Enable Sececret Manager with Azure Key Vault https://docs.open-metadata.org/latest/deployment/secrets-manager/supported-implementations/azure-key-vault
- Azure SSO https://docs.open-metadata.org/latest/deployment/security/azure