Avvio rapido: distribuire un cluster di contenitori SQL Server in Azure
Si applica a: SQL Server - Linux
Questo avvio rapido illustra come configurare un'istanza di SQL Server a disponibilità elevata in un contenitore con archiviazione permanente nel servizio Azure Kubernetes (AKS) o Red Hat OpenShift. Se l'istanza di SQL Server ha esito negativo, l’agente di orchestrazione la ricrea automaticamente in un nuovo pod. Il servizio cluster offre anche resilienza in caso di errore del nodo.
Questo avvio rapido usa le utilità da riga di comando seguenti per gestire il cluster.
Servizio cluster | Strumento da riga di comando |
---|---|
Servizio Azure Kubernetes (AKS) | kubectl (interfaccia della riga di comando di Kubernetes) |
Azure Red Hat OpenShift | oc (interfaccia della riga di comando di OpenShift) |
Prerequisiti
Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
Un cluster Kubernetes. Per altre informazioni sulla creazione e la connessione a un cluster Kubernetes in AKS con
kubectl
, vedi Distribuire un cluster del servizio Azure Kubernetes (AKS).Nota
Per la protezione da errori del nodo, un cluster Kubernetes richiede più di un nodo.
Interfaccia della riga di comando di Azure. Per installare la versione più recente, vedere Come installare l'interfaccia della riga di comando di Azure.
Creare una password dell'amministratore di sistema
Creare una password dell'amministratore di sistema nel cluster Kubernetes. Kubernetes può gestire informazioni di configurazione riservate, ad esempio le password come segreti.
Per creare in Kubernetes un segreto denominato
mssql
che contenga il valoreMyC0m9l&xP@ssw0rd
perMSSQL_SA_PASSWORD
, eseguire il comando seguente. Ricordarsi di scegliere una propria password complessa:Importante
La variabile di ambiente
SA_PASSWORD
è deprecata. Utilizzare inveceMSSQL_SA_PASSWORD
.kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
Creare una risorsa di archiviazione
Per un database in un cluster Kubernetes, è necessario usare l'archiviazione persistente. È possibile configurare un volume persistente e una richiesta di volume persistente nel cluster Kubernetes seguendo questi passaggi:
Creare un manifesto per definire la classe di archiviazione e la richiesta di volume persistente. Il manifesto specifica lo strumento di provisioning di archiviazione, i parametri e i criteri di recupero. Il cluster Kubernetes usa questo manifesto per creare l'archivio permanente.
L'esempio YAML seguente definisce una classe di archiviazione e una richiesta di volume persistente. Lo strumento di provisioning della classe di archiviazione è
azure-disk
, perché questo cluster Kubernetes è in Azure. Il tipo di account di archiviazione èStandard_LRS
. La richiesta di volume persistente è denominatamssql-data
. I metadati della richiesta di volume persistente includono un'annotazione che la riconnette alla classe di archiviazione.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
Salva il file (ad esempio,
pvc.yaml
).Creare l'attestazione del volume persistente in Kubernetes, dove
<path to pvc.yaml file>
è il percorso in cui è stato salvato il file:kubectl apply -f <path to pvc.yaml file>
Il volume persistente viene creato automaticamente come account di archiviazione di Azure e associato alla richiesta di volume persistente.
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
Verificare l'attestazione del volume persistente, dove
<persistentVolumeClaim>
è il nome dell'attestazione del volume persistente:kubectl describe pvc <persistentVolumeClaim>
Nel passaggio precedente la richiesta di volume persistente è denominata
mssql-data
. Per visualizzare i metadati relativi alla richiesta di volume persistente, eseguire il comando seguente:kubectl describe pvc mssql-data
I metadati restituiti includono un valore denominato
Volume
. Questo valore esegue il mapping al nome del 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>
Il valore per il volume corrisponde a una parte del nome del BLOB nell'immagine seguente tratta dal portale di Azure:
Verificare il volume persistente.
kubectl describe pv
kubectl
restituisce i metadati relativi al volume persistente creato automaticamente e associato alla richiesta di volume persistente.
Creare la distribuzione
Il contenitore che ospita l'istanza di SQL Server viene descritto come oggetto di distribuzione Kubernetes. La distribuzione crea un set di repliche. Il set di repliche crea il pod.
Si creerà un manifesto per descrivere il contenitore in base all'immagine Docker mssql-server-linux per SQL Server.
- Il manifesto fa riferimento alla richiesta di volume persistente
mssql-server
e al segretomssql
già applicato al cluster Kubernetes. - Il manifesto descrive anche un servizio. Si tratta di un servizio di bilanciamento del carico. Il servizio di bilanciamento del carico garantisce che l'indirizzo IP venga mantenuto anche dopo il ripristino dell'istanza di SQL Server.
- Il manifesto descrive le richieste e i limiti per le risorse, in base ai requisiti di sistema minimi.
Creare un manifesto (un file YAML) per descrivere la distribuzione. L'esempio seguente descrive una distribuzione, incluso un contenitore basato sull'immagine del contenitore per 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
Copiare il codice precedente in un nuovo file, denominato
sqldeployment.yaml
. Aggiornare i valori seguenti:MSSQL_PID
value: "Developer"
: imposta il contenitore per l'esecuzione dell'edizione SQL Server Developer. L'edizione Developer non è concessa in licenza per i dati di produzione. Se la distribuzione è destinata all'uso in produzione, impostare l'edizione appropriata (Enterprise
,Standard
oExpress
). Per altre informazioni, vedere Come ottenere una licenza per SQL Server.persistentVolumeClaim
: questo valore richiede una voce perclaimName:
che esegue il mapping al nome usato per la richiesta di volume persistente. In questa esercitazione viene usatomssql-data
.name: MSSQL_SA_PASSWORD
: configura l'immagine del contenitore per impostare la password dell'amministratore di sistema, come definito in questa sezione.valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD
Quando Kubernetes distribuisce il contenitore, fa riferimento al segreto denominato
mssql
per ottenere il valore per la password.securityContext
: definisce le impostazioni di privilegio e controllo di accesso per un pod o un contenitore. In questo caso viene specificato a livello di pod, quindi tutti i contenitori rispettano tale contesto di sicurezza. Nel contesto di sicurezza viene definito con il valorefsGroup
, ovvero l'ID di gruppo (GID)10001
per il gruppomssql
. Questo valore significa che tutti i processi del contenitore fanno parte anche dell'ID di gruppo10001
supplementare (mssql
). Il proprietario per il volume/var/opt/mssql
e tutti i file creati in tale volume avranno l'ID di gruppo10001
(il gruppomssql
).
Avviso
Usando il tipo di servizio
LoadBalancer
, l'istanza di SQL Server è accessibile in modalità remota (tramite Internet) sulla porta 1433.Salvare il file. Ad esempio:
sqldeployment.yaml
.Creare la distribuzione, dove
<path to sqldeployment.yaml file>
è il percorso in cui è stato salvato il file:kubectl apply -f <path to sqldeployment.yaml file>
Vengono creati la distribuzione e il servizio. L'istanza di SQL Server si trova in un contenitore, connesso a una risorsa di archiviazione permanente.
deployment "mssql-deployment" created service "mssql-deployment" created
Vengono creati la distribuzione e il servizio. L'istanza di SQL Server si trova in un contenitore, connesso a una risorsa di archiviazione permanente.
Per visualizzare lo stato del pod, digitare
kubectl get pod
.NAME READY STATUS RESTARTS AGE mssql-deployment-3813464711-h312s 1/1 Running 0 17m
Il pod ha uno stato
Running
. Questo stato indica che il contenitore è pronto. Dopo aver creato la distribuzione, la visualizzazione del pod potrebbe richiedere alcuni minuti. Il ritardo si verifica perché il cluster esegue il pull dell'immagine mssql-server-linux dal registro artefatti Microsoft. Dopo il primo pull dell'immagine, le distribuzioni successive potrebbero essere più veloci se la distribuzione viene eseguita in un nodo in cui l'immagine è già memorizzata.Verificare che i servizi siano in esecuzione. Esegui questo comando:
kubectl get services
Questo comando restituisce i servizi in esecuzione, nonché gli indirizzi IP interni ed esterni per i servizi. Prendere nota dell'indirizzo IP esterno per il servizio
mssql-deployment
. Usare questo indirizzo IP per connettersi a 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
Per altre informazioni sullo stato degli oggetti nel cluster Kubernetes, eseguire il comando seguente. Ricordarsi di sostituire
<MyResourceGroup>
e<MyKubernetesClustername>
con il nome del cluster Kubernetes e del gruppo di risorse:az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
È anche possibile verificare che il contenitore sia in esecuzione non come radice eseguendo il comando seguente, dove
<nameOfSqlPod>
è il nome del pod SQL Server:kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
È possibile visualizzare il nome utente come
mssql
se si eseguewhoami
.mssql
non è un utente radice.whoami
Connettersi all'istanza di SQL Server
È possibile connettersi con un'applicazione dall'esterno della rete virtuale di Azure usando l'account sa
e l'indirizzo IP esterno per il servizio. Usa la password configurata come segreto di OpenShift.
È possibile usare le applicazioni seguenti per connettersi all'istanza di SQL Server.
Connettersi con sqlcmd
Per connettersi con sqlcmd
, eseguire il comando seguente:
sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"
Sostituire i valori seguenti:
<External IP Address>
con l'indirizzo IP per il serviziomssql-deployment
MyC0m9l&xP@ssw0rd
con la propria password complessa
Verificare l'errore e il ripristino
Per verificare l'errore e il ripristino, è possibile eliminare il pod con i passaggi seguenti:
Elencare il pod che esegue SQL Server.
kubectl get pods
Prendere nota del nome del pod che esegue SQL Server.
Eliminare il pod.
kubectl delete pod mssql-deployment-0
mssql-deployment-0
è il valore del nome del pod restituito nel passaggio precedente.
Kubernetes ricrea automaticamente il pod per ripristinare un'istanza di SQL Server e connettersi alla risorsa di archiviazione permanente. Usare kubectl get pods
per verificare che venga distribuito un nuovo pod. Usare kubectl get services
per verificare che l'indirizzo IP del nuovo contenitore sia lo stesso.
Pulire le risorse
Se non si prevede di eseguire le esercitazioni seguenti, pulire le risorse non necessarie. Usa il comando az group delete
per rimuovere il gruppo di risorse, il servizio contenitore e tutte le risorse correlate. Sostituisci <MyResourceGroup>
con il nome del gruppo di risorse contenente il cluster.
az group delete --name <MyResourceGroup> --yes --no-wait