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

适用于:SQL Server - Linux

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

注意

Microsoft 支持数据移动、AG 和 SQL Server 组件。 DH2i 负责支持 DxEnterprise 产品,包括群集和仲裁管理。 DxOperator 是对 Kubernetes 的软件扩展,使用自定义资源定义来自动化 DxEnterprise 群集的部署。 然后,DxEnterprise 提供所有检测,以便为 Kubernetes 中的 SQL Server AG 工作负载创建、配置、管理和提供自动故障转移。

可以注册免费的 DxEnterprise 软件许可证。 有关详细信息,请参阅 DxOperator 快速入门指南

使用本文中提及的步骤,了解如何部署 StatefulSet 并使用 DH2i DxOperator 创建和配置包含 AKS 上托管的三个副本 (replica) 的 AG。

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

  • 使用 mssql-conf 设置在 AKS 群集上创建 configmap 对象
  • 安装 DxOperator
  • 创建机密对象
  • 使用 YAML 文件部署 3 副本 (replica) SQL AG
  • 连接到 SQL Server

先决条件

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

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

创建 configmap 对象

  1. 在 AKS 中,根据要求创建具有 mssql-conf 设置的 configmap 对象。 在本例中,使用名为 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="Password123"

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

kubectl create secret generic dxe --from-literal=DX_PASSKEY="Password123" --from-literal=DX_LICENSE=XXXX-XXXX-XXXX-XXXX

安装 DxOperator

要安装 DxOperator,必须使用以下示例下载 DxOperator YAML 文件,然后应用 YAML 文件。

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

    curl -L https://dxoperator.dh2i.com/dxesqlag/files/v1.yaml -o DxOperator.yaml
    kubectl apply –f DxOperator.yaml
    
  2. 安装运算符后,可以部署 SQL Server 容器、配置可用性组、定义副本、部署和配置 DxEnterprise 群集。 下面是一个名为 DxEnterpriseSqlAg.yaml 的示例部署 YAML 文件,可以根据需要进行更改。

    apiVersion: dh2i.com/v1
    kind: DxEnterpriseSqlAg
    metadata:
      name: contoso-sql
    spec:
      synchronousReplicas: 3
      asynchronousReplicas: 0
      # ConfigurationOnlyReplicas are only allowed with availabilityGroupClusterType set to EXTERNAL
      configurationOnlyReplicas: 0
      availabilityGroupName: AG1
      # Listener port for the availability group (uncomment to apply)
      availabilityGroupListenerPort: 51433
      # For a contained availability group, add the option CONTAINED
      availabilityGroupOptions: null
      # Valid options are EXTERNAL (automatic failover) and NONE (no automatic failover)
      availabilityGroupClusterType: EXTERNAL
      createLoadBalancers: true
      template:
        metadata:
          labels:
            label: example
          annotations:
            annotation: example
        spec:
          dxEnterpriseContainer:
            image: "docker.io/dh2i/dxe:latest"
            imagePullPolicy: Always
            acceptEula: true
            clusterSecret: dxe
            vhostName: VHOST1
            joinExistingCluster: false
            # QoS – guaranteed (uncomment to apply)
            #resources:
              #limits:
                #memory: 1Gi
                #cpu: '1'
            # Configuration options for the required persistent volume claim for DxEnterprise
            volumeClaimConfiguration:
              storageClassName: null
              resources:
                requests:
                  storage: 1Gi
          mssqlServerContainer:
            image: "mcr.microsoft.com/mssql/server:latest"
            imagePullPolicy: Always
            mssqlSecret: mssql
            acceptEula: true
            mssqlPID: Developer
            mssqlConfigMap: mssql-config
            # QoS – guaranteed (uncomment to apply)
            #resources:
              #limits:
                #memory: 2Gi
                #cpu: '2'
            # Configuration options for the required persistent volume claim for SQL Server
            volumeClaimConfiguration:
              storageClassName: null
              resources:
                requests:
                  storage: 2Gi
          # Additional side-car containers, such as mssql-tools (uncomment to apply)
          #containers:
          #- name: mssql-tools
              #image: "mcr.microsoft.com/mssql-tools"
              #command: [ "/bin/sh" ]
              #args: [ "-c", "tail -f /dev/null" ]
    
  3. 部署 DxEnterpriseSqlAg.yaml 文件。

    kubectl apply -f DxEnterpriseSqlAg.yaml
    

创建可用性组侦听器

通过将选择器设置为上一步骤中 metadata.name 的值,应用以下 YAML 来添加负载均衡器。 在此示例中,它是 contoso-sql

apiVersion: v1
kind: Service
metadata:
  name: contoso-cluster-lb
spec:
  type: LoadBalancer
  selector:
    dh2i.com/entity: contoso-sql
  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

验证部署和负载均衡器分配。

kubectl get pods
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

PS /home/aravind> 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