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

적용 대상:SQL Server - Linux

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

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

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

필수 조건

  • 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.

  • Kubernetes 클러스터 AKS에서 Kubernetes 클러스터를 만들고 연결하는 방법에 대한 자세한 내용은 AKS kubectl(Azure Kubernetes Service) 클러스터 배포를 참조 하세요.

    참고 항목

    노드 오류로부터 보호하기 위해 Kubernetes 클러스터에는 둘 이상의 노드가 필요합니다.

  • Azure CLI 최신 버전을 설치하려면 Azure CLI 설치 방법을 참조하세요.

SA 암호 만들기

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

  2. MSSQL_SA_PASSWORD의 값 MyC0m9l&xP@ssw0rd를 포함하는 mssql이라는 비밀을 Kubernetes에서 만들려면 다음 명령을 실행합니다. 고유의 복잡한 암호를 선택해야 합니다.

    Important

    SA_PASSWORD 환경 변수는 사용되지 않습니다. 대신 MSSQL_SA_PASSWORD을 사용합니다.

    kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
    

스토리지 만들기

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

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

  2. 다음 YAML 예제에서는 스토리지 클래스 및 영구적 볼륨 클레임을 정의합니다. 스토리지 클래스 프로비저닝기는 azure-disk이 Kubernetes 클러스터가 Azure에 있기 때문입니다. 스토리지 계정 유형은 .입니다 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 이름의 일부와 일치합니다.

    Screenshot of the Azure portal blob name.

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

    kubectl describe pv
    

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

배포 만들기

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

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

  • 매니페스트는 영구 볼륨 클레임 및 mssql Kubernetes 클러스터에 이미 적용한 비밀을 참조 mssql-server 합니다.
  • 매니페스트는 서비스에 대해서도 설명합니다. 이 서비스는 부하 분산 장치입니다. 부하 분산 장치는 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이라는 새 파일에 복사합니다. 다음 값을 업데이트합니다.

    • value: "Developer"MSSQL_PID: SQL Server Developer Edition을 실행할 컨테이너를 설정합니다. Developer Edition은 프로덕션 데이터에 사용하도록 허가되지 않습니다. 프로덕션용 배포인 경우 적절한 버전(EnterpriseStandard또는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 주소를 반환합니다. 서비스의 외부 IP 주소를 기록해 둡니다 mssql-deployment . 이 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 "MyC0m9l&xP@ssw0rd"

다음 값을 바꿉니다.

  • <External IP Address>서비스에 대한 IP 주소가 있는 경우 mssql-deployment
  • MyC0m9l&xP@ssw0rd를 복잡한 암호로 바꿉니다.

오류 및 복구 확인

실패 및 복구를 확인하려면 다음 단계를 사용하여 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