Démarrage rapide : déployer un cluster de conteneurs SQL Server sur Azure
S’applique à : SQL Server - Linux
Ce guide de démarrage rapide montre comment configurer une instance SQL hautement disponible dans un conteneur avec stockage persistant sur Azure Kubernetes Service (AKS) ou Red Hat OpenShift. En cas d’échec de l’instance SQL, l’orchestrateur la recrée automatiquement dans un nouveau pod. Le service de cluster fournit également une résilience contre les défaillances de nœud.
Ce guide de démarrage rapide utilise les outils en ligne de commande suivants pour gérer le cluster.
Service de cluster | Outil de ligne de commande |
---|---|
Azure Kubernetes Service (AKS) | kubectl (interface CLI Kubernetes) |
Azure Red Hat OpenShift | oc (interface CLI OpenShift) |
Prérequis
Compte Azure avec un abonnement actif. Créez un compte gratuitement.
Un cluster Kubernetes. Pour plus d’informations sur la création et la connexion d’un cluster Kubernetes dans AKS avec
kubectl
, consultez Déployer un cluster AKS (Azure Kubernetes Service).Notes
Pour une protection contre les défaillances de nœuds, un cluster Kubernetes requiert plusieurs nœuds.
Azure CLI. Découvrez comment installer Azure CLI pour installer la dernière version.
Créer un mot de passe AS
Créez un mot de passe AS dans le cluster Kubernetes. Kubernetes peut gérer des informations de configuration sensibles, comme des mots de passe en tant que secrets.
Pour créer un secret dans Kubernetes nommé
mssql
qui contient la valeurMyC0m9l&xP@ssw0rd
pour leMSSQL_SA_PASSWORD
, exécutez la commande suivante. N’oubliez pas de choisir votre propre mot de passe complexe :Important
La variable d’environnement
SA_PASSWORD
est dépréciée. UtilisezMSSQL_SA_PASSWORD
à la place.kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
Créer un stockage
Pour une base de données dans un cluster Kubernetes, vous devez utiliser le stockage persistant. Vous pouvez configurer un volume persistant et une revendication de volume persistant dans le cluster Kubernetes en suivant les étapes ci-dessous :
Créez un manifeste pour définir la classe de stockage et la revendication de volume persistant. Le manifeste spécifie le fournisseur de stockage, les paramètres et la stratégie de récupération. Le cluster Kubernetes utilise ce manifeste pour créer le stockage persistant.
L’exemple de YAML suivant définit une classe de stockage et une revendication de volume persistant. Le fournisseur de classe de stockage est
azure-disk
, car ce cluster Kubernetes est dans Azure. Le type de compte de stockage estStandard_LRS
. La revendication de volume persistant est nomméemssql-data
. Les métadonnées de revendication de volume persistant incluent une annotation qui les reconnecte à la classe de stockage.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
Enregistrez le fichier (par exemple,
pvc.yaml
).Créez la revendication de volume persistant dans Kubernetes, où
<path to pvc.yaml file>
est l’emplacement où vous avez enregistré le fichier :kubectl apply -f <path to pvc.yaml file>
Le volume persistant est automatiquement créé en tant que compte de stockage Azure et lié à la revendication de volume persistant.
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
Vérifiez la revendication de volume persistant, où
<persistentVolumeClaim>
est le nom de la revendication de volume persistant :kubectl describe pvc <persistentVolumeClaim>
Dans l’étape précédente, la revendication de volume persistant est nommée
mssql-data
. Pour afficher les métadonnées relatives à la revendication de volume persistant, exécutez la commande suivante :kubectl describe pvc mssql-data
Les métadonnées retournées incluent une valeur appelée
Volume
. Cette valeur correspond au nom du 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>
La valeur de volume correspond à une partie du nom du blob dans l’image suivante du Portail Azure :
Vérifiez le volume persistant.
kubectl describe pv
kubectl
retourne les métadonnées relatives au volume persistant automatiquement créé et lié à la revendication de volume persistant.
Créer le déploiement
Le conteneur qui héberge l’instance est décrit comme un objet de déploiement Kubernetes. Le déploiement crée un jeu de réplicas. Le jeu de réplicas crée le pod.
Vous créez un manifeste pour décrire le conteneur en fonction de l’image de Docker mssql-server-linux de SQL Server.
- Le manifeste fait référence à la revendication de volume persistant
mssql-server
et au secretmssql
que vous avez déjà appliqué au cluster Kubernetes. - Le manifeste décrit également un service. Ce service est un équilibreur de charge. L’équilibreur de charge garantit que l’adresse IP persiste après la récupération de l’instance.
- Le manifeste décrit les demandes et les limites de ressources. Celles-ci sont basées sur la configuration système minimale requise.
Créez un manifeste (fichier YAML) pour décrire le déploiement. L’exemple suivant décrit un déploiement, y compris un conteneur basé sur l’image de conteneur 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
Copiez le code précédent dans un nouveau fichier, nommé
sqldeployment.yaml
. Utilisez les valeurs suivantes :MSSQL_PID
value: "Developer"
: Définit le conteneur pour qu’il exécute l’édition SQL Server Développeur. L’édition Développeur n’est pas concédée sous licence pour les données de production. Si le déploiement est destiné à une utilisation en production, définissez l'édition appropriée (Enterprise
,Standard
ouExpress
). Pour plus d'informations, consultez Comment installer SQL Server.persistentVolumeClaim
: Cette valeur requiert une entrée pourclaimName:
qui correspond au nom utilisé pour la revendication de volume persistant. Ce didacticiel utilisemssql-data
.name: MSSQL_SA_PASSWORD
: Configure l’image de conteneur pour définir le mot de passe AS, comme défini dans cette section.valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD
Quand Kubernetes déploie le conteneur, il fait référence au secret nommé
mssql
pour obtenir la valeur du mot de passe.securityContext
: définit les paramètres de contrôle d’accès et de privilège pour un pod ou un conteneur. Dans ce cas, il est spécifié au niveau du pod, de sorte que tous les conteneurs adhèrent à ce contexte de sécurité. Dans le contexte de sécurité, nous définissonsfsGroup
avec la valeur10001
, qui est l’ID de groupe (GID) du groupemssql
. Cette valeur signifie que tous les processus du conteneur font également partie du GID10001
supplémentaire (mssql
). Le propriétaire du volume/var/opt/mssql
et tous les fichiers créés dans ce volume vont correspondre au GID10001
(groupemssql
).
Avertissement
En utilisant le type de service
LoadBalancer
, l’instance =est accessible à distance (via Internet) sur le port 1433.Enregistrez le fichier . Par exemple :
sqldeployment.yaml
.Créez le déploiement, où
<path to sqldeployment.yaml file>
est l’emplacement où vous avez enregistré le fichier :kubectl apply -f <path to sqldeployment.yaml file>
Le déploiement et le service sont créés. L’instance se trouve dans un conteneur, connecté au stockage persistant.
deployment "mssql-deployment" created service "mssql-deployment" created
Le déploiement et le service sont créés. L’instance se trouve dans un conteneur, connecté au stockage persistant.
Pour afficher l'état du pod, saisissez
kubectl get pod
.NAME READY STATUS RESTARTS AGE mssql-deployment-3813464711-h312s 1/1 Running 0 17m
Le pod a l’état
Running
. Cet état indique que le conteneur est prêt. Une fois le déploiement créé, plusieurs minutes peuvent être nécessaires avant que le pod ne soit visible. Ce délai est dû au fait que le cluster extrait l’image mssql-server-linux du Registre des artefacts Microsoft. Une fois l’image extraite pour la première fois, les déploiements ultérieurs peuvent être plus rapides si le déploiement se fait sur un nœud sur lequel l’image est déjà mise en cache.Vérifiez que les services sont en cours d'exécution. Exécutez la commande suivante :
kubectl get services
Cette commande retourne les services en cours d’exécution, et les adresses IP internes et externes des services. Notez l’adresse IP externe pour le service
mssql-deployment
. Utilisez cette adresse IP pour vous connecter à 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
Pour plus d’informations sur l’état des objets dans le cluster Kubernetes, exécutez la commande suivante. N’oubliez pas de remplacer
<MyResourceGroup>
et<MyKubernetesClustername>
par le nom de votre groupe de ressources et de votre cluster Kubernetes :az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
Vous pouvez également vérifier que le conteneur s’exécute comme non racine en exécutant la commande suivante, où
<nameOfSqlPod>
est le nom de votre pod SQL Server :kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
Vous pouvez voir le nom d’utilisateur comme
mssql
si vous exécutezwhoami
.mssql
correspond à un utilisateur non-racine.whoami
Se connecter à l'instance
Vous pouvez vous connecter à une application en dehors du réseau virtuel Azure, à l’aide du compte sa
et de l’adresse IP externe du service. Utilisez le mot de passe que vous avez configuré en tant que secret OpenShift.
Vous pouvez utiliser les applications suivantes pour vous connecter à l’instance.
Se connecter avec sqlcmd
Pour se connecter avec sqlcmd
, exécutez la commande suivante :
sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"
Remplacez les valeurs suivantes :
<External IP Address>
par l’adresse IP pour le servicemssql-deployment
MyC0m9l&xP@ssw0rd
avec un mot de passe complexe
Vérifier la défaillance et la récupération
Pour vérifier l’échec et la récupération, vous pouvez supprimer le pod en procédant comme suit :
Répertoriez le pod exécutant SQL Server.
kubectl get pods
Notez le nom du pod exécutant SQL Server.
Supprimer le pod.
kubectl delete pod mssql-deployment-0
mssql-deployment-0
est la valeur retournée de l’étape précédente pour le nom du pod.
Kubernetes recrée automatiquement le pod pour récupérer une instance et se connecter au stockage persistant. Utilisez kubectl get pods
pour vérifier qu’un nouveau pod est déployé. Utilisez kubectl get services
pour vérifier que l’adresse IP du nouveau conteneur est la même.
Nettoyer les ressources
Si vous ne prévoyez pas d’effectuer les tutoriels qui suivent, nettoyez vos ressources inutiles. Utilisez la commande az group delete
pour supprimer le groupe de ressources, le service conteneur ainsi que toutes les ressources associées. Remplacez <MyResourceGroup>
par le nom du groupe de ressources contenant le cluster.
az group delete --name <MyResourceGroup> --yes --no-wait