본문 바로가기

가상화/Kubernetes

[kubernetes] Kubernetes에 SQL Server 컨테이너 배포

반응형

개요

예제에서는 배포를 만들어 공유 디스크 장애 조치(failover) 클러스터 인스턴스와 비슷한 고가용성 구성을 얻는 방법을 보여 줍니다. 이 구성에서 Kubernetes는 클러스터 오케스트레이터의 역할을 수행합니다. 컨테이너의 SQL Server 인스턴스가 실패하면 오케스트레이터는 동일한 영구적 스토리지에 연결된 또 다른 컨테이너 인스턴스를 부트스트랩합니다. 


구성환경

docker-ce 19.03.5, kubernetes v1.18.0

 

kubernetes 클러스터 환경에서 mssql 컨테이너 생성 구성 절차

1. 이미지 다운로드
2. SA 암호만들기
3. 볼륨 만들기
4. 배포 만들기
5. Failover 테스트

 

1. 이미지 다운로드(모든 worker 노드에서 실행)

 shell> docker pull mcr.microsoft.com/mssql/server:2017-CU20-ubuntu-16.04

 ** 인터넷이 연결되어 있어야 한다.

2. SA 암호만들기( Master 노드에서 실행)

shell> kubectl create secret generic mssql --from-literal=SA_PASSWORD="MyC0m9l&xP@ssw0rd"

3. 볼륨 만들기

 3.1 NFS 서버 구성

 - /etc/exports 파일 예시

/opt/mssql-data *(rw,no_root_squash,no_all_squash,sync)

shell> exportfs -a

 3.2 Persistent Volume 생성

 shell> kubectl apply -f PersistentVolume.yaml

 - PersistentVolume.yaml 예시

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0000
  namespace: default
  labels:
    storage: nfs
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /opt/mssql-data
    server: 192.168.0.167

 3.3 Persistent Volume Claim 생성

 shell> kubectl apply -f PersistentVolumeClaim.yaml

 - PersistentVolumeClaim.yaml 예시

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mssql-data
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: slow
  selector:
    matchLabels:
      storage: "nfs"

4. 배포 만들기

shell> kubectl apply -f sqldeployment.yaml

- sqldeployment.yaml 예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2017-CU20-ubuntu-16.04
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: 'Developer'
        - name: ACCEPT_EULA
          value: 'Y'
        - name: SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql
              key: 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

- 생성된 파드 및 서비스 확인( Master Node)

shell> kubectl get pod -o wide
NAME                                         READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATES
mssql-deployment-77b965cdc9-p5vv6            1/1     Running   1          9h      10.38.0.0    workernode1               
shell>
shell> kubectl get svc
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
mssql-deployment            LoadBalancer   10.109.133.162        1433:30792/TCP   9h
shell>

5. Failover 테스트

 5.1 worker node #1을 유지 모드로 변경

shell> kubectl get node
NAME        STATUS   ROLES     AGE   VERSION
masternode1    Ready    master    25d   v1.17.4
workernode1    Ready    <none>   25d   v1.17.4
workernode2    Ready    <none>   25d   v1.17.4
shell> kubectl drain workernode1
node/workernode1 cordoned
evicting pod "mssql-deployment-77b965cdc9-p5vv6"
pod/mssql-deployment-77b965cdc9-p5vv6 evicted
node/myworkernode1 evicted
shell> kubectl get node
NAME        STATUS                     ROLES     AGE   VERSION
masternode1    Ready                      master    25d   v1.17.4
workernode1   Ready,SchedulingDisabled   <none>  25d   v1.17.4
workernode2    Ready                      <none>    25d   v1.17.4
shell>

 5.2 파드가 workernode2에서 실행중인지 확인

shell> kubectl get pod -o wide
NAME                                         READY   STATUS    RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
mssql-deployment-77b965cdc9-q4zrl            1/1     Running   0          4m56s   10.45.0.19   workernode2              
shell>

 

참고 : https://docs.microsoft.com/ko-kr/sql/linux/tutorial-sql-server-containers-kubernetes?view=sql-server-ver15

 

반응형