如何使用Azure Kubernetes服务(AKS)部署一个SQL Server容器

198 阅读9分钟

本文使用Azure Kubernetes服务(AKS)部署了一个SQL Server容器。

Kubernetes简介

Kubernetes是一个可移植的、开源的、可扩展的平台,用于管理和协调容器。它将复杂的容器管理任务抽象化。你可能在环境中运行数百个容器应用程序和数据库,而Kubernetes提供了一个可靠和高度可扩展的控制面板来管理这些容器。Kubernetes被通俗地称为k8s,其中数字8定义了K[ubernete]s这个词的k和s之间的字符数。它是基于云的应用开发中的一个流行概念。

Diagram of replicated servers as multiple containers in a Kubernetes cluster.

Kubernetes提供了以下好处。

Kubernetes benefit

  • Kubernetes提供容器的自我修复。例如,它在失败时重新启动包含。
  • 它可以动态地扩大或缩小容器的规模。
  • 你可以为容器实例应用自动滚动更新和回滚。
  • 它可以存储和管理敏感信息,如密码。

Kubernetes组件

在高层次上,Kubernetes形成了一个服务器集群,即Nodes。主节点维持所需的集群状态,而工人节点运行应用程序和服务的容器。

计算机集群

Kubernetes集群负责控制和调度任务。该集群包含节点和控制面板。

  • 节点。节点是执行任务的系统。
  • 控制平面。它运行调度软件。

Computer cluster

Kubectl

它是一个与Kubernetes集群交互的命令行工具。你可以使用kubectl创建、停止、删除、自动扩展资源、描述活动资源。我们将在本文中使用kubectl进行资源部署。

Kubernetes Pods

Kubernetes Pods是Kubernetes架构中最小的单元,它代表了Kubernetes中的一个容器实例。为了在Kubernetes中运行应用程序,你将容器打包到pod中。荚的模板是用YAML文件定义的。

Kubernetes pods

本文使用Azure Kubernetes Service(AKS)来部署和管理Kubernetes集群。它是一个完全可管理的服务,提供无服务器的Kubernetes,具有集成的CI/CD解决方案、企业级安全和治理。

你可以导航到azure.microsoft.com/en-in/servi…,并尝试Azure Kubernetes服务(AKS)。

Azure Kubernetes Services (AKS)

要部署Kubernetes集群,启动Azure门户,搜索Kubernetes服务。 Deploy a Kubernetes cluster

点击在Azure Kubernetes服务(AKS)中创建一个新集群,需要输入一些配置才能进行。

  • 基本情况。

基本页面需要Azure订阅、资源组、Kubernetes集群名称、区域、预设配置。

预设配置允许你根据你的要求定制Kubernetes集群配置。它有以下预设配置。

  • 标准配置。它提供了一个标准配置,适用于大多数应用程序
  • Dev\Test:它适用于开发、测试或学习Kubernetes。在本文中,我们使用Dev\test预设配置。
  • 成本优化的。它的重点是降低生产工作负载的部署成本。
  • 批量处理。它适用于计算密集型、机器学习、图形密集型的工作负载。
  • 硬化的访问。它适用于需要完全控制安全性和稳定性的大型企业。

Basic page configuration

我们可以在主节点池中配置节点大小、扩展方法(手动或自动扩展)和节点数量。

Primary Node pool

节点大小取决于vCPU、内存、数据磁盘和成本。你可以点击改变大小,选择你的最佳虚拟机大小。

Select a VM size

我们在本文中使用标准B2,有2个vCPU和4个GIB内存,采用自动缩放方法。

Node configurations

我们将对Azure Kubernetes服务(AKS)集群中的其余选项进行默认配置--节点池、认证、集成、标签。

节点池。

Node Pools

认证

Cluster authentication

联网

Cluster networking

集成

Container Integrations

审查+创建

Review configuration

部署你的Kubernetes集群并查看仪表盘,如下图所示。

Cluster dashboard

单击 "节点"。它显示节点池、单个节点名称和它们的状态。

Node count and Pool Node Pools

使用Azure CLI与Azure Kubernetes服务(AKS)连接

Azure门户给出了以下说明,使用命令行Azure CLI或Cloud Shell连接到Kubernetes集群。 Azure CLI commands

在本文中,我们将使用Azure CLI来连接Kubernetes集群。你可以导航到docs.microsoft.com/en-us/cli/a…,并在Windows、Linux或macOS上安装最新的Azure CLI。

Download latest Azure CLI

在Azure CLI安装后,启动命令提示,并使用你的凭证验证Azure。

az登录命令会打开一个浏览器窗口,让你输入你的Azure凭证。认证后,你会看到以下页面。

az account set -subscription
az login

az login command

  • 配置kubectl

如前所述,我们使用kubectl命令来连接Kubernetes集群。我们运行az aks get-credentials命令来配置kubectl。

az aks get-credentials需要输入我们之前部署的资源组和Kubernetes集群。

az aks get-credentials -resource-group myResourceGroup -name myAKSCluster

Configure kubectl

  • 获取Kubernetes集群信息

我们可以运行命令 -kubectl get nodes- 来获取集群节点、状态、正常运行时间和版本的列表。

Kubernetes cluster information

  • 存储SQL部署的SA密码

在这一步,使用kubectl create generic mssql并存储SQL服务器管理员密码。在这个例子中,我使用了一个通用密码;但是,你应该使用一个复杂的密码。下面的命令在Kubernetes中创建了一个名为mssql的秘密,它存储了SA_PASSWORD的值。

