使用 Azure Kubernetes Service 上的 DH2i DxOperator 在 Kubernetes 上部署可用性群組

適用於:Linux 上的 SQL Server

本教學課程說明如何使用 DH2i DxOperator 為部署至 Azure Kubernetes Service (AKS) 叢集的 SQL Server Linux 型容器設定 SQL Server Always On 可用性群組 (AG)。 這些程序同樣適用於 Azure Red Hat OpenShift 叢集。 主要區別在於部署 Azure Red Hat OpenShift 叢集,接著在以下步驟中將指令替換kubectloc

透過本文的步驟,你將學習如何部署 StatefulSet,並使用 DH2i DxOperator 建立與配置一個由三個副本架設於 AKS 上的 AG。

本教學課程包含下列步驟:

  • 使用 mssql-conf 設定在 AKS 叢集上建立 configmap 物件
  • 安裝 DxOperator
  • 建立祕密物件
  • 使用 YAML 檔案部署三副本的 SQL Server 可用性群組
  • 連接到 SQL Server

先決條件

  • Azure Kubernetes Service (AKS) 或 Kubernetes 叢集。

  • 已啟用 AG 功能和通道的有效 DxEnterprise 授權。 如需詳細資訊,請參閱非生產環境的開發人員版本,或生產工作負載的 DxEnterprise 軟體

建立 configmap 物件

  1. 在 AKS 建立 configmap 物件,根據您的需求,它具有 mssql-conf 設定。 在這個範例中,你會使用名為 mssqlconfig.yaml 且具有下列參數的檔案來建立 configmap

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mssql-config
    data:
      mssql.conf: |
        [EULA]
        accepteula = Y
    
        [sqlagent]
        enabled = true
    
  2. 請執行以下指令建立物件。

    kubectl apply -f ./mssqlconfig.yaml
    

建立祕密物件

建立祕密以儲存 SQL Server 的 sa 密碼。

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

注意事項

您的密碼應遵循 SQL Server 預設 密碼原則。 根據預設,密碼長度必須至少為8個字元,且包含下列四個集合中的三個字元:大寫字母、小寫字母、基底10位數和符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

建立祕密以儲存 DH2i 的授權識別碼。 請造訪 DH2i 的網站以取得開發人員授權。 在下列範例中,將 XXXX-XXXX-XXXX-XXXX 取代為您的授權識別碼。

kubectl create secret generic dxe --from-literal=DX_PASSKEY="<password>" --from-literal=DX_LICENSE=XXXX-XXXX-XXXX-XXXX

安裝 DxOperator

