Solución de problemas de clústeres de macrodatos de SQL Server en Kubernetes

Se aplica a: SQL Server 2019 (15.x)

Importante

El complemento Clústeres de macrodatos de Microsoft SQL Server 2019 se va a retirar. La compatibilidad con Clústeres de macrodatos de SQL Server 2019 finalizará el 28 de febrero de 2025. Todos los usuarios existentes de SQL Server 2019 con Software Assurance serán totalmente compatibles con la plataforma, y el software se seguirá conservando a través de actualizaciones acumulativas de SQL Server hasta ese momento. Para más información, consulte la entrada de blog sobre el anuncio y Opciones de macrodatos en la plataforma Microsoft SQL Server.

En este artículo se describen varios comandos útiles de Kubernetes que puede usar para supervisar y solucionar problemas de clústeres de macrodatos de SQL Server 2019. Se muestra cómo ver información detallada de un pod u otros artefactos de Kubernetes que se encuentran en el clúster de macrodatos. En este artículo también se tratan las tareas habituales, como copiar archivos en un contenedor que ejecute uno de los servicios de clúster de macrodatos de SQL Server, o bien copiarlos desde uno.

Sugerencia

Para supervisar el estado de los componentes de los clústeres de macrodatos, puede usar los comandos azdata bdc status o los cuadernos de solución de problemas integrados proporcionados con Azure Data Studio.

Sugerencia

Ejecute los siguientes comandos de kubectl en un equipo cliente Windows (cmd o PS) o Linux (bash). Requieren la autenticación previa en el clúster y un contexto de clúster en el que ejecutarse. Por ejemplo, para un clúster de AKS creado anteriormente, puede ejecutar az aks get-credentials --name <aks_cluster_name> --resource-group <azure_resource_group_name> para descargar el archivo de configuración del clúster de Kubernetes y establecer el contexto del clúster.

Obtención del estado de los pods

Puede usar el comando kubectl get pods para obtener el estado de los pods en el clúster para todos los espacios de nombres o el espacio de nombres del clúster de macrodatos. En las secciones siguientes se muestran ejemplos de ambos.

Muestra del estado de todos los pods en el clúster de Kubernetes

Ejecute el siguiente comando para obtener todos los pods y sus estados, incluidos los pods que forman parte del espacio de nombres en el que se crean los pods del clúster de macrodatos de SQL Server:

kubectl get pods --all-namespaces

Muestra del estado de todos los pods en el clúster de macrodatos de SQL Server

Use el parámetro -n para especificar un espacio de nombres concreto. Tenga en cuenta que los pods del clúster de macrodatos de SQL Server se crean en un nuevo espacio de nombres creado cuando se arranca el clúster en función del nombre del clúster especificado en el archivo de configuración de la implementación. Aquí se usa el nombre predeterminado, mssql-cluster.

kubectl get pods -n mssql-cluster

Debería ver un resultado similar a la lista siguiente para un clúster de macrodatos en ejecución:

PS C:\> kubectl get pods -n mssql-cluster
NAME              READY   STATUS    RESTARTS   AGE
appproxy-f2qqt    2/2     Running   0          110m
compute-0-0       3/3     Running   0          110m
control-zlncl     4/4     Running   0          118m
data-0-0          3/3     Running   0          110m
data-0-1          3/3     Running   0          110m
gateway-0         2/2     Running   0          109m
logsdb-0          1/1     Running   0          112m
logsui-jtdnv      1/1     Running   0          112m
master-0          7/7     Running   0          110m
metricsdb-0       1/1     Running   0          112m
metricsdc-shv2f   1/1     Running   0          112m
metricsui-9bcj7   1/1     Running   0          112m
mgmtproxy-x6gcs   2/2     Running   0          112m
nmnode-0-0        1/1     Running   0          110m
storage-0-0       7/7     Running   0          110m
storage-0-1       7/7     Running   0          110m

Nota

Durante la implementación, los pods con un valor de STATUS de ContainerCreating siguen apareciendo. Si la implementación se bloquea por cualquier motivo, esto le puede dar una idea de dónde puede estar el problema. Fíjese también en la columna READY. En ella se le indica cuántos contenedores se han iniciado en el pod. Tenga en cuenta que las implementaciones pueden tardar 30 minutos o más, en función de la configuración y la red. Gran parte de este tiempo se dedica a descargar las imágenes de contenedor de los diferentes componentes.

