다음을 통해 공유


빠른 시작: Azure에 SQL Server 컨테이너 클러스터 배포

적용 대상: SQL Server - Linux

이 빠른 시작에서는 영구적 저장소가 있는 컨테이너, Azure Kubernetes Service(AKS) 또는 Red Hat OpenShift에서 고가용성 SQL Server 인스턴스를 구성하는 방법을 설명합니다. SQL Server 인스턴스가 실패하면 Orchestrator는 자동으로 새 Pod에 다시 만듭니다. 클러스터 서비스는 노드 오류에 대한 복원력도 제공합니다.

이 빠른 시작에서는 다음 명령줄 도구를 사용하여 클러스터를 관리합니다.

클러스터 서비스 명령줄 도구
AKS(Azure Kubernetes Service) kubectl (Kubernetes CLI)
Azure Red Hat OpenShift oc (OpenShift CLI)

필수 조건

SA 암호 만들기

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

  1. sa Kubernetes 클러스터에서 암호를 만듭니다. Kubernetes는 비밀 등의 암호와 같은 중요한 구성 정보를 관리할 수 있습니다.

  2. MSSQL_SA_PASSWORD의 값 <password>를 포함하는 mssql이라는 비밀을 Kubernetes에서 만들려면 다음 명령을 실행합니다. 복잡한 암호로 대체 <password> 합니다.

    Important

    SA_PASSWORD 환경 변수는 사용되지 않습니다. 대신 MSSQL_SA_PASSWORD를 사용하세요.

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

스토리지 만들기

Kubernetes 클러스터의 데이터베이스의 경우 영구 스토리지를 사용해야 합니다. 다음 단계를 사용하여 Kubernetes 클러스터에서 영구적 볼륨영구적 볼륨 클레임을 구성할 수 있습니다.

  1. 스토리지 클래스 및 영구적 볼륨 클레임을 정의하는 매니페스트를 만듭니다. 매니페스트는 스토리지 프로비저닝 프로그램, 매개 변수 및 회수 정책을 지정합니다. Kubernetes 클러스터는 이 매니페스트를 사용하여 영구적 스토리지를 만듭니다.

  2. 다음 YAML 예제에서는 스토리지 클래스 및 영구적 볼륨 클레임을 정의합니다. 이 Kubernetes 클러스터가 Azure에 있기 때문에 스토리지 클래스 프로비저닝 프로그램은 azure-disk입니다. 스토리지 계정 유형은 Standard_LRS입니다. 영구적 볼륨 클레임의 이름은 mssql-data입니다. 영구적 볼륨 클레임 메타데이터에는 스토리지 클래스에 다시 연결하는 주석이 포함되어 있습니다.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
         name: azure-disk
    provisioner: kubernetes.io/azure-disk
    parameters:
      storageaccounttype: Standard_LRS
      kind: Managed
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mssql-data
      annotations:
        volume.beta.kubernetes.io/storage-class: azure-disk
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 8Gi
    

    파일(예: pvc.yaml)을 저장합니다.

  3. Kubernetes에서 영구적 볼륨 클레임을 만듭니다. 여기서 <path to pvc.yaml file>은 파일을 저장한 위치입니다.

    kubectl apply -f <path to pvc.yaml file>
    

    영구적 볼륨은 Azure Storage 계정으로 자동으로 생성되고 영구적 볼륨 클레임에 바인딩됩니다.

    storageclass "azure-disk" created
    persistentvolumeclaim "mssql-data" created
    
  4. 영구적 볼륨 클레임을 확인합니다. 여기서 <persistentVolumeClaim>은 영구적 볼륨 클레임의 이름입니다.

    kubectl describe pvc <persistentVolumeClaim>
    

    이전 단계에서 영구적 볼륨 클레임의 이름은 mssql-data입니다. 영구적 볼륨 클레임에 대한 메타데이터를 확인하려면 다음 명령을 실행합니다.

    kubectl describe pvc mssql-data
    

    반환된 메타데이터에는 Volume이라는 값이 있습니다. 이 값은 Blob의 이름에 매핑됩니다.

    Name:          mssql-data
    Namespace:     default
    StorageClass:  azure-disk
    Status:        Bound
    Volume:        pvc-d169b88e-f26d-11e7-bc3e-0a58ac1f09a4
    Labels:        ‹none>
    Annotations:   kubectl.kubernetes.io/last-applied-configuration-{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"volume.beta.   kubernetes.io/storage-class":"azure-disk"},"name":"mssq1-data...
                   pv.kubernetes.io/bind-completed-yes
                   pv.kubernetes.io/bound-by-controller=yes
                   volume.beta.kubernetes.io/storage-class=azure-disk
                   volume.beta.kubernetes.io/storage-provisioner=kubernetes.io/azure-disk
    Capacity:      8Gi
    Access Modes:  RWO
    Events:        <none>
    

    볼륨 값은 Azure Portal에서 Blob 이름의 일부와 일치합니다.

  5. 영구적 볼륨을 확인합니다.

    kubectl describe pv
    

    kubectl이 자동으로 생성되어 영구적 볼륨 클레임에 바인딩된 영구적 볼륨에 대한 메타데이터를 반환합니다.

