目录一、ECS的介绍二、服务部署到ECS中三、“Jenkins 流水线 → ECS”后半段四、三种常见落地形态一、ECS的介绍ECSElastic Compute Service云服务器是阿里云的弹性计算服务本质是云上的虚拟机用来部署和运行应用。按需租一台或一批云主机选配置、装系统、跑业务按量或包年包月计费。核心能力计算资源CPU、内存、GPU 等可按规格选择存储系统盘、数据盘如云盘网络 VPC 私网、公网 IP、安全组防火墙弹性随时升降配、开机关机、做快照备份镜像用公共镜像或自定义镜像快速开出相同环境常见用途跑网站、API、微服务部署中间件Nginx、Redis、数据库等生产库也常单独用云数据库作为 MSE、SLB 等背后的实际业务机器ECS 里常见组成部分实例Instance真正的那台云主机有 CPU、内存、操作系统。镜像Image系统模板如 CentOS、Ubuntu、Alibaba Cloud Linux、Windows。注意这里的“镜像”是装系统的盘不一定等于 Docker 镜像。云盘系统盘 数据盘可扩容、可快照备份。网络专有网络 VPC公网 IP / EIP是否能被外网访问安全组防火墙规则开 22、80、443 等规格如 2核4G、4核8G决定性能和价格。ECS 上服务怎么跑常见几种直接跑进程装 JDK/Node用systemd托管java -jar app.jar。Nginx 应用Nginx 反代到后端端口。机器上装 Docker/Podman仍用容器但不走 K8s只用单机/多机容器。前面加负载均衡 SLB多台 ECS 一起对外提供服务。和 Jenkins 的关系Jenkins 构建产物→ SSH/Ansible 连到 ECS→ 传包或拉镜像→ 重启服务→ 健康检查所以 ECS 是运行环境落地机器Jenkins 是自动化流水线。二、服务部署到ECS中要部署到 ECS云主机本质是换成打到一台/多台 Linux 机器上跑Jenkins 仍然负责编排落地方式要变。1、和 K8s 部署的区别K8sECS交付物镜像 Deployment/Helm包jar/war、镜像或直接覆盖目录目标API Server / kubectlSSH、Ansible、云厂商部署工具扩缩容Deployment/HPA自己管机器或挂负载均衡配置/密钥ConfigMap/Secret环境变量、配置文件、密钥管理健康检查Probesystemd / nginx / 脚本探活Jenkins 还是流水线调度器变的是最后一公里怎么上机器。2、需要准备的东西1ECS 环境安全组放行SSH22 或自定义、业务端口80/443/应用端口安装运行时JDK / Node / Python或 Docker若仍用镜像建议用systemd管进程便于启停和开机自启2Jenkins 到 ECS 的连通SSH 密钥推荐或账号密码放进 Jenkins「凭据」固定跳板机/堡垒机时流水线要走跳板3部署方式选型三选一即可方式适合说明A. 直接部署包传统 jar/warscp 远程systemctl restartB. ECS 上跑 Docker想保留镜像习惯机器装 Docker/Podman拉镜像docker run/composeC. Ansible多台 ECS、要标准化Jenkins 调 Ansible Playbook你之前问过很合适3、Jenkins 流水线通常要改什么K8s 常见后半段build image → push registry → kubectl/helm applyECS 常见后半段改成build 产物/镜像 → 传到 ECS或 ECS 拉取→ 停旧服务 → 替换 → 启动 → 健康检查1示例 部署 jar 到 ECSSSHstage(Deploy to ECS) { steps { sshagent(credentials: [ecs-ssh-key]) { sh scp target/app.jar userecs-ip:/opt/app/app.jar ssh userecs-ip sudo systemctl restart myapp curl -fsS http://127.0.0.1:8080/health } } }2示例 ECS 上用 Docker仍打镜像stage(Deploy to ECS) { steps { sshagent(credentials: [ecs-ssh-key]) { sh ssh userecs-ip docker pull registry.example.com/app:${GIT_COMMIT} docker stop app || true docker rm app || true docker run -d --name app -p 8080:8080 registry.example.com/app:${GIT_COMMIT} } } }3示例 Jenkins Ansible多台更稳Jenkins: build → ansible-playbook -i inventory deploy.ymlAnsible: 拷贝文件、改配置、重启服务、做检查4、上 ECS 时建议补齐的能力版本回滚保留上一版包/镜像标签失败一键切回健康检查部署后curl探活失败则标红并回滚配置分离环境配置别打进包用文件或环境变量权限最小化Jenkins 只用部署账号不要 root 长期登录多台 ECS前面加 SLB/NginxAnsible 滚动更新避免全挂日志与监控机器上 journald/filebeat或云监控告警三、“Jenkins 流水线 → ECS”后半段一条完整流水线[前半段] Checkout → Build → Test → Package/Image[后半段] Publish → Stop → Replace → Start → Health Check → Rollback?后半段目标只有一个把新版本安全、可回退地落到 ECS 上并确认可用。1. 构建产物 / 镜像后半段的输入后半段不负责“怎么编译”只消费前半段产物常见两种类型产物后续怎么到 ECS传统包app.jar/dist.zipscp/rsync上传容器registry/app:tagECS 上docker pull/podman pull建议产物带版本号例如app-1.2.3.jarapp:20260722-abc1234日期 Git commit方便回滚和排查。2. 传到 ECS或 ECS 拉取方式 AJenkins 推上去Push适合 jar/静态资源scp target/app.jar deployecs:/opt/app/releases/app-1.2.3.jar # 或 rsync -avz dist/ deployecs:/opt/app/share/优点逻辑集中在 Jenkins。注意大文件、多机会比较慢。方式 BECS 自己拉Pull适合镜像ssh deployecs docker pull registry.example.com/app:abc1234或 ECS 从 OSS/Nexus 下载包。优点机器多时更自然也更贴近 K8s“拉镜像”习惯。Jenkins 里这一步通常是sshagentsh scp/ssh ...凭据用 SSH 私钥。3. 停旧服务替换文件前先停进程避免文件被占用、出现“半新半旧”。ssh deployecs sudo systemctl stop myapp # Docker 场景 ssh deployecs docker stop myapp || true要点最好有超时避免卡死优雅停止优先给应用收尾时间多实例时不要同时全停滚动更新4. 替换新版本把“当前运行版本”切到新产物。1systemd jar 示例ln -sfn /opt/app/releases/app-1.2.3.jar /opt/app/current/app.jar # 或直接覆盖不如版本目录软链清晰推荐目录结构/opt/app/ releases/app-1.2.2.jar releases/app-1.2.3.jar current - releases/app-1.2.3.jar2Docker 示例docker rm myapp || true docker run -d --name myapp -p 8080:8080 registry/app:abc1234替换阶段还常包含改配置、换.env、更新 nginx 反代按需。5. 启动新服务sudo systemctl start myapp # 或 docker start myapp / docker run ...建议同时systemctl is-active myapp看最近日志journalctl -u myapp -n 100启动成功 ≠ 业务可用所以必须有下一步。6. 健康检查最关键确认进程起来并且接口真的通。# 在 ECS 本机检查 curl -fsS http://127.0.0.1:8080/health # 或检查首页/登录接口 curl -fsS -o /dev/null -w %{http_code} http://127.0.0.1:8080/常见策略重试 1030 次每隔 25 秒超时仍失败 → 流水线标红 → 触发回滚有 SLB 时再检查负载均衡后端是否健康没有健康检查的部署等于“发布成功但服务可能已挂”。7. 失败回滚强烈建议任一步失败尤其健康检查失败应自动回到上一版本切回旧软链 / 旧镜像 tag→ 启动旧服务→ 再做一次健康检查→ 通知人工示例思路ln -sfn /opt/app/releases/app-1.2.2.jar /opt/app/current/app.jar systemctl restart myapp curl -fsS http://127.0.0.1:8080/healthDocker 则重新run上一个 tag。串成 Jenkins Pipeline 后半段示意stage(Publish) { steps { sshagent(credentials: [ecs-ssh-key]) { sh scp target/app.jar deploy${ECS_IP}:/opt/app/releases/app-${VERSION}.jar } } } stage(Deploy) { steps { sshagent(credentials: [ecs-ssh-key]) { sh ssh deploy${ECS_IP} set -e sudo systemctl stop myapp ln -sfn /opt/app/releases/app-${VERSION}.jar /opt/app/current/app.jar sudo systemctl start myapp } } } stage(Health Check) { steps { sshagent(credentials: [ecs-ssh-key]) { sh ssh deploy${ECS_IP} for i in $(seq 1 20); do if curl -fsS http://127.0.0.1:8080/health; then echo OK; exit 0 fi sleep 3 done echo FAIL; exit 1 } } } post { failure { // 这里调用回滚脚本 echo 部署失败执行回滚 } }和 K8s 后半段的对照步骤K8sECS分发推镜像仓库节点拉取scp/rsync 或 docker pull切换版本kubectl apply/ 改 image tag换文件软链 / 换容器停旧启新Deployment 滚动更新systemctl/docker 自己控健康检查readiness/livenesscurl/脚本/云监控回滚kubectl rollout undo切回旧包/旧镜像K8s 很多能力“内置”ECS 要把这些步骤在流水线或 Ansible 里显式写出来。四、三种常见落地形态1、SSH 脚本型单机、起步快Jenkins 直接scpssh命令。2、Docker on ECS常用后半段几乎是pull → stop → run → health。3、Ansible 型多机、要规范Jenkins 只调ansible-playbook停服/替换/启服/检查都在 Playbook 里。实战注意点权限用deploy账号 有限 sudo不要整条流水线 root。幂等重复执行不应把环境弄乱stop || true、ln -sfn。并发同一服务不要两条流水线同时部署。配置与代码分离配置放 ECS 或配置中心别每次把密钥打进包。可观测每次部署记下版本号、时间、操作人、构建号。
郑州网站建设
网页设计
企业官网