다음을 통해 공유


Azure Kubernetes Service의 DH2i DxOperator를 사용하여 Kubernetes에 가용성 그룹 배포

적용 대상: SQL Server - Linux

이 자습서에서는 DH2i DxOperator를 사용하여 Azure Kubernetes Service(AKS) Kubernetes 클러스터에 배포된 SQL Server Linux 기반 컨테이너에 대해 SQL Server Always On 가용성 그룹(AG)을 구성하는 방법을 설명합니다. 이러한 절차는 Azure Red Hat OpenShift 클러스터에도 적용되며, 가장 큰 차이점은 Azure Red Hat OpenShift 클러스터를 배포한 후 다음 단계에서 kubectl 명령을 oc로 대체한다는 것입니다.

참고 항목

Microsoft는 데이터 이동, AG 및 SQL Server 구성 요소를 지원합니다. DH2i는 DxEnterprise 제품 지원을 담당하며, 여기에는 클러스터 및 쿼럼 관리가 포함됩니다. DxOperator는 사용자 지정 리소스 정의를 사용하여 DxEnterprise 클러스터의 배포를 자동화하는 Kubernetes의 소프트웨어 확장입니다. 그런 다음 DxEnterprise는 Kubernetes에서 SQL Server AG 워크로드를 생성, 구성, 관리하고 자동 장애 조치(failover)를 수행하기 위한 모든 계측 기능을 제공합니다.

무료 DxEnterprise 소프트웨어 라이선스에 등록할 수 있습니다. 자세한 내용은 DxOperator 빠른 시작 가이드를 참조하세요.

이 문서에서 설명되는 단계를 사용하여 StatefulSet을 배포하고 DH2i DxOperator를 사용하여 AKS에서 호스팅되는 3개의 복제본(replica)으로 AG를 생성 및 구성하는 방법을 알아봅니다.

이 자습서는 다음 단계로 구성됩니다.

  • mssql-conf 설정으로 AKS 클러스터에서 configmap 개체 만들기
  • DxOperator 설치
  • 비밀 개체 만들기
  • YAML 파일을 사용하여 3개의 복제본(replica) SQL AG 배포
  • SQL Server에 연결

필수 조건

  • Azure Kubernetes Service(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="<password>"

주의

암호는 SQL Server 기본 암호 정책을 따라야 합니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다. 암호 길이는 128자까지 가능하며 되도록 길고 복잡한 암호를 사용합니다.

DH2i의 라이선스 키를 저장할 비밀을 만듭니다. 개발자 라이선스는 DH2i의 웹 사이트에서 구할 수 있습니다. 다음 예제에서 XXXX-XXXX-XXXX-XXXX을(를) 라이선스 키로 바꿉니다.

kubectl create secret generic dxe --from-literal=DX_PASSKEY="<password>" --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 컨테이너를 배포하고, 가용성 그룹을 구성하고, 복제본(replica)을 정의하고, 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