使用 Azure Kubernetes 服务上的 DH2i DxOperator 在 Kubernetes 上部署可用性组

适用于:Linux 上的 SQL Server

本教程介绍如何使用 DH2i DxOperator,为部署到 Azure Kubernetes 服务(AKS)集群中的基于 Linux 的 SQL Server 容器配置 SQL Server Always On 可用性组(AG)。 这些流程同样适用于 Azure Red Hat OpenShift 集群。 主要区别在于部署了 Azure Red Hat OpenShift 集群,随后在以下步骤中将kubectl命令替换为oc

通过本文中的步骤,你将了解如何部署 StatefulSet,并使用 DH2i DxOperator 创建和配置一个在 AKS 上托管的、具有三个副本的 AG。

本教程包含以下几个步骤:

  • 使用 mssql-conf 设置在 AKS 群集上创建 ConfigMap 对象
  • 创建机密对象
  • 安装 DxOperator
  • 使用YAML文件部署三副本SQL Server可用性组
  • 连接到SQL Server

先决条件

  • Azure Kubernetes 服务 (AKS) 或 Kubernetes 群集。

  • 已启用 AG 功能和隧道的有效 DxEnterprise 许可证。 有关详细信息,请参阅适用于非生产用途的开发人员版或适用于生产工作负载的 DxEnterprise 软件。

创建 ConfigMap 对象

  1. 在 AKS 中,创建 ConfigMap 对象,并根据你的要求配置 mssql-conf 设置。 在此示例中,您将使用一个名为 ConfigMap 的文件和以下参数来创建 mssqlconfig.yaml。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mssql-config
    data:
      mssql.conf: |
        [EULA]
        accepteula = Y
    
        [sqlagent]
        enabled = true
    
  2. 通过执行以下命令创建该对象。

    kubectl apply -f ./mssqlconfig.yaml
    

创建机密对象

创建用于存储 SQL Server sa 密码的机密。

kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"

注意

密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

创建用于存储 DH2i 许可证密钥的机密。 访问 DH2i 的网站以获取开发人员许可证。 在下面的示例中,将 XXXX-XXXX-XXXX-XXXX 替换为许可证秘钥。

kubectl create secret generic dxe --from-literal=DX_PASSKEY="<password>" --from-literal=DX_LICENSE=XXXX-XXXX-XXXX-XXXX

安装 DxOperator

要安装 DxOperator,请按照以下示例下载 DxOperator 的 YAML 文件,然后应用 YAML 文件。

  1. 使用以下命令部署描述如何设置AG的YAML文件。 以 DxOperator.yaml 等自定义名称保存文件。

    curl -L https://dxoperator.dh2i.com/dxsqlag/files/v2.yaml -o DxOperator.yaml
    kubectl apply -f DxOperator.yaml
    
  2. 安装操作员后,你可以部署SQL Server容器,配置可用性组,定义副本,并部署和配置DxEnterprise集群。 请修改以下示例部署 YAML 文件 DxSqlAg.yaml,以符合您的需求。

    apiVersion: dh2i.com/v1
    kind: DxSqlAg
    metadata:
      name: contoso-sql
    spec:
     sqlAgConfiguration:
       synchronousReplicas: 3
       asynchronousReplicas: 0
       # ConfigurationOnlyReplicas are only allowed with availabilityGroupClusterType set to EXTERNAL
       configurationOnlyReplicas: 0
       availabilityGroupName: AG1
       # Adds auto-generated load balancers to serviceTemplates for easy cluster access
       # For more customization, use the serviceTemplates section below
       #createLoadBalancers: true
       # Listener port for the availability group (uncomment to apply)
       #availabilityGroupListenerPort: 51433
       # For a contained availability group, add the option CONTAINED
       #availabilityGroupOptions: CONTAINED
       # Disables automatic availability mode switching when scaling down
       #disableModeSwitching: true
      statefulSetSpec:
        podspec:
          dxEnterpriseContainer:
            image: "docker.io/dh2i/dxe:latest"
            imagePullPolicy: Always
            acceptEula: true
            clusterSecret: dxe
            vhostName: VHOST1
            # Configuration options for the required persistent volume claim for DxEnterprise
            #volumeClaimConfiguration:
            # Set custom storage class for DxE PVC
            #storageClassName: example-class
          mssqlServerContainer:
            image: "mcr.microsoft.com/mssql/server:2025-latest"
            imagePullPolicy: Always
            mssqlSecret: mssql
            acceptEula: true
            mssqlPID: Developer
            # Set a non-default SQL Server port. DxOperator will auto-detect
            # the port from other sources too, such as mssqlConfigMap
            mssqlTcpPort: 51444
            # The MSSQL configMap (mssql.conf file)
            mssqlConfigMap: mssql-config
            # Configuration options for the required persistent volume claim for SQL Server
            #volumeClaimConfiguration:
            #  resources:
            #    requests:
            #      storage: 2Gi
          # Additional pod containers, such as mssql-tools
          #containers:
          #- name: mssql-tools
            #image: "mcr.microsoft.com/mssql-tools"
            #command: [ "/bin/sh" ]
            #args: [ "-c", "tail -f /dev/null" ]
    
  3. 部署 DxSqlAg.yaml 文件。

    kubectl apply -f DxSqlAg.yaml
    

创建可用性组侦听器

  1. 更新你的 availabilityGroupListenerPort 文件中的 DxSqlAg.yaml 值:

    spec:
      sqlAgConfiguration:
        availabilityGroupListenerPort: 51433
    
  2. 应用此文件:

    kubectl apply -f DxSqlAg.yaml
    
  3. 应用以下 YAML来为监听器添加负载均衡器。

    apiVersion: v1
    kind: Service
    metadata:
      name: contoso-cluster-lb
    spec:
      type: LoadBalancer
      selector:
        dh2i.com/entity-name: contoso-sql
        # This label points to whichever pod is the active Vhost member
        dh2i.com/active-vhost-vhost1: "true"
      ports:
        - name: sql
          protocol: TCP
          port: 1433
          targetPort: 51444
        - name: listener
          protocol: TCP
          port: 51433
          targetPort: 51433
        - name: dxe
          protocol: TCP
          port: 7979
          targetPort: 7979
    
  4. 确认服务和负载均衡器是否在运行。

    kubectl get services
    

    输出与以下示例类似:

    NAME                     TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)                                         AGE
    contoso-cluster-lb       LoadBalancer   10.1.0.21    172.212.20.29   1433:30484/TCP,51433:30694/TCP,7979:30385/TCP   3m18s
    contoso-sql-0            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-0-lb         LoadBalancer   10.1.0.210   4.255.19.171    7979:32374/TCP,1433:32444/TCP                   79m
    contoso-sql-1            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-1-lb         LoadBalancer   10.1.0.158   4.255.19.201    7979:30152/TCP,1433:30868/TCP                   79m
    contoso-sql-2            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-2-lb         LoadBalancer   10.1.0.159   4.255.19.218    7979:30566/TCP,1433:31463/TCP                   79m
    kubernetes               ClusterIP      10.1.0.1     <none>          443/TCP                                         87m
    
  5. 确认三个SQL Server Pod都在运行。

    kubectl get pods
    

    输出与以下示例类似:

    NAME            READY   STATUS    RESTARTS   AGE
    contoso-sql-0   2/2     Running   0          74m
    contoso-sql-1   2/2     Running   0          74m
    contoso-sql-2   2/2     Running   0          74m