빠른 시작: 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) |
필수 조건
활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
Kubernetes 클러스터
kubectl
를 사용하여 AKS에서 Kubernetes 클러스터를 만들고 연결하는 방법에 대한 자세한 내용은 Azure Kubernetes Service(AKS) 클러스터 배포를 참조하세요.참고 항목
노드 오류로부터 보호하려면 Kubernetes 클러스터에 두 개 이상의 노드가 필요합니다.
Azure CLI 최신 버전을 설치하려면 Azure CLI 설치 방법을 참조하세요.
SA 암호 만들기
Kubernetes 클러스터에서 SA 암호를 만듭니다. Kubernetes는 비밀 등의 암호와 같은 중요한 구성 정보를 관리할 수 있습니다.
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 클러스터에서 영구적 볼륨 및 영구적 볼륨 클레임을 구성할 수 있습니다.
스토리지 클래스 및 영구적 볼륨 클레임을 정의하는 매니페스트를 만듭니다. 매니페스트는 스토리지 프로비저닝 프로그램, 매개 변수 및 회수 정책을 지정합니다. Kubernetes 클러스터는 이 매니페스트를 사용하여 영구적 스토리지를 만듭니다.
다음 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
)을 저장합니다.Kubernetes에서 영구적 볼륨 클레임을 만듭니다. 여기서
<path to pvc.yaml file>
은 파일을 저장한 위치입니다.kubectl apply -f <path to pvc.yaml file>
영구적 볼륨은 Azure Storage 계정으로 자동으로 생성되고 영구적 볼륨 클레임에 바인딩됩니다.
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
영구적 볼륨 클레임을 확인합니다. 여기서
<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 이름의 일부와 일치합니다.
영구적 볼륨을 확인합니다.
kubectl describe pv
kubectl
이 자동으로 생성되어 영구적 볼륨 클레임에 바인딩된 영구적 볼륨에 대한 메타데이터를 반환합니다.
배포 만들기
SQL Server 인스턴스를 호스트하는 컨테이너는 Kubernetes 배포 개체로 설명됩니다. 배포는 복제본 세트를 만듭니다. 복제본 세트는 Pod를 만듭니다.
SQL Server mssql-server-linux Docker 이미지를 기반으로 하는 컨테이너를 설명하는 매니페스트를 만듭니다.
- 매니페스트는
mssql-server
영구적 볼륨 클레임 및 Kubernetes 클러스터에 이미 적용된mssql
비밀을 참조합니다. - 또한 매니페스트는 서비스를 설명합니다. 이 서비스는 부하 분산 장치입니다. 부하 분산 장치는 SQL Server 인스턴스가 복구된 후에도 IP 주소가 유지되도록 보장합니다.
- 매니페스트는 리소스 요청 및 제한을 설명합니다. 최소 시스템 요구 사항을 기반으로 합니다.
배포를 설명하는 매니페스트(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
을 정의합니다. 이 값은 컨테이너의 모든 프로세스가 보조 GID10001
(mssql
)의 일부이기도 하다는 것을 의미합니다. 볼륨/var/opt/mssql
및 이 볼륨에서 만들어진 모든 파일의 소유자는 GID10001
(mssql
그룹)입니다.
Warning
LoadBalancer
서비스 유형을 사용하면 포트 1433에서 인터넷을 통해 원격으로 SQL Server 인스턴스에 액세스할 수 있습니다.파일을 저장합니다. 예들 들어
sqldeployment.yaml
입니다.배포를 만듭니다. 여기서
<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 이미지를 끌어오기 때문에 발생합니다. 이미지를 처음 끌어온 후, 해당 이미지가 이미 캐시되어 있는 노드에 배포하는 경우 후속 배포는 더 빨라질 수 있습니다.서비스가 실행되고 있는지 확인합니다. 다음 명령을 실행합니다.
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>
다음 명령을 실행하여 컨테이너가 루트가 아닌 컨테이너로 실행되고 있는지 확인할 수도 있습니다. 여기서
<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"
다음 값을 바꿉니다.
mssql-deployment
서비스의 IP 주소를<External IP Address>
합니다MyC0m9l&xP@ssw0rd
를 복잡한 암호로 바꿉니다.
실패 및 복구 확인
실패 및 복구를 확인하려면 다음 단계를 사용하여 Pod를 삭제할 수 있습니다.
SQL Server를 실행하는 Pod를 나열합니다.
kubectl get pods
SQL Server를 실행하는 Pod의 이름을 적어 둡니다.
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