本文使用Azure Kubernetes服务(AKS)部署了一个SQL Server容器。
Kubernetes简介
Kubernetes是一个可移植的、开源的、可扩展的平台,用于管理和协调容器。它将复杂的容器管理任务抽象化。你可能在环境中运行数百个容器应用程序和数据库,而Kubernetes提供了一个可靠和高度可扩展的控制面板来管理这些容器。Kubernetes被通俗地称为k8s,其中数字8定义了K[ubernete]s这个词的k和s之间的字符数。它是基于云的应用开发中的一个流行概念。
Kubernetes提供了以下好处。
- Kubernetes提供容器的自我修复。例如,它在失败时重新启动包含。
- 它可以动态地扩大或缩小容器的规模。
- 你可以为容器实例应用自动滚动更新和回滚。
- 它可以存储和管理敏感信息,如密码。
Kubernetes组件
在高层次上,Kubernetes形成了一个服务器集群,即Nodes。主节点维持所需的集群状态,而工人节点运行应用程序和服务的容器。
计算机集群
Kubernetes集群负责控制和调度任务。该集群包含节点和控制面板。
- 节点。节点是执行任务的系统。
- 控制平面。它运行调度软件。
Kubectl
它是一个与Kubernetes集群交互的命令行工具。你可以使用kubectl创建、停止、删除、自动扩展资源、描述活动资源。我们将在本文中使用kubectl进行资源部署。
Kubernetes Pods
Kubernetes Pods是Kubernetes架构中最小的单元,它代表了Kubernetes中的一个容器实例。为了在Kubernetes中运行应用程序,你将容器打包到pod中。荚的模板是用YAML文件定义的。
本文使用Azure Kubernetes Service(AKS)来部署和管理Kubernetes集群。它是一个完全可管理的服务,提供无服务器的Kubernetes,具有集成的CI/CD解决方案、企业级安全和治理。
你可以导航到azure.microsoft.com/en-in/servi…,并尝试Azure Kubernetes服务(AKS)。
要部署Kubernetes集群,启动Azure门户,搜索Kubernetes服务。
点击在Azure Kubernetes服务(AKS)中创建一个新集群,需要输入一些配置才能进行。
- 基本情况。
基本页面需要Azure订阅、资源组、Kubernetes集群名称、区域、预设配置。
预设配置允许你根据你的要求定制Kubernetes集群配置。它有以下预设配置。
- 标准配置。它提供了一个标准配置,适用于大多数应用程序
- Dev\Test:它适用于开发、测试或学习Kubernetes。在本文中,我们使用Dev\test预设配置。
- 成本优化的。它的重点是降低生产工作负载的部署成本。
- 批量处理。它适用于计算密集型、机器学习、图形密集型的工作负载。
- 硬化的访问。它适用于需要完全控制安全性和稳定性的大型企业。
我们可以在主节点池中配置节点大小、扩展方法(手动或自动扩展)和节点数量。
节点大小取决于vCPU、内存、数据磁盘和成本。你可以点击改变大小,选择你的最佳虚拟机大小。
我们在本文中使用标准B2,有2个vCPU和4个GIB内存,采用自动缩放方法。
我们将对Azure Kubernetes服务(AKS)集群中的其余选项进行默认配置--节点池、认证、集成、标签。
节点池。
认证
联网
集成
审查+创建
部署你的Kubernetes集群并查看仪表盘,如下图所示。
单击 "节点"。它显示节点池、单个节点名称和它们的状态。
使用Azure CLI与Azure Kubernetes服务(AKS)连接
Azure门户给出了以下说明,使用命令行Azure CLI或Cloud Shell连接到Kubernetes集群。
在本文中,我们将使用Azure CLI来连接Kubernetes集群。你可以导航到docs.microsoft.com/en-us/cli/a…,并在Windows、Linux或macOS上安装最新的Azure CLI。
在Azure CLI安装后,启动命令提示,并使用你的凭证验证Azure。
az登录命令会打开一个浏览器窗口,让你输入你的Azure凭证。认证后,你会看到以下页面。
az account set -subscription
az login
- 配置kubectl
如前所述,我们使用kubectl命令来连接Kubernetes集群。我们运行az aks get-credentials命令来配置kubectl。
az aks get-credentials需要输入我们之前部署的资源组和Kubernetes集群。
az aks get-credentials -resource-group myResourceGroup -name myAKSCluster
- 获取Kubernetes集群信息
我们可以运行命令 -kubectl get nodes- 来获取集群节点、状态、正常运行时间和版本的列表。
- 存储SQL部署的SA密码
在这一步,使用kubectl create generic mssql并存储SQL服务器管理员密码。在这个例子中,我使用了一个通用密码;但是,你应该使用一个复杂的密码。下面的命令在Kubernetes中创建了一个名为mssql的秘密,它存储了SA_PASSWORD的值。
kubectl create secret generic mssql -from-literal=SA_PASSWORD= "India@1234"
使用kubectl describe secret命令来验证mssql这个秘密。
创建一个持久性存储
下一步需要配置一个持久化存储卷。这个持久化卷是独立的存储,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
它的输出说 - 成功地配置了卷。
你也可以在Kubernetes集群存储部分验证该存储。如下图所示,名为mssql-data的卷被绑定到Kubernetes集群上。
- 创建一个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端口。
在一个首选的编辑器中复制以下脚本,并将其保存为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。
SQL服务器实例在容器中运行,它被连接到持久性存储。运行命令--kubectl get pod来获取pod的名称、状态和年龄。
在创建pod的过程中,集群从docker hub拉出SQL Server docker镜像,并执行配置。一旦镜像被拉出,后续的部署就会更快,因为它不需要再次下载镜像。
如下图所示,pod的状态从ContainerCreating变成了Running。
kubectl get服务来 返回Kubernetes集群IP和外部IP地址。你需要一个外部IP地址来连接到SQL服务。如下图所示,内部1433端口被映射到31146。
使用SQLCMD连接到SQL服务器
你可以使用SQLCMD、SSMS或Azure Data Studio,用外部IP地址连接,并验证Microsoft SQL Server 2019 CU13。
验证Azure Kubernetes服务(AKS)中的Pod故障和恢复情况
Kubernetes会自动检测任何故障并重新启动或部署Pod。它连接到持久的存储,所以你不会丢失任何数据。
让我们创建一个新的数据库[demodb],表,并插入一条记录来测试故障和恢复。
现在,运行kubectl get pods命令,获取pods名称、状态。它的状态是准备好并运行,如下图所示。
让我们使用kubectl delete命令来删除这个pod。该命令需要一个pod名称作为输入。
Azure Kubernetes服务(AKS)集群会自动创建pod,并与持久性存储连接以恢复SQL Server实例。你可以使用kubectl get pods来验证新的pod是否部署在Kubernetes存储中。
pod的外部IP地址得到一个新的外部IP地址。如下图所示,新的外部IP地址是13.71.60.245
让我们连接到SQL实例,并验证是否可以访问在前一个pod中插入的记录。如下图所示,数据库[demodb]和记录 "Kubernetes "是可用的。
在Azure Kubernetes服务中运行的Kubernetes的HA解决方案
正如本文所探讨的,Kubernetes作为一个集群协调器。假设你在一个pod中拥有一个mssql-server容器。复制集确保如果一个节点发生故障,该pod会自动恢复。
下图显示mssql-server容器失败。Kubernetes维护了正确的健康复制集,并维护了一个具有类似配置的新容器。mssql-server与相同的持久性存储连接,并连接到mssql-server。
同样地,下图显示运行mssql-server容器的节点失败。Kubernetes在不同的节点上启动了一个新的pod,并将mssql-server容器与持久化存储相连。
总结
本文使用Azure Kubernetes服务(AKS)部署了一个Kubernetes集群,并配置了一个SQL Server Linux docker镜像。我们使用kubectl命令来配置Kubernetes,创建和管理POD。Kubernetes会自动恢复具有持久性存储的pod。你可以按照这篇文章,用SQL Server进行K8s集群部署。