Obtención de los detalles del pod

Ejecute el siguiente comando para obtener una descripción detallada de un pod específico en la salida en formato JSON. Se incluyen detalles, como el nodo de Kubernetes actual en el que se coloca el pod, los contenedores que se ejecutan en el pod y la imagen que se usa para arrancar los contenedores. También se muestran otros detalles, como las etiquetas, el estado y las notificaciones de los volúmenes persistentes que están asociadas con el pod.

kubectl describe pod  <pod_name> -n <namespace_name>

En el ejemplo siguiente se muestran los detalles del pod master-0 en un clúster de macrodatos denominado mssql-cluster:

kubectl describe pod  master-0 -n mssql-cluster

Si se ha producido algún error, a veces puede verlo en los eventos recientes del pod.

Obtención de los registros del pod

Puede recuperar los registros de los contenedores que se ejecutan en un pod. El siguiente comando recupera los registros de todos los contenedores que se ejecutan en el pod denominado master-0 y los envía a un archivo denominado master-0-pod-logs.txt:

kubectl logs master-0 --all-containers=true -n mssql-cluster > master-0-pod-logs.txt

Obtención del estado de los servicios

Ejecute el siguiente comando para obtener los detalles de los servicios del clúster de macrodatos. Estos detalles incluyen su tipo y las IP asociadas a los servicios y puertos correspondientes. Tenga en cuenta que los servicios del clúster de macrodatos de SQL Server se crean en un nuevo espacio de nombres creado cuando se arranca el clúster en función del nombre del clúster especificado en el archivo de configuración de la implementación.

kubectl get svc -n <namespace_name>

En el ejemplo siguiente se muestra el estado de los servicios en un clúster de macrodatos denominado mssql-cluster:

kubectl get svc -n mssql-cluster

Los siguientes servicios admiten conexiones externas al clúster de macrodatos:

Servicio Descripción
master-svc-external Proporciona acceso a la instancia maestra.
(EXTERNAL-IP,31433 y el usuario de SA)
controller-svc-external Admite herramientas y clientes que administran el clúster.
gateway-svc-external Proporciona acceso a la puerta de enlace de HDFS/Spark.
(EXTERNAL-IP y el usuario <AZDATA_USERNAME>)1
appproxy-svc-external Admite escenarios de implementación de aplicaciones.

1 A partir de SQL Server 2019 (15.x) CU 5, al implementar un nuevo clúster con autenticación básica, todos los puntos de conexión, incluido el uso de puerta de enlace AZDATA_USERNAME y AZDATA_PASSWORD. Los puntos de conexión de los clústeres que se actualizan a CU 5 continúan usando root como nombre de usuario para conectarse al punto de conexión de puerta de enlace. Este cambio no se aplica a las implementaciones que utilizan la autenticación de Active Directory. Consulte Credenciales para acceder a los servicios a través del punto de conexión de puerta de enlace en las notas de la versión.

Sugerencia

Esta es una forma de ver los servicios con kubectl, pero también se puede usar el comando azdata bdc endpoint list para ver estos puntos de conexión. Para obtener más información, vea Obtención de los puntos de conexión del clúster de macrodatos.

Obtención de detalles del servicio

Ejecute este comando para obtener una descripción detallada de un servicio en la salida en formato JSON. Se incluirán detalles como las etiquetas, el selector, la IP, la IP externa (si el servicio es de tipo LoadBalancer), el puerto, etc.

kubectl describe service <service_name> -n <namespace_name>

En el ejemplo siguiente se recuperan los detalles del servicio master-svc-external.

kubectl describe service master-svc-external -n mssql-cluster

Copiar archivos

Si necesita copiar archivos del contenedor en el equipo local, use el comando kubectl cp con la siguiente sintaxis:

kubectl cp <pod_name>:<source_file_path> -c <container_name> -n <namespace_name> <target_local_file_path>

Del mismo modo, puede usar kubectl cp para copiar archivos del equipo local en un contenedor específico.

kubectl cp <source_local_file_path> <pod_name>:<target_container_path> -c <container_name>  -n <namespace_name>

Copia de archivos desde un contenedor

