Docker+K8s在阿里云上的部署实践

张工

· 阅读 709

分享
Docker K8s阿里云部署

容器化部署在阿里云上的完整实践

去年我们团队将一个传统Java单体应用迁移到Docker+K8s架构,部署在阿里云ACK上。整个过程踩了不少坑,今天把经验整理出来分享给大家。文章涵盖环境准备、镜像构建、K8s配置、CI/CD流水线、监控告警等完整链路,希望能帮到正在做容器化迁移的团队。

环境准备

首先在阿里云控制台创建一个ACK托管版集群。建议选择专有版而非Serverless版,因为专有版可以自定义节点规格和网络配置,更适合生产环境。节点推荐选择4核16G的通用型g7实例,至少3个节点分布在不同可用区保证高可用。网络插件选择Terway(支持ENI模式,Pod可直接使用VPC网络),Service CIDR建议用 172.21.0.0/20,避免和VPC网段冲突。

集群创建后,别忘了配置以下关键项:开启日志采集(SLS)、开启ARMS应用监控、配置Pod安全策略(禁止root运行)、设置资源配额(ResourceQuota)和限制范围(LimitRange)。

Docker镜像构建

我们使用多阶段构建来减小镜像体积。基础镜像选择 alibaba-cloud-linux-3,JDK使用 dragonwell-11(阿里开源的JDK,针对阿里云有优化)。最终镜像控制在200MB以内。

Dockerfile关键优化:将依赖下载层和代码编译层分离,利用Docker缓存加速构建。使用 .dockerignore 排除不必要的文件。设置非root用户运行应用。健康检查用 HEALTHCHECK 指令配置。

K8s部署配置要点

Deployment中务必设置 resources.limits,防止单个Pod占用过多资源导致节点不稳定。Liveness和Readiness探针必须配置,否则K8s无法正确判断容器健康状态,可能导致流量打到未就绪的Pod上。Service使用ClusterIP类型,通过Ingress暴露外部访问,Ingress Controller选择Nginx Ingress或ALB Ingress。

ConfigMap和Secret要分开管理,敏感信息(数据库密码、API Key)用Secret存储,并开启KMS加密。HPA(水平自动伸缩)建议配置,根据CPU利用率或自定义指标自动调整Pod副本数。

CI/CD流水线

我们使用阿里云效(Flow)构建CI/CD流水线:代码提交 → 代码扫描(SonarQube) → 镜像构建(ACR) → 部署到测试环境 → 自动化测试 → 审批 → 部署到生产环境。整个流程全自动化,发布频率从原来的每月1次提升到每周3次。

踩过的坑

镜像拉取失败:需要在ACK节点上配置容器镜像服务企业版的地域,或者将镜像推到阿里云ACR公共版。跨地域拉取镜像会很慢,建议在每个地域都创建ACR命名空间并开启同步。

Pod调度不均:开启Pod拓扑分布约束(TopologySpreadConstraints),确保Pod均匀分布在不同可用区,避免单点故障。

OOM Killed:Java应用在容器中容易触发OOM,因为JVM默认使用容器的memory limit作为堆上限。需要设置 -XX:MaxRAMPercentage=75.0,给非堆内存留出空间。

日志丢失:容器重启后日志丢失,必须使用Sidecar模式或Volume挂载将日志持久化。推荐直接用Logtail DaemonSet采集容器日志到SLS。

#Docker#K8s#容器#ACK