你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
部署由 Azure Arc 启用的 Active Directory 集成的 SQL 托管实例
本文介绍如何通过 Active Directory 身份验证部署启用了 Azure Arc 的 Azure SQL 托管实例。
先决条件
在开始部署 SQL 托管实例之前,请确保具备以下先决条件:
连接器要求
客户管理的密钥表 Active Directory 连接器和系统管理的密钥表 Active Directory 连接器是不同的部署模式,具有不同的要求和步骤。 每种模式在部署期间都有特定的要求。 选择你使用的连接器的选项卡。
对于 Active Directory 客户管理的密钥表部署,必须提供:
- SQL 的 Active Directory 用户帐户
- 用户帐户下的服务主体名称 (SPN)
- SQL 的主要终结点(以及可选的次要终结点)的 DNS A(转发)记录
准备部署
根据你的部署模式,完成以下步骤以准备部署 SQL 托管实例。
要在客户管理的密钥表模式下准备部署,请执行以下操作:
识别 SQL 终结点的 DNS 名称:为客户端将从 Kubernetes 群集外部连接到的 SQL 终结点选择唯一的 DNS 名称。
- DNS 名称应在 Active Directory 域中或在其后代域中。
- 本文中的示例使用
sqlmi-primary.contoso.local
作为主 DNS 名称,使用sqlmi-secondary.contoso.local
作为辅助 DNS 名称。
标识 SQL 终结点的端口号:输入每个 SQL 终结点的端口号。
- 这些端口号必须位于 Kubernetes 群集的可接受端口号范围内。
- 本文中的示例使用
31433
作为主要端口号,使用31434
作为辅助端口号。
为托管实例创建 Active Directory 帐户:为 Active Directory 帐户选择一个名称以表示你的托管实例。
- 该名称在 Active Directory 域中必须唯一。
- 本文中的示例使用
sqlmi-account
作为 Active Directory 帐户名。
创建帐户:
- 在域控制器上,打开“Active Directory 用户和计算机”工具。 创建表示托管实例的帐户。
- 输入符合 Active Directory 域密码策略的帐户密码。 你将在下一部分的某些步骤中使用此密码。
- 确保帐户已启用。 帐户不需要任何特殊权限。
为 Active Directory DNS 服务器中的 SQL 终结点创建 DNS 记录:在其中一个 Active Directory DNS 服务器中,为在步骤 1 中选择的 DNS 名称创建 A 记录(正向查找记录)。
- DNS 记录应指向 SQL 终结点将在其上侦听来自 Kubernetes 群集外部的连接的 IP 地址。
- 你不需要创建与 A 记录关联的反向查找指针 (PTR) 记录。
创建 SPN:要使 SQL 能够接受针对 SQL 终结点的 Active Directory 身份验证,必须在上一步中创建的帐户中注册两个 SPN。 必须为主要终结点注册两个 SPN。 如果希望对辅助终结点进行 Active Directory 身份验证,还必须为辅助终结点注册 SPN。
要创建并注册 SPN,请执行以下操作:
使用以下格式创建 SPN:
MSSQLSvc/<DNS name> MSSQLSvc/<DNS name>:<port>
在其中一个域控制器上运行以下命令以注册 SPN:
setspn -S MSSQLSvc/<DNS name> <account> setspn -S MSSQLSvc/<DNS name>:<port> <account>
命令可能如以下示例所示:
setspn -S MSSQLSvc/sqlmi-primary.contoso.local sqlmi-account setspn -S MSSQLSvc/sqlmi-primary.contoso.local:31433 sqlmi-account
如果要在辅助终结点上执行 Active Directory 身份验证,请运行相同的命令来为辅助终结点添加 SPN:
setspn -S MSSQLSvc/<DNS name> <account> setspn -S MSSQLSvc/<DNS name>:<port> <account>
命令可能如以下示例所示:
setspn -S MSSQLSvc/sqlmi-secondary.contoso.local sqlmi-account setspn -S MSSQLSvc/sqlmi-secondary.contoso.local:31434 sqlmi-account
生成包含帐户和 SPN 条目的密钥表文件:若要使 SQL 能够向 Active Directory 进行身份验证并接受 Active Directory 用户的身份验证,请使用 Kubernetes 机密提供密钥表文件。
密钥表文件包含针对托管实例和 SPN 生成的 Active Directory 帐户的加密条目。
SQL Server 将此文件用作其针对 Active Directory 的凭据。
要生成 keytab 文件,有多个工具可供选择:
adutil
:适用于 Linux(请参阅 adutil 简介)ktutil
:在 Linux 上可用ktpass
:适用于 Windows- 自定义脚本
若要生成专用于托管实例的密钥表文件,请执行以下操作:
使用以下自定义脚本之一:
- Linux:create-sql-keytab.sh
- Windows Server:create-sql-keytab.ps1
这些脚本接受几个参数,并为包含 keytab 的 Kubernetes Secret 生成一个密钥表文件和一个 YAML 规范文件。
在脚本中,将参数值替换为托管实例部署的值。
对于输入参数,请使用以下值:
--realm
:大写的 Active Directory 域名。 示例:CONTOSO.LOCAL
--account
:注册 SPN 的 Active Directory 帐户。 示例:sqlmi-account
--port
:主 SQL 终结点的端口号。 示例:31433
--dns-name
:主 SQL 终结点的 DNS 名称。--keytab-file
:密钥表文件的路径。--secret-name
:是为其生成规范的密钥表机密的名称。--secret-namespace
:包含密钥表机密的 Kubernetes 命名空间。--secondary-port
:辅助 SQL 终结点端口号(可选)。 示例:31434
--secondary-dns-name
:辅助 SQL 终结点的 DNS 名称(可选)。
为托管密钥表的 Kubernetes 机密选择一个名称。 使用部署了托管实例的命名空间。
运行以下命令来创建密钥表:
AD_PASSWORD=<password> ./create-sql-keytab.sh --realm <Active Directory domain in uppercase> --account <Active Directory account name> --port <endpoint port> --dns-name <endpoint DNS name> --keytab-file <keytab file name/path> --secret-name <keytab secret name> --secret-namespace <keytab secret namespace>
命令可能如以下示例所示:
AD_PASSWORD=<password> ./create-sql-keytab.sh --realm CONTOSO.LOCAL --account sqlmi-account --port 31433 --dns-name sqlmi.contoso.local --keytab-file sqlmi.keytab --secret-name sqlmi-keytab-secret --secret-namespace sqlmi-ns
运行以下命令以验证密钥表是否正确:
klist -kte <keytab file>
为密钥表部署 Kubernetes 机密:使用在上一步中创建的 Kubernetes 机密规范文件来部署机密。
规范文件类似于以下示例:
apiVersion: v1 kind: Secret type: Opaque metadata: name: <secret name> namespace: <secret namespace> data: keytab: <keytab content in Base64>
若要部署 Kubernetes 机密,请运行以下命令:
kubectl apply -f <file>
你的命令可能类似于以下示例:
kubectl apply -f sqlmi-keytab-secret.yaml
设置 Active Directory 身份验证的属性
若要为 Azure Arc Active Directory 身份验证部署 Azure Arc 启用的 SQL 托管实例,请更新部署规范文件来引用要使用的 Active Directory 连接器实例。 在 SQL 规范文件中引用 Active Directory 连接器会自动为 Active Directory 身份验证设置 SQL。
要在客户管理的密钥表模式下支持 SQL 上的 Active Directory 身份验证,请在部署规范文件中设置以下属性。 有些属性是必需的,有些是可选的。
必须
spec.security.activeDirectory.connector.name
:要加入以进行 Active Directory 身份验证、预先存在的 Active Directory 连接器自定义资源的名称。 如果输入此属性的值,则将实施 Active Directory 身份验证。spec.security.activeDirectory.accountName
:托管实例的 Active Directory 帐户名称。spec.security.activeDirectory.keytabSecret
:Kubernetes 机密的名称,该机密用于托管用户的预创建密钥表文件。 此机密必须与托管实例位于同一命名空间中。 仅当在客户管理的密钥表模式下进行 Active Directory 部署时,此参数才是必需的。spec.services.primary.dnsName
:输入主 SQL 终结点的 DNS 名称。spec.services.primary.port
:输入主 SQL 终结点的端口号。
可选
spec.security.activeDirectory.connector.namespace
:要加入以进行 Active Directory 身份验证、预先存在的 Active Directory 连接器的 Kubernetes 命名空间。 如果不输入值,则使用 SQL 命名空间。spec.services.readableSecondaries.dnsName
:输入辅助 SQL 终结点的 DNS 名称。spec.services.readableSecondaries.port
:输入辅助 SQL 终结点的端口号。
准备部署规范文件
接下来,准备 YAML 规范文件以部署 SQL 托管实例。 对于使用的模式,请在规范文件中输入部署值。
注意
在两种模式的规范文件中,YAML 示例中的 admin-login-secret
值均提供基本身份验证。 可以使用参数值登录到托管实例,然后为 Active Directory 用户和组创建登录名。 有关详细信息,请参阅连接到 Azure Arc 启用的已集成 Active Directory 的 SQL 托管实例。
以下示例显示了客户管理的密钥表模式的规范文件:
apiVersion: v1
data:
password: <your Base64-encoded password>
username: <your Base64-encoded username>
kind: Secret
metadata:
name: admin-login-secret
type: Opaque
---
apiVersion: sql.arcdata.microsoft.com/v3
kind: SqlManagedInstance
metadata:
name: <name>
namespace: <namespace>
spec:
backup:
retentionPeriodInDays: 7
dev: false
tier: GeneralPurpose
forceHA: "true"
licenseType: LicenseIncluded
replicas: 1
security:
adminLoginSecret: admin-login-secret
activeDirectory:
connector:
name: <Active Directory connector name>
namespace: <Active Directory connector namespace>
accountName: <Active Directory account name>
keytabSecret: <keytab secret name>
services:
primary:
type: LoadBalancer
dnsName: <primary endpoint DNS name>
port: <primary endpoint port number>
readableSecondaries:
type: LoadBalancer
dnsName: <secondary endpoint DNS name>
port: <secondary endpoint port number>
storage:
data:
volumes:
- accessMode: ReadWriteOnce
className: local-storage
size: 5Gi
logs:
volumes:
- accessMode: ReadWriteOnce
className: local-storage
size: 5Gi
部署托管实例
对于客户管理的密钥表模式和系统管理的密钥表模式,请使用准备好的规范 YAML 文件来部署托管实例:
保存文件。 下一步中的示例使用 sqlmi.yaml 来指定文件名,但可以选择任何文件名。
运行以下命令以使用规范部署实例:
kubectl apply -f <specification file name>
命令可能如以下示例所示:
kubectl apply -f sqlmi.yaml