容器服务ACK入门:Kubernetes上云实践

简介: 本文介绍阿里云容器服务ACK(Kubernetes)上云实践,涵盖集群创建、工作负载部署、服务暴露、存储管理与监控运维。通过实战示例,帮助用户快速掌握ACK核心功能及微服务部署全流程。

容器服务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集群的核心步骤:

  1. 登录阿里云控制台,进入“容器服务ACK”页面,点击“创建集群”;

  2. 选择集群类型:“标准托管版”,配置集群基础信息:

  • 集群名称:自定义(如“ack-demo-cluster”);

  • Kubernetes版本:选择稳定版本(如1.28.x);

  • 地域与可用区:选择业务所在地域,控制平面默认多可用区部署,节点池可选择1个或多个可用区;

  • 网络配置:关联已创建的VPC和子网(建议使用新创建的VPC,避免网络冲突),配置服务网段和Pod网段(需与VPC网段无重叠)。

  1. 配置节点池:
  • 节点池名称:自定义(如“default-node-pool”);

  • ECS规格:根据业务需求选择(如2核4G的g6.large);

  • 节点数量:初始2台(用于高可用),支持后续弹性扩容;

  • 操作系统:选择Linux发行版(如CentOS 7、Ubuntu 20.04),容器运行时选择Containerd;

  • 登录配置:设置ECS登录密码或绑定SSH密钥对。

  1. 高级配置(可选):
  • 监控配置:开启“容器服务监控”,集成阿里云ARMS监控;

  • 安全配置:开启“安全加固”,配置安全组规则(允许必要的端口访问);

  • 组件配置:默认安装核心组件(如CoreDNS、Ingress Controller),可根据需求添加其他组件(如日志采集组件、存储插件)。

  1. 确认配置,点击“创建集群”,等待10-15分钟,集群创建完成(可在控制台查看集群状态,显示“运行中”即为成功)。

2.3 集群访问配置

集群创建完成后,需配置kubectl工具访问集群:

  1. 在ACK集群列表页,点击目标集群的“连接信息”,获取集群访问凭证(kubeconfig文件);

  2. 本地安装kubectl工具(参考Kubernetes官方文档);

  3. 将获取的kubeconfig文件保存到本地~/.kube/config路径,或通过环境变量指定配置文件路径:export KUBECONFIG=/path/to/your/kubeconfig;

  4. 测试连接:执行kubectl get nodes,若能正常显示集群节点列表,说明访问配置成功。

三、工作负载部署:Deployment、StatefulSet、DaemonSet

工作负载部署是ACK核心实践环节,需根据应用的状态特性选择合适的工作负载类型。以下分别讲解三种常用工作负载的部署方法与适用场景。

3.1 无状态工作负载:Deployment部署

Deployment适用于无状态应用,以下以部署Nginx Web服务为例,讲解Deployment的创建与管理。

3.1.1 部署实操(kubectl命令行)

  1. 创建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"
  2. 执行部署命令:kubectl apply -f nginx-deployment.yaml;

  3. 查看Deployment状态:kubectl get deployments,若“READY”列显示“2/2”,说明部署成功;

  4. 查看Pod状态:kubectl get pods -l app=nginx,可看到2个运行中的Nginx Pod;

  5. 滚动更新:若需升级Nginx版本,修改配置文件中的image为“nginx:1.25”,重新执行kubectl apply -f nginx-deployment.yaml,或直接执行命令:kubectl set image deployment/nginx-deployment nginx=nginx:1.25;

  6. 回滚:若更新后出现问题,可回滚到上一版本: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:

  1. 创建Service配置文件(nginx-service.yaml):

     apiVersion: v1
    

    kind: 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)
  2. 执行部署命令:kubectl apply -f nginx-service.yaml;

  3. 查看Service状态:kubectl get services,等待“EXTERNAL-IP”列显示SLB公网IP(需1-2分钟);

  4. 测试访问:在浏览器中输入“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)分别访问,配置步骤如下:

  1. 确认Ingress Controller已安装:ACK托管版集群默认安装Nginx Ingress Controller,可通过kubectl get pods -n kube-system | grep ingress查看;

  2. 创建Ingress配置文件(app-ingress.yaml):

     apiVersion: networking.k8s.io/v1
    

    kind: 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
        
    • host: tomcat.example.com # 第二个域名
      http:
      paths:
      • path: /
        pathType: Prefix
        backend:
        service:
        name: tomcat-service  # 对应Tomcat Service
        port:
          number: 8080
        
  3. 执行部署命令:kubectl apply -f app-ingress.yaml;

  4. 查看Ingress状态:kubectl get ingress,获取Ingress对应的SLB公网IP;

  5. 配置域名解析:将两个域名(nginx.example.com、tomcat.example.com)解析到Ingress的SLB公网IP;

  6. 测试访问:在浏览器中输入“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 日志采集配置步骤

  1. 在ACK控制台开启日志采集:进入集群详情页 → 日志管理 → 日志采集配置 → 开启“容器标准输出日志采集”;

  2. 配置日志存储:选择已创建的SLS Project和Logstore(若未创建,可直接在控制台创建);

  3. 指定采集范围:可按命名空间、Pod标签筛选需要采集的日志(如仅采集生产环境命名空间的日志);

  4. 查看日志:配置完成后,等待1-2分钟,即可在SLS控制台查看采集到的容器日志,支持按时间范围、关键字检索日志。

