Kubernetes で DH2i DxEnterprise を使って可用性グループをデプロイする
適用対象: SQL Server - Linux
このチュートリアルでは、DH2i DxEnterprise を使って、Azure Kubernetes Service (AKS) Kubernetes クラスターにデプロイされた SQL Server Linux ベースのコンテナーに SQL Server Always On 可用性グループ (AG) を構成する方法について説明します。 サイドカー構成 (推奨) を選ぶか、独自のカスタム コンテナー イメージを構築できます。
Note
データ移動、AG、SQL Server コンポーネントは、Microsoft によってサポートされています。 DxEnterprise 製品のサポートは、クラスターとクォーラムの管理も含めて、DH2i によって行われます。
この記事で説明されている手順を使って、StatefulSet をデプロイし、DH2i DxEnterprise ソリューションを使って AG を作成および構成する方法について説明します。 このチュートリアルは、以下の手順で構成されています。
- ヘッドレス サービス構成を作成する
- 同じポッド内の SQL Server と DxEnterprise をサイドカー コンテナーとして使って StatefulSet 構成を作成する
- セカンダリ レプリカを追加して SQL Server AG を作成して構成する
- AG にデータベースを作成し、フェールオーバーをテストする
前提条件
このチュートリアルでは、3 つのレプリカを含む AG の例を示します。 必要なもの:
- Azure Kubernetes Service (AKS) または Kubernetes クラスター。
- AG 機能とトンネルが有効になっている、有効な DxEnterprise ライセンス。 詳しくは、開発者向けエディションに関するページ (非運用環境での使用) か、DxEnterprise ソフトウェアに関するページ (運用ワークロード) を参照してください。
ヘッドレス サービスを作成する
Kubernetes クラスターでは、ヘッドレス サービスによって、ホスト名を使って各ポッドを相互に接続できます。
ヘッドレス サービスを作成するには、次のサンプル コンテンツを含む
headless_services.yaml
という名前の YAML ファイルを作成します。#Headless services for local connections/resolution apiVersion: v1 kind: Service metadata: name: dxemssql-0 spec: clusterIP: None selector: statefulset.kubernetes.io/pod-name: dxemssql-0 ports: - name: dxl protocol: TCP port: 7979 - name: dxc-tcp protocol: TCP port: 7980 - name: dxc-udp protocol: UDP port: 7981 - name: sql protocol: TCP port: 1433 - name: listener protocol: TCP port: 14033 --- apiVersion: v1 kind: Service metadata: name: dxemssql-1 spec: clusterIP: None selector: statefulset.kubernetes.io/pod-name: dxemssql-1 ports: - name: dxl protocol: TCP port: 7979 - name: dxc-tcp protocol: TCP port: 7980 - name: dxc-udp protocol: UDP port: 7981 - name: sql protocol: TCP port: 1433 - name: listener protocol: TCP port: 14033 --- apiVersion: v1 kind: Service metadata: name: dxemssql-2 spec: clusterIP: None selector: statefulset.kubernetes.io/pod-name: dxemssql-2 ports: - name: dxl protocol: TCP port: 7979 - name: dxc-tcp protocol: TCP port: 7980 - name: dxc-udp protocol: UDP port: 7981 - name: sql protocol: TCP port: 1433 - name: listener protocol: TCP port: 14033
次のコマンドを実行して、構成を適用します。
kubectl apply -f headless_services.yaml
StatefulSet を作成する
次のサンプル コンテンツを含む StatefulSet YAML ファイルを作成し、
dxemssql.yaml
という名前を付けます。この StatefulSet 構成では、永続ボリューム要求を利用してデータを格納する 3 つの DxEMSSQL レプリカが作成されます。 この StatefulSet の各ポッドは、SQL Server コンテナーと DxEnterprise コンテナーという 2 つのコンテナーで構成されます。 これらのコンテナーは "サイドカー" 構成で互いに独立して開始されますが、DxEnterprise によって SQL Server コンテナー内の AG レプリカが管理されます。
#DxEnterprise + MSSQL StatefulSet apiVersion: apps/v1 kind: StatefulSet metadata: name: dxemssql spec: serviceName: "dxemssql" replicas: 3 selector: matchLabels: app: dxemssql template: metadata: labels: app: dxemssql spec: securityContext: fsGroup: 10001 containers: - name: sql image: mcr.microsoft.com/mssql/server:2022-latest env: - name: ACCEPT_EULA value: "Y" - name: MSSQL_ENABLE_HADR value: "1" - name: MSSQL_SA_PASSWORD valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD volumeMounts: - name: mssql mountPath: "/var/opt/mssql" - name: dxe image: docker.io/dh2i/dxe env: - name: MSSQL_SA_PASSWORD valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD volumeMounts: - name: dxe mountPath: "/etc/dh2i" volumeClaimTemplates: - metadata: name: dxe spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi - metadata: name: mssql spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
SQL Server インスタンスの認証情報を作成します。
kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"
StatefulSet 構成を適用します。
kubectl apply -f dxemssql.yaml
ポッドの状態を確認し、ポッドの状態が
running
になったら次の手順に進みます。kubectl get pods kubectl describe pods
可用性グループの作成とフェールオーバーのテスト
AG の作成と構成、レプリカの追加、フェールオーバーのテストの詳細については、「Kubernetes の SQL Server 可用性グループ」を参照してください。
可用性グループ リスナーを構成する手順 (省略可能)
また、以下の手順で、AG リスナーを構成することもできます。
DH2i のドキュメント の終わりの方に省略可能な手順として記載されている通り、DxEnterprise を使用して AG リスナーを作成したことを確認します。
Kubernetes では、必要に応じて 静的 IP アドレスを作成できます。 静的 IP アドレスを作成する時、リスナー サービスが削除されて再作成された場合に、リスナー サービスに割り当てられた外部 IP アドレスが変更されないことを確かめます。 この手順に従って、Azure Kubernetes Service (AKS) で 静的 IP アドレスを作成 します。
IP アドレスを作成したら、次の YAML サンプルに示すように、その IP アドレスを割り当て、ロード バランサー サービスを作成します。
apiVersion: v1 kind: Service metadata: name: agslistener spec: type: LoadBalancer loadBalancerIP: 52.140.117.62 selector: app: mssql ports: - protocol: TCP port: 44444 targetPort: 44444
読み取り/書き込み接続リダイレクトを構成する手順 (省略可能)
AG を作成したら、これらの手順に従って、セカンダリからプライマリへの読み取り/書き込み接続リダイレクトを有効にできます。 詳しくは、「セカンダリからプライマリ レプリカへの読み取り/書き込み接続のリダイレクト (Always On 可用性グループ)」をご覧ください。
USE [master];
GO
ALTER AVAILABILITY
GROUP [ag_name] MODIFY REPLICA
ON N'<name of the primary replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO
USE [master];
GO
ALTER AVAILABILITY
GROUP [AGS1] MODIFY REPLICA
ON N'<name of the secondary-0 replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO
USE [master];
GO
ALTER AVAILABILITY
GROUP [AGS1] MODIFY REPLICA
ON N'<name of the secondary-1 replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO
USE [master];
GO
ALTER AVAILABILITY
GROUP AGS1 MODIFY REPLICA
ON N'<name of the primary replica>'
WITH (PRIMARY_ROLE(READ_WRITE_ROUTING_URL = 'TCP://<External IP address of primary -0>:1433'));
GO
USE [master];
GO
ALTER AVAILABILITY
GROUP AGS1 MODIFY REPLICA
ON N'<name of the secondary-0 replica>'
WITH (PRIMARY_ROLE(READ_WRITE_ROUTING_URL = 'TCP://<External IP address of secondary -0>:1433'));
GO
USE [master];
GO
ALTER AVAILABILITY
GROUP AGS1 MODIFY REPLICA
ON N'<name of the secondary-1 replica>'
WITH (PRIMARY_ROLE(READ_WRITE_ROUTING_URL = 'TCP://<External IP address of secondary -1>:1433'));
GO