快速入門:在 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) |
必要條件
具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
Kubernetes 叢集。 如需有關使用
kubectl
在 AKS 中建立和連線至 Kubernetes 叢集的詳細資訊,請參閱部署 Azure Kubernetes Service (AKS) 叢集。注意
為了防止節點失敗,Kubernetes 叢集需要一個以上的節點。
Azure CLI。 若要安裝最新版本,請參閱如何安裝 Azure CLI。
建立 SA 密碼
在 Kubernetes 叢集中建立 SA 密碼。 Kubernetes 可以管理敏感性設定資訊,例如作為 Secret 的密碼。
若要在 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 叢集中使用下列步驟設定永續性磁碟區和永續性磁碟區宣告:
建立資訊清單,以定義儲存體類別和永續性磁碟區宣告。 資訊清單會指定儲存體佈建程式、參數和回收原則。 Kubernetes 叢集會使用這個資訊清單來建立永續性儲存體。
下列 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
)。在 Kubernetes 中建立永續性磁碟區宣告,其中
<path to pvc.yaml file>
是您儲存檔案的位置:kubectl apply -f <path to pvc.yaml file>
系統會自動將永續性磁碟區建立為 Azure 儲存體帳戶,並繫結至永續性磁碟區宣告。
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
驗證永續性磁碟區宣告,其中
<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 的名稱部分:
驗證永續性磁碟區。
kubectl describe pv
kubectl
會傳回永續性磁碟區 (之前由系統自動建立並繫結至永續性磁碟區宣告) 的相關中繼資料。
建立部署
裝載 SQL Server 執行個體的容器被描述為 Kubernetes「部署物件」。 部署會建立「複本集」。 複本集會建立 Pod。
您可建立資訊清單,以根據 SQL Server mssql-server-linux Docker 映像來描述容器。
- 資訊清單會參考
mssql-server
永續性磁碟區宣告,以及您已套用至 Kubernetes 叢集的mssql
Secret。 - 資訊清單也會描述服務。 此服務是負載平衡器。 負載平衡器可確保在 SQL Server 執行個體復原之後,IP 位址會持續保留。
- 資訊清單描述了資源「要求」和「限制」。 這些內容都是基於最低系統需求。
建立資訊清單 (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 版本未獲授權用於生產環境資料。 如果部署是供生產環境使用,請設定適當的版本 (Enterprise
、Standard
或Express
)。 如需詳細資訊,請參閱如何授權 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)。 這個值表示容器的所有流程也是補充 GID10001
(mssql
) 的一部分。/var/opt/mssql
磁碟區擁有者和在該磁碟區中建立的任何檔案都會是 GID10001
(mssql
群組)。
警告
藉由使用
LoadBalancer
服務類型,您可以在連接埠 1433 遠端存取 (透過網際網路) SQL Server 執行個體。儲存檔案。 例如:
sqldeployment.yaml
。建立部署,其中
<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 映像,所以導致延遲。 第一次提取映像之後,如果部署抵達的節點中已經快取映像,則後續部署可能會更快速。驗證服務是否正在執行。 執行以下命令:
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>
您還可以執行下列命令來驗證容器是否以非根身分執行,其中
<nameOfSqlPod>
是您 SQL Server Pod 的名稱:kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
如果您執行
whoami
,就可以看到使用者名稱是否為mssql
。mssql
是非根使用者。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:
列出執行 SQL Server 的 Pod。
kubectl get pods
記下執行 SQL Server 的 Pod 名稱。
刪除 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