Implementación de SQL Instancia administrada habilitadas por Azure Arc mediante herramientas de Kubernetes

En este artículo se muestra cómo implementar Azure SQL Managed Instance para Azure Arc con las herramientas de Kubernetes.

Requisitos previos

Ya debería haber creado un controlador de datos.

Para crear una instancia de SQL Managed Instance mediante las herramientas de Kubernetes, debe tener instaladas dichas herramientas. En los ejemplos de este artículo se usará kubectl, pero se podrían emplear enfoques similares con otras herramientas de Kubernetes como el panel de Kubernetes, oc o helm si está familiarizado con esas herramientas y los formatos YAML y JSON de Kubernetes.

Instalación de la herramienta kubectl

Información general

Para crear una instancia de SQL Managed Instance, debe hacer lo siguiente:

  1. Crear un secreto de Kubernetes para almacenar el inicio de sesión y la contraseña del administrador del sistema de forma segura
  2. Crear un recurso personalizado de SQL Managed Instance basado en la definición de recurso personalizado SqlManagedInstance

Defina ambos elementos en un archivo yaml.

Creación de un archivo YAML

Use el archivo yaml de plantilla como punto de partida para crear su propio archivo yaml de SQL Managed Instance personalizado. Descargue este archivo en el equipo local y ábralo en un editor de texto. Use un editor de texto como VS Code que admita el linting y el resaltado de la sintaxis en archivos yaml.

Nota:

A partir de la versión de febrero de 2022, es necesario especificar una clase de almacenamiento compatible con ReadWriteMany (RWX) para las copias de seguridad. Obtenga más información sobre los modos de acceso. Si no se especifica ninguna clase de almacenamiento para las copias de seguridad, se usa la clase de almacenamiento predeterminada en Kubernetes. Si el valor predeterminado no es compatible con RWX, puede que la instalación de SQL Managed Instance no se realice correctamente.

Archivo yaml de ejemplo

Vea el siguiente ejemplo de un archivo yaml:

apiVersion: v1
data:
  password: <your base64 encoded password>
  username: <your base64 encoded username>
kind: Secret
metadata:
  name: sql1-login-secret
type: Opaque
---
apiVersion: sql.arcdata.microsoft.com/v12
kind: SqlManagedInstance
metadata:
  name: sql1
  annotations:
    exampleannotation1: exampleannotationvalue1
    exampleannotation2: exampleannotationvalue2
  labels:
    examplelabel1: examplelabelvalue1
    examplelabel2: examplelabelvalue2
spec:
  dev: true #options: [true, false]
  licenseType: LicenseIncluded #options: [LicenseIncluded, BasePrice].  BasePrice is used for Azure Hybrid Benefits.
  tier: GeneralPurpose #options: [GeneralPurpose, BusinessCritical]
  security:
    adminLoginSecret: sql1-login-secret
  scheduling:
    default:
      resources:
        limits:
          cpu: "2"
          memory: 4Gi
        requests:
          cpu: "1"
          memory: 2Gi
  services:
    primary:
      type: LoadBalancer
  storage:
    #backups:
    #  volumes:
    #  - className: azurefile # Backup volumes require a ReadWriteMany (RWX) capable storage class
    #    size: 5Gi
    data:
      volumes:
      - className: default # Use default configured storage class or modify storage class based on your Kubernetes environment
        size: 5Gi
    datalogs:
      volumes:
      - className: default # Use default configured storage class or modify storage class based on your Kubernetes environment
        size: 5Gi
    logs:
      volumes:
      - className: default # Use default configured storage class or modify storage class based on your Kubernetes environment
        size: 5Gi

Personalización del inicio de sesión y la contraseña

Un secreto de Kubernetes se almacena como una cadena codificada en Base64, una para el nombre de usuario y otra para la contraseña. Deberá codificar en Base64 el inicio de sesión y la contraseña del administrador del sistema y colocarlos en la ubicación del marcador de posición en data.password y data.username. No incluya los símbolos < y > que se proporcionan en la plantilla.

