Implementación de grupos de disponibilidad en Kubernetes con DH2i DxOperator en Azure Kubernetes Service

Se aplica a:SQL Server en Linux

En este tutorial se explica cómo configurar grupos de disponibilidad AlwaysOn (AG) de SQL Server para contenedores basados en Linux de SQL Server implementados en un clúster de Azure Kubernetes Service (AKS), mediante DH2i DxOperator. Estos procedimientos también se aplican a los clústeres de Red Hat OpenShift en Azure. La principal diferencia es el despliegue de un clúster Red Hat OpenShift en Azure, seguido de sustituir kubectl comandos por oc en los siguientes pasos.

Siguiendo los pasos de este artículo, aprendes a desplegar un StatefulSet y utilizar el DH2i DxOperator para crear y configurar un AG con tres réplicas, alojado en AKS.

Este tutorial consta de los pasos siguientes:

  • Creación de un objeto configmap en el clúster de AKS con la configuración mssql-conf
  • Instalación de DxOperator
  • Cree objetos secretos
  • Despliega un grupo de disponibilidad de SQL Server de tres réplicas usando un archivo YAML
  • Conectarse a SQL Server

Prerequisites

  • Un Azure Kubernetes Service (AKS) o clúster de Kubernetes.

  • Una licencia de DxEnterprise válida que incluya características de AG y túneles habilitados. Para obtener más información, consulte la edición de desarrollador para uso no productivo o el software DxEnterprise para cargas de trabajo de producción.

Cree el objeto configmap

  1. En AKS, cree el objeto configmap, que tiene la configuración mssql-conf en función de sus requisitos. En este ejemplo, creas el configmap usando un archivo llamado mssqlconfig.yaml con los siguientes parámetros.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mssql-config
    data:
      mssql.conf: |
        [EULA]
        accepteula = Y
    
        [sqlagent]
        enabled = true
    
  2. Crea el objeto ejecutando el siguiente comando.

    kubectl apply -f ./mssqlconfig.yaml
    

Cree objetos secretos

Cree un secreto para almacenar la contraseña sa de SQL Server.

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

Caution

La contraseña debe seguir la directiva de contraseña predeterminada de SQL Server. De forma predeterminada, la contraseña debe tener al menos ocho caracteres y contener caracteres de tres de los siguientes cuatro conjuntos: mayúsculas, minúsculas, dígitos en base 10 y símbolos. Las contraseñas pueden tener hasta 128 caracteres. Use contraseñas lo más largas y complejas posible.

Cree un secreto para almacenar la clave de licencia para DH2i. Visite el sitio web de DH2i para obtener una licencia de desarrollador. En el ejemplo siguiente, reemplace XXXX-XXXX-XXXX-XXXX con su clave de licencia.

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

Instalación de DxOperator

Para instalar DxOperator, descarga el archivo YAML de DxOperator usando el siguiente ejemplo y luego aplica el archivo YAML.

  1. Despliega el archivo YAML que describe cómo configurar un AG usando el siguiente comando. Guarde el archivo con un nombre personalizado, como DxOperator.yaml.

    curl -L https://dxoperator.dh2i.com/dxsqlag/files/v2.yaml -o DxOperator.yaml
    kubectl apply -f DxOperator.yaml
    
  2. Después de instalar el operador, puedes desplegar contenedores de SQL Server, configurar el grupo de disponibilidad, definir réplicas y desplegar y configurar el clúster DxEnterprise. Cambia el siguiente archivo YAML de despliegue de ejemplo, DxSqlAg.yaml, para adaptarlo a tus necesidades.

    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: 51433
            # 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. Implemente el archivo DxSqlAg.yaml.

    kubectl apply -f DxSqlAg.yaml
    

Creación del agente de escucha del grupo de disponibilidad

  1. Actualiza el availabilityGroupListenerPort valor en tu DxSqlAg.yaml archivo:

    spec:
      sqlAgConfiguration:
        availabilityGroupListenerPort: 51433
    
  2. Aplique el archivo:

    kubectl apply -f DxSqlAg.yaml
    
  3. Aplica el siguiente YAML para añadir un balanceador de carga para el oyente.

    apiVersion: v1
    kind: Service
    metadata:
      name: contoso-cluster-lb
    spec:
      type: LoadBalancer
      selector:
        dh2i.com/entity: 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. Verifica que los servicios y balanceadores de carga estén funcionando.

    kubectl get services
    

    El resultado es similar al ejemplo siguiente:

    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. Verifica que los tres pods de SQL Server estén funcionando.

    kubectl get pods
    

    El resultado es similar al ejemplo siguiente:

    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