32、在 Azure 上部署和管理 Kubernetes 集群

在 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"
  1. 使用默认子网创建集群:
# 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"
}
  1. 配置 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 准备应用程序注册
  1. 在 Azure 门户中进入 Azure 活动目录服务,记录“属性”标签中的“目录 ID”。
  2. 创建第一个应用程序注册(作为用户组成员身份的服务器):
    • 在“应用程序注册”页面,点击“新建应用程序注册”,添加任意名称和 URL。也可以使用 az ad app create --display - name myAKSAD --identifier - uris http://myAKSAD 命令。
    • 记录应用程序 ID,例如 c7d828e7 - bca0 - 4771 - 8f9d - 50b9e1ea0afc
    • 点击“清单”,将 groupMemebershipClaims 更改为 All
    • 保存设置后,进入“设置” - “密钥”页面创建一个有效期为一年的密钥,记录该密码。
    • 定义应用程序和委托权限,选择 Microsoft Graph,在“应用程序权限”类别中选择“读取目录数据”,在“委托权限”中选择“登录并读取用户配置文件”和“读取目录数据”,点击“保存”,然后作为管理员点击“授予权限”。
  3. 创建第二个应用程序注册(作为与 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 的优势,实现容器化应用的稳定运行和灵活扩展。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值