安裝 DxOperator 時,請依照以下範例下載 DxOperator 的 YAML 檔案,然後套用 YAML 檔案。

  1. 請使用以下指令部署描述如何設定 AG 的 YAML 檔案。 使用自訂名稱儲存檔案,例如 DxOperator.yaml

    curl -L https://dxoperator.dh2i.com/dxsqlag/files/v2.yaml -o DxOperator.yaml
    kubectl apply -f DxOperator.yaml
    
  2. 安裝操作員後,你可以部署 SQL Server 容器、設定可用性群組、定義副本,並部署與配置 DxEnterprise 叢集。 請修改下列範例部署 YAML 檔案 DxSqlAg.yaml,使其符合您的需求。

    apiVersion: dh2i.com/v1
    kind: DxSqlAg
    metadata:
      name: contoso-sql
    spec:
     sqlAgConfiguration:
       synchronousReplicas: 3
       asynchronousReplicas: 0
       # ConfigurationOnlyReplicas are only allowed with availabilityGroupClusterType set to EXTERNAL
       configurationOnlyReplicas: 0
       availabilityGroupName: AG1
       # Adds auto-generated load balancers to serviceTemplates for easy cluster access
       # For more customization, use the serviceTemplates section below
       #createLoadBalancers: true
       # Listener port for the availability group (uncomment to apply)
       #availabilityGroupListenerPort: 51433
       # For a contained availability group, add the option CONTAINED
       #availabilityGroupOptions: CONTAINED
       # Disables automatic availability mode switching when scaling down
       #disableModeSwitching: true
      statefulSetSpec:
        podspec:
          dxEnterpriseContainer:
            image: "docker.io/dh2i/dxe:latest"
            imagePullPolicy: Always
            acceptEula: true
            clusterSecret: dxe
            vhostName: VHOST1
            # Configuration options for the required persistent volume claim for DxEnterprise
            #volumeClaimConfiguration:
            # Set custom storage class for DxE PVC
            #storageClassName: example-class
          mssqlServerContainer:
            image: "mcr.microsoft.com/mssql/server:2025-latest"
            imagePullPolicy: Always
            mssqlSecret: mssql
            acceptEula: true
            mssqlPID: Developer
            # Set a non-default SQL Server port. DxOperator will auto-detect
            # the port from other sources too, such as mssqlConfigMap
            mssqlTcpPort: 51444
            # The MSSQL configMap (mssql.conf file)
            mssqlConfigMap: mssql-config
            # Configuration options for the required persistent volume claim for SQL Server
            #volumeClaimConfiguration:
            #  resources:
            #    requests:
            #      storage: 2Gi
          # Additional pod containers, such as mssql-tools
          #containers:
          #- name: mssql-tools
            #image: "mcr.microsoft.com/mssql-tools"
            #command: [ "/bin/sh" ]
            #args: [ "-c", "tail -f /dev/null" ]
    
  3. 部署 DxSqlAg.yaml 檔案。

    kubectl apply -f DxSqlAg.yaml
    

建立可用性群組接聽程式

  1. 更新你的 DxSqlAg.yaml 檔案中的 availabilityGroupListenerPort 值:

    spec:
      sqlAgConfiguration:
        availabilityGroupListenerPort: 51433
    
  2. 套用此檔案:

    kubectl apply -f DxSqlAg.yaml
    
  3. 套用以下 YAML 來為監聽者新增負載平衡器。

    apiVersion: v1
    kind: Service
    metadata:
      name: contoso-cluster-lb
    spec:
      type: LoadBalancer
      selector:
        dh2i.com/entity-name: contoso-sql
        # This label points to whichever pod is the active Vhost member
        dh2i.com/active-vhost-vhost1: "true"
      ports:
        - name: sql
          protocol: TCP
          port: 1433
          targetPort: 51444
        - name: listener
          protocol: TCP
          port: 51433
          targetPort: 51433
        - name: dxe
          protocol: TCP
          port: 7979
          targetPort: 7979
    
  4. 確認服務和負載平衡器是否在執行。

    kubectl get services
    

    輸出看起來類似於以下範例:

    NAME                     TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)                                         AGE
    contoso-cluster-lb       LoadBalancer   10.1.0.21    172.212.20.29   1433:30484/TCP,14033:30694/TCP,7979:30385/TCP   3m18s
    contoso-sql-0            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-0-lb         LoadBalancer   10.1.0.210   4.255.19.171    7979:32374/TCP,1433:32444/TCP                   79m
    contoso-sql-1            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-1-lb         LoadBalancer   10.1.0.158   4.255.19.201    7979:30152/TCP,1433:30868/TCP                   79m
    contoso-sql-2            ClusterIP      None         <none>          7979/TCP,7980/TCP,7981/UDP,5022/TCP,1433/TCP    79m
    contoso-sql-2-lb         LoadBalancer   10.1.0.159   4.255.19.218    7979:30566/TCP,1433:31463/TCP                   79m
    kubernetes               ClusterIP      10.1.0.1     <none>          443/TCP                                         87m
    
  5. 確認三個 SQL Server Pod 都已經在執行。

    kubectl get pods
    

    輸出看起來類似於以下範例:

    NAME            READY   STATUS    RESTARTS   AGE
    contoso-sql-0   2/2     Running   0          74m
    contoso-sql-1   2/2     Running   0          74m
    contoso-sql-2   2/2     Running   0          74m