容器服务ACK入门:Kubernetes上云实践
容器服务ACK(Alibaba Cloud Container Service for Kubernetes)是阿里云提供的企业级Kubernetes容器 orchestration 服务,基于原生Kubernetes构建,兼容Kubernetes社区标准,可帮助企业快速实现容器化应用的部署、运维与扩展。本文从ACK核心概念入手,逐步讲解集群创建、工作负载部署、服务暴露、存储管理及监控运维等核心实践要点,最后通过从零部署微服务应用的实验,帮助读者快速掌握ACK上云实操技能。
一、ACK核心概念:集群、节点池、工作负载
在使用ACK之前,需先理解其核心概念,明确各组件的功能与关联关系,为后续实践奠定基础。
1.1 集群(Cluster)
集群是ACK的核心部署单元,是一组运行容器化应用的节点(服务器)的集合,包含控制平面和节点两部分:① 控制平面(Control Plane):由阿里云托管或用户自建,负责Kubernetes集群的核心调度与管理,包括API Server、Scheduler、Controller Manager、etcd等组件;② 节点(Node):运行容器的实际服务器(ECS实例),节点上部署Kubelet、Container Runtime(如Docker、Containerd)等组件,接收控制平面的调度指令,运行工作负载。
ACK集群的核心特性:① 兼容原生Kubernetes:支持标准Kubernetes API,可直接使用kubectl等原生工具操作;② 高可用性:控制平面多实例部署,节点支持跨可用区部署,避免单点故障;③ 弹性扩展:可根据业务需求动态调整节点数量和工作负载副本数。
1.2 节点池(Node Pool)
节点池是对集群中节点的逻辑分组,用于统一管理具有相同配置(如ECS规格、操作系统、容器运行时)的节点。通过节点池,可实现节点的批量创建、扩容、缩容和升级,简化集群运维。
核心应用场景:① 按业务类型分组:如将运行Web应用的节点归为“Web节点池”,运行数据库的节点归为“数据节点池”;② 按资源规格分组:如高性能节点池(用于计算密集型业务)、通用节点池(用于普通业务);③ 版本管理:统一升级节点的Kubernetes版本或操作系统版本,避免节点配置不一致。
1.3 工作负载(Workload)
工作负载是Kubernetes中对运行容器化应用的抽象,用于定义应用的运行方式和管理策略。ACK支持多种Kubernetes原生工作负载类型,适配不同业务场景:
无状态工作负载(Deployment):适用于无状态应用(如Web服务、API服务),Pod副本完全一致,可随意替换,支持滚动更新和回滚;
有状态工作负载(StatefulSet):适用于有状态应用(如数据库、分布式缓存),每个Pod有唯一标识(名称、网络标识),支持稳定的存储挂载和有序部署/更新;
守护进程工作负载(DaemonSet):适用于需要在集群所有节点(或指定节点)上运行的应用(如日志采集器、监控代理),确保每个节点仅运行一个Pod副本;
任务型工作负载(Job/CronJob):适用于一次性任务(Job)或定时任务(CronJob),任务完成后Pod自动终止。
二、集群创建:托管版、专有版、Serverless版选择
ACK提供多种集群类型,不同类型在控制平面管理、节点管理、适用场景上存在差异,需根据业务需求、运维能力和成本预算选择合适的集群类型。
2.1 核心集群类型对比
集群类型
控制平面管理
节点管理
核心优势
适用场景
成本
托管版ACK
阿里云全托管(多可用区部署,高可用)
用户管理节点(ECS实例),支持节点池批量运维
无需关心控制平面运维,专注业务;兼容原生Kubernetes;支持弹性扩展
中小企业、快速上云场景;无专业K8s运维团队;大多数容器化业务(Web、API、微服务)
中(仅支付节点ECS费用,控制平面免费)
专有版ACK
用户自建自管(部署在用户ECS上)
用户全量管理节点,可自定义节点配置
控制平面完全可控;支持自定义组件和配置;适配特殊合规需求
大型企业、金融行业;有专业K8s运维团队;需严格控制集群权限和合规性的场景
高(需支付控制平面和节点ECS费用,运维成本高)
Serverless版ACK(ASK)
阿里云全托管
无节点概念,用户无需管理服务器,直接部署Pod
极致弹性(按需扩容,秒级响应);零节点运维;按Pod实际运行资源计费
弹性需求高的业务(如秒杀、突发流量);短期任务、测试环境;无状态微服务
灵活(按Pod CPU/内存计费,无闲置资源浪费)
2.2 托管版ACK创建实操
托管版ACK因“低运维、高可用”成为大多数用户的首选,以下是阿里云控制台创建托管版ACK集群的核心步骤:
登录阿里云控制台,进入“容器服务ACK”页面,点击“创建集群”;
选择集群类型:“标准托管版”,配置集群基础信息:
集群名称:自定义(如“ack-demo-cluster”);
Kubernetes版本:选择稳定版本(如1.28.x);
地域与可用区:选择业务所在地域,控制平面默认多可用区部署,节点池可选择1个或多个可用区;
网络配置:关联已创建的VPC和子网(建议使用新创建的VPC,避免网络冲突),配置服务网段和Pod网段(需与VPC网段无重叠)。
- 配置节点池:
节点池名称:自定义(如“default-node-pool”);
ECS规格:根据业务需求选择(如2核4G的g6.large);
节点数量:初始2台(用于高可用),支持后续弹性扩容;
操作系统:选择Linux发行版(如CentOS 7、Ubuntu 20.04),容器运行时选择Containerd;
登录配置:设置ECS登录密码或绑定SSH密钥对。
- 高级配置(可选):
监控配置:开启“容器服务监控”,集成阿里云ARMS监控;
安全配置:开启“安全加固”,配置安全组规则(允许必要的端口访问);
组件配置:默认安装核心组件(如CoreDNS、Ingress Controller),可根据需求添加其他组件(如日志采集组件、存储插件)。
- 确认配置,点击“创建集群”,等待10-15分钟,集群创建完成(可在控制台查看集群状态,显示“运行中”即为成功)。
2.3 集群访问配置
集群创建完成后,需配置kubectl工具访问集群:
在ACK集群列表页,点击目标集群的“连接信息”,获取集群访问凭证(kubeconfig文件);
本地安装kubectl工具(参考Kubernetes官方文档);
将获取的kubeconfig文件保存到本地~/.kube/config路径,或通过环境变量指定配置文件路径:export KUBECONFIG=/path/to/your/kubeconfig;
测试连接:执行kubectl get nodes,若能正常显示集群节点列表,说明访问配置成功。
三、工作负载部署:Deployment、StatefulSet、DaemonSet
工作负载部署是ACK核心实践环节,需根据应用的状态特性选择合适的工作负载类型。以下分别讲解三种常用工作负载的部署方法与适用场景。
3.1 无状态工作负载:Deployment部署
Deployment适用于无状态应用,以下以部署Nginx Web服务为例,讲解Deployment的创建与管理。
3.1.1 部署实操(kubectl命令行)
创建Deployment配置文件(nginx-deployment.yaml):apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment # Deployment名称
labels:
app: nginx # 标签,用于关联Service和Pod
spec:
replicas: 2 # 副本数,2个Pod实例
selector:
matchLabels:
app: nginx # 匹配Pod标签
strategy:
type: RollingUpdate # 滚动更新策略(避免业务中断)
rollingUpdate:
maxSurge: 1 # 最大额外可新增的Pod数
maxUnavailable: 0 # 最大不可用的Pod数
template:
metadata:
labels:app: nginx # Pod标签spec:
containers:- name: nginx
image: nginx:1.24 # 容器镜像(Nginx 1.24版本)
ports:- containerPort: 80 # 容器暴露端口
resources:
requests: # 资源请求(调度时参考)
cpu: "100m"
memory: "128Mi"
limits: # 资源限制(避免资源占用过高)
cpu: "500m"
memory: "512Mi"
- containerPort: 80 # 容器暴露端口
- name: nginx
执行部署命令:kubectl apply -f nginx-deployment.yaml;
查看Deployment状态:kubectl get deployments,若“READY”列显示“2/2”,说明部署成功;
查看Pod状态:kubectl get pods -l app=nginx,可看到2个运行中的Nginx Pod;
滚动更新:若需升级Nginx版本,修改配置文件中的image为“nginx:1.25”,重新执行kubectl apply -f nginx-deployment.yaml,或直接执行命令:kubectl set image deployment/nginx-deployment nginx=nginx:1.25;
回滚:若更新后出现问题,可回滚到上一版本:kubectl rollout undo deployment/nginx-deployment。
3.1.2 控制台部署(可视化操作)
若不熟悉命令行,可通过ACK控制台部署Deployment:进入集群详情页 → 工作负载 → 无状态Deployment → 创建 → 填写名称、选择镜像、配置副本数和资源限制 → 点击创建,即可完成部署。
3.2 有状态工作负载:StatefulSet部署
StatefulSet适用于有状态应用,以下以部署MySQL主从集群(简化版)为例,讲解StatefulSet的部署要点。
3.2.1 核心特性与部署注意事项
稳定标识:每个Pod有固定的名称(如mysql-0、mysql-1)和主机名,重启或重建后标识不变;
有序部署/更新:按Pod名称顺序部署(0→1→...),更新时按逆序执行,确保数据一致性;
稳定存储:需结合PersistentVolume(PV)和PersistentVolumeClaim(PVC),每个Pod绑定独立的存储卷,避免数据丢失。
3.2.2 部署实操(核心配置)
创建StatefulSet配置文件(mysql-statefulset.yaml),核心配置如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-service # 关联的Headless Service(用于Pod DNS解析)
replicas: 2
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "root123" # 根密码(生产环境建议使用Secret管理)
volumeMounts:
- name: data-volume
mountPath: /var/lib/mysql # 挂载存储卷(数据存储目录)
volumeClaimTemplates: # PVC模板(自动为每个Pod创建PVC)
- metadata:
name: data-volume
spec:
accessModes: [ "ReadWriteOnce" ] # 读写权限(仅单个Pod挂载)
storageClassName: "alicloud-disk-ssd" # 存储类(阿里云SSD云盘)
resources:requests: storage: 20Gi # 存储容量
补充说明:StatefulSet需配合Headless Service使用(用于Pod之间的DNS解析),需单独创建Headless Service配置文件并部署。
3.3 守护进程工作负载:DaemonSet部署
DaemonSet适用于需在所有节点运行的应用,以下以部署日志采集组件Filebeat为例,讲解DaemonSet的部署。
3.3.1 部署实操
创建DaemonSet配置文件(filebeat-daemonset.yaml):
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
tolerations: # 容忍度(允许部署在污点节点,如主控节点)
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule
containers:
- name: filebeat
image: elastic/filebeat:8.10.0
volumeMounts:
- name: varlog
mountPath: /var/log # 挂载节点日志目录(采集节点日志)
- name: filebeat-config
mountPath: /usr/share/filebeat/config/filebeat.yml
subPath: filebeat.yml
volumes:
- name: varlog
hostPath:
path: /var/log # 节点主机路径
- name: filebeat-config
configMap:
name: filebeat-config # 关联配置文件ConfigMap
部署命令:kubectl apply -f filebeat-daemonset.yaml,部署完成后,执行kubectl get pods -l app=filebeat,可看到每个节点上均运行一个Filebeat Pod。
四、服务暴露:Service类型、Ingress配置
部署完成的工作负载(Pod)仅能在集群内部访问,需通过Service或Ingress实现外部访问。Service负责集群内部的服务发现与负载均衡,Ingress负责HTTP/HTTPS层的路由与负载均衡,实现多服务的统一入口。
4.1 Service类型:ClusterIP、NodePort、LoadBalancer
Kubernetes Service支持多种类型,适配不同的访问场景,ACK对部分类型进行了增强(如LoadBalancer集成阿里云SLB)。
4.1.1 核心Service类型对比
Service类型
访问范围
核心特性
适用场景
ClusterIP
仅集群内部
自动分配集群内部IP,仅可被集群内Pod访问;支持Service之间的访问
集群内部服务通信(如应用层访问数据层服务)
NodePort
集群内部+外部
在每个节点上开放一个静态端口,外部通过“节点IP:NodePort”访问服务;自动关联ClusterIP
测试环境、临时外部访问;无需负载均衡的简单场景
LoadBalancer
集群内部+外部
集成云厂商负载均衡(如阿里云SLB),自动创建SLB实例并关联节点;外部通过SLB公网IP访问
生产环境、公网访问的业务(如Web服务、API服务)
Headless Service
仅集群内部
无ClusterIP,通过DNS解析直接访问Pod;适用于StatefulSet的Pod通信
有状态应用的Pod间通信(如MySQL主从复制、ZooKeeper集群)
4.1.2 LoadBalancer Service部署实操(公网访问)
以暴露Nginx Deployment为例,创建LoadBalancer Service:
创建Service配置文件(nginx-service.yaml):
apiVersion: v1kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer # Service类型为LoadBalancer
selector:
app: nginx # 匹配Nginx Pod的标签
ports:- port: 80 # Service暴露端口
targetPort: 80 # 对应Pod的容器端口
nodePort: 30080 # 可选,指定NodePort(范围30000-32767)
externalTrafficPolicy: Cluster # 流量策略(Cluster:负载均衡到所有Pod;Local:仅负载均衡到本节点Pod)
- port: 80 # Service暴露端口
执行部署命令:kubectl apply -f nginx-service.yaml;
查看Service状态:kubectl get services,等待“EXTERNAL-IP”列显示SLB公网IP(需1-2分钟);
测试访问:在浏览器中输入“SLB公网IP:80”,若能正常显示Nginx默认页面,说明服务暴露成功。
4.2 Ingress配置:多服务统一入口
当集群内部署多个HTTP/HTTPS服务时,使用Ingress可实现“一个公网IP+多个域名”的统一入口,避免为每个服务创建独立的LoadBalancer Service,降低成本并简化管理。ACK集成了Ingress Controller(基于Nginx或Traefik),可直接使用。
4.2.1 Ingress核心概念
Ingress资源:定义路由规则(如域名与服务的映射关系、路径路由);
Ingress Controller:运行在集群内的Pod,监听Ingress资源变化,将路由规则转换为负载均衡配置(如Nginx配置),并通过SLB暴露公网入口。
4.2.2 Ingress配置实操(多服务路由)
假设集群内已部署两个Web服务:Nginx(对应Service:nginx-service,端口80)和Tomcat(对应Service:tomcat-service,端口8080),需通过两个域名(nginx.example.com、tomcat.example.com)分别访问,配置步骤如下:
确认Ingress Controller已安装:ACK托管版集群默认安装Nginx Ingress Controller,可通过kubectl get pods -n kube-system | grep ingress查看;
创建Ingress配置文件(app-ingress.yaml):
apiVersion: networking.k8s.io/v1kind: Ingress
metadata:
name: app-ingress
annotations:
kubernetes.io/ingress.class: "nginx" # 指定Ingress Controller类型
nginx.ingress.kubernetes.io/ssl-redirect: "false" # 禁用HTTPS重定向(测试环境)
spec:
rules:- host: nginx.example.com # 第一个域名
http:
paths:- path: /
pathType: Prefix
backend:
service:name: nginx-service # 对应Nginx Service port: number: 80
- path: /
- host: tomcat.example.com # 第二个域名
http:
paths:- path: /
pathType: Prefix
backend:
service:name: tomcat-service # 对应Tomcat Service port: number: 8080
- path: /
- host: nginx.example.com # 第一个域名
执行部署命令:kubectl apply -f app-ingress.yaml;
查看Ingress状态:kubectl get ingress,获取Ingress对应的SLB公网IP;
配置域名解析:将两个域名(nginx.example.com、tomcat.example.com)解析到Ingress的SLB公网IP;
测试访问:在浏览器中输入“nginx.example.com”,可访问Nginx服务;输入“tomcat.example.com”,可访问Tomcat服务,实现多服务统一入口路由。
4.2.3 HTTPS配置(可选)
生产环境建议开启HTTPS,需在Ingress中配置SSL证书:① 先在阿里云控制台申请SSL证书,将证书上传至ACK集群(创建Secret);② 在Ingress配置文件中添加tls字段,关联证书Secret。具体配置可参考阿里云ACK官方文档。
五、存储管理:PV/PVC、StorageClass、CSI插件
容器化应用的存储需求分为临时存储和持久化存储:临时存储随Pod生命周期终止而丢失,持久化存储需使用Kubernetes的PV/PVC机制,结合云厂商的存储服务(如阿里云云盘、NAS)实现数据持久化。ACK集成了CSI(Container Storage Interface)插件,简化了云存储与Kubernetes的集成。
5.1 核心存储概念
PersistentVolume(PV):持久化存储卷,是对底层存储资源(如云盘、NAS)的抽象,由管理员创建,可被多个PVC申请;
PersistentVolumeClaim(PVC):持久化存储卷声明,由用户创建,用于申请PV资源,Pod通过PVC挂载存储卷;
StorageClass:存储类,用于动态创建PV,用户无需手动创建PV,只需在PVC中指定StorageClass,系统自动创建对应的存储资源(如阿里云云盘)和PV;
CSI插件:容器存储接口插件,用于对接云厂商的存储服务(如阿里云CSI插件支持云盘、NAS、OSS等存储类型),实现存储资源的自动化管理。
5.2 动态存储创建:StorageClass + PVC
动态存储创建是最常用的存储管理方式,无需管理员手动创建PV,适用于大多数业务场景。以下以创建阿里云SSD云盘存储为例,讲解动态存储的配置与使用。
5.2.1 确认StorageClass已存在
ACK托管版集群默认创建多个StorageClass,执行kubectl get sc可查看,其中“alicloud-disk-ssd”为阿里云SSD云盘存储类。
5.2.2 创建PVC申请存储
创建PVC配置文件(ssd-pvc.yaml):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ssd-pvc
spec:
accessModes:
- ReadWriteOnce # 访问模式:仅单个Pod读写
storageClassName: "alicloud-disk-ssd" # 指定StorageClass
resources:
requests:
storage: 50Gi # 申请50Gi SSD云盘
执行创建命令:kubectl apply -f ssd-pvc.yaml,执行后系统会自动创建50Gi SSD云盘和对应的PV,并绑定到该PVC。
5.2.3 Pod挂载PVC
在Deployment或StatefulSet的配置文件中,通过volumeMounts和volumes字段挂载PVC,示例如下(修改Nginx Deployment配置):
spec:
template:
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
volumeMounts:
- name: data-volume
mountPath: /usr/share/nginx/html # 挂载到容器内的Nginx网页目录
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: ssd-pvc # 关联创建的PVC
部署后,Pod内的/usr/share/nginx/html目录会挂载到阿里云SSD云盘,数据持久化存储,即使Pod重建,数据也不会丢失。
5.3 其他存储类型:NAS、OSS
除云盘外,ACK还支持NAS(网络文件存储)和OSS(对象存储)等存储类型,适配不同业务场景:
NAS:支持多Pod共享访问(ReadWriteMany访问模式),适用于需要多Pod共享数据的场景(如分布式应用、日志共享);
OSS:对象存储,适用于海量数据存储(如静态资源、备份数据),需通过OSS CSI插件或挂载工具(如ossfs)实现容器挂载。
具体配置方法可参考阿里云ACK官方文档,核心步骤与云盘类似:创建对应存储类型的StorageClass → 创建PVC → Pod挂载PVC。
六、监控运维:日志采集、性能监控、故障排查
容器化应用的监控运维是保障业务稳定运行的关键。ACK集成了阿里云ARMS(应用实时监控服务)、SLS(日志服务)等工具,可实现日志采集、性能监控和故障排查的全流程运维管理。
6.1 日志采集:SLS集成
ACK可通过日志采集组件(如Filebeat、Logtail)将容器日志和节点日志采集到阿里云SLS,实现日志的集中存储、检索和分析。
6.1.1 日志采集配置步骤
在ACK控制台开启日志采集:进入集群详情页 → 日志管理 → 日志采集配置 → 开启“容器标准输出日志采集”;
配置日志存储:选择已创建的SLS Project和Logstore(若未创建,可直接在控制台创建);
指定采集范围:可按命名空间、Pod标签筛选需要采集的日志(如仅采集生产环境命名空间的日志);
查看日志:配置完成后,等待1-2分钟,即可在SLS控制台查看采集到的容器日志,支持按时间范围、关键字检索日志。
6.1.2 自定义日志采集(非标准输出)
若应用日志输出到容器内的文件(非标准输出),需通过自定义配置采集:在日志采集配置中选择“自定义日志采集”,指定容器内的日志文件路径(如/var/log/app.log),即可采集该文件的日志。
6.2 性能监控:ARMS集成
ACK集成阿里云ARMS可实现集群、节点、Pod、应用的全维度性能监控,提供可视化监控面板和告警功能。
6.2.1 监控开启与面板查看
在ACK控制台开启ARMS监控:进入集群详情页 → 监控管理 → 应用实时监控服务ARMS → 开启;
查看监控面板:开启后,可在ARMS控制台查看集群监控面板,包括:
集群维度:CPU使用率、内存使用率、Pod数量、服务可用性;
节点维度:单个节点的CPU、内存、网络带宽使用率;
Pod维度:单个Pod的CPU、内存使用率,容器状态;
应用维度:若部署了Java、Go等应用,可监控应用的接口响应时间、错误率、JVM状态等。
6.2.2 告警配置
在ARMS控制台可配置告警规则(如CPU使用率超过80%告警、Pod异常终止告警),支持通过短信、邮件、钉钉等渠道通知运维人员,确保及时响应故障。
6.3 故障排查:核心命令与方法
日常运维中,需掌握常用的kubectl命令和故障排查方法,快速定位和解决问题。
6.3.1 常用故障排查命令
查看Pod状态:kubectl get pods -n <命名空间>,关注“STATUS”列(Running:正常;CrashLoopBackOff:反复重启;Pending:调度失败);
查看Pod详情(定位故障原因):kubectl describe pod -n <命名空间>,重点查看“Events”部分;
查看Pod日志:kubectl logs <Pod名称> -n <命名空间>,查看最近日志;kubectl logs -f -n <命名空间>,实时查看日志;
查看Service状态:kubectl get services -n <命名空间>,确认Service是否正常关联Pod;
查看集群事件:kubectl get events -n <命名空间>,查看集群内的异常事件。
6.3.2 常见故障及解决方法
Pod处于Pending状态:可能原因是资源不足(节点CPU/内存不够)、节点污点限制、PVC未绑定;解决方法:扩容节点资源、添加容忍度、检查PVC状态;
Pod处于CrashLoopBackOff状态:可能原因是容器镜像错误、应用配置错误、容器启动命令错误;解决方法:检查镜像名称和版本、查看应用配置文件、通过kubectl exec进入容器调试;
Service无法访问:可能原因是Service标签选择器错误、Pod未正常运行、网络策略限制;解决方法:检查Service的selector配置、确认Pod状态、检查安全组和网络ACL规则。
实验:从零部署微服务应用
本实验基于ACK托管版集群,从零部署一个简单的微服务应用(包含前端Web服务、后端API服务、MySQL数据库),覆盖工作负载部署、服务暴露、存储持久化、监控配置全流程。
实验环境准备
已创建ACK托管版集群(参考第二章内容);
本地已安装kubectl工具,并配置好集群访问凭证;
已注册域名(可选,用于Ingress配置)。
实验目标
部署MySQL数据库(StatefulSet + PVC,实现数据持久化);
部署后端API服务(Deployment,连接MySQL);
部署前端Web服务(Deployment,调用后端API);
通过Ingress配置多服务统一入口,实现公网访问;
开启日志采集和性能监控,验证运维功能。
实验步骤
部署MySQL数据库(有状态服务)
创建Headless Service(mysql-service.yaml):
apiVersion: v1kind: Service
metadata:
name: mysql-service
spec:
clusterIP: None # Headless Service,无ClusterIP
selector:
app: mysql
ports:- port: 3306
targetPort: 3306执行部署:kubectl apply -f mysql-service.yaml;
- port: 3306
创建StatefulSet和PVC模板(mysql-statefulset.yaml):
apiVersion: apps/v1kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-service
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:app: mysqlspec:
containers:- name: mysql
image: mysql:8.0
ports:- containerPort: 3306
env: - name: MYSQL_ROOT_PASSWORD
value: "ack@123456" - name: MYSQL_DATABASE
value: "demo_db" # 初始化数据库
volumeMounts: - name: data-volume
mountPath: /var/lib/mysql
volumeClaimTemplates: - metadata:
name: data-volume
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd"
resources:
requests:
storage: 20Gi执行部署:kubectl apply -f mysql-statefulset.yaml;
- containerPort: 3306
- name: mysql
验证MySQL部署:执行kubectl get pods -l app=mysql,确认Pod处于Running状态;执行kubectl exec -it mysql-0 -- mysql -u root -p,输入密码“ack@123456”,可成功登录MySQL,说明部署成功。
部署后端API服务(无状态服务)
假设后端API服务为一个简单的Spring Boot应用,镜像地址为“registry.cn-hangzhou.aliyuncs.com/ack-demo/backend-api:v1”,该应用连接MySQL数据库(配置MySQL地址为“mysql-0.mysql-service”,通过Headless Service解析)。
创建Deployment配置文件(backend-deployment.yaml):
apiVersion: apps/v1kind: Deployment
metadata:
name: backend-api
spec:
replicas: 2
selector:
matchLabels:
app: backend-api
template:
metadata:
labels:app: backend-apispec:
containers:- name: backend-api
image: registry.cn-hangzhou.aliyuncs.com/ack-demo/backend-api:v1
ports:- containerPort: 8080
env: - name: SPRING_DATASOURCE_URL
value: "jdbc:mysql://mysql-0.mysql-service:3306/demo_db?useSSL=false" - name: SPRING_DATASOURCE_USERNAME
value: "root" - name: SPRING_DATASOURCE_PASSWORD
value: "ack@123456"
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"执行部署:kubectl apply -f backend-deployment.yaml;
- containerPort: 8080
- name: backend-api
创建Service(backend-service.yaml):
apiVersion: v1kind: Service
metadata:
name: backend-service
spec:
type: ClusterIP
selector:
app: backend-api
ports:- port: 8080
targetPort: 8080执行部署:kubectl apply -f backend-service.yaml;
- port: 8080
验证API服务:执行kubectl get pods -l app=backend-api,确认Pod正常运行;执行kubectl exec -it -- curl http://backend-service:8080/health,若返回“healthy”,说明API服务正常。
部署前端Web服务(无状态服务)
前端Web服务为Nginx容器,镜像地址为“registry.cn-hangzhou.aliyuncs.com/ack-demo/frontend-web:v1”,该服务调用后端API服务。
创建Deployment配置文件(frontend-deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-web
spec:
replicas: 2
selector:
matchLabels:
app: frontend-web
template:
metadata:
labels:app: frontend-webspec:
containers:- name: frontend-web
image: registry.cn-hangzhou.aliyuncs.com/ack-demo/frontend-web:v1
ports:- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "300m"
memory: "256Mi"执行部署:kubectl apply -f frontend-deployment.yaml;
- containerPort: 80
- name: frontend-web
创建Service(frontend-service.yaml):
apiVersion: v1kind: Service
metadata:
name: frontend-service
spec:
type: ClusterIP
selector:
app: frontend-web
ports:- port: 80
targetPort: 80执行部署:kubectl apply -f frontend-service.yaml。4. 配置Ingress实现公网访问5. 开启监控与日志采集
- 创建Ingress配置文件(app-ingress.yaml),假设域名为“web.example.com”(前端)和“api.example.com”(后端):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: web.example.com
http:
paths:- path: /
pathType: Prefix
backend:
service:name: frontend-service port: number: 80
- path: /
- host: api.example.com
http:
paths:- path: /
pathType: Prefix
backend:
service:name: backend-service port: number: 8080执行部署:kubectl apply -f app-ingress.yaml;
- path: /
配置域名解析:将“web.example.com”和“api.example.com”解析到Ingress的SLB公网IP(通过kubectl get ingress获取);
测试访问:在浏览器中输入“web.example.com”,可看到前端Web页面;输入“api.example.com/health”,可看到后端健康检查响应,说明公网访问成功。
在ACK控制台开启ARMS监控和SLS日志采集(参考第六章内容);
在ARMS控制台查看集群、Pod的性能指标,确认监控正常;
- port: 80