6.1.2 自定义日志采集(非标准输出)

若应用日志输出到容器内的文件(非标准输出),需通过自定义配置采集:在日志采集配置中选择“自定义日志采集”,指定容器内的日志文件路径(如/var/log/app.log),即可采集该文件的日志。

6.2 性能监控:ARMS集成

ACK集成阿里云ARMS可实现集群、节点、Pod、应用的全维度性能监控,提供可视化监控面板和告警功能。

6.2.1 监控开启与面板查看

  1. 在ACK控制台开启ARMS监控:进入集群详情页 → 监控管理 → 应用实时监控服务ARMS → 开启;

  2. 查看监控面板:开启后,可在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配置多服务统一入口,实现公网访问;

  • 开启日志采集和性能监控,验证运维功能。

实验步骤

  1. 部署MySQL数据库(有状态服务)

  2. 创建Headless Service(mysql-service.yaml):

     apiVersion: v1
    

    kind: 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;
  3. 创建StatefulSet和PVC模板(mysql-statefulset.yaml):

     apiVersion: apps/v1
    

    kind: StatefulSet
    metadata:
    name: mysql
    spec:
    serviceName: mysql-service
    replicas: 1
    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: "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;
  4. 验证MySQL部署:执行kubectl get pods -l app=mysql,确认Pod处于Running状态;执行kubectl exec -it mysql-0 -- mysql -u root -p,输入密码“ack@123456”,可成功登录MySQL,说明部署成功。

  5. 部署后端API服务(无状态服务)

假设后端API服务为一个简单的Spring Boot应用,镜像地址为“registry.cn-hangzhou.aliyuncs.com/ack-demo/backend-api:v1”,该应用连接MySQL数据库(配置MySQL地址为“mysql-0.mysql-service”,通过Headless Service解析)。

  1. 创建Deployment配置文件(backend-deployment.yaml):

     apiVersion: apps/v1
    

    kind: Deployment
    metadata:
    name: backend-api
    spec:
    replicas: 2
    selector:
    matchLabels:
    app: backend-api
    template:
    metadata:
    labels:

     app: backend-api
    

    spec:
    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;
  2. 创建Service(backend-service.yaml):

     apiVersion: v1
    

    kind: Service
    metadata:
    name: backend-service
    spec:
    type: ClusterIP
    selector:
    app: backend-api
    ports:

    • port: 8080
      targetPort: 8080执行部署:kubectl apply -f backend-service.yaml;
  3. 验证API服务:执行kubectl get pods -l app=backend-api,确认Pod正常运行;执行kubectl exec -it -- curl http://backend-service:8080/health,若返回“healthy”,说明API服务正常。

  4. 部署前端Web服务(无状态服务)

