Implantar grupos de disponibilidade no Kubernetes com DH2i DxOperator no Serviço de Kubernetes do Azure

Aplica-se a: SQL Server no Linux

Este tutorial explica como configurar os AGs (grupos de disponibilidade Always On) do SQL Server para contêineres baseados em Linux do SQL Server implantados em um cluster do AKS (Serviço de Kubernetes do Azure), usando DH2i DxOperator. Esses procedimentos também se aplicam aos clusters Red Hat OpenShift no Azure. A principal distinção é a implantação de um cluster Red Hat OpenShift no Azure, seguido pela substituição kubectl dos comandos por oc nos passos seguintes.

Seguindo os passos deste artigo, você aprende como implantar um StatefulSet e usar o DH2i DxOperator para criar e configurar um AG com três réplicas, hospedado no AKS.

O tutorial consiste nas seguintes etapas:

  • Criar um objeto configmap no cluster AKS com configurações mssql-conf
  • Instalar o DxOperator
  • Criar objetos secretos
  • Implante um grupo de disponibilidade do SQL Server com três réplicas usando um arquivo YAML
  • Conectar-se ao SQL Server

Pré-requisitos

  • Um cluster do AKS (Serviço de Kubernetes do Azure) ou do Kubernetes.

  • Uma licença válida do DxEnterprise com funcionalidades de AG e túneis habilitados. Para obter mais informações, confira a edição do desenvolvedor para uso que não seja de produção ou software DxEnterprise para cargas de trabalho de produção.

Criar o objeto configmap

  1. No AKS, crie o objeto configmap, que tem configurações mssql-conf com base em seus requisitos. Neste exemplo, você cria o configmap by usando um arquivo chamado mssqlconfig.yaml com os seguintes parâmetros.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mssql-config
    data:
      mssql.conf: |
        [EULA]
        accepteula = Y
    
        [sqlagent]
        enabled = true
    
  2. Crie o objeto executando o seguinte comando.

    kubectl apply -f ./mssqlconfig.yaml
    

Criar objetos secretos

Crie um segredo para armazenar a senha sa do SQL Server.

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

Caution

Sua senha deve seguir a política de senha padrão do SQL Server. Por padrão, a senha precisa ter pelo menos oito caracteres e conter caracteres de três dos seguintes quatro conjuntos: letras maiúsculas, letras minúsculas, dígitos de base 10 e símbolos. As senhas podem ter até 128 caracteres. Use senhas que sejam tão longas e complexas quanto possível.

Crie um segredo para armazenar a chave de licença para DH2i. Visite o site da DH2i para obter uma licença de desenvolvedor. No exemplo a seguir, substitua XXXX-XXXX-XXXX-XXXX por sua chave de licença.

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

Instalar o DxOperator

Para instalar o DxOperator, baixe o arquivo YAML do DxOperator usando o seguinte exemplo e, em seguida, aplique o arquivo YAML.

  1. Implante o arquivo YAML que descreve como configurar um AG usando o seguinte comando. Salve o arquivo com um nome personalizado, por exemplo, DxOperator.yaml.

    curl -L https://dxoperator.dh2i.com/dxsqlag/files/v2.yaml -o DxOperator.yaml
    kubectl apply -f DxOperator.yaml
    
  2. Depois de instalar o operador, você pode implantar contêineres do SQL Server, configurar o grupo de disponibilidade, definir réplicas e implantar e configurar o cluster DxEnterprise. Altere o seguinte arquivo YAML de implantação de exemplo, DxSqlAg.yaml, para atender às suas necessidades.

    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. Implante o arquivo DxSqlAg.yaml.

    kubectl apply -f DxSqlAg.yaml
    

Criar um ouvinte de grupo de disponibilidade

  1. Atualize o valor availabilityGroupListenerPort no arquivo DxSqlAg.yaml:

    spec:
      sqlAgConfiguration:
        availabilityGroupListenerPort: 51433
    
  2. Aplique o arquivo:

    kubectl apply -f DxSqlAg.yaml
    
  3. Aplique o YAML a seguir para adicionar um balanceador de carga para o ouvinte.

    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. Verifique se os serviços e balanceadores de carga estão funcionando.

    kubectl get services
    

    A saída é semelhante ao exemplo a seguir:

    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. Verifique se os três pods do SQL Server estão rodando.

    kubectl get pods
    

    A saída é semelhante ao exemplo a seguir:

    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