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 クラスターのデプロイメントであり、その後、次の手順で kubectl コマンドを oc に置き換えます。

  • Microsoft では、データ移動、AG、SQL Server の各コンポーネントをサポートしています。 DH2i は、クラスターとクォーラム管理を含む DxEnterprise 製品のサポートを担当します。

  • DxOperator は、カスタム リソース定義を使用して DxEnterprise クラスターのデプロイを自動化する Kubernetes のソフトウェア拡張機能です。 DxEnterprise は、Kubernetes の SQL Server AG ワークロードの自動フェールオーバーを作成、構成、管理、および提供するためのすべてのインストルメンテーションを備えています。 無料の DxEnterprise ソフトウェア ライセンスに登録できます。 詳細については、 DxOperator クイック スタート ガイドを参照してください。

この記事に記載された手順を用いて、StatefulSet をデプロイし、DH2i DxOperator を使用して、AKS でホストされる 3 個のレプリカで AG を作成および構成する方法について説明します。

このチュートリアルは、次の手順で構成されます。

  • mssql-conf 設定を使用して AKS クラスターに configmap オブジェクトを作成する
  • DxOperator のインストール
  • シークレットオブジェクトを作成する
  • YAML ファイルを使用して 3 個のレプリカ SQL AG を配置する
  • SQL Serverに接続する

前提条件

  • Azure Kubernetes Service (AKS) または Kubernetes クラスター。

  • AG 機能とトンネルが有効な DxEnterprise ライセンス。 詳細については、非運用環境での使用に関する 開発者向けエディション 、または運用ワークロード用 の DxEnterprise ソフトウェア を参照してください。

configmap オブジェクトを作成する

  1. AKS で、要件に応じた mssql-conf 設定を持つ configmap オブジェクトを作成します。 この例では、configMap というファイルを次のパラメータとともに使用して、mssqlconfig.yaml を作成します。

    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>"

Caution

パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。 既定では、パスワードの長さは少なくとも 8 文字で、大文字、小文字、10 進数の数字、記号の 4 種類のうち 3 種類を含んでいる必要があります。 パスワードには最大 128 文字まで使用できます。 可能な限り長く複雑なパスワードを使用してください。

DH2i のライセンス キーを格納するシークレットを作成します。 DH2i の Web サイト にアクセスして、開発者用ライセンスを取得します。 次の例では、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/dxesqlag/files/v1.yaml -o DxOperator.yaml
    kubectl apply -f DxOperator.yaml
    
  2. オペレーターをインストールしたら、SQL Server コンテナーのデプロイ、可用性グループの構成、レプリカの定義、DxEnterprise クラスターのデプロイと構成を行うことができます。 これは、DxEnterpriseSqlAg.yaml というサンプル デプロイメント YAML ファイルです。これは、要件に合わせて変更できます。

    apiVersion: dh2i.com/v1
    kind: DxEnterpriseSqlAg
    metadata:
      name: contoso-sql
    spec:
      synchronousReplicas: 3
      asynchronousReplicas: 0
      # ConfigurationOnlyReplicas are only allowed with availabilityGroupClusterType set to EXTERNAL
      configurationOnlyReplicas: 0
      availabilityGroupName: AG1
      # Listener port for the availability group (uncomment to apply)
      availabilityGroupListenerPort: 51433
      # For a contained availability group, add the option CONTAINED
      availabilityGroupOptions: null
      # Valid options are EXTERNAL (automatic failover) and NONE (no automatic failover)
      availabilityGroupClusterType: EXTERNAL
      createLoadBalancers: true
      template:
        metadata:
          labels:
            label: example
          annotations:
            annotation: example
        spec:
          dxEnterpriseContainer:
            image: "docker.io/dh2i/dxe:latest"
            imagePullPolicy: Always
            acceptEula: true
            clusterSecret: dxe
            vhostName: VHOST1
            joinExistingCluster: false
            # QoS - guaranteed (uncomment to apply)
            #resources:
              #limits:
                #memory: 1Gi
                #cpu: '1'
            # Configuration options for the required persistent volume claim for DxEnterprise
            volumeClaimConfiguration:
              storageClassName: null
              resources:
                requests:
                  storage: 1Gi
          mssqlServerContainer:
            image: "mcr.microsoft.com/mssql/server:latest"
            imagePullPolicy: Always
            mssqlSecret: mssql
            acceptEula: true
            mssqlPID: Developer
            mssqlConfigMap: mssql-config
            # QoS - guaranteed (uncomment to apply)
            #resources:
              #limits:
                #memory: 2Gi
                #cpu: '2'
            # Configuration options for the required persistent volume claim for SQL Server
            volumeClaimConfiguration:
              storageClassName: null
              resources:
                requests:
                  storage: 2Gi
          # Additional side-car containers, such as mssql-tools (uncomment to apply)
          #containers:
          #- name: mssql-tools
              #image: "mcr.microsoft.com/mssql-tools"
              #command: [ "/bin/sh" ]
              #args: [ "-c", "tail -f /dev/null" ]
    
  3. DxEnterpriseSqlAg.yaml ファイルをデプロイします。

    kubectl apply -f DxEnterpriseSqlAg.yaml
    

可用性グループリスナーを作成する

前の手順でセレクターの値を metadata.name に設定することで、次の YAML を適用してロード バランサーを追加します。 この例の場合、contoso-sql です。

apiVersion: v1
kind: Service
metadata:
  name: contoso-cluster-lb
spec:
  type: LoadBalancer
  selector:
    dh2i.com/entity: contoso-sql
  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

展開とロード バランサーの割り当てを確認します。

kubectl get pods
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

PS /home/aravind> 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