快速入門:在 Azure 上部署 SQL Server 容器叢集

適用於:SQL Server - Linux

本快速入門示範如何在 Azure Kubernetes Service (AKS) 或 Red Hat OpenShift 上具有永續性儲存體的容器中設定高可用性 SQL Server 執行個體。 如果 SQL Server 執行個體失敗,則會在新的 Pod 中自動重新建立協調器。 叢集服務還可針對節點失敗提供復原能力。

本快速入門使用下列命令列工具來管理叢集。

叢集服務 命令列工具
Azure Kubernetes Service (AKS) kubectl (Kubernetes CLI)
Azure Red Hat OpenShift oc (OpenShift CLI)

必要條件

建立 SA 密碼

  1. 在 Kubernetes 叢集中建立 SA 密碼。 Kubernetes 可以管理敏感性設定資訊,例如作為 Secret 的密碼。

  2. 若要在 Kubernetes 中建立名為 mssql 的祕密,以保存 MSSQL_SA_PASSWORD 的值 MyC0m9l&xP@ssw0rd,請執行下列命令。 請記得挑選您自己的複雜密碼:

    重要

    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 儲存體帳戶,並繫結至永續性磁碟區宣告。

    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 入口網站中 Blob 的名稱部分:

    Screenshot of the Azure portal blob name.

  5. 驗證永續性磁碟區。

    kubectl describe pv
    

    kubectl 會傳回永續性磁碟區 (之前由系統自動建立並繫結至永續性磁碟區宣告) 的相關中繼資料。

建立部署

裝載 SQL Server 執行個體的容器被描述為 Kubernetes「部署物件」。 部署會建立「複本集」。 複本集會建立 Pod

您可建立資訊清單,以根據 SQL Server mssql-server-linux Docker 映像來描述容器。

  • 資訊清單會參考 mssql-server 永續性磁碟區宣告,以及您已套用至 Kubernetes 叢集的 mssql Secret。
  • 資訊清單也會描述服務。 此服務是負載平衡器。 負載平衡器可確保在 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 版本未獲授權用於生產環境資料。 如果部署是供生產環境使用,請設定適當的版本 (EnterpriseStandardExpress)。 如需詳細資訊,請參閱如何授權 SQL Server

    • persistentVolumeClaim:此值需要使用與永續性磁碟區宣告所用名稱對應的 claimName: 項目。 本教學課程使用 mssql-data

    • name: MSSQL_SA_PASSWORD:設定容器映像以設定 SA 密碼,如本節中所定義。

      valueFrom:
        secretKeyRef:
          name: mssql
          key: MSSQL_SA_PASSWORD
      

      當 Kubernetes 部署容器時,它會參考名為 mssql 的 Secret,以取得密碼的值。

    • securityContext:定義 Pod 或容器的權限和存取控制設定。 在此情況下,將會在 Pod 層級指定此值,因此所有容器都會遵守該資訊安全內容。 在資訊安全內容中,我們會使用值 10001 來定義 fsGroup,該值是 mssql 群組的群組識別碼 (GID)。 這個值表示容器的所有流程也是補充 GID 10001 (mssql) 的一部分。 /var/opt/mssql 磁碟區擁有者和在該磁碟區中建立的任何檔案都會是 GID 10001 (mssql 群組)。

    警告

    藉由使用 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,就可以看到使用者名稱是否為 mssqlmssql 是非根使用者。

    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> 取代為 mssql-deployment 服務的 IP 位址
  • 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