Nota:

Para lograr una seguridad óptima, no se permite usar el valor sa para el inicio de sesión. Siga la directiva de complejidad de la contraseña.

Puede usar una herramienta en línea para codificar el nombre de usuario y la contraseña deseados en base64 o puede usar herramientas de la CLI en función de la plataforma.

PowerShell

[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('<your string to encode here>'))

#Example
#[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('example'))

Linux/macOS

echo -n '<your string to encode here>' | base64

#Example
# echo -n 'example' | base64

Personalización del nombre

La plantilla tiene un valor de sql1 para el atributo de nombre. Puede cambiar este valor, pero deben incluir caracteres que sigan los estándares de nomenclatura de DNS. También debe cambiar el nombre del secreto para que coincida. Por ejemplo, si cambia el nombre de la instancia de SQL Managed Instance a sql2, debe cambiar el nombre del secreto de sql1-login-secret a sql2-login-secret.

Personalización de los requisitos de recursos

Puede cambiar los requisitos de los recursos (solicitudes y límites de RAM y núcleo), según sea necesario.

Nota:

Puede obtener más información sobre la gobernanza de recursos de Kubernetes.

Requisitos para las solicitudes y los límites de recursos:

  • El valor de límite de núcleos es necesario para la facturación.
  • El resto de límites y solicitudes de recursos son opcionales.
  • La solicitud y el límite de núcleos deben ser un valor entero positivo, si se especifican.
  • Se requiere un mínimo de 1 núcleo para la solicitud de núcleos, si se especifica.
  • El formato del valor de memoria sigue la notación de Kubernetes.
  • Se requiere un mínimo de 2 GB para la solicitud de memoria, si se especifica.
  • Como norma general, debe tener 4 GB de RAM por cada núcleo para los casos de uso de producción.

Personalización del tipo de servicio

Si lo desea, el tipo de servicio se puede cambiar a NodePort. Se asignará un número de puerto aleatorio.

Personalización del almacenamiento

Puede personalizar las clases de almacenamiento para que el almacenamiento coincida con su entorno. Si no está seguro de qué clases de almacenamiento están disponibles, ejecute el comando kubectl get storageclass para verlas.

La plantilla tiene el valor predeterminado de default.

Por ejemplo

storage:
    data:
      volumes:
      - className: default 

Este ejemplo refleja que existe una clase de almacenamiento denominada default, no que exista una clase de almacenamiento que sea la predeterminada. También tiene la opción de cambiar el tamaño del almacenamiento. Para más información, consulte la configuración del almacenamiento.

Creación de la instancia de SQL Managed Instance

Ahora que ha personalizado el archivo YAML de SQL Managed Instance, puede crear la instancia de SQL Managed Instance mediante la ejecución del siguiente comando:

kubectl create -n <your target namespace> -f <path to your yaml file>

#Example
#kubectl create -n arc -f C:\arc-data-services\sqlmi.yaml

Supervisión del estado de creación

La creación de la instancia de SQL Managed Instance tardará unos minutos en completarse. Puede supervisar el progreso en otra ventana de terminal con los siguientes comandos:

Nota:

En los siguientes comandos de ejemplo se da por hecho que ha creado una instancia de SQL Managed Instance denominada sql1 y un espacio de nombres de Kubernetes con el nombre arc. Si ha usado otro un nombre para el espacio de nombres o la instancia de SQL Managed Instance, puede reemplazar arc y sqlmi por sus nombres.

kubectl get sqlmi/sql1 --namespace arc
kubectl get pods --namespace arc

También puede comprobar el estado de creación de cualquier pod determinado. Ejecute kubectl describe pod .... Use este comando para solucionar cualquier problema. Por ejemplo:

kubectl describe pod/<pod name> --namespace arc

#Example:
#kubectl describe pod/sql1-0 --namespace arc

Solución de problemas de implementación

Si tiene problemas con la implementación, consulte la guía de solución de problemas.

Conexión a una instancia administrada de SQL habilitada por Azure Arc