title: “Ubuntu 运维系列 | 第 29 天:云原生运维——公有云 Ubuntu 实例管理与弹性伸缩”
tags: [Ubuntu, Linux, 系统管理, 云原生, 弹性伸缩, AWS, 阿里云, Auto Scaling, Terraform, 公有云]
category: “运维技能”
从本地物理机到云上虚拟机,再到容器化服务与弹性伸缩,Ubuntu 的运维形态正在从”静态部署”走向”动态编排”。第 29 天,我们进入云原生运维的实战阶段,聚焦公有云上 Ubuntu 实例的全生命周期管理与弹性伸缩体系,涵盖 AWS EC2、阿里云 ECS、腾讯云 CVM 三大主流平台的实例部署、用户数据注入、伸缩组策略与自动化成本治理。

一、云原生运维的核心概念
云原生(Cloud Native)并不是一句口号,而是”以基础设施即代码(IaC)、容器化运行时、自动化编排、可观测性”为四大支柱的工程范式。落到 Ubuntu 运维层面,意味着:
- 实例即代码:Ubuntu 虚拟机不再手工点击”创建”,而是通过 Terraform、Packer 或直接 API 用配置定义;
- 镜像即产品:用 Packer 把 Ubuntu 22.04/24.04 LTS 打成黄金镜像(Golden Image),预装 Nginx、Docker、安全基线;
- 伸缩即策略:基于 CPU、内存、连接数或预测流量,自动扩缩实例数量;
- 可观测即标配:指标、日志、链路追踪全量采集,异常触发告警与自动扩缩容。
在公有云上,”Ubuntu 实例管理”实际指的是管理这些实例的元数据、生命周期、伸缩组与配额,而不是”SSH 上去敲命令”。这一转变对运维的自动化与可靠性提出了更高要求。
二、三大公有云 Ubuntu 实例创建实战
2.1 AWS EC2 创建 Ubuntu 实例
通过 AWS CLI 创建一台 Ubuntu 22.04 实例:
# 查找 Ubuntu 22.04 LTS 公共镜像 ID
ami_id=$(aws ec2 describe-images
--owners 099720109477
--filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"
--query "Images[0].ImageId" --output text)
# 创建实例并注入用户数据(cloud-init)
aws ec2 run-instances
--image-id "$ami_id"
--instance-type t3.medium
--key-name ubuntu-prod-key
--security-group-ids sg-0a1b2c3d
--subnet-id subnet-0f0f0f0f
--user-data "file:///tmp/user-data.sh"
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=web-ubuntu-29},{Key=Role,Value=app}]"
--output json > /tmp/launch.json
用户数据脚本(/tmp/user-data.sh)通过 cloud-init 自动执行,是替代”SSH 上机初始化”的关键:
#!/bin/bash
set -e
apt-get update -y
apt-get install -y linux-cloud-tools-$(uname -r) docker.io python3-pip htop
systemctl enable --now docker
usermod -aG docker ubuntu
apt-get autoremove -y
echo "Instance ready at $(date -u)" > /var/log/cloud-init-final.log
2.2 阿里云 ECS 创建 Ubuntu 实例
aliyun ecs RunInstances
--RegionId cn-hangzhou
--ImageId ubuntu_22_04_x64_20G_alibase_20240725.vhd
--InstanceType ecs.t6-c1m2.large
--SecurityGroupId sg-bp1fg655nhf8wxpljxxx
--VSwitchId vsw-bp1s5fnvk4gn2gwsxxxx
--KeyPairName ubuntu-prod
--UserData "$(base64 -w0 /tmp/user-data.sh)"
--Tag.1.Key Role --Tag.1.Value app
--Tag.2.Key Env --Tag.2.Value prod
2.3 腾讯云 CVM 创建 Ubuntu 实例
tencentcloud-cli cvm RunInstances
--RegionId ap-guangzhou
--LaunchConfiguration 'ImageId=img-xxxxx,InstanceType=S5.MEDIUM2,InstanceChargePrepaid.PaidMode=HourPOSTPAID'
--KeyId 20xxxxxxxx
--UserData "$(cat /tmp/user-data.sh | base64)"
--InstanceChargePrepaid '{PaidMode:HourPOSTPAID}'
--ProjectId 0
三家平台的差异主要在:镜像 ID 的命名规则、计费模式、UserData 是否需要 base64 编码。理解这些差异,才能在多云环境下用统一的 Terraform 模板管理 Ubuntu 实例。
三、用 Terraform 声明式管理 Ubuntu 实例
手写 CLI 命令只适合一次性操作,生产环境需要用 IaC 工具收敛”变更”。下面用 Terraform 在 AWS 上创建 3 台 Ubuntu 实例:
terraform {
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
}
provider "aws" {
region = "ap-northeast-1"
}
data "aws_ami" "ubuntu2204" {
most_recent = true
owners = ["099720109477"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
}
resource "aws_instance" "app_ubuntu" {
count = 3
ami = data.aws_ami.ubuntu2204.id
instance_type = "t3.medium"
key_name = "ubuntu-prod-key"
user_data = file("${path.module}/user-data.sh")
subnet_id = "subnet-0f0f0f0f"
security_groups = ["web-sg"]
tags = {
Name = "ubuntu-app-${count.index}"
Role = "app"
}
}
执行流程:terraform init -> terraform plan -> terraform apply。删除整批实例只需 terraform destroy,比逐台手动释放安全得多。
四、弹性伸缩(Auto Scaling)策略
单纯创建实例不叫”云原生”,能根据负载自动扩缩才是核心能力。AWS Auto Scaling Group 是一个经典示例:
resource "aws_autoscaling_group" "app_asg" {
name_prefix = "ubuntu-app-"
min_size = 2
max_size = 20
desired_capacity = 3
launch_template {
id = aws_launch_template.ubuntu.id
version = "$Default"
}
vpc_zone_identifier = ["subnet-0a", "subnet-0b", "subnet-0c"]
health_check_type = "ELB"
health_check_grace_period = 300
tag {
key = "Name"
value = "ubuntu-app-${asg.resource}"
propagate_at_launch = true
}
}
resource "aws_autoscaling_policy" "scale_up" {
name = "scale-up-cpu"
autoscaling_group_name = aws_autoscaling_group.app_asg.name
policy_type = "TargetTrackingScaling"
target_tracking_configuration {
predefined_metric_type = "ASGAverageCPUUtilization"
target_value = 60
}
}
阿里云的 ESS(弹性伸缩服务)语义类似:
{
"ScalingGroupName": "ubuntu-ess-prod",
"MinSize": 2,
"MaxSize": 20,
"DefaultCooldown": 300,
"DefaultInstanceChargeType": "PostPaid",
"LoadBalancerIds": ["lb-bp1xxxxx"],
"VSwitchIds": ["vsw-bp1xxx-a", "vsw-bp1xxx-b"]
}
关键指标建议:
- CPU 目标 60%:过高会挤压突发余量,过低浪费;
- 健康检查超时 300s:给 Ubuntu 实例留出 apt 更新、系统启动、应用初始化的时间;
- 滚动更新策略:优先
ReplaceOneAtATime,避免一次扩缩全部导致服务抖动。
五、常见问题与排障
5.1 实例启动但 SSH 连接失败
优先检查:安全组入方向 22 端口是否放行;系统内 sshd 状态(通过云控制台”VNC 登录”进入);/var/log/auth.log 中 sshd 是否有拒绝记录。
sudo systemctl status ssh
sudo grep -i 'fail|denied' /var/log/auth.log | tail -20
sudo ss -lntp | grep :22
5.2 cloud-init 未执行
现象:实例启动后没有自动安装 Docker、没有生成目标用户。排查:
sudo cat /var/log/cloud-init.log | tail -50
sudo cat /var/log/cloud-init-output.log
sudo cloud-init status --long
常见原因是 UserData 未 base64 编码(腾讯云)或超过大小限制(AWS 16KB,超过需放 S3)。
5.3 弹性伸缩抖动(Flapping)
CPU 刚超过 60% 扩容,扩容后新实例还没热起来 CPU 又跌回 40%,再缩容——无限循环。解法:
- 增大
DefaultCooldown到 300s; - 开启预测式伸缩(Predictive Scaling);
- 目标值改为 55%,并设置 60s 观察窗口。
5.4 实例镜像不一致
不同批次启动的 Ubuntu 实例镜像版本不同,导致依赖库冲突。解法:固化镜像,用 Packer 生成黄金镜像,伸缩组统一引用同一个镜像 ID。
六、成本治理与配额管理
弹性伸缩意味着成本随流量浮动。生产环境的最佳实践:
- 设置预算告警:AWS Budgets / 阿里云费用中心,超阈值通知;
- 生命周期钩子:实例释放前执行
Stop事件,备份日志与磁盘; - 保留实例/节省计划:固定底容量用 1 年预留,弹性部分按量;
- 配额申请:
aws service-quotas list-quotas检查 EC2 实例配额,必要时通过工单提升。
七、总结
Ubuntu 云原生运维的核心是”用代码定义实例、用策略驱动伸缩、用可观测性保证稳定、用预算控制成本”。掌握 AWS/阿里云/腾讯云的实例创建、cloud-init 用户数据注入、Terraform 声明式编排、Auto Scaling 目标追踪,你就具备了跨云管理数百台 Ubuntu 实例的能力。
下期预告
第 30 天:Ubuntu 运维精通之路——总结、能力图谱与进阶规划。我们将回顾整个 30 天系列,绘制 Ubuntu 运维能力图谱,梳理从入门到精通的知识体系,并给出后续进阶方向与资源推荐。这是本系列的收官篇,请务必跟上。


















暂无评论内容