在 Azure 上部署和管理 Kubernetes 集群
1. 从零构建集群
如果你想自己构建一个 Kubernetes 集群,可以参考 AKS - engine 项目(https://github.com/Azure/aks - engine),它使用 Azure 资源管理器在 Azure 中构建 Kubernetes 基础设施。
2. 在 AKS 上设置首个 Kubernetes 集群
AKS 集群可以在其自己的 VPC(基本网络配置)或现有 VPC(高级网络配置)中启动,这两种方式都可以通过 Azure CLI 完成。创建集群时可以指定以下参数:
| 参数 | 描述 |
| ---- | ---- |
| –name | 集群名称 |
| –enable - addons | 以逗号分隔的列表形式启用 Kubernetes 附加组件模块 |
| –generate - ssh - keys | 如果 SSH 密钥文件不存在,则生成它们 |
| –node - count | 节点数量,默认值为 3 |
| –network - policy | (预览)启用或禁用网络策略,默认禁用 |
| –vnet - subnet - id | 用于部署集群的 VNet 中的子网 ID |
| –node - vm - size | VM 的大小,默认是 Standard_DS2_v2 |
| –service - cidr | 用于分配服务集群 IP 的 CIDR 表示法 IP 范围 |
| –max - pods | 基本网络配置默认是 110,高级网络配置(使用现有 VNet)默认是 30 |
以下是创建一个包含两个节点的 AKS 集群,并启用监控和 HTTP 应用路由附加组件的示例:
# 创建一个包含两个节点的 AKS 集群
# az aks create --resource-group devops --name myAKS --node-count 2 --enable-addons monitoring,http_application_routing --generate-ssh-keys
Running...
# az aks list --resource-group devops
[
{
"aadProfile":null,
"addonProfiles":{
"httpApplicationRouting":{
"config":{
"HTTPApplicationRoutingZoneName":"cef42743fd964970b357.centralus.aksapp.io"
},
"enabled":true
},
"omsagent":{
"config":{
"logAnalyticsWorkspaceResourceID":...
},
"enabled":true
}
},
"agentPoolProfiles":[
{
"count":2,
"maxPods":110,
"name":"nodepool1",
"osDiskSizeGb":30,
"osType":"Linux",
"storageProfile":"ManagedDisks",
"vmSize":"Standard_DS2_v2"
}
],
"dnsPrefix":"myAKS-devops-f82579",
"enableRbac":true,
"fqdn":"myaks-devops-f82579-077667ba.hcp.centralus.azmk8s.io",
"id":"/subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourcegroups/devops/providers/Microsoft.ContainerService/managedClusters/myAKS",
"kubernetesVersion":"1.9.11",
"linuxProfile":{
"adminUsername":"azureuser",
"ssh":{
"publicKeys":[
{
"keyData":"ssh-rsa xxx"
}
]
}
},
"location":"centralus",
"name":"myAKS",
"networkProfile":{
"dnsServiceIp":"10.0.0.10",
"dockerBridgeCidr":"172.17.0.1/16",
"networkPlugin":"kubenet",
"networkPolicy":null,
"podCidr":"10.244.0.0/16",
"serviceCidr":"10.0.0.0/16"
},
"nodeResourceGroup":"MC_devops_myAKS_centralus",
"provisioningState":"Succeeded",
"resourceGroup":"devops",
"servicePrincipalProfile":{
"clientId":"db016e5d-b3e5-4e22-a844-1dad5d16fec1"
},
"type":"Microsoft.ContainerService/ManagedClusters"
}
]
集群启动后,使用
get - credentials
子命令配置
kubeconfig
:
# 配置本地 kubeconfig 以访问集群
# az aks get-credentials --resource-group devops --name myAKS
Merged "myAKS" as current context in /home/chloe/.kube/config
# 检查当前上下文
# kubectl config current-context
myAKS
检查节点是否已加入集群,确保所有节点都处于
Ready
状态:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-37748545-0 Ready agent 12m v1.9.11
aks-nodepool1-37748545-1 Ready agent 12m v1.9.11
接下来,部署一个 ReplicaSet 并创建一个服务来访问它:
# 部署 ReplicaSet
# kubectl create -f chapter3/3-2-3_Service/3-2-3_rs1.yaml
replicaset.apps/nginx-1.12 created
# 创建服务
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
project: chapter3
service: web
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
name: http
# 观察服务的外部 IP 变化
# kubectl get svc --watch
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6h
nginx-service LoadBalancer 10.0.139.13 40.122.78.184 80:31011/TCP 1m
3. 基本网络配置与高级网络配置的区别
基本网络配置使用
kubenet
(https://github.com/vplauzon/aks/tree/master/aks - kubenet)作为网络插件,而高级网络配置使用 Azure CNI 插件(https://github.com/Azure/azure - container - networking/tree/master/cni)。高级网络配置的节点上默认最大 Pod 数为 30,而基本网络配置为 110。这是因为 Azure CNI 只为节点上的 NIC 配置了 30 个额外的 IP 地址。使用
kubenet
时,集群 IP 分配给 Pod,这些 IP 不属于虚拟网络,而是由 AKS 管理,并且在集群外部无法访问。
创建具有高级网络配置的 AKS 集群步骤如下:
1. 列出之前创建的 VNet
devops - vnet
中的子网 ID:
# az network vnet subnet list --vnet-name devops-vnet --resource-group devops | jq .[].id
"/subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourceGroups/devops/providers/Microsoft.Network/virtualNetworks/devops-vnet/subnets/default"
"/subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourceGroups/devops/providers/Microsoft.Network/virtualNetworks/devops-vnet/subnets/test"
- 使用默认子网创建集群:
# az aks create --resource-group devops --name myAdvAKS --network-plugin azure --vnet-subnet-id /subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourceGroups/devops/providers/Microsoft.Network/virtualNetworks/devops-vnet/subnets/default --service-cidr 10.2.0.0/24 --node-count 1 --enable-addons monitoring,http_application_routing --generate-ssh-keys
- Running ..
{
"aadProfile": null,
"addonProfiles": {
"httpApplicationRouting": {
"config": {
"HTTPApplicationRoutingZoneName":
"cef42743fd964970b357.centralus.aksapp.io"
},
"enabled": true
},
"omsagent": {
"config": {
"logAnalyticsWorkspaceResourceID":
},
"enabled": true
}
},
"agentPoolProfiles": [
{
"count": 1,
"maxPods": 30,
"name": "nodepool1",
"vmSize": "Standard_DS2_v2"
}
],
"dnsPrefix": "myAdvAKS-devops-f82579",
"enableRbac": true,
"fqdn": "myadveks-devops-f82579-059d5b24.hcp.centralus.azmk8s.io",
"id": "/subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourcegroups/devops/providers/Microsoft.ContainerService/managedClusters/myAdvAKS",
"kubernetesVersion": "1.9.11",
"linuxProfile": {
"adminUsername": "azureuser",
"ssh": {
"publicKeys": [
...
]
}
},
"location": "centralus",
"name": "myAdvAKS",
"networkProfile": {
"dnsServiceIp": "10.0.0.10",
"dockerBridgeCidr": "172.17.0.1/16",
"networkPlugin": "azure",
"networkPolicy": null,
"podCidr": null,
"serviceCidr": "10.2.0.0/24"
},
"nodeResourceGroup": "MC_devops_myAdvAKS_centralus",
"provisioningState": "Succeeded",
"resourceGroup": "devops",
"servicePrincipalProfile": {
"clientId": "db016e5d-b3e5-4e22-a844-1dad5d16fec1",
"secret": null
},
"tags": null,
"type": "Microsoft.ContainerService/ManagedClusters"
}
-
配置
kubeconfig:
# az aks get-credentials --resource-group devops --name myAdvAKS
Merged "myAdvAKS" as current context in /home/chloe/.kube/config
4. 节点池
节点池是一组相同大小的 VM。目前,多节点池支持正在开发中,可以关注 https://github.com/Azure/AKS/issues/759 的讨论或官方公告。Azure 提供虚拟机器扩展集作为其自动缩放组解决方案,在 Kubernetes 1.12 中,VMSS 支持已普遍可用,通过 VM 指标可以对 VMs 进行扩展。更多信息可查看官方文档:https://kubernetes.io/blog/2018/10/08/support - for - azure - vmss - cluster - autoscaler - and - user - assigned - identity/。
5. 集群升级
升级集群前,确保订阅有足够的资源,因为节点将通过滚动部署进行替换,会向集群添加额外节点。可以使用
az vm list - usage --location $location
命令检查配额限制。
# 查看当前使用的 Kubernetes 版本
# az aks show --resource-group devops --name myAKS | jq .kubernetesVersion
"1.9.11"
# 检查集群可以升级到的版本
# az aks get-upgrades --name myAKS --resource-group devops
{
"agentPoolProfiles": [
{
"kubernetesVersion": "1.9.11",
"name": null,
"osType": "Linux",
"upgrades": [
"1.10.8",
"1.10.9"
]
}
],
"controlPlaneProfile": {
"kubernetesVersion": "1.9.11",
"name": null,
"osType": "Linux",
"upgrades": [
"1.10.8",
"1.10.9"
]
},
"id": "/subscriptions/f825790b-ac24-47a3-89b8-9b4b3974f0d5/resourcegroups/devops/providers/Microsoft.ContainerService/managedClusters/myAKS/upgradeprofiles/default",
"name": "default",
"resourceGroup": "devops",
"type": "Microsoft.ContainerService/managedClusters/upgradeprofiles"
}
在 Azure 中,不能跳过小版本升级,例如不能从 1.9.11 直接升级到 1.11.x,需要先升级到 1.10,再升级到 1.11。以下是升级到 1.10.9 的示例:
# az aks upgrade --name myAKS --resource-group devops --kubernetes-version 1.10.9
# 检查升级后的集群版本
# az aks show --resource-group devops --name myAKS --output table
Name Location ResourceGroup KubernetesVersion ProvisioningState Fqdn
------ ---------- --------------- ------------------- ------------------- -
---------------------------------------------------
myAKS centralus devops 1.10.9 Succeeded myaks-devops-
f82579-077667ba.hcp.centralus.azmk8s.io
# 检查节点版本
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-37748545-2 Ready agent 6m v1.10.9
aks-nodepool1-37748545-3 Ready agent 6m v1.10.9
6. 监控和日志
创建集群时部署了监控附加组件,这样可以通过 Azure 监控轻松观察集群指标和日志。在 Azure 门户中访问 Kubernetes 服务,会看到带有见解、指标和日志子标签的“监控”标签。
- 见解页面显示集群的一般指标,如节点 CPU、内存利用率和节点的总体健康状况。
- 指标页面显示所有支持的资源指标,对于 AKS 集群,会显示一些核心指标(https://kubernetes.io/docs/tasks/debug - application - cluster/core - metrics - pipeline/)。
- 日志页面可以在 Azure 日志分析中找到集群日志,可通过支持的语法运行查询来搜索日志,更多信息可查看 Azure 监控文档:https://docs.microsoft.com/en - us/azure/azure - monitor/log - query/log - query - overview。
7. Kubernetes 云提供商
Azure 的云控制器管理器(https://github.com/kubernetes/cloud - provider - azure)实现了与 Kubernetes 的一系列集成,它与 Azure 交互,为用户提供无缝体验。
8. 基于角色的访问控制(RBAC)
AKS 通过 OpenID 连接令牌(https://kubernetes.io/docs/reference/access - authn - authz/authentication/#openid - connect - tokens)与 Azure 活动目录(https://azure.microsoft.com/en - ca/services/active - directory/)集成。RBAC 功能只能在集群创建时启用,创建支持 RBAC 的集群步骤如下:
8.1 准备应用程序注册
- 在 Azure 门户中进入 Azure 活动目录服务,记录“属性”标签中的“目录 ID”。
-
创建第一个应用程序注册(作为用户组成员身份的服务器):
-
在“应用程序注册”页面,点击“新建应用程序注册”,添加任意名称和 URL。也可以使用
az ad app create --display - name myAKSAD --identifier - uris http://myAKSAD命令。 -
记录应用程序 ID,例如
c7d828e7 - bca0 - 4771 - 8f9d - 50b9e1ea0afc。 -
点击“清单”,将
groupMemebershipClaims更改为All。 - 保存设置后,进入“设置” - “密钥”页面创建一个有效期为一年的密钥,记录该密码。
- 定义应用程序和委托权限,选择 Microsoft Graph,在“应用程序权限”类别中选择“读取目录数据”,在“委托权限”中选择“登录并读取用户配置文件”和“读取目录数据”,点击“保存”,然后作为管理员点击“授予权限”。
-
在“应用程序注册”页面,点击“新建应用程序注册”,添加任意名称和 URL。也可以使用
-
创建第二个应用程序注册(作为与
kubectl集成的客户端):-
使用名称
myAKSADClient进行注册,记录其应用程序 ID,例如b4309673 - 464e - 4c95 - adf9 - afeb27cc8d4c。 - 客户端只需访问应用程序,搜索委托权限并找到为服务器创建的访问权限,完成后点击“授予权限”。
-
使用名称
8.2 创建 AKS 集群
# az aks create --resource-group devops --name myADAKS --generate-ssh-keys --aad-server-app-id c7d828e7-bca0-4771-8f9d-50b9e1ea0afc --aad-server-app-secret 'A/IqLPieuCqJzL9vPEI5IqCn0IaEyn5Zq/lgfovNn9g=' --aad-client-app-id b4309673-464e-4c95-adf9-afeb27cc8d4c --aad-tenant-id d41d3fd1-f004-45cf-a77b-09a532556331 --node-count 1 --enable-addons monitoring,http_application_routing --generate-ssh-keys
8.3 创建角色绑定
# 以管理员身份登录以创建绑定
# az aks get-credentials --resource-group devops --name myADAKS --admin
# 列出集群角色
# kubectl get clusterrole
NAME AGE
admin 2h
cluster-admin 2h
...
# 创建用户的集群角色绑定
# cat 12-3_user-clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: azure-user-cluster-admins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: "8698dcf8-4d97-43be-aacd-eca1fc1495b6"
# kubectl create -f 12-3_user-clusterrolebinding.yaml
clusterrolebinding.rbac.authorization.k8s.io/azure-user-cluster-admins created
# 配置非管理员的 kubeconfig 并尝试访问集群资源
# (可选) 如果需要,清理 kubeconfig
# rm -f ~/.kube/config
# 设置非管理员的 kubeconfig
# az aks get-credentials --resource-group devops --name myADAKS
# 尝试获取节点信息
# kubectl get nodes
To sign in, use a web browser to open the page
https://microsoft.com/devicelogin and enter the code A6798XUFB to
authenticate.
也可以通过 Azure AD 组对象 ID 指定用户组,将集群角色绑定配置中的主体替换为:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: "$group_object_id"
通过以上步骤,你可以在 Azure 上成功部署、管理和维护 Kubernetes 集群,并实现基于角色的访问控制。
在 Azure 上部署和管理 Kubernetes 集群(续)
9. 操作流程总结
为了更清晰地展示在 Azure 上部署、管理和维护 Kubernetes 集群的整个流程,下面用 mermaid 流程图来呈现:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择构建方式}:::decision
B -->|从零构建| C(使用 AKS - engine 项目):::process
B -->|使用 AKS| D(选择网络配置):::process
D -->|基本网络配置| E(使用 kubenet 插件创建集群):::process
D -->|高级网络配置| F(使用 Azure CNI 插件创建集群):::process
E --> G(配置 kubeconfig):::process
F --> G
G --> H(检查节点状态):::process
H --> I(部署 ReplicaSet 和服务):::process
I --> J{是否需要扩展或升级}:::decision
J -->|是| K(进行节点池扩展或集群升级):::process
J -->|否| L{是否需要监控和日志}:::decision
K --> L
L -->|是| M(使用 Azure 监控查看指标和日志):::process
L -->|否| N{是否需要 RBAC 控制}:::decision
M --> N
N -->|是| O(准备应用程序注册):::process
N -->|否| P([结束]):::startend
O --> Q(创建 AKS 集群并集成 AD):::process
Q --> R(创建角色绑定):::process
R --> P
10. 常见问题及解决办法
在操作过程中,可能会遇到一些常见问题,下面以表格形式列出并给出解决办法:
| 问题描述 | 可能原因 | 解决办法 |
| ---- | ---- | ---- |
| 集群创建失败 | 订阅资源不足、参数配置错误 | 使用
az vm list - usage --location $location
检查配额,仔细检查创建集群时的参数 |
| 节点未处于 Ready 状态 | 网络问题、节点资源不足 | 检查网络配置,确保节点有足够的 CPU、内存等资源 |
| 服务无法访问 | 网络策略限制、服务配置错误 | 检查网络策略是否允许访问,查看服务配置文件是否正确 |
| 集群升级失败 | 版本不兼容、资源不足 | 确保不跳过小版本升级,检查订阅资源是否充足 |
11. 最佳实践建议
- 资源规划 :在创建集群前,根据实际业务需求合理规划节点数量、VM 大小等资源,避免资源浪费或不足。
- 监控与日志 :及时部署监控附加组件,定期查看集群指标和日志,以便及时发现和解决潜在问题。
- 安全配置 :启用 RBAC 功能,合理分配角色和权限,确保集群的安全性。
- 版本管理 :定期检查集群可升级的版本,及时进行升级以获取更好的性能和安全性。
12. 总结
在 Azure 上部署和管理 Kubernetes 集群涉及多个方面,包括集群创建、网络配置、节点池管理、集群升级、监控日志以及基于角色的访问控制等。通过本文详细介绍的步骤和方法,结合操作流程总结、常见问题解决办法和最佳实践建议,你可以更高效、安全地在 Azure 平台上运行 Kubernetes 集群,满足不同业务场景的需求。无论是小型项目还是大型企业级应用,都能借助 Azure 的强大功能和 Kubernetes 的优势,实现容器化应用的稳定运行和灵活扩展。
超级会员免费看
398

被折叠的 条评论
为什么被折叠?



