作者:基于 Azure Masterclass V2 教程整理 | 适合:云工程师、DevOps、备考 AZ-104/AZ-204
一、为什么需要 AKS?
Azure Container Instances(ACI)解决了"快速运行容器"的问题,但当业务规模扩大,我们需要:
- 服务发现(Service Discovery)
:让容器自动找到彼此 - 滚动升级(Rolling Upgrade)
:更新镜像而不中断服务 - 自动扩缩容(Auto-scaling)
:根据负载动态增减 Pod 数量 - 持久化存储(Persistent Volume)
:容器重启后数据不丢失 - 多容器协同
:Pod 内共享网络和存储
Azure Kubernetes Service(AKS) 是 Azure 的托管 Kubernetes 服务,解决了上述所有问题。
ACI 是"一辆车",AKS 是"一支车队 + 指挥中心"。
二、AKS 核心概念速查
| Node(节点) | |
| Node Pool(节点池) | |
| Pod | |
| Deployment | |
| Service | |
| Ingress | |
| ConfigMap | |
| Secret | |
| Namespace | |
| ReplicaSet |
三、滚动升级(Rolling Upgrade)
滚动升级是 Kubernetes 的核心能力之一,允许在不影响可用性的前提下更新应用。
工作原理:
新版本 Pod 逐步启动(不超过 maxSurge) 旧版本 Pod 逐步终止(不超过 maxUnavailable) 滚动过程持续直到所有 Pod 更新完毕
# deployment.yaml 示例
apiVersion:apps/v1
kind:Deployment
metadata:
name:my-app
spec:
replicas:5
strategy:
type:RollingUpdate
rollingUpdate:
maxSurge:1# 最多超出预期多少个 Pod
maxUnavailable:0# 最多不可用多少个 Pod(0 = 保持全程可用)
template:
spec:
containers:
-name:my-app
image:myapp:v2# 更新镜像版本即触发滚动升级
回滚(Rollback):
kubectl rollout undo deployment/my-app # 回滚到上一版本
kubectl rollout undo deployment/my-app --to-revision=3 # 回滚到指定版本
四、自动扩缩容(Auto-scaling)
AKS 提供三种自动扩缩容机制:
4.1 Horizontal Pod Autoscaler(HPA)
根据 CPU/内存使用率自动调整 Pod 数量:
kubectl autoscale deployment my-app \
--cpu-percent=70 \
--min=2 --max=10
# 或通过 YAML 声明
apiVersion:autoscaling/v2
kind:HorizontalPodAutoscaler
metadata:
name:my-app-hpa
spec:
scaleTargetRef:
apiVersion:apps/v1
kind:Deployment
name:my-app
minReplicas:2
maxReplicas:10
metrics:
-type:Resource
resource:
name:cpu
target:
type:Utilization
averageUtilization:70
4.2 KEDA(Kubernetes Event-driven Autoscaling)
KEDA 是 Kubernetes 原生的事件驱动扩缩容器,AKS 内置支持。
与 HPA 不同,KEDA 可以根据任意外部指标触发扩缩容:
# KEDA 扩缩容配置示例(基于 Azure Queue)
apiVersion:keda.sh/v1alpha1
kind:TriggerAuthentication
metadata:
name:azure-queue-auth
spec:
secretTargetRef:
-parameter:connectionString
name:azure-queue-secret
key:connectionString
---
apiVersion:keda.sh/v1alpha1
kind:ScaledObject
metadata:
name:my-app-scaler
spec:
scaleTargetRef:
name:my-app
minReplicaCount:2
maxReplicaCount:20
triggers:
-type:azure-queue
metadata:
queueName:my-queue
queueLength:"10"
authenticationRef:
name:azure-queue-auth
4.3 Cluster Autoscaler
当 HPA/KEDA 需要更多 Pod 但节点资源不足时,Cluster Autoscaler 自动向 AKS 添加新节点:
# 启用 Cluster Autoscaler(通过 az aks update)
az aks update \
--resource-group myRG \
--name myAKS \
--enable-cluster-autoscaler \
--min-count 1 \
--max-count 5
五、服务发现与网络
5.1 ClusterIP(默认)
为 Pod 分配集群内部 IP,仅集群内可访问:
apiVersion:v1
kind:Service
metadata:
name:my-service
spec:
selector:
app:my-app
ports:
-port:80# Service 端口
targetPort:8080# Pod 容器端口
type:ClusterIP
5.2 LoadBalancer
通过 Azure Load Balancer 暴露服务到公网:
type:LoadBalancer# Azure 自动创建 LB 并分配公网 IP
5.3 Ingress Controller
通常使用 NGINX Ingress Controller 处理 HTTP/HTTPS 路由:
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name:my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target:/
spec:
rules:
-host:myapp.example.com
http:
paths:
-path:/api
pathType:Prefix
backend:
service:
name:my-api-service
port:
number:80
六、GitOps 集成(Flux & Argo CD)
GitOps 是用 Git 仓库作为声明式基础设施和应用配置的唯一真实来源(Single Source of Truth)。
6.1 Azure Arc + GitOps
Azure Arc 可以将非 Azure 集群(如本地或其他云)纳入 Azure 管理,并通过 GitOps 自动化部署:
# 将集群连接到 Azure Arc
az connectedk8s connect \
--resource-group myRG \
--name myCluster
# 配置 GitOps
az k8s-configuration create \
--resource-group myRG \
--cluster-name myCluster \
--name my-gitops \
--operator-instance-name flux \
--operator-namespace flux-system \
--repository-url https://github.com/myorg/k8s-config \
--scope cluster
6.2 Flux 工作原理
Flux 自动监听 Git 仓库变更:
检测到新的 commits 或 tags 自动 kubectl apply应用配置确保集群状态与 Git 声明一致
6.3 优势
- 审计追踪
:所有变更通过 Pull Request,代码审查记录完整 - 一键回滚
:git revert 即可回滚基础设施变更 - 幂等性
:声明式配置天然幂等,多次应用结果一致 - GitOps 自动化
:减少人工操作,降低错误率
七、存储与持久化
Kubernetes 通过 PersistentVolume(PV) 和 PersistentVolumeClaim(PVC) 抽象存储:
# Azure Disk 作为 PersistentVolume
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:my-pvc
spec:
accessModes:
-ReadWriteOnce
storageClassName:managed-premium
resources:
requests:
storage:10Gi
---
apiVersion:apps/v1
kind:Deployment
spec:
template:
spec:
volumes:
-name:my-volume
persistentVolumeClaim:
claimName:my-pvc
containers:
-name:my-app
volumeMounts:
-name:my-volume
mountPath:/data
八、AKS 网络基础
Azure CNI 网络模式
AKS 默认使用 Azure CNI(Container Networking Interface),每个 Pod 获得真实 Azure VNet IP:
Pod 与 VNet 内其他资源直接通信 支持 VNet 安全策略(NSG) 节点数量受 VNet 子网 CIDR 限制
# 创建时指定 CNI 网络
az aks create \
--resource-group myRG \
--name myAKS \
--network-plugin azure \
--service-cidr 10.0.0.0/16 \
--dns-service-ip 10.0.0.10 \
--vnet-subnet-id /subscriptions/xxx/resourceGroups/myRG/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/aks
九、AKS 成本优化
| Spot Node Pool | |
| KEDA 按需扩缩 | |
| Reserved Instances | |
| 自动缩放到 0 | |
| 选择合适 SKU |
十、核心要点总结
下期预告:《Azure 容器服务完全指南(三):Serverless 与 Azure 应用服务》—— DAPR、KEDA、App Service、Logic Apps、Static Web Apps,低代码到无代码的全栈选择。
夜雨聆风