Implementación de un contenedor de SQL Server en Kubernetes con Azure Kubernetes Service (AKS)
Se aplica a:
SQL Server (todas las versiones admitidas): Linux
Aprenda a configurar una instancia de SQL Server en Kubernetes en Azure Kubernetes Service (AKS), con almacenamiento persistente para la alta disponibilidad. La solución proporciona resistencia. Si se produce un error en la instancia de SQL Server, Kubernetes vuelve a crearla automáticamente en un nuevo pod. Kubernetes también proporciona resistencia frente a un error de nodo.
En este tutorial se explica cómo configurar una instancia de SQL Server de alta disponibilidad en un contenedor en AKS.
- Creación de una contraseña de administrador del sistema
- Creación de almacenamiento
- Creación de la implementación
- Conexión con SQL Server Management Studio (SSMS)
- Comprobación de errores y recuperación
Solución de alta disponibilidad en Kubernetes en ejecución en Azure Kubernetes Service
Kubernetes 1.6 y versiones posteriores admite clases de almacenamiento, notificaciones de volumen persistente y el tipo de volumen de disco de Azure. Puede crear y administrar las instancias de SQL Server de forma nativa en Kubernetes. En el ejemplo de este artículo se muestra cómo crear una implementación para lograr una configuración de alta disponibilidad similar a una instancia de clúster de conmutación por error de disco compartido. En esta configuración, Kubernetes desempeña el papel de orquestador de clústeres. Si se produce un error en una instancia de SQL Server de un contenedor, el orquestador arranca otra instancia del contenedor que se adjunta al mismo almacenamiento persistente.

En el diagrama anterior, mssql-server es un contenedor en un pod. Kubernetes orquesta los recursos del clúster. Un conjunto de réplicas garantiza que el pod se recupere automáticamente tras un error de nodo. Las aplicaciones se conectan al servicio. En este caso, el servicio representa un equilibrador de carga que hospeda una dirección IP que permanece igual tras un error de mssql-server.
En el diagrama siguiente, se ha producido un error del contenedor mssql-server. Como orquestador, Kubernetes garantiza el recuento correcto de instancias correctas en el conjunto de réplicas e inicia un nuevo contenedor de acuerdo con la configuración. El orquestador inicia un nuevo pod en el mismo nodo y mssql-server se vuelve a conectar al mismo almacenamiento persistente. El servicio se conecta al nuevo mssql-server creado.

En el diagrama siguiente, se ha producido un error en el nodo que hospeda el contenedor mssql-server. El orquestador inicia el nuevo pod en otro nodo y mssql-server se vuelve a conectar al mismo almacenamiento persistente. El servicio se conecta al nuevo mssql-server creado.

Prerrequisitos
Clúster de Kubernetes
El tutorial requiere un clúster de Kubernetes. En los pasos se usa kubectl para administrar el clúster.
Consulte Implementación de un clúster de Azure Kubernetes Service (AKS) para crear un clúster de Kubernetes de un solo nodo en AKS con
kubectly conectarse a él.
Nota
Para protegerse frente a errores de nodo, un clúster de Kubernetes requiere más de un nodo.
CLI de Azure 2.0.23
- Las instrucciones de este tutorial se han validado con la CLI de Azure 2.0.23.
Creación de una contraseña de administrador del sistema
Cree una contraseña de administrador del sistema en el clúster de Kubernetes. Kubernetes puede administrar información de configuración confidencial (por ejemplo, las contraseñas) como secretos.
El siguiente comando crea una contraseña para la cuenta SA:
kubectl create secret generic mssql --from-literal=SA_PASSWORD="MyC0m9l&xP@ssw0rd"
Reemplace MyC0m9l&xP@ssw0rd por una contraseña compleja.
Para crear un secreto en Kubernetes denominado mssql que contenga el valor MyC0m9l&xP@ssw0rd de SA_PASSWORD, ejecute el comando.
Creación de almacenamiento
Configure un volumen persistente y una notificación de volumen persistente en el clúster de Kubernetes. Complete los pasos siguientes:
Cree un manifiesto para definir la clase de almacenamiento y la notificación de volumen persistente. El manifiesto especifica el aprovisionamiento de almacenamiento, los parámetros y la directiva de recuperación. El clúster de Kubernetes usa este manifiesto para crear el almacenamiento persistente.
En el siguiente ejemplo de YAML se define una clase de almacenamiento y una notificación de volumen persistente. El almacenamiento de la clase de almacenamiento es
azure-diskporque este clúster de Kubernetes está en Azure. El tipo de cuenta de almacenamiento esStandard_LRS. La notificación de volumen persistente se denominamssql-data. Los metadatos de la notificación de volumen persistente incluyen una anotación que lo vuelve a conectar con la clase de almacenamiento.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: 8GiGuarde el archivo (por ejemplo, pvc.yaml).
Cree la notificación de volumen persistente en Kubernetes.
kubectl apply -f <Path to pvc.yaml file><Path to pvc.yaml file>es la ubicación en la que ha guardado el archivo.El volumen persistente se crea automáticamente como una cuenta de Azure Storage y se enlaza a la notificación de volumen persistente.

