Ubuntu 运维系列 | 第 29 天:云原生运维——公有云 Ubuntu 实例管理与弹性伸缩

title: “Ubuntu 运维系列 | 第 29 天:云原生运维——公有云 Ubuntu 实例管理与弹性伸缩”
tags: [Ubuntu, Linux, 系统管理, 云原生, 弹性伸缩, AWS, 阿里云, Auto Scaling, Terraform, 公有云]
category: “运维技能”

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

Ubuntu 运维 第29天

一、云原生运维的核心概念

云原生(Cloud Native)并不是一句口号,而是”以基础设施即代码(IaC)、容器化运行时、自动化编排、可观测性”为四大支柱的工程范式。落到 Ubuntu 运维层面,意味着:

  1. 实例即代码:Ubuntu 虚拟机不再手工点击”创建”,而是通过 Terraform、Packer 或直接 API 用配置定义;
  2. 镜像即产品:用 Packer 把 Ubuntu 22.04/24.04 LTS 打成黄金镜像(Golden Image),预装 Nginx、Docker、安全基线;
  3. 伸缩即策略:基于 CPU、内存、连接数或预测流量,自动扩缩实例数量;
  4. 可观测即标配:指标、日志、链路追踪全量采集,异常触发告警与自动扩缩容。

在公有云上,”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.logsshd 是否有拒绝记录。

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。

六、成本治理与配额管理

弹性伸缩意味着成本随流量浮动。生产环境的最佳实践:

  1. 设置预算告警:AWS Budgets / 阿里云费用中心,超阈值通知;
  2. 生命周期钩子:实例释放前执行 Stop 事件,备份日志与磁盘;
  3. 保留实例/节省计划:固定底容量用 1 年预留,弹性部分按量;
  4. 配额申请aws service-quotas list-quotas 检查 EC2 实例配额,必要时通过工单提升。

七、总结

Ubuntu 云原生运维的核心是”用代码定义实例、用策略驱动伸缩、用可观测性保证稳定、用预算控制成本”。掌握 AWS/阿里云/腾讯云的实例创建、cloud-init 用户数据注入、Terraform 声明式编排、Auto Scaling 目标追踪,你就具备了跨云管理数百台 Ubuntu 实例的能力。

下期预告

第 30 天:Ubuntu 运维精通之路——总结、能力图谱与进阶规划。我们将回顾整个 30 天系列,绘制 Ubuntu 运维能力图谱,梳理从入门到精通的知识体系,并给出后续进阶方向与资源推荐。这是本系列的收官篇,请务必跟上。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容