배포 만들기

SQL Server 인스턴스를 호스트하는 컨테이너는 Kubernetes 배포 개체로 설명됩니다. 배포는 복제본 세트를 만듭니다. 복제본 세트는 Pod를 만듭니다.

SQL Server mssql-server-linux Docker 이미지를 기반으로 하는 컨테이너를 설명하는 매니페스트를 만듭니다.

  • 매니페스트는 mssql-server 영구적 볼륨 클레임 및 Kubernetes 클러스터에 이미 적용된 mssql 비밀을 참조합니다.
  • 또한 매니페스트는 서비스를 설명합니다. 이 서비스는 부하 분산 장치입니다. 부하 분산 장치는 SQL Server 인스턴스가 복구된 후에도 IP 주소가 유지되도록 보장합니다.
  • 매니페스트는 리소스 요청제한을 설명합니다. 최소 시스템 요구 사항을 기반으로 합니다.
  1. 배포를 설명하는 매니페스트(YAML 파일)를 만듭니다. 다음 예제에서는 SQL Server 컨테이너 이미지를 기반으로 컨테이너를 포함하여 배포에 대해 설명합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mssql-deployment
    spec:
      replicas: 1
      selector:
         matchLabels:
           app: mssql
      template:
        metadata:
          labels:
            app: mssql
        spec:
          terminationGracePeriodSeconds: 30
          hostname: mssqlinst
          securityContext:
            fsGroup: 10001
          containers:
          - name: mssql
            image: mcr.microsoft.com/mssql/server:2022-latest
            resources:
              requests:
                memory: "2G"
                cpu: "2000m"
              limits:
                memory: "2G"
                cpu: "2000m"
            ports:
            - containerPort: 1433
            env:
            - name: MSSQL_PID
              value: "Developer"
            - name: ACCEPT_EULA
              value: "Y"
            - name: MSSQL_SA_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mssql
                  key: MSSQL_SA_PASSWORD
            volumeMounts:
            - name: mssqldb
              mountPath: /var/opt/mssql
          volumes:
          - name: mssqldb
            persistentVolumeClaim:
              claimName: mssql-data
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mssql-deployment
    spec:
      selector:
        app: mssql
      ports:
        - protocol: TCP
          port: 1433
          targetPort: 1433
      type: LoadBalancer
    

    앞의 코드를 sqldeployment.yaml이라는 새 파일에 복사합니다. 다음 값을 업데이트합니다.

    • MSSQL_PID value: "Developer": SQL Server Developer 버전을 실행하도록 컨테이너를 설정합니다. Developer Edition은 프로덕션 데이터에 사용하도록 허가되지 않습니다. 프로덕션용으로 배포하는 경우 적절한 버전(Enterprise, Standard 또는 Express)으로 설정합니다. 자세한 내용은 SQL Server 라이선스 획득 방법을 참조하세요.

    • persistentVolumeClaim: 이 값에는 영구적 볼륨 클레임의 이름에 매핑되는 claimName: 항목이 필요합니다. 이 자습서에서는 mssql-data를 사용합니다.

    • name: MSSQL_SA_PASSWORD: 이 섹션에 정의된 대로 암호를 설정 sa 하도록 컨테이너 이미지를 구성합니다.

      valueFrom:
        secretKeyRef:
          name: mssql
          key: MSSQL_SA_PASSWORD
      

      Kubernetes는 컨테이너를 배포할 때 암호의 값을 얻기 위해 mssql이라는 비밀을 참조합니다.

    • securityContext: Pod 또는 컨테이너에 대한 권한 및 액세스 제어 설정을 정의합니다. 이 경우, 보안 컨텍스트가 Pod 수준에서 지정되므로 모든 컨테이너에서 준수합니다. 보안 컨텍스트에서 mssql 그룹의 GID(그룹 ID)인 값 10001을 사용하여 fsGroup을 정의합니다. 이 값은 컨테이너의 모든 프로세스가 보조 GID 10001(mssql)의 일부이기도 하다는 것을 의미합니다. 볼륨 /var/opt/mssql 및 이 볼륨에서 만들어진 모든 파일의 소유자는 GID 10001(mssql 그룹)입니다.

    Warning

    LoadBalancer 서비스 유형을 사용하면 포트 1433에서 인터넷을 통해 원격으로 SQL Server 인스턴스에 액세스할 수 있습니다.

    파일을 저장합니다. 예들 들어 sqldeployment.yaml입니다.

  2. 배포를 만듭니다. 여기서 <path to sqldeployment.yaml file>은 파일을 저장한 위치입니다.

    kubectl apply -f <path to sqldeployment.yaml file>
    

    배포 및 서비스가 만들어집니다. SQL Server 인스턴스는 영구적 스토리지에 연결된 컨테이너에 있습니다.

    deployment "mssql-deployment" created
    service "mssql-deployment" created
    

    배포 및 서비스가 만들어집니다. SQL Server 인스턴스는 영구적 스토리지에 연결된 컨테이너에 있습니다.

    Pod의 상태를 보려면 kubectl get pod를 입력합니다.

    NAME                                READY    STATUS    RESTARTS   AGE
    mssql-deployment-3813464711-h312s   1/1      Running   0          17m
    

    Pod의 상태는 Running입니다. 이 상태는 컨테이너가 준비되었음을 나타냅니다. 배포를 만든 후에 Pod가 표시될 때까지 몇 분 정도 걸릴 수 있습니다. 이 지연은 클러스터가 Microsoft 아티팩트 레지스트리에서 mssql-server-linux 이미지를 끌어오기 때문에 발생합니다. 이미지를 처음 끌어온 후, 해당 이미지가 이미 캐시되어 있는 노드에 배포하는 경우 후속 배포는 더 빨라질 수 있습니다.

  3. 서비스가 실행되고 있는지 확인합니다. 다음 명령을 실행합니다.

    kubectl get services
    

    이 명령은 실행 중인 서비스와 서비스의 내부 및 외부 IP 주소를 반환합니다. mssql-deployment 서비스의 외부 IP 주소를 적어 둡니다. 이 IP 주소를 사용하여 SQL Server에 연결합니다.

    NAME               TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
    kubernetes         ClusterIP      10.0.0.1      <none>          443/TCP          52m
    mssql-deployment   LoadBalancer   10.0.113.96   52.168.26.254   1433:30619/TCP   2m
    

    Kubernetes 클러스터의 개체 상태에 대한 자세한 내용을 보려면 다음 명령을 실행합니다. <MyResourceGroup><MyKubernetesClustername>을 리소스 그룹과 Kubernetes 클러스터 이름으로 바꿔야 합니다.

    az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
    
  4. 다음 명령을 실행하여 컨테이너가 루트가 아닌 컨테이너로 실행되고 있는지 확인할 수도 있습니다. 여기서 <nameOfSqlPod>는 SQL Server Pod의 이름입니다.

    kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
    

    whoami를 실행하면 사용자 이름이 mssql로 표시됩니다. mssql은 루트가 아닌 사용자입니다.

    whoami
    