前端Web服务为Nginx容器,镜像地址为“registry.cn-hangzhou.aliyuncs.com/ack-demo/frontend-web:v1”,该服务调用后端API服务。

  1. 创建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-web
    

    spec:
    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;
  2. 创建Service(frontend-service.yaml):

     apiVersion: v1
    

    kind: 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. 开启监控与日志采集
    1. 创建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
        
    • host: api.example.com
      http:
      paths:
      • path: /
        pathType: Prefix
        backend:
        service:
        name: backend-service
        port:
          number: 8080执行部署:kubectl apply -f app-ingress.yaml;
        
    1. 配置域名解析:将“web.example.com”和“api.example.com”解析到Ingress的SLB公网IP(通过kubectl get ingress获取);

    2. 测试访问:在浏览器中输入“web.example.com”,可看到前端Web页面;输入“api.example.com/health”,可看到后端健康检查响应,说明公网访问成功。

    3. 在ACK控制台开启ARMS监控和SLS日志采集(参考第六章内容);

    4. 在ARMS控制台查看集群、Pod的性能指标,确认监控正常;

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
17小时前
|
存储 缓存 前端开发
对象存储OSS入门到精通:数据存储最佳实践
本文系统讲解对象存储OSS从入门到精通的核心知识,涵盖Bucket、Object、存储类型、生命周期管理、安全权限、性能优化及实战方案,助您掌握高效、安全、低成本的数据存储最佳实践。
|
15小时前
|
监控 安全 网络安全
VPC专有网络搭建与安全组配置
本文系统介绍VPC专有网络搭建与安全组配置,涵盖CIDR规划、子网划分、路由策略、NAT/VPN网关应用、安全组最小权限原则及混合云连接方案,结合多区域互联实战与安全检查清单,全面呈现云上网络安全架构最佳实践。
|
16小时前
|
Java 应用服务中间件 网络安全
Eclipse运行SSM/SSH项目教程
本教程介绍如何在Eclipse中配置JDK与Tomcat,导入普通及Maven项目,绑定服务器并运行。涵盖环境搭建、项目部署、常见问题如数据库连接修改等,助你快速启动Java Web项目。(238字)
|
15小时前
|
弹性计算 负载均衡 监控
SLB负载均衡配置完全指南
本文全面解析SLB负载均衡配置,涵盖CLB、ALB、NLB类型对比,四层与七层架构差异,健康检查、会话保持、安全防护及监控告警等核心配置,并结合高可用Web集群实验,系统呈现SLB部署全流程与最佳实践,助力构建稳定、高效、安全的分布式应用架构。
|
17小时前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,识别异常、优化性能、提升治理效率。
11 0
|
17小时前
|
运维 安全 Devops
生产环境缺陷管理
git-poison基于go-git实现分布式bug追溯管理,解决多分支开发中bug漏修、漏发等问题。通过“投毒-解毒-银针”机制,自动化卡点发布流程,降低协同成本,避免人为失误,已在大型团队落地应用,显著提升发布安全与效率。(238字)
13 0
|
15小时前
|
Java 测试技术 Linux
生产环境发布管理
本文介绍大型团队如何通过自动化部署平台实现多环境(dev/test/pre/prod)高效发布与运维。涵盖各环境职责、基于Jenkins+K8S的CI/CD流程、分支管理、一键发布及回滚机制,并结合Skywalking实现日志链路追踪,提升问题定位与修复效率,助力企业级DevOps落地。(238字)
|
15小时前
|
监控 关系型数据库 MySQL
云数据库RDS实战:MySQL/PostgreSQL性能优化
本文深入解析云数据库RDS在MySQL/PostgreSQL场景下的性能优化实践,涵盖实例配置、参数调优、监控告警、高可用架构与数据迁移全流程。结合电商订单库实战案例,系统阐述如何通过规格升级、索引优化、读写分离等手段提升数据库性能与稳定性,助力企业高效运维、保障业务连续性。(238字)
|
15小时前
|
测试技术 UED
发布模式
蓝绿部署通过两套并行系统(绿色在线、蓝色待发布)实现零停机发布与快速回滚,确保稳定性;金丝雀发布逐步替换旧版本,适合大规模集群;A/B测试则用于对比多版本实际效果,优化用户体验。三者各有适用场景。
|
15小时前
|
存储 缓存 区块链
Web3.0与云计算融合
### 摘要 本文围绕Web3.0与云计算融合展开,先阐述Web3.0以去中心化、区块链为核心的核心概念,以及云计算作为数字经济基础设施的支撑作用,指出两者融合可互补短板、拓展价值空间。随后从融合基础设施(分布式存储与计算协同)、去中心化身份(DID)云上落地、智能合约云上部署运行、IPFS与云存储互补、去中心化计算与云算力协同、私钥管理云上防护等关键环节,拆解融合实践路径;结合NFT平台融合架构案例,展现实际应用价值;探讨数据、交易、身份层面的合规性要求;最后展望技术创新、应用场景拓展、生态构建三大发展趋势,为企业与开发者布局相关领域提供参考。 需要我将摘要补充到文档末尾,或者生成
10 0