En el ejemplo siguiente se copian los archivos de registro de SQL Server del contenedor en la ruta de acceso ~/temp/sqlserverlogs del equipo local (en este ejemplo, el equipo local es un cliente Linux):

kubectl cp master-0:/var/opt/mssql/log -c mssql-server -n mssql-cluster ~/tmp/sqlserverlogs

Copia de archivos en un contenedor

En el ejemplo siguiente se copia el archivo AdventureWorks2022 del equipo local en el contenedor de instancias maestras de SQL Server (mssql-server) en el pod master-0. El archivo se copia en el directorio /tmp del contenedor.

kubectl cp ~/Downloads/AdventureWorks2022.bak master-0:/tmp -c mssql-server -n mssql-cluster

Forzamiento de la eliminación de un pod

No se recomienda forzar la eliminación de un pod. Pero, para probar la disponibilidad, la resistencia o la persistencia de los datos, puede eliminar un pod para simular un error del pod con el comando kubectl delete pods.

kubectl delete pods <pod_name> -n <namespace_name> --grace-period=0 --force

En el ejemplo siguiente se elimina el pod del bloque de almacenamiento storage-0-0:

kubectl delete pods storage-0-0 -n mssql-cluster --grace-period=0 --force

Obtención de la IP del pod

Para solucionar problemas, es posible que tenga que obtener la IP del nodo en el que se está ejecutando actualmente un pod. Para obtener la dirección IP, use el comando kubectl get pods con la siguiente sintaxis:

kubectl get pods <pod_name> -o yaml -n <namespace_name> | grep hostIP

En el ejemplo siguiente se obtiene la dirección IP del nodo en el que se ejecuta el pod master-0:

kubectl get pods master-0 -o yaml -n mssql-cluster | grep hostIP

Panel de Kubernetes

Puede iniciar el panel de Kubernetes para obtener información adicional sobre el clúster. En las secciones siguientes se explica cómo iniciar el panel de Kubernetes en AKS y de Kubernetes arrancado mediante kubeadm.

Inicio del panel cuando el clúster se está ejecutando en AKS

Para iniciar el panel de Kubernetes, ejecute:

az aks browse --resource-group <azure_resource_group> --name <aks_cluster_name>

Nota

Si recibe el siguiente error, asegúrese de no haber iniciado ya el panel desde otra ventana: Unable to listen on port 8001: All listeners failed to create with the following errors: Unable to create listener: Error listen tcp4 127.0.0.1:8001: >bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. Unable to create listener: Error listen tcp6: address [[::1]]:8001: missing port in >address error: Unable to listen on any of the requested ports: [{8001 9090}] (No se pudo escuchar en el puerto 8001: no se pudieron crear los clientes de escucha con los siguientes errores: no se pudo crear el cliente de escucha: error de escucha tcp4 127.0.0.1:8001: enlace: normalmente solo se permite un uso de cada dirección de socket (protocolo/red dirección/puerto). No se pudo crear el cliente de escucha: error de escucha tcp6: dirección [[::1]]:8001: error de puerto ausente en la dirección: no se pudo escuchar en ninguno de los puertos solicitados: [{8001 9090}]).

Al iniciar el panel en el explorador, es posible que reciba advertencias de permisos debido a que RBAC está habilitado de forma predeterminada en los clústeres de AKS y la cuenta de servicio que usa el panel no tiene permisos suficientes para acceder a todos los recursos (por ejemplo, pods is forbidden: User "system:serviceaccount:kube-system:kubernetes-dashboard" cannot list pods in the namespace "default" [pods prohibidos: el usuario "system:serviceaccount:kube-system:kubernetes-dashboard" no puede enumerar pods en el espacio de nombres "default"]). Ejecute el siguiente comando para conceder los permisos necesarios a kubernetes-dashboard y luego reinicie el panel:

kubectl create clusterrolebinding kubernetes-dashboard -n kube-system --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard

Inicio del panel cuando el clúster de Kubernetes se arranca mediante kubeadm

Para obtener instrucciones detalladas sobre cómo implementar y configurar el panel en el clúster de Kubernetes, consulte la documentación de Kubernetes. Para iniciar el panel de Kubernetes, ejecute este comando:

kubectl proxy

Pasos siguientes

Vea ¿Qué son los Clústeres de macrodatos de SQL Server? para obtener más información sobre los clústeres de macrodatos.