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

Aplica-se a:SQL Server em Linux

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

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

Este tutorial consiste nas seguintes etapas:

  • Criar um objeto configmap no cluster AKS com configurações mssql-conf
  • Instalar o DxOperator
  • Criar objetos secretos
  • Implementar um grupo de disponibilidade SQL Server com três réplicas usando um ficheiro YAML
  • Liga-te ao SQL Server

Pré-requisitos

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

  • Uma licença DxEnterprise válida com recursos AG e túneis ativados. Para obter mais informações, consulte a edição para programadores para uso não produtivo ou o software DxEnterprise para cargas de trabalho de produção.

Criar o configmap objeto

  1. No AKS, crie o configmap objeto, que tem configurações mssql-conf com base em suas necessidades. Neste exemplo, cria o configmap usando um ficheiro 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 do sa SQL Server.

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

Atenção

A sua palavra-passe deve seguir a política de palavra-passe padrão do SQL Server . Por padrão, a senha deve ter pelo menos oito caracteres e conter caracteres de três dos quatro conjuntos a seguir: letras maiúsculas, letras minúsculas, dígitos de base 10 e símbolos. As palavras-passe podem ter até 128 caracteres. Use senhas 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. Substitua XXXX-XXXX-XXXX-XXXX no exemplo a seguir 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, descarregue o ficheiro YAML do DxOperator usando o seguinte exemplo e depois aplique o ficheiro YAML.

  1. Implemente o ficheiro YAML que descreve como configurar um AG usando o seguinte comando. Salve o arquivo com um nome personalizado, como 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, pode implementar containers do SQL Server, configurar o grupo de disponibilidade, definir réplicas e implementar e configurar o cluster DxEnterprise. Altere o seguinte ficheiro YAML de implementação de exemplo, DxSqlAg.yaml, para se adequar aos seus requisitos.

    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. Implemente o ficheiro DxSqlAg.yaml.

    kubectl apply -f DxSqlAg.yaml
    

Criar um ouvinte para o grupo de disponibilidade

  1. Atualize o availabilityGroupListenerPort valor no seu DxSqlAg.yaml ficheiro:

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

    kubectl apply -f DxSqlAg.yaml
    
  3. Aplique o seguinte YAML 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 a funcionar.

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

    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