Compruebe la notificación de volumen persistente.
kubectl describe pvc <PersistentVolumeClaim><PersistentVolumeClaim>es el nombre de la notificación de volumen persistente.En el paso anterior, la notificación de volumen persistente se denomina
mssql-data. Para ver los metadatos sobre la notificación de volumen persistente, ejecute el siguiente comando:kubectl describe pvc mssql-dataLos metadatos devueltos incluyen un valor denominado
Volume. Este valor se asigna al nombre del blob.
El valor del volumen coincide con parte del nombre del blob en la siguiente imagen de Azure Portal:

Compruebe el volumen persistente.
kubectl describe pvkubectldevuelve metadatos sobre el volumen persistente que se ha creado automáticamente y se ha enlazado a la notificación de volumen persistente.
Creación de la implementación
En este ejemplo, el contenedor que hospeda la instancia de SQL Server se describe como un objeto de implementación de Kubernetes. La implementación crea un conjunto de réplicas. El conjunto de réplicas crea el pod.
En este paso, cree un manifiesto para describir el contenedor basado en la imagen de Docker mssql-server-linux de SQL Server. El manifiesto hace referencia a la notificación de volumen persistente mssql-server y al secreto mssql que ya ha aplicado al clúster de Kubernetes. El manifiesto también describe un servicio. Este servicio es un equilibrador de carga. El equilibrador de carga garantiza que la dirección IP se conserva después de que se recupere la instancia de SQL Server.
Cree un manifiesto (un archivo YAML) para describir la implementación. En el ejemplo siguiente se describe una implementación, incluido un contenedor basado en la imagen de contenedor de 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:2019-latest ports: - containerPort: 1433 env: - name: MSSQL_PID value: "Developer" - name: ACCEPT_EULA value: "Y" - name: SA_PASSWORD valueFrom: secretKeyRef: name: mssql key: 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: LoadBalancerCopie el código anterior en un nuevo archivo denominado
sqldeployment.yaml. Actualice los siguientes valores:MSSQL_PID
value: "Developer": establece el contenedor para ejecutar la edición SQL Server Developer. La edición Developer no tiene licencia para los datos de producción. Si la implementación es para su uso en producción, establezca la edición adecuada (Enterprise,StandardoExpress).Nota
Para obtener más información, vea Cómo obtener una licencia de SQL Server.
persistentVolumeClaim: este valor requiere una entrada paraclaimName:que se asigne al nombre usado para la notificación de volumen persistente. En este tutorial se usamssql-data.name: SA_PASSWORD: Configura la imagen de contenedor para establecer la contraseña de administrador del sistema, tal como se define en esta sección.valueFrom: secretKeyRef: name: mssql key: SA_PASSWORD
Cuando Kubernetes implementa el contenedor, hace referencia al secreto denominado
mssqlpara obtener el valor de la contraseña.securityContext: un objeto securityContext define la configuración de privilegios de control de acceso para un pod o contenedor, en este caso se especifica en el nivel de pod, de modo que todos los contenedores (en este caso, solo uno) se adhieren a ese contexto de seguridad. En el contexto de seguridad, se define fsGroup con el valor 10001 (que es el GID para el grupo mssql), lo que significa que todos los procesos del contenedor también forman parte del identificador de grupo complementario 10001(mssql). El propietario del volumen /var/opt/mssql y todos los archivos creados en ese volumen será el id. de grupo 10001(mssql group).
Nota
Al usar el tipo de servicio
LoadBalancer, se puede acceder a la instancia de SQL Server de forma remota (mediante Internet) en el puerto 1433.Guarde el archivo (por ejemplo, sqldeployment.yaml).
Cree la implementación.
kubectl apply -f <Path to sqldeployment.yaml file><Path to sqldeployment.yaml file>es la ubicación en la que ha guardado el archivo.
Se crean la implementación y el servicio. La instancia de SQL Server está en un contenedor, que está conectado al almacenamiento persistente.
Para ver el estado del pod, escriba
kubectl get pod.
En la imagen anterior, el pod tiene un estado de
Running. Este estado indica que el contenedor está listo. Esto podría tardar varios minutos.Nota
Una vez creada la implementación, pueden pasar unos minutos hasta que el pod se pueda ver. El retraso se debe a que el clúster extrae la imagen mssql-server-linux del centro de Docker. Una vez que se extrae la imagen por primera vez, las implementaciones posteriores pueden ser más rápidas si la implementación se realiza en un nodo que ya tiene la imagen almacenada en la memoria caché.
Compruebe que los servicios se está ejecutando. Ejecute el siguiente comando:
kubectl get servicesEste comando devuelve los servicios que se están ejecutando, así como sus direcciones IP internas y externas. Anote la dirección IP externa del servicio
mssql-deployment. Use esta dirección IP para conectarse a SQL Server.
Para obtener más información sobre el estado de los objetos en el clúster de Kubernetes, ejecute:
az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>También puede comprobar que el contenedor se ejecuta como no raíz mediante la ejecución del comando siguiente:
kubectl.exe exec <name of SQL POD> -it -- /bin/bashY después de ejecutar "whoami" debería ver el nombre de usuario como mssql, que es un usuario no raíz.
whoami
Conexión con la instancia de SQL Server
Si ha configurado el contenedor como se ha descrito, puede conectarse con una aplicación desde fuera de la red virtual de Azure. Use la cuenta sa y la dirección IP externa del servicio. Use la contraseña que ha configurado como secreto de Kubernetes.
Puede usar las siguientes aplicaciones para conectarse a la instancia de SQL Server.
sqlcmd
Para conectarse a
sqlcmd, ejecute el siguiente comando:sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"Reemplace los siguientes valores:
<External IP Address>por la dirección IP del serviciomssql-deployment.MyC0m9l&xP@ssw0rdpor la contraseña.
Comprobación de errores y recuperación
Para comprobar los errores y la recuperación, puede eliminar el pod. Siga estos pasos:
Enumere el pod que ejecuta SQL Server.
kubectl get podsAnote el nombre del pod que ejecuta SQL Server.
Elimine el pod.
kubectl delete pod mssql-deployment-0mssql-deployment-0es el valor devuelto del paso anterior para el nombre del pod.
Kubernetes vuelve a crear automáticamente el pod para recuperar una instancia de SQL Server y se conecta al almacenamiento persistente. Use kubectl get pods para comprobar que se ha implementado un nuevo pod. Use kubectl get services para comprobar que la dirección IP del nuevo contenedor es la misma.
Resumen
En este tutorial, ha aprendido a implementar contenedores de SQL Server en un clúster de Kubernetes para la alta disponibilidad.
- Creación de una contraseña de administrador del sistema
- Creación de almacenamiento
- Creación de la implementación
- Conexión con SQL Server Management Studio (SSMS)
- Comprobación de errores y recuperación