Início Rápido: Implantar um cluster de contêiner do SQL Server no Azure
Aplica-se a: SQL Server – Linux
Este início rápido demonstra como configurar uma instância do SQL Server altamente disponível em um contêiner com armazenamento persistente no AKS (Serviço de Kubernetes do Azure) ou no Red Hat OpenShift. Se a instância do SQL Server falhar, o orquestrador a recriará automaticamente em um novo pod. O serviço de cluster também oferece resiliência com relação a uma falha de nó.
Este início rápido usa as ferramentas de linha de comando a seguir para gerenciar o cluster.
Serviço de cluster | Ferramenta de linha de comando |
---|---|
AKS (Serviço de Kubernetes do Azure) | CLI do Kubernetes kubectl |
Red Hat OpenShift no Azure | CLI de OpenShift oc |
Pré-requisitos
Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
Um cluster do Kubernetes. Para saber mais sobre como criar e conectar a um cluster do Kubernetes no AKS com
kubectl
, veja Implantar um cluster do AKS (Serviço de Kubernetes do Azure).Observação
Para proteger contra falhas de nó, um cluster Kubernetes requer mais de um nó.
CLI do Azure. Confira Como instalar a CLI do Azure para instalar a versão mais recente.
Criar uma senha SA
Crie a senha SA no cluster Kubernetes. O Kubernetes pode gerenciar informações de configuração confidenciais, por exemplo, senhas como segredos.
Para criar um segredo no Kubernetes chamado
mssql
que contém o valorMyC0m9l&xP@ssw0rd
paraMSSQL_SA_PASSWORD
, execute o comando a seguir. Lembre-se de escolher sua senha complexa:Importante
A variável de ambiente
SA_PASSWORD
foi preterida. UseMSSQL_SA_PASSWORD
em vez disso.kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="MyC0m9l&xP@ssw0rd"
Criar armazenamento
Para um banco de dados em um cluster do Kubernetes, você precisa usar armazenamento persistente. Configure um volume persistente e uma declaração de volume persistente no cluster Kubernetes usando as seguintes etapas:
Crie um manifesto para definir a classe de armazenamento e a declaração de volume persistente. O manifesto especifica o provisionador de armazenamento, os parâmetros e a política de recuperação. O cluster Kubernetes usa esse manifesto para criar o armazenamento persistente.
O exemplo de YAML a seguir define uma classe de armazenamento e uma declaração de volume persistente. O provisionador de classe de armazenamento é
azure-disk
, porque esse cluster Kubernetes está no Azure. O tipo de conta de armazenamento éStandard_LRS
. A declaração de volume persistente é denominadamssql-data
. Os metadados da declaração de volume persistente incluem uma anotação que os conecta de volta à classe de armazenamento.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
Salve o arquivo (por exemplo,
pvc.yaml
).Crie a declaração de volume persistente no Kubernetes, onde
<path to pvc.yaml file>
é o local onde você salvou o arquivo:kubectl apply -f <path to pvc.yaml file>
O volume persistente é criado automaticamente como uma conta de armazenamento do Azure e associado à declaração de volume persistente.
storageclass "azure-disk" created persistentvolumeclaim "mssql-data" created
Verifique a declaração de volume persistente, onde
<persistentVolumeClaim>
está o nome da declaração de volume persistente:kubectl describe pvc <persistentVolumeClaim>
Na etapa anterior, a declaração de volume persistente é denominada
mssql-data
. Para ver os metadados sobre a declaração de volume persistente, execute o seguinte comando:kubectl describe pvc mssql-data
Os metadados retornados incluem um valor chamado
Volume
. Esse valor é mapeado para o nome do 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>
O valor do volume corresponde a parte do nome do blob na seguinte imagem do portal do Azure:
Verifique o volume persistente.
kubectl describe pv
kubectl
retorna metadados sobre o volume persistente que foi criado automaticamente e associado à declaração de volume persistente.
Criar a implantação
O contêiner que hospeda a instância do SQL Server é descrito como um objeto de implantação do Kubernetes. A implantação cria um conjunto de réplicas. O conjunto de réplicas cria o pod.
Você cria um manifesto para descrever o contêiner, com base na imagem do Docker mssql-server-linux do SQL Server.
- O manifesto referencia a declaração de volume persistente do
mssql-server
e o segredomssql
que você já aplicou ao cluster Kubernetes. - O manifesto também descreve um serviço. Esse serviço é um balanceador de carga. O balanceador de carga garante que o endereço IP persiste após a recuperação da instância do SQL Server.
- O manifesto descreve as solicitações e os limites do recurso. Eles se baseiam nos requisitos mínimos do sistema.
Crie um manifesto (um arquivo YAML) para descrever a implantação. O exemplo a seguir descreve uma implantação, incluindo um contêiner baseado na imagem de contêiner do 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
Copie o código anterior para um novo arquivo, denominado
sqldeployment.yaml
. Atualize os seguintes valores:MSSQL_PID
value: "Developer"
: define o contêiner para executar o SQL Server Developer Edition. A edição Developer não é licenciada para dados de produção. Se a implantação for para uso em produção, defina a edição apropriada (Enterprise
,Standard
ouExpress
). Para saber mais, confira Como licenciar o SQL Server.persistentVolumeClaim
: esse valor requer uma entrada paraclaimName:
mapeada para o nome usado para a declaração de volume persistente. Este tutorial usamssql-data
.name: MSSQL_SA_PASSWORD
: configura a imagem de contêiner para definir a senha SA, conforme definido nesta seção.valueFrom: secretKeyRef: name: mssql key: MSSQL_SA_PASSWORD
Quando o Kubernetes implanta o contêiner, ele refere-se ao segredo chamado
mssql
para obter o valor da senha.securityContext
: define as configurações de privilégio e controle de acesso para um pod ou contêiner. Nesse caso, ele é especificado no nível do pod e, portanto, todos os contêineres aderem a esse contexto de segurança. No contexto de segurança, definimos ofsGroup
com o valor10001
, que é a GID (ID de Grupo) do grupomssql
. Esse valor significa que todos os processos do contêiner também fazem parte do GID10001
suplementar (mssql
). O proprietário do volume/var/opt/mssql
e de todos os arquivos criados nesse volume será a GID10001
(o grupomssql
).
Aviso
Usando o tipo de serviço
LoadBalancer
, a instância do SQL Server pode ser acessada remotamente (pela Internet) na porta 1433.Salve o arquivo. Por exemplo,
sqldeployment.yaml
.Crie a implantação, em que
<path to sqldeployment.yaml file>
é o local onde você salvou o arquivo:kubectl apply -f <path to sqldeployment.yaml file>
A implantação e o serviço são criados. A instância do SQL Server está em um contêiner, conectada ao armazenamento persistente.
deployment "mssql-deployment" created service "mssql-deployment" created
A implantação e o serviço são criados. A instância do SQL Server está em um contêiner, conectada ao armazenamento persistente.
Para exibir o status do pod, digite
kubectl get pod
.NAME READY STATUS RESTARTS AGE mssql-deployment-3813464711-h312s 1/1 Running 0 17m
O pod tem um status de
Running
. Esse status indica que o contêiner está pronto. Após a criação da implantação, pode levar alguns minutos antes que o pod fique visível. O atraso ocorre porque o cluster efetua pull da imagem mssql-server-linux do Registro de Artefato da Microsoft. Depois o pull da imagem for efetuado pela primeira vez, implantações subsequentes poderão ser mais rápidas se a implantação for para um nó que já tem a imagem armazenada em cache.Verifique se os serviços estão em execução. Execute o comando a seguir:
kubectl get services
Esse comando retorna serviços em execução e os endereços IP internos e externos para os serviços. Observe o endereço IP externo do serviço
mssql-deployment
. Use o endereço IP para conectar-se ao 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
Para saber mais sobre o status dos objetos no cluster Kubernetes, execute o comando a seguir. Lembre-se de substituir
<MyResourceGroup>
e<MyKubernetesClustername>
com o grupo de recursos e o nome do cluster do Kubernetes:az aks browse --resource-group <MyResourceGroup> --name <MyKubernetesClustername>
Você também pode verificar se o contêiner está em execução como não raiz executando o seguinte comando, em que
<nameOfSqlPod>
é o nome do pod do SQL Server:kubectl.exe exec <nameOfSqlPod> -it -- /bin/bash
Você poderá ver o nome de usuário como
mssql
se executarwhoami
.mssql
que é um usuário não raiz.whoami
Conectar-se à instância do SQL Server
Você pode se conectar com um aplicativo de fora da rede virtual do Azure, usando a conta sa
e o endereço IP externo para o serviço. Use a senha que você configurou como o segredo do OpenShift.
É possível usar os seguintes aplicativos para se conectar à instância do SQL Server.
Conectar-se com sqlcmd
Para se conectar com sqlcmd
, execute o seguinte comando:
sqlcmd -S <External IP Address> -U sa -P "MyC0m9l&xP@ssw0rd"
Substitua os seguintes valores:
<External IP Address>
pelo endereço IP do serviçomssql-deployment
MyC0m9l&xP@ssw0rd
com a sua senha complexa
Verificar falha e recuperação
Para verificar a falha e a recuperação, exclua o pod realizando as seguintes etapas:
Listar o pod que está executando o SQL Server.
kubectl get pods
Anotar o nome do pod que está executando o SQL Server.
Excluir o pod.
kubectl delete pod mssql-deployment-0
mssql-deployment-0
é o valor retornado da etapa anterior para o nome do pod.
O Kubernetes recria automaticamente o pod para recuperar uma instância do SQL Server e se conecta ao armazenamento persistente. Use kubectl get pods
para verificar se um novo pod foi implantado. Use kubectl get services
para verificar se o endereço IP do novo contêiner é o mesmo.
Limpar os recursos
Se você não planeja passar pelos tutoriais a seguir, limpe os recursos desnecessários. Use o comando az group delete
para remover o grupo de recursos, o serviço de contêiner e todos os recursos relacionados. Substitua <MyResourceGroup>
pelo nome do grupo de recursos que contém o cluster.
az group delete --name <MyResourceGroup> --yes --no-wait