Schnellstart: Bereitstellen eines SQL Server-Containerclusters in Azure
Gilt für: SQL Server – Linux
In diesem Schnellstart wird veranschaulicht, wie Sie eine hoch verfügbare SQL Server-Instanz in einem Container mit persistentem Speicher in Azure Kubernetes Service (AKS) oder Red Hat OpenShift konfigurieren. Wenn bei der SQL Server-Instanz ein Fehler aufritt, erstellt der Orchestrator sie automatisch in einem neuen Pod neu. Der Clusterdienst bietet auch Resilienz für Knotenausfälle.
In dieser Schnellstartanleitung werden die folgenden Befehlszeilentools verwendet, um den Cluster zu verwalten.
Clusterdienst | Befehlszeilentool |
---|---|
Azure Kubernetes Service (AKS) | kubectl (Kubernetes CLI) |
Azure Red Hat OpenShift | oc (OpenShift CLI) |
Voraussetzungen
Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
Ein Kubernetes-Cluster. Weitere Informationen zum Erstellen eines Kubernetes-Clusters und Herstellen einer Verbindung damit in AKS mit
kubectl
finden Sie unter Bereitstellen eines Azure Kubernetes Service-Clusters (AKS).Hinweis
Ein Kubernetes-Cluster benötigt mehrere Knoten zum Schutz vor Knotenausfällen.
Azure-Befehlszeilenschnittstelle. Unter Installieren der Azure CLI erhalten Sie Informationen zur Installation der neuesten Version.
Erstellen eines Systemadministratorkennworts
Erstellen Sie ein Systemadministratorkennwort im Kubernetes-Cluster. Kubernetes kann vertrauliche Konfigurationsinformationen wie Kennwörter als Geheimnisse verwalten.
Führen Sie den folgenden Befehl aus, um in Kubernetes ein Geheimnis namens
mssql
zu erstellen, das den WertMyC0m9l&xP@ssw0rd
fürMSSQL_SA_PASSWORD
enthält. Wählen Sie Ihr eigenes komplexes Kennwort aus:Wichtig
Die Umgebungsvariable
SA_PASSWORD
ist veraltet. Verwenden Sie stattdessenMSSQL_SA_PASSWORD
.kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
Erstellen des Speichers
Für eine Datenbank in einem Kubernetes-Cluster müssen Sie beständigen Speicher verwenden. Über die folgenden Schritte können Sie ein persistentes Volume und einen Anspruch auf ein persistentes Volume im Kubernetes-Cluster konfigurieren:
Erstellen Sie ein Manifest, um die Speicherklasse und den Anspruch auf ein persistentes Volume zu definieren. Mit dem Manifest werden der Speicheranbieter, die Parameter und die reclaim policy (Rückforderungsrichtlinie) festgelegt. Der Kubernetes-Cluster verwendet dieses Manifest, um den persistenten Speicher zu erstellen.
Im folgenden YAML-Beispiel werden eine Speicherklasse und ein Anspruch auf persistente Volumes definiert. Der Speicherklassenanbieter lautet
azure-disk
, weil sich dieser Kubernetes-Cluster in Azure befindet. Der Speicherkontotyp lautetStandard_LRS
. Der Anspruch auf persistente Volumes heißtmssql-data
. Die Metadaten des Anspruchs auf persistente Volumes enthalten eine Anmerkung, durch die sie auf die Speicherklasse zurückgeführt werden können.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
Speichern Sie die Datei (z. B.
pvc.yaml
).Erstellen Sie den Anspruch auf ein persistentes Volume in Kubernetes, wobei
<path to pvc.yaml file>
den Speicherort angibt, an dem Sie die Datei gespeichert haben:kubectl apply -f <path to pvc.yaml file>
Das persistente Volume wird automatisch als Azure-Speicherkonto erstellt und an den Anspruch auf ein persistentes Volume gebunden.
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
Überprüfen Sie den Anspruch auf das persistente Volume, wobei
<persistentVolumeClaim>
dem Namen des Anspruchs auf das persistente Volume entspricht:kubectl describe pvc <persistentVolumeClaim>
Im vorherigen Schritt wurde der Anspruch auf persistente Volumes
mssql-data
genannt. Führen Sie den folgenden Befehl aus, um die Metadaten über den Anspruch auf permanente Volumes anzuzeigen:kubectl describe pvc mssql-data
Die zurückgegebenen Metadaten enthalten einen Wert namens
Volume
. Dieser Wert wird dem Namen des Blobs zugeordnet.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>
Der Wert für Volume entspricht einem Teil des Namens des Blobs in der folgenden Abbildung aus dem Azure-Portal:
Überprüfen Sie das persistente Volume.
kubectl describe pv
kubectl
gibt Metadaten zum persistenten Volume zurück, die automatisch generiert und an den Anspruch für das persistente Volume gebunden wurden.
Erstellen der Bereitstellung
In diesem Beispiel wird der Container, der die SQL Server-Instanz hostet, als Kubernetes-Bereitstellungsobjekt beschrieben. Die Bereitstellung erstellt eine Replikatgruppe. Die Replikatgruppe erstellt einen Pod.
Sie erstellen ein Manifest zum Beschreiben des Containers basierend auf dem Docker-Image der SQL Server-Instanz mssql-server-linux.
- Das Manifest referenziert den
mssql-server
-Anspruch auf das persistente Volume und dasmssql
-Geheimnis, das Sie bereits auf den Kubernetes-Cluster angewendet haben. - Das Manifest beschreibt außerdem einen Dienst. Bei diesem Dienst handelt es sich um einen Lastenausgleich. Der Lastenausgleich garantiert, dass die IP-Adresse beibehalten wird, nachdem die SQL Server-Instanz wiederhergestellt wurde.
- Das Manifest beschreibt Ressourcenanforderungen und Grenzwerte. Diese basieren auf den Mindestsystemanforderungen.
Erstellen Sie ein Manifest (eine YAML-Datei), um die Bereitstellung zu beschreiben. Im folgenden Beispiel wird eine Bereitstellung beschrieben, die einen Container enthält, der auf dem SQL Server-Containerimage basiert.
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
Kopieren Sie den obigen Code in eine neue Datei namens
sqldeployment.yaml
. Ändern Sie die folgenden Werte:MSSQL_PID
value: "Developer"
: Hiermit wird festgelegt, dass der Container die SQL Server Developer-Edition ausführt. Die Developer-Edition ist nicht für Produktionsdaten lizenziert. Wenn die Bereitstellung für die Produktion vorgesehen ist, legen Sie die entsprechende Edition fest (Enterprise
,Standard
oderExpress
). Weitere Informationen finden Sie unter Lizenzierung von SQL Server.persistentVolumeClaim
: Dieser Wert erfordert einen Eintrag fürclaimName:
, der den verwendeten Namen dem Anspruch für das persistente Volume zuordnet. In diesem Tutorial wirdmssql-data
verwendet.name: MSSQL_SA_PASSWORD
: Konfiguriert das Containerimage, um das Systemadministratorkennwort wie in diesem Abschnitt beschrieben festzulegen.valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD
Wenn Kubernetes den Container bereitstellt, verweist auf das Geheimnis namens
mssql
, um den Wert für das Kennwort abzurufen.securityContext
: Definiert Einstellungen für Berechtigungen und die Zugriffssteuerung für einen Pod oder Container. In diesem Fall werden diese auf Podebene angegeben, damit alle Container diesem Sicherheitskontext entsprechen. Im Sicherheitskontext definieren wirfsGroup
mit dem Wert10001
, der der Gruppen-ID (GID) für diemssql
-Gruppe entspricht. Dieser Wert bedeutet, dass alle Prozesse des Containers auch Bestandteil der ergänzenden GID10001
(mssql
) sind. Der Besitzer des Volumes/var/opt/mssql
und aller Dateien, die in diesem Volume erstellt werden, ist die GID10001
(diemssql
-Gruppe).
Warnung
Mithilfe des
LoadBalancer
-Diensttyps wird der Remotezugriff auf die SQL Server-Instanz (über das Internet) an Port 1433 ermöglicht.Speichern Sie die Datei . Beispiel:
sqldeployment.yaml
.Erstellen Sie die Bereitstellung, wobei
<path to sqldeployment.yaml file>
dem Speicherort entspricht, an dem Sie die Datei gespeichert haben:kubectl apply -f <path to sqldeployment.yaml file>
Die Bereitstellung und der Dienst werden erstellt. Die SQL Server-Instanz befindet sich in einem Container, der mit dem persistenten Speicher verbunden ist.
deployment "mssql-deployment" created service "mssql-deployment" created
Die Bereitstellung und der Dienst werden erstellt. Die SQL Server-Instanz befindet sich in einem Container, der mit dem persistenten Speicher verbunden ist.
Geben Sie
kubectl get pod
ein, um den Status des Pods anzuzeigen.NAME READY STATUS RESTARTS AGE mssql-deployment-3813464711-h312s 1/1 Running 0 17m
Der Pod weist den Status
Running
auf. Dieser Status gibt an, dass der Container bereit ist. Nachdem die Bereitstellung erstellt wurde, kann es einige Minuten dauern, bis der Pod sichtbar ist. Die Verzögerung liegt daran, dass der Cluster das Image mssql-server-linux per Pull aus der Microsoft-Artefaktregistrierung abruft. Nachdem das Image zum ersten Mal per Pull abgerufen wurde, können nachfolgende Bereitstellungen schneller sein, wenn die Bereitstellung einen Knoten nutzt, auf dem bereits ein Image zwischengespeichert wurde.Überprüfen Sie, ob die Dienste ausgeführt werden. Führen Sie den folgenden Befehl aus:
kubectl get services
Dieser Befehl gibt alle Dienste, die ausgeführt werden, und die internen sowie externen IP-Adressen der Dienste zurück. Beachten Sie die externe IP-Adresse für den
mssql-deployment
-Dienst. Verwenden Sie diese IP-Adresse, um eine Verbindung mit SQL Server herzustellen.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
Führen Sie den folgenden Befehl aus, um weitere Informationen zum Status der Objekte im Kubernetes-Cluster zu erhalten. Denken Sie daran,
<MyResourceGroup>
und<MyKubernetesClustername>
durch Ihre Ressourcengruppe und den Namen des Kubernetes-Clusters zu ersetzen:az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
Über den folgenden Befehl können Sie auch sicherstellen, dass der Container als Nicht-Root-Benutzer ausgeführt wird, wobei
<nameOfSqlPod>
dem Namen Ihres SQL Server-Pods entspricht:kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
Sie sehen den Benutzernamen als
mssql
, wenn Siewhoami
ausführen.mssql
ist kein Root-Benutzer.whoami
Herstellen einer Verbindung mit der SQL Server-Instanz
Sie können von außerhalb des virtuellen Azure-Netzwerks eine Verbindung mit einer Anwendung herstellen, indem Sie das sa
-Konto und die externe IP-Adresse für den Dienst verwenden. Verwenden Sie das Kennwort, das Sie als OpenShift-Geheimnis konfiguriert haben.
Sie können die folgenden Anwendungen verwenden, um eine Verbindung mit der SQL Server-Instanz herzustellen.
Herstellen einer Verbindung mit sqlcmd
Führen Sie den folgenden Befehl aus, um eine Verbindung mit sqlcmd
herzustellen:
sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"
Ersetzen Sie die folgenden Werte:
- Ersetzen Sie
<External IP Address>
durch die IP-Adresse für denmssql-deployment
-Dienst MyC0m9l&xP@ssw0rd
durch Ihr komplexes Kennwort
Überprüfen von Fehlern und der Wiederherstellung
Um die Fehler und die Wiederherstellung zu überprüfen, können Sie den Pod löschen, indem Sie folgendermaßen vorgehen:
Listen Sie den Pod auf, der SQL Server ausführt.
kubectl get pods
Notieren Sie sich den Namen des Pods, der SQL Server ausführt.
Löschen Sie den Pod.
kubectl delete pod mssql-deployment-0
mssql-deployment-0
ist der Wert, der im vorherigen Schritt als Name des Pods zurückgegeben wurde.
Kubernetes erstellt den Pod automatisch neu, um eine SQL Server-Instanz wiederherzustellen, und stellt eine Verbindung mit dem beständigen Speicher her. Verwenden Sie kubectl get pods
, um zu überprüfen, dass ein neuer Pod bereitgestellt wurde. Verwenden Sie kubectl get services
, um zu überprüfen, ob die IP-Adresse für den neuen Container gleich ist.
Bereinigen von Ressourcen
Wenn Sie nicht planen, die folgenden Tutorials zu durchlaufen, bereinigen Sie Ihre unnötigen Ressourcen. Führen Sie den Befehl az group delete
aus, um die Ressourcengruppe, den Containerdienst und alle dazugehörigen Ressourcen zu entfernen. Ersetzen Sie <MyResourceGroup>
durch den Namen der Ressourcengruppe, die Ihren Cluster enthält.
az group delete --name <MyResourceGroup> --yes --no-wait