SQL Server 인스턴스에 연결합니다

sa 계정과 서비스의 외부 IP 주소를 사용하여 Azure 가상 네트워크 외부에서 애플리케이션과 연결할 수 있습니다. OpenShift 비밀로 구성한 암호를 사용합니다.

다음 애플리케이션을 사용하여 SQL Server 인스턴스에 연결할 수 있습니다.

Sqlcmd를 사용하여 연결

연결 sqlcmd하려면 다음 명령을 실행합니다.

sqlcmd -S <External IP address> -U sa -P "<password>"

서비스의 IP 주소 mssql-deployment<password> 복잡한 암호로 바꿉 <External IP address> 니다.

주의

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

실패 및 복구 확인

실패 및 복구를 확인하려면 다음 단계를 사용하여 Pod를 삭제할 수 있습니다.

  1. SQL Server를 실행하는 Pod를 나열합니다.

    kubectl get pods
    

    SQL Server를 실행하는 Pod의 이름을 적어 둡니다.

  2. Pod를 삭제합니다.

    kubectl delete pod mssql-deployment-0
    

    mssql-deployment-0은 이전 단계에서 Pod 이름으로 반환된 값입니다.

Kubernetes는 Pod를 자동으로 다시 만들어 SQL Server 인스턴스를 복구하고 영구적 스토리지에 연결합니다. kubectl get pods를 사용하여 새 Pod가 배포되었는지 확인합니다. kubectl get services를 사용하여 새 컨테이너의 IP 주소가 동일한지 확인합니다.

리소스 정리

다음 자습서를 진행하지 않는 경우 불필요한 리소스를 정리합니다. az group delete 명령을 사용하여 리소스 그룹, 컨테이너 서비스 및 모든 관련 리소스를 제거합니다. <MyResourceGroup>을 클러스터가 포함된 리소스 그룹의 이름으로 바꿉니다.

az group delete --name <MyResourceGroup> --yes --no-wait