阿里云国际版ACK容器网络、存储与弹性调度深度实践(2026版)
在上一篇文章中,我们系统梳理了阿里云国际版弹性伸缩(ESS)、镜像管理与抢占式实例的最佳实践。
- 前言
- ACK容器网络架构:Terway vs Flannel 深度对比
- ACK存储体系:CSI驱动全解析
- 弹性调度与网络存储的协同
- 成本优化:存储与网络的精打细算
- ACK集群网络与存储故障排查手册
- 综合最佳实践
前言
在上一篇文章中,我们系统梳理了阿里云国际版弹性伸缩(ESS)、镜像管理与抢占式实例的最佳实践。当基础设施层准备就绪后,真正考验平台能力的战场转移到容器网络与容器存储——这两个领域直接决定了云原生应用的可扩展性、可靠性和性能天花板。
阿里云ACK(Alibaba Cloud Container Service for Kubernetes)在网络和存储层面做了大量深度定制,使其与ECS、NAS、OSS等底层基础设施无缝融合。本文将从Terway网络插件的架构原理讲起,深入探讨ACK存储CSI体系,并展示如何将网络与存储策略融入弹性调度体系,构建真正生产可用的云原生Kubernetes集群。
ACK容器网络架构:Terway vs Flannel 深度对比
Terway:阿里云自研的高性能容器网络方案
Terway是阿里云为ACK量身定制的CNI网络插件,基于ECS弹性网卡(ENI)实现Pod网络。与开源Flannel/Calico相比,Terway的核心优势在于直接利用阿里云VPC的SDN能力,Pod IP直接从VSwitch分配,无需Overlay封装。
Terway网络架构示意:
┌──────────────────────────────────────────────────┐
│ 阿里云VPC (10.0.0.0/8) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ vSwitch-A │ │ vSwitch-B │ │
│ │ 10.1.0.0/16 │ │ 10.2.0.0/16 │ │
│ │ │ │ │ │
│ │ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │ │
│ │ │Pod │ │Pod │ │ │ │Pod │ │Pod │ │ │
│ │ │ ENI│ │ ENI│ │ │ │ ENI│ │ ENI│ │ │
│ │ └────┘ └────┘ │ │ └────┘ └────┘ │ │
│ │ ECS Worker-1 │ │ ECS Worker-2 │ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │ │
│ └──────────┬───────────┘ │
│ VPC Router (直连转发) │
└──────────────────────────────────────────────────┘
Terway vs Flannel 功能矩阵:
| 对比维度 | Terway(独占ENI模式) | Terway(共享ENI模式) | Flannel VXLAN |
|---|---|---|---|
| 网络性能 | 接近裸金属(无封装) | 接近裸金属 | 有10-15%性能损耗 |
| Pod IP来源 | VSwitch直接分配 | 辅助IP地址 | Overlay网段 |
| VPC互通 | 原生互通 | 原生互通 | 需额外路由配置 |
| 单节点最大Pod数 | 受ENI数量限制(~40) | 受辅助IP限制(~256) | 理论无限制 |
| NetworkPolicy | 原生支持(基于安全组) | 原生支持 | 需额外安装Calico |
| 固定Pod IP | 支持(StatefulSet专用) | 支持 | 不直接支持 |
| 跨VPC通信 | 通过CEN/云企业网 | 通过CEN | 需NAT/专线 |
| 适用场景 | 高性能/低延迟应用 | 高密度Pod部署 | 通用场景/混合云 |
选型建议:生产环境首选Terway共享ENI模式——兼具原生VPC网络性能和高Pod密度。只有在纯开源技术栈依赖或混合云场景下才考虑Flannel。
Terway网络策略(NetworkPolicy)
Terway直接复用阿里云安全组(Security Group)实现Kubernetes NetworkPolicy,无需额外组件。这意味着网络策略的执行在VPC层面完成,性能开销极低。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: microservice-isolation
namespace: production
spec:
podSelector:
matchLabels:
app: payment-service
policyTypes:
- Ingress
- Egress
ingress:
# 仅允许API网关访问支付服务的8080端口
- from:
- namespaceSelector:
matchLabels:
name: api-gateway
ports:
- protocol: TCP
port: 8080
egress:
# 允许访问数据库服务和外部HTTPS
- to:
- podSelector:
matchLabels:
app: mysql
ports:
- protocol: TCP
port: 3306
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
ports:
- protocol: TCP
port: 443
执行策略验证:
# 查看NetworkPolicy是否生效(对应安全组自动创建)
aliyun ecs DescribeSecurityGroups \
--RegionId ap-southeast-1 \
--Tag.1.Key ack.aliyun.com \
--Tag.1.Value network-policy
# 从受限Pod测试网络连通性
kubectl exec -it test-pod -- curl -m 3 http://payment-service.production:8080
# 预期:NetworkPolicy限制下应超时
ACK存储体系:CSI驱动全解析
ACK通过容器存储接口(CSI)插件,将阿里云块存储、文件存储和对象存储抽象为Kubernetes原生PersistentVolume。理解这套体系是有状态应用上云的关键。
ACK存储类型全景图
| 存储产品 | PV类型 | 访问模式 | 最大容量 | 性能等级 | 典型场景 |
|---|---|---|---|---|---|
| ESSD云盘 | diskplugin.csi.alibabacloud.com | RWO | 64 TiB | PL0-PL3(最高100万IOPS) | 数据库、中间件 |
| NAS极速型 | nasplugin.csi.alibabacloud.com | RWX / RW | 1 PiB | 标准/极速型 | 共享文件、CI/CD |
| OSS对象存储 | ossplugin.csi.alibabacloud.com | RW (ReadWriteMany) | 近乎无限 | 吞吐型 | 日志、AI训练数据 |
| CPFS并行文件 | cpfskplugin.csi.alibabacloud.com | RWX | 1 PiB | ~100 GB/s总吞吐 | HPC、大规模计算 |
| 本地盘 | localplugin.csi.alibabacloud.com | RWO | 受限于实例规格 | 极高(NVMe直接) | 缓存、临时数据 |
ESSD云盘实战:为MySQL StatefulSet配置高性能存储
创建StorageClass并部署MySQL有状态应用:
# 1. ESSD PL3 StorageClass(高性能数据库存储)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-essd-pl3
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd
performanceLevel: PL3 # 最高IOPS等级
encrypted: "true" # 启用加密
kmsKeyId: "your-kms-key-id" # KMS密钥加密
zoneId: ap-southeast-1a
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true # 允许在线扩容
reclaimPolicy: Retain # 防止误删
---
# 2. MySQL StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-production
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
resources:
requests:
cpu: "4"
memory: "16Gi"
limits:
cpu: "8"
memory: "32Gi"
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: alicloud-disk-essd-pl3
resources:
requests:
storage: 500Gi
NAS共享存储:多Pod读写场景
对于需要多个Pod同时读写的场景(如WordPress媒体文件、共享配置文件),NAS是唯一支持RWX的高性能方案:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-nas-extreme
provisioner: nasplugin.csi.alibabacloud.com
parameters:
volumeAs: subpath
server: "extreme-nas-id.cn-singapore.nas.aliyuncs.com"
path: /shared
vers: "3"
options: "nolock,proto=tcp,rsize=1048576,wsize=1048576"
mountOptions:
- nolock
- proto=tcp
- rsize=1048576
- wsize=1048576
- hard
- timeo=600
- retrans=2
reclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: shared-media
spec:
accessModes:
- ReadWriteMany
storageClassName: alicloud-nas-extreme
resources:
requests:
storage: 200Gi
NAS性能调优参数说明:
| 挂载参数 | 推荐值 | 说明 |
|---|---|---|
| rsize/wsize | 1048576 (1MB) | 读写块大小,大文件场景调大 |
| timeo | 600 (60秒) | 超时时间,生产环境调大避免误判 |
| hard | 启用 | 硬挂载,防止数据不一致(比soft更安全) |
| nolock | 启用 | 多Pod共享场景关闭NFS锁,避免锁争抢 |
在线扩容与快照备份
ESSD云盘支持在线扩容(不中断Pod运行),配合CSI快照功能实现秒级数据保护:
# 在线扩容PVC到1TB
kubectl patch pvc data-mysql-production-0 -p '{"spec":{"resources":{"requests":{"storage":"1Ti"}}}}'
# 创建VolumeSnapshot(需先安装快照CRD和CSI快照控制器)
cat <<EOF | kubectl apply -f -
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-disk-snapclass
driver: diskplugin.csi.alibabacloud.com
deletionPolicy: Retain
parameters:
forceDelete: "false"
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysql-snapshot-20260709
spec:
volumeSnapshotClassName: csi-disk-snapclass
source:
persistentVolumeClaimName: data-mysql-production-0
EOF
弹性调度与网络存储的协同
弹性调度的价值最大化,离不开网络和存储的配合。以下几点是生产踩坑后的实战总结。
问题一:弹性扩容时Pod IP耗尽
在Terway独占ENI模式下,新Pod需要从VSwitch获取独立IP地址。当VSwitch可用IP不足时,即使ECS资源充足,Pod也无法启动:
# 监控VSwitch可用IP数量
aliyun vpc DescribeVSwitchAttributes \
--VSwitchId vsw-xxx \
--RegionId ap-southeast-1 | jq '.AvailableIpAddressCount'
# 扩容VSwitch CIDR(需提前规划)
aliyun vpc ModifyVSwitchAttribute \
--VSwitchId vsw-xxx \
--CidrBlock 10.1.0.0/15 # 从/16扩展到/15,IP数量翻倍
规划建议:为ACK集群预留至少/16的Pod VSwitch网段(65,536个IP),并在集群创建时配置多个VSwitch实现多可用区容灾。
问题二:抢占式实例回收导致存储丢失
抢占式实例被回收时,使用本地盘的数据会丢失。避免方案:
# ACK节点池配置:混合弹性策略 + 云盘持久化
apiVersion: v1
kind: ConfigMap
metadata:
name: spot-instance-strategy
data:
strategy: |
# 核心规则
- 无状态服务(Deployment):抢占式实例 + 空数据卷(emptyDir)
- 有状态服务(StatefulSet):按量付费实例 + ESSD PersistentVolume
- 批处理任务(Job):抢占式实例 + OSS持久化输出
- 缓存服务(Redis Cluster):按量付费为主 + 抢占式弹性扩容
问题三:跨可用区存储亲和性
在ACK集群中,ESSD云盘与ECS实例必须在同一可用区。弹性伸缩(Cluster Autoscaler)扩容时如果选错可用区,PVC绑定会失败:
# 节点池配置:按可用区分组,确保存储亲和性
# 节点池-A (ap-southeast-1a)
apiVersion: v1
kind: NodePool
spec:
zone: ap-southeast-1a
labels:
topology.kubernetes.io/zone: ap-southeast-1a
taints:
- key: storage-zone
value: zone-a
effect: NoSchedule
---
# StatefulSet使用NodeSelector确保Pod调度到有存储的AZ
apiVersion: apps/v1
kind: StatefulSet
spec:
template:
spec:
nodeSelector:
topology.kubernetes.io/zone: ap-southeast-1a
tolerations:
- key: storage-zone
operator: Equal
value: zone-a
effect: NoSchedule
成本优化:存储与网络的精打细算
存储成本对比与选型决策树
| 场景 | 推荐存储方案 | 月成本估算(500GB) | 降本策略 |
|---|---|---|---|
| 数据库主库 | ESSD PL1 AutoPL | ~$75 | 启用自动性能调节 |
| 日志归档 | OSS归档存储 + 生命周期 | ~$2 | 自动降冷标准→低频→归档 |
| CI/CD构建缓存 | ESSD PL0 | ~$25 | 任务结束后自动清理 |
| AI训练数据集 | NAS极速型(按量) | ~$85 | 训练结束后释放 |
| 容器镜像仓库 | ACR EE + OSS后端 | ~$40 | 按层去重节省空间 |
# OSS生命周期自动降冷策略
cat <<EOF > lifecycle.json
{
"Rule": [
{
"ID": "auto-archive",
"Prefix": "logs/",
"Status": "Enabled",
"Transitions": [
{"Days": 7, "StorageClass": "IA"},
{"Days": 30, "StorageClass": "Archive"},
{"Days": 90, "StorageClass": "ColdArchive"}
],
"Expiration": {"Days": 365}
}
]
}
EOF
aliyun oss lifecycle put oss://my-k8s-backup --lifecycle-config "$(cat lifecycle.json)"
网络成本优化
Terway的Pod直接使用VPC IP,同VPC内通信免费,但跨可用区会产生流量费用。合理编排Pod的调度域可以降低网络成本:
# Pod反亲和:将同一服务的Pod分散到不同可用区(高可用+避免跨AZ流量的平衡)
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: backend-api
affinity:
# 将频繁通信的微服务调度到同一AZ
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis-cache
topologyKey: topology.kubernetes.io/zone
ACK集群网络与存储故障排查手册
常见网络问题诊断
# 1. Pod间网络不通:检查安全组/NetworkPolicy
kubectl describe networkpolicy -A | grep -A5 "DENY\|DROP"
# 2. Pod无法访问外网:检查SNAT配置
kubectl run test-nat --image=busybox --rm -it -- wget -qO- --timeout=5 http://ifconfig.me
# 3. Service DNS解析失败:检查CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
kubectl exec -it test-pod -- nslookup kubernetes.default
# 4. Ingress流量不通:检查ALB/Ingress Controller状态
kubectl get pods -n kube-system | grep ingress
kubectl logs -n kube-system deployment/ack-ingress-nginx-controller --tail=30
# 5. 跨VPC通信失败:确认CEN配置
aliyun cen DescribeCenAttachedChildInstances --CenId cen-xxx
常见存储问题诊断
# 1. PVC Pending:检查StorageClass和可用区
kubectl describe pvc data-mysql-production-0 | grep -A10 Events
# 2. PV卸载失败(disk still in use):强制清理
kubectl patch pv pvc-xxx -p '{"metadata":{"finalizers":null}}'
# 3. NAS挂载超时:检查安全组放行NFS端口(2049)
aliyun ecs AuthorizeSecurityGroup \
--SecurityGroupId sg-xxx \
--IpProtocol tcp --PortRange 2049/2049 \
--SourceCidrIp 10.0.0.0/8
# 4. ESSD性能瓶颈:查看云盘监控
aliyun cms DescribeMetricList \
--Namespace acs_ecs_dashboard \
--MetricName DiskReadIOPS \
--Dimensions "[{\"instanceId\":\"disk-xxx\"}]" \
--Period 60
# 5. 快照创建失败:确认快照配额未超限
aliyun ecs DescribeSnapshots --RegionId ap-southeast-1 \
--Status accomplished --query 'length(Snapshots.Snapshot)'
综合最佳实践
生产环境网络存储 Checklist
- [ ] 网络规划:Pod VSwitch至少预留/16网段;生产环境部署CoreDNS多副本(≥3)
- [ ] Terway选型:默认使用共享ENI模式;低延迟应用(如交易系统)使用独占ENI
- [ ] NetworkPolicy:所有namespace启用默认拒绝策略,仅显式放行业务所需流量
- [ ] 存储加密:所有ESSD云盘启用KMS加密;OSS bucket启用服务端加密(SSE-KMS)
- [ ] 备份策略:数据库PVC每日自动快照;快照跨Region复制实现异地容灾
- [ ] 成本控制:非生产环境使用ESSD PL0/PL1;启用OSS生命周期自动降冷
- [ ] 弹性配合:有状态服务固定调度到按量付费节点池;无状态服务优先抢占式实例
- [ ] 监控告警:对VSwitch可用IP、PVC使用率、CSI驱动状态设置云监控告警
端到端架构:高性能有状态应用部署模板
以下是一个完整的ACK部署模板,整合了网络策略、存储加密、弹性约束和监控:
# 生产级 StatefulSet 模板:PostgreSQL on ACK
apiVersion: v1
kind: Namespace
metadata:
name: database
labels:
security: restricted
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-isolation
namespace: database
spec:
podSelector:
matchLabels:
app: postgres
policyTypes: [Ingress]
ingress:
- from:
- namespaceSelector:
matchLabels:
name: backend
ports:
- port: 5432
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: postgres-encrypted-pl3
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd
performanceLevel: PL3
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: v1
kind: Secret
metadata:
name: postgres-credentials
namespace: database
type: Opaque
stringData:
password: "$(openssl rand -base64 32)"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
namespace: database
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
cost-center: production
spec:
nodeSelector:
node-type: on-demand # 数据库必须用按量付费
tolerations:
- key: node-type
operator: Equal
value: on-demand
effect: NoSchedule
containers:
- name: postgres
image: postgres:16-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-credentials
key: password
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
- name: wal
mountPath: /var/lib/postgresql/wal
resources:
requests:
cpu: "4"
memory: "16Gi"
limits:
cpu: "8"
memory: "32Gi"
livenessProbe:
exec:
command: ["pg_isready", "-U", "postgres"]
initialDelaySeconds: 30
periodSeconds: 10
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: postgres-encrypted-pl3
resources:
requests:
storage: 1Ti
- metadata:
name: wal
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: postgres-encrypted-pl3
resources:
requests:
storage: 200Gi
总结
阿里云ACK的网络与存储体系是云原生架构中两个"看不见但无处不在"的基石。Terway以零封装的性能优势让Pod网络与VPC原生融合,CSI存储插件则将弹性块存储、共享文件系统和海量对象存储引入Kubernetes声明式管理体系。
在实际生产落地中,有四个关键决策需要审慎考量:第一,Terway模式选择——共享ENI兼顾性能与密度,独占ENI追求极致低延迟;第二,存储分层——PL3 ESSD用于数据库热数据、NAS用于共享文件、OSS用于归档和备份;第三,弹性与持久化的平衡——有状态服务锁定按量付费节点,无状态服务优先抢占式实例降本;第四,网络与安全一体化——利用Terway原生安全组能力实施细粒度NetworkPolicy,减少额外的网络组件引入。
掌握了这些网络与存储的深层机制,再结合之前讨论的弹性伸缩和镜像管理能力,就能构建出一套高可用、低成本、可自愈的云原生Kubernetes集群架构,真正释放阿里云国际版ACK的全部潜力。
本文由 chengzicloud.cloud 提供,点击访问首页了解更多