如何实现AKS(Azure Kubernetes Service)
群集部署及挂载共享存储
目录
背景需求
迁移现有应用程序
概述
轻松地将现有应用程序迁移到容器,并在 Azure 托管 Kubernetes 服务 (AKS) 中运行。
流
1 用户可将现有应用程序转换为容器,还可将容器映像发布到 Azure 容器注册表
2 借助 Azure 门户或命令行,用户可将容器部署到 AKS 群集
解决方案
解决方案介绍:
-
使用 Azure 门户部署并连接到 AKS 群集。
-
在该群集中运行一个包含 Web 前端和 Redis 实例的多容器应用程序。
-
监视运行应用程序的群集和 Pod 的运行状况。
**Kubernetes 群集体系结构:**Kubernetes 群集分为两个组件:
-
控制平面:提供 Kubernetes 核心服务和应用程序工作负载的业务流程。
-
节点:运行应用程序工作负载。
产品介绍&基本概念
Azure Kubernetes 服务 (AKS) 是一种托管 Kubernetes
产品/服务,可进一步简化基于容器的应用程序部署和管理,降低部署和核心管理任务(例如升级协调)的复杂性。作为一个托管的
Kubernetes 服务,Azure 可以自动处理运行状况监视和维护等关键任务。-
Azure Kubernetes
Service(AKS)是Azure推出的开源容器与平台服务。Kubernetes是当下火热的容器市场的关注热点,AKS是Azure容器生态的核心产品服务。
介绍以下内容(基本概念)
核心 Kubernetes 基础结构组件:
控制平面
节点
节点池
工作负载资源:
Pod
部署
控制面板
创建 AKS 群集时,系统会自动创建和配置控制平面。
节点
要运行应用程序和支持服务,需要 Kubernetes 节点。 一个 AKS
群集至少有一个节点,这是运行 Kubernetes 节点组件和容器运行时的 Azure 虚拟机
(VM)。
节点池
具有相同配置的节点将统一合并成节点池。 一个 Kubernetes 群集至少包含一个节点池。
创建 AKS 群集时会定义初始节点数和大小,从而创建默认节点池。 AKS
中的此默认节点池包含运行代理节点的基础 VM。
Pod
Kubernetes 使用 Pod 来运行应用程序的实例。 Pod 表示应用程序的单个实例。
Pod 通常与容器是一对一映射关系。 在高级方案中,一个 Pod 可能包含多个容器。
多容器 Pod 是在同一节点上共同计划的,容器可通过它们共享相关资源。
部署和 YAML 清单
部署表示由 Kubernetes 部署控制器管理的相同 Pod。 部署定义了要创建的 Pod
副本数量。 Kubernetes 计划程序可确保当 Pod
或节点遇到问题时,在正常节点上计划其他 Pod。
方案验证
在 https://portal.azure.cn 中登录 Azure 门户,
1.创建 AKS 群集
在搜索框 键入 “Kubernetes 服务”,点击Kubernetes 服务,选择“创建”
在“基本信息”页面上,配置以下选项:
项目详细信息:
选择一个 Azure 订阅。
选择或创建一个 Azure 资源组,例如 SinoK8S-RG。
群集详细信息:
输入 Kubernetes 群集名称,例如 SinoK8SCluster。
选择 AKS 群集的“区域”为中国北部2和“Kubernetes 版本”默认即可 。
主节点池:
为 AKS 节点选择 VM 节点大小。 一旦部署 AKS 群集,不能更改 VM 大小。
选择要部署到群集中的节点数。请将“节点计数”设置为“1”。
部署群集后,可以调整节点计数。
在完成时选择“下一步:节点池”。保留默认的“节点池”选项。
单击屏幕底部的“下一步:身份验证”。
创建新的群集标识:
在“身份验证”页上,配置以下选项:(补个图)
在“身份验证”字段中保留“系统分配的托管标识”。
启用 Kubernetes 基于角色的访问控制 (Kubernetes RBAC)
选项(以便更精细地控制对部署在 AKS 群集中的 Kubernetes 资源的访问权限)。
默认情况下将使用“基本”网络,并且会启用适用于容器的 Azure Monitor。
其余设置保留默认,验证完成后,依次单击“查看 + 创建”、“创建”。
创建 AKS 群集需要几分钟时间。
部署完成后,单击“转到资源”找到创建好的SinoK8SCluster:
下面显示了示例群集仪表板:
2.安装Azure CLI 并成功连接到Azure
导入 Microsoft 存储库密钥。
sudo rpm --import <https://packages.microsoft.com/keys/microsoft.asc>
创建本地 azure-cli 存储库信息,运行如下命令:
sudo sh -c 'echo -e "[azure-cli]
name=Azure CLI
baseurl=https://packages.microsoft.com/yumrepos/azure-cli
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc" \>
/etc/yum.repos.d/azure-cli.repo'
**sudo yum install azure-cli \#\#\#\#\#**使用 yum install 命令安装。
先运行 az cloud set -n AzureChinaCloud 更改云环境
登录,使用 az login 命令
如果 CLI 可以打开默认浏览器,它将这样做并加载 Azure 登录页。
否则,请在 https://aka.ms/devicelogin
处打开浏览器页,然后输入终端中显示的授权代码。如图:授权代码为FMP3QTUKZ。
输入完成后会出现你的中国区Azure账号,选中该账号后会如下图所示:
点击继续,成功连接到 Azure,见图:
3.连接到群集
使用 az aks get-credentials 命令将 kubectl 配置为连接到你的 Kubernetes 群集。
以下命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。
**az aks get-credentials --admin --name SinoK8SCluster --resource-group SinoK8S-RG**
使用 kubectl get 命令返回群集节点的列表,以此验证与群集之间的连接。
**kubectl get nodes**
输出显示在上一步骤中创建的单个节点。 确保节点状态为 Ready
,然后可以进行运行应用程序步骤*~*
如果遇到输入kubectl get nodes命令返回结果:-bash: kubectl: command not
found的情况,
执行以下命令:
**yum install -y etcd kubernetts ntp flannel \#\#\#\#\#\#**
**vim /etc/yum.repos.d/CentOS-Base.repo
\#\#\#\#\#\#**在/etc/yum.repos.d/目录下添加Kubernetes的yum源,在最后加入下面的信息,保存退出
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
**yum list kubectl –showduplicates
#####**查看可安装的版本,每个人的有所不同,我本机的输出信息如下
**yum -y install kubectl.x86_64 \#\#\#\#\#\#**安装提示信息中可安装的软件包
**最后再执行kubectl get nodes。**
4.运行应用程序
在本地 Shell 中,使用编辑器创建一个名为 azure-vote.yaml 的文件
复制以下 YAML 定义:
apiVersion: apps/v1
kind: Deployment
metadata:
name: azure-vote-back
spec:
replicas: 1
selector:
matchLabels:
app: azure-vote-back
template:
metadata:
labels:
app: azure-vote-back
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
\- name: azure-vote-back
image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
env:
\- name: ALLOW_EMPTY_PASSWORD
value: "yes"
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
ports:
\- containerPort: 6379
name: redis
\---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-back
spec:
ports:
\- port: 6379
selector:
app: azure-vote-back
\---
apiVersion: apps/v1
kind: Deployment
metadata:
name: azure-vote-front
spec:
replicas: 1
selector:
matchLabels:
app: azure-vote-front
template:
metadata:
labels:
app: azure-vote-front
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
\- name: azure-vote-front
image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 250m
memory: 256Mi
ports:
\- containerPort: 80
env:
\- name: REDIS
value: "azure-vote-back"
\---
apiVersion: v1
kind: Service
metadata:
name: azure-vote-front
spec:
type: LoadBalancer
ports:
\- port: 80
selector:
app: azure-vote-front
使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称:
kubectl apply -f azure-vote.yaml
输出显示已成功创建的部署和服务:
5.测试应用程序
应用程序运行时,Kubernetes 服务将向 Internet 公开应用程序前端。
此过程可能需要几分钟才能完成。
若要监视进度,运行如下命令:
kubectl get service azure-vote-front –watch
azure-vote-front 服务的 EXTERNAL-IP 输出最初显示为 pending。在
EXTERNAL-IP 地址从 pending 更改为实际公共 IP 地址后,请使用 CTRL-C 来停止
kubectl 监视进程。 以下输出显示向服务分配了有效的公共 IP 地址:
若要查看 Azure Vote 应用的实际效果,打开 Web 浏览器并输入服务的外部 IP 地址
6.监视运行状况和日志
【说明】创建群集后,适用于容器的 Azure Monitor 便已启用。 用于容器的 Azure
Monitor 提供 AKS 群集以及该群集上运行的 Pod 的运行状况指标。
指标数据需在几分钟后才会填充到 Azure 门户中。 若要查看 Azure Vote Pod
的当前运行状况、运行时间和资源使用情况:
浏览回到 Azure 门户中的 AKS 资源。在左侧的“监视”下,选择“见解”。
在顶部选择“+ 添加筛选器”。选择“命名空间”作为属性,然后选择 <All but
kube-system> 。选择“容器”以查看容器。
将显示 azure-vote-back 和 azure-vote-front 容器,如以下示例中所示:
若要查看 azure-vote-front Pod 的日志,请从容器下拉列表中选择“查看容器日志”。
这些日志包括容器中的 stdout 和 stderr 流。
收益
使用容器服务的解决了成本和效率问题。IT资产的巨额浪费问题得到解决。
实战应用
部署应用及挂载共享存储
添加资源组
az group create --name yz-TechnologyCarnival --location chinanorth2
创建容器注册表
az acr login --name sinoage
登录容器注册表
推送镜像
docker push sinoage.azurecr.cn/nginx
docker push sinoage.azurecr.cn/mysql
查看容器注册表中的镜像
az acr repository list --name sinoage --output table
<span style=“color: #171717”>创建服务主体</span>
az ad sp create-for-rbac --skip-assignment
root@docker:/yaml# az ad sp create-for-rbac --skip-assignment
{
“appId”: “15ff0340-ebbc-406c-ada3-2b0af6fe80be”,
“displayName”: “azure-cli-2019-10-08-07-37-49”,
“name”: “http://azure-cli-2019-10-08-07-37-49”,
“password”: “134e9239-043f-4919-82d2-ca780231b0b8”,
“tenant”: “113aef27-55c0-4536-9576-bd8c6a7846d3”
}
查看ACRID
az acr show --resource-group yz-TechnologyCarnival --name sinoage --query “id”
–output tsv
配置 ACR 身份验证
az role assignment create --assignee 15ff0340-ebbc-406c-ada3-2b0af6fe80be
–scope
/subscriptions/6b3fe200-d158-4f43-a320-ccb6bb97af0f/resourceGroups/yz-TechnologyCarnival/providers/Microsoft.ContainerRegistry/registries/sinoage
–role acrpull
创建 Kubernetes 群集
root@docker:/yaml# az aks create \
> --resource-group yz-TechnologyCarnival \
> --name sinoageAKSCluster \
> --node-count 1 \
> --service-principal 15ff0340-ebbc-406c-ada3-2b0af6fe80be \
> --client-secret 134e9239-043f-4919-82d2-ca780231b0b8 \
> --generate-ssh-keys
{
“aadProfile”: null,
“addonProfiles”: null,
“agentPoolProfiles”: [
{
“availabilityZones”: null,
“count”: 1,
“enableAutoScaling”: null,
“enableNodePublicIp”: false,
“maxCount”: null,
“maxPods”: 110,
“minCount”: null,
“name”: “nodepool1”,
“nodeTaints”: null,
“orchestratorVersion”: “1.13.10”,
“osDiskSizeGb”: 100,
“osType”: “Linux”,
“provisioningState”: “Succeeded”,
“scaleSetEvictionPolicy”: null,
“scaleSetPriority”: null,
“type”: “AvailabilitySet”,
“vmSize”: “Standard_DS2_v2”,
“vnetSubnetId”: null
}
],
“apiServerAccessProfile”: null,
“dnsPrefix”: “sinoageAKS-yz-TechnologyCar-6b3fe2”,
“enablePodSecurityPolicy”: null,
“enableRbac”: true,
“fqdn”:
“sinoageaks-yz-technologycar-6b3fe2-ca3a87ea.hcp.chinanorth2.cx.prod.service.azk8s.cn”,
“id”:
“/subscriptions/6b3fe200-d158-4f43-a320-ccb6bb97af0f/resourcegroups/yz-TechnologyCarnival/providers/Microsoft.ContainerService/managedClusters/sinoageAKSCluster”,
“identity”: null,
“kubernetesVersion”: “1.13.10”,
“linuxProfile”: {
“adminUsername”: “azureuser”,
“ssh”: {
“publicKeys”: [
{
“keyData”: “ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDfv7ywVcCC4OT6e08zXN9//0PVBSFsl+QZuFjY7zTbEPvYpn4ZvVVAjLNbtN00rDsuYT4/mWW9ly69fa/7KAWrkuGhXs0N2IDDUXdio+2LOpLJv86cFHRcG31SB3YZH8AUWlbxahRrHyHXIQEYX/bPUalfZRMnjrFT0bzDFWGosWLYvblVpWnlgCJPBZTx3oGOX7euhAO1JDMHTrmK5fQrXHJSKwgzgZR0MiDB5SMinlJtxYmT/JVHYnPGwTGfJHBtjMIR2U/wvFhU+m4fDV00mrcVjuw1cgpmNuKXsOiVxSrh+UNfjOieqv86M39laxDPRxANwl+lxfrpKRVRith5”
}
]
}
},
“location”: “chinanorth2”,
“maxAgentPools”: 1,
“name”: “sinoageAKSCluster”,
“networkProfile”: {
“dnsServiceIp”: “10.0.0.10”,
“dockerBridgeCidr”: “172.17.0.1/16”,
“loadBalancerProfile”: null,
“loadBalancerSku”: “Basic”,
“networkPlugin”: “kubenet”,
“networkPolicy”: null,
“podCidr”: “10.244.0.0/16”,
“serviceCidr”: “10.0.0.0/16”
},
“nodeResourceGroup”: “MC_yz-TechnologyCarnival_sinoageAKSCluster_chinanorth2”,
“provisioningState”: “Succeeded”,
“resourceGroup”: “yz-TechnologyCarnival”,
“servicePrincipalProfile”: {
“clientId”: “15ff0340-ebbc-406c-ada3-2b0af6fe80be”,
“secret”: null
},
“tags”: null,
“type”: “Microsoft.ContainerService/ManagedClusters”,
“windowsProfile”: null
}
<span style=“color: #171717”>连接到 Kubernetes 群集</span>
<span style=“color: #171717”>若要验证与群集之间的连接,请运行
</span>kubectl get nodes<span style=“color: #171717”> 命令:</span>
部署应用程序
发布程序
查看pod日志
kubectl describe pods mysql-6479cbbfdc-pgmnn
创建存储账户并创建共享文件夹aksshare
使用存储账户用户名和访问key创建 Kubernetes 机密
kubectl create secret generic azure-secret
–from-literal=azurestorageaccountname=technologycarnival
–from-literal=azurestorageaccountkey=Ad4qRXvlINiNqOiyuEH0G1AnIT+3w8qvUuQToD4gjGY95XkitDlGffXmaHGpInSUlylsc1U6SXvYoDJJDibk+w==
<span style=“color: #171717”>使用 kubectl describe pod PodName
验证共享是否已成功装载</span>
Containers:
mysql:
Container ID:
docker://c4d5d4f2b0a1a5f27441d745ae2ca64c8eb73e5e6d690a330262f2b99f2b5d0f
Image: sinoage.azurecr.cn/mysql:v1
Image ID:
docker-pullable://sinoage.azurecr.cn/mysql@sha256:2bd4665d9c5ecad61f7ceff82f82e6470c4686b9ec0fd986b84012861506c722
Port: 3306/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 08 Oct 2019 16:37:12 +0800
Ready: True
Restart Count: 0
Environment:
MYSQL_ROOT_PASSWORD: zabbix
Mounts:
/mnt/azure from azure (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-t9nvm (ro)
<span style=“color: #171717”><ac:structured-macro
ac:name=“unmigrated-wiki-markup” ac:schema-version=“1”
ac:macro-id=“d9674f6e-c679-44cd-ad50-1874cd3e8e42”><ac:plain-text-body><![CDATA[[…]
Volumes: azure: Type: AzureFile (an Azure File Service mount on the host and
bind mount to the pod) SecretName: azure-secret ShareName: aksshare ReadOnly:
false default-token-t9nvm: Type: Secret (a volume populated by a Secret)
SecretName: default-token-t9nvm Optional: false QoS Class: BestEffort
Node-Selectors: beta.kubernetes.io/os=linux Tolerations:
node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From
Message ---- ------ ---- ---- ------- Normal Scheduled 6m7s default-scheduler
Successfully assigned default/mysql-6479cbbfdc-pgmnn to aks-nodepool1-10409544-0
Normal Pulling 6m5s kubelet, aks-nodepool1-10409544-0 pulling image
“sinoage.azurecr.cn/mysql:v1” Normal Pulled 5m58s kubelet,
aks-nodepool1-10409544-0 Successfully pulled image “sinoage.azurecr.cn/mysql:v1”
Normal Created 5m48s kubelet, aks-nodepool1-10409544-0 Created container Normal
Started 5m48s kubelet, aks-nodepool1-10409544-0 Started container]]>
de-Selectors: beta.kubernetes.io/os=linux Tolerations:
node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From
Message ---- ------ ---- ---- ------- Normal Scheduled 6m7s default-scheduler
Successfully assigned default/mysql-6479cbbfdc-pgmnn to aks-nodepool1-10409544-0
Normal Pulling 6m5s kubelet, aks-nodepool1-10409544-0 pulling image
“sinoage.azurecr.cn/mysql:v1” Normal Pulled 5m58s kubelet,
aks-nodepool1-10409544-0 Successfully pulled image “sinoage.azurecr.cn/mysql:v1”
Normal Created 5m48s kubelet, aks-nodepool1-10409544-0 Created container Normal
Started 5m48s kubelet, aks-nodepool1-10409544-0 Started container]]>