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

Aplica-se a: SQL Server - Linux

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

Observação

A Microsoft oferece suporte a movimentação de dados, AGs e componentes do SQL Server. O DH2i é responsável pelo suporte do produto DxEnterprise, que inclui o gerenciamento de cluster e quorum. O DxOperator é uma extensão de software para o Kubernetes que usa definições de recursos personalizadas para automatizar a implantação de clusters DxEnterprise. Em seguida, o DxEnterprise fornece toda a instrumentação para criar, configurar, gerenciar e fornecer failover automático para cargas de trabalho de AG do SQL Server no Kubernetes.

Você pode se registrar para uma licença de software gratuita do DxEnterprise. Para obter mais informações, consulte o Guia de início rápido do DxOperator.

Usando as etapas mencionadas neste artigo, saiba como implantar um StatefulSet e usar a solução DH2i DxOperator para criar e configurar um AG com três réplicas hospedadas 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
  • Implantar 3 réplicas de AG no SQL usando o arquivo YAML
  • Conecte-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 recursos 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, 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 comando a seguir.

    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="Password123"

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="Password123" --from-literal=DX_LICENSE=XXXX-XXXX-XXXX-XXXX

Instalar o DxOperator

Para instalar o DxOperator, você deve baixar o arquivo YAML do DxOperator usando o exemplo a seguir e, em seguida, aplicar o arquivo YAML.

  1. Implante o YAML descrevendo como configurar um AG usando o comando a seguir. Salve o arquivo com um nome personalizado, por exemplo, DxOperator.yaml.

    curl -L https://dxoperator.dh2i.com/dxesqlag/files/v1.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, implantar e configurar o cluster DxEnterprise. Aqui está um exemplo de arquivo YAML de implantação chamado DxEnterpriseSqlAg.yaml, que você pode alterar para atender às suas necessidades.

    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. Implantar o DxEnterpriseSqlAg.yaml arquivo.

    kubectl apply -f DxEnterpriseSqlAg.yaml
    

Criar um ouvinte de grupo de disponibilidade

Aplique o seguinte YAML para adicionar um balanceador de carga, definindo o seletor como o valor de metadata.name na etapa anterior. Neste exemplo, é 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

Verifique a implantação e as atribuições de balanceador de carga.

kubectl get pods
kubectl get services

Você deverá ver uma 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

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