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

适用于:Linux 上的 SQL Server

本教程介绍如何使用 DH2i DxOperator 为部署到 Azure Kubernetes 服务(AKS)群集的基于 SQL Server Linux 的容器配置 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 设置。 在此示例中,您将使用一个名为 mssqlconfig.yaml 的文件和以下参数来创建 configmap

    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. 更新你的 DxSqlAg.yaml 文件中的 availabilityGroupListenerPort 值:

    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,14033: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