kubectl create secret generic mssql -from-literal=SA_PASSWORD= "India@1234"

SA password for SQL deployment

使用kubectl describe secret命令来验证mssql这个秘密。

validate the secret

创建一个持久性存储

下一步需要配置一个持久化存储卷。这个持久化卷是独立的存储,Kubernetes在其中存储SQL Server数据库,Kubernetes pods以后会访问这个存储。

为了创建持久性存储,我们需要创建一个YAML文件。你可以使用记事本、Visual Studio Code或任何首选编辑器来创建该文件。

下面的脚本声明了一个存储类、供应者、账户类型和持久化卷名。

  • 类型。存储类
  • 命名。Azure-disk
  • 提供者:Azure-disk
  • 存储账户类型。标准LRS
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

将此文件保存在YAML扩展名中,如pvc.yml。为了在Kubernetes集群中创建持久化存储卷并绑定到持久化卷,运行以下脚本。

kubectl apply -f c:\Azure\pvc.yml

使用下面的descript命令验证持久性存储卷。这里,mssql-data是持久化卷的名称。

describe pvc mssql-data

它的输出说 - 成功地配置了卷。

Create a persistent storage

你也可以在Kubernetes集群存储部分验证该存储。如下图所示,名为mssql-data的卷被绑定到Kubernetes集群上。

View storage in cluster

  • 创建一个Kubernetes部署对象

这一步创建了一个Kubernetes部署对象,以创建承载SQL Server实例的容器。该部署对象创建了一个副本集和pod。

  • 它创建一个清单(YAML文件)来描述部署配置。
  • 它使用mssql-server-linux docker镜像来安装SQL Server。
  • 它使用kubectl从先前创建的mssql秘密中检索SA密码。
  • 使用MSSQL_PID来指定SQL服务器版本。目前,我们将其设置为开发者。你可以选择诸如Express、Standard、Enterprise(用于生产许可证)等值。
  • 部署使用先前定义的persistentVolumeClaim- mssql-data。
  • 该脚本为SQL Server连接定义了1433端口。

Kubernetes deployment object

在一个首选的编辑器中复制以下脚本,并将其保存为sql.yml这样的格式

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: LoadBalancer

要创建部署,使用kubectl apply命令并指定该YML文件的路径。

kubectl apply -f C:\Azure\sql.yml

如下图所示,它创建了脚本中定义的部署和服务mssql-deployment。

Apply cluster configuration

SQL服务器实例在容器中运行,它被连接到持久性存储。运行命令--kubectl get pod来获取pod的名称、状态和年龄。

在创建pod的过程中,集群从docker hub拉出SQL Server docker镜像,并执行配置。一旦镜像被拉出,后续的部署就会更快,因为它不需要再次下载镜像。

如下图所示,pod的状态从ContainerCreating变成了Running

pod status changes

kubectl get服务来 返回Kubernetes集群IP和外部IP地址。你需要一个外部IP地址来连接到SQL服务。如下图所示,内部1433端口被映射到31146。

Get external IP

使用SQLCMD连接到SQL服务器

你可以使用SQLCMD、SSMS或Azure Data Studio,用外部IP地址连接,并验证Microsoft SQL Server 2019 CU13。

Connect to SQL Server using SQLCMD

验证Azure Kubernetes服务(AKS)中的Pod故障和恢复情况

Kubernetes会自动检测任何故障并重新启动或部署Pod。它连接到持久的存储,所以你不会丢失任何数据。

让我们创建一个新的数据库[demodb],表,并插入一条记录来测试故障和恢复。

Verify Pod Failure

现在,运行kubectl get pods命令,获取pods名称、状态。它的状态是准备好并运行,如下图所示。

Check Pod status

让我们使用kubectl delete命令来删除这个pod。该命令需要一个pod名称作为输入。

delete the pod

Azure Kubernetes服务(AKS)集群会自动创建pod,并与持久性存储连接以恢复SQL Server实例。你可以使用kubectl get pods来验证新的pod是否部署在Kubernetes存储中。

Verify pod is available again

pod的外部IP地址得到一个新的外部IP地址。如下图所示,新的外部IP地址是13.71.60.245

Note down current external IP

让我们连接到SQL实例,并验证是否可以访问在前一个pod中插入的记录。如下图所示,数据库[demodb]和记录 "Kubernetes "是可用的。

View records

在Azure Kubernetes服务中运行的Kubernetes的HA解决方案

正如本文所探讨的,Kubernetes作为一个集群协调器。假设你在一个pod中拥有一个mssql-server容器。复制集确保如果一个节点发生故障,该pod会自动恢复。

SQL Server container on Azure Kubernetes Services (AKS)

下图显示mssql-server容器失败。Kubernetes维护了正确的健康复制集,并维护了一个具有类似配置的新容器。mssql-server与相同的持久性存储连接,并连接到mssql-server。

SQL Server pod fail on Kubernetes cluster

同样地,下图显示运行mssql-server容器的节点失败。Kubernetes在不同的节点上启动了一个新的pod,并将mssql-server容器与持久化存储相连。

SQL Server pod recover on Kubernetes cluster

总结

本文使用Azure Kubernetes服务(AKS)部署了一个Kubernetes集群,并配置了一个SQL Server Linux docker镜像。我们使用kubectl命令来配置Kubernetes,创建和管理POD。Kubernetes会自动恢复具有持久性存储的pod。你可以按照这篇文章,用SQL Server进行K8s集群部署。