第261集:云平台部署

教学目标

  • 理解云平台部署的概念和优势
  • 掌握主流云平台的选择和使用方法
  • 熟悉云实例的创建和配置
  • 学习应用在云平台的部署策略
  • 能够实现云平台的自动扩缩容和监控管理

核心知识点

1. 云平台概述

1.1 云计算服务模型

服务模型 描述 责任划分
IaaS 基础设施即服务,提供计算、存储、网络等基础资源 用户管理应用、数据、运行时、中间件;云平台管理虚拟化、服务器、存储、网络
PaaS 平台即服务,提供应用开发和部署平台 用户管理应用、数据;云平台管理运行时、中间件、操作系统、虚拟化、服务器、存储、网络
SaaS 软件即服务,提供完整的应用软件 用户管理数据;云平台管理应用、运行时、中间件、操作系统、虚拟化、服务器、存储、网络

1.2 主流云平台对比

云平台 优势 适用场景
AWS 服务最全面,生态最成熟,市场份额最大 企业级应用、大数据分析、机器学习
Azure 与微软生态系统集成紧密,企业支持强大 企业级应用、Windows环境、混合云
GCP 技术创新领先,数据分析能力强 大数据分析、机器学习、容器化应用
阿里云 国内服务稳定,中文支持完善 国内业务、电商、移动应用
腾讯云 游戏行业支持强,CDN服务优秀 游戏应用、视频流媒体、移动应用

2. AWS平台部署

2.1 AWS CLI安装配置

# 安装AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# 验证安装
aws --version

# 配置AWS凭证
aws configure

# 输入以下信息:
# AWS Access Key ID: your-access-key-id
# AWS Secret Access Key: your-secret-access-key
# Default region name: us-east-1
# Default output format: json

2.2 创建EC2实例

# 创建密钥对
aws ec2 create-key-pair \
  --key-name my-key-pair \
  --query 'KeyMaterial' \
  --output text > my-key-pair.pem

# 设置密钥权限
chmod 400 my-key-pair.pem

# 创建安全组
aws ec2 create-security-group \
  --group-name my-security-group \
  --description "My security group"

# 添加安全组规则(允许SSH和HTTP)
aws ec2 authorize-security-group-ingress \
  --group-name my-security-group \
  --protocol tcp \
  --port 22 \
  --cidr 0.0.0.0/0

aws ec2 authorize-security-group-ingress \
  --group-name my-security-group \
  --protocol tcp \
  --port 80 \
  --cidr 0.0.0.0/0

# 创建EC2实例
aws ec2 run-instances \
  --image-id ami-0c55b159cbfafe1f0 \
  --count 1 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-groups my-security-group \
  --user-data file://user-data.sh

# 查看实例状态
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress]' \
  --output table

2.3 用户数据脚本

# 创建user-data.sh脚本
cat > user-data.sh << 'EOF'
#!/bin/bash

# 更新系统
yum update -y

# 安装必要的软件
yum install -y httpd php mysql

# 启动Apache服务
systemctl start httpd
systemctl enable httpd

# 创建示例网页
echo "<h1>Hello from AWS!</h1>" > /var/www/html/index.html

# 配置防火墙
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
EOF

# 使用user-data创建实例
aws ec2 run-instances \
  --image-id ami-0c55b159cbfafe1f0 \
  --count 1 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-groups my-security-group \
  --user-data file://user-data.sh

3. Azure平台部署

3.1 Azure CLI安装配置

# 安装Azure CLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# 验证安装
az --version

# 登录Azure
az login

# 设置默认订阅
az account set --subscription "your-subscription-id"

3.2 创建虚拟机

# 创建资源组
az group create \
  --name myResourceGroup \
  --location eastus

# 创建虚拟机
az vm create \
  --resource-group myResourceGroup \
  --name myVM \
  --image UbuntuLTS \
  --admin-username azureuser \
  --generate-ssh-keys \
  --size Standard_B1s

# 开放HTTP端口
az vm open-port \
  --resource-group myResourceGroup \
  --name myVM \
  --port 80

# 获取虚拟机IP地址
az vm show \
  --resource-group myResourceGroup \
  --name myVM \
  --show-details \
  --query [publicIps] \
  --output tsv

3.3 部署应用到Azure VM

# SSH连接到虚拟机
ssh azureuser@<public-ip-address>

# 安装Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# 创建应用目录
mkdir ~/myapp
cd ~/myapp

# 创建简单的Express应用
cat > app.js << 'EOF'
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from Azure!');
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});
EOF

# 初始化项目
npm init -y
npm install express

# 使用PM2运行应用
sudo npm install -g pm2
pm2 start app.js
pm2 startup
pm2 save

# 配置Nginx反向代理
sudo apt install -y nginx
sudo cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

4. GCP平台部署

4.1 gcloud CLI安装配置

# 安装gcloud CLI
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init

# 验证安装
gcloud --version

# 配置默认区域和区域
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

4.2 创建计算引擎实例

# 创建实例
gcloud compute instances create my-instance \
  --zone=us-central1-a \
  --machine-type=e2-medium \
  --image-family=ubuntu-2004-lts \
  --image-project=ubuntu-os-cloud \
  --boot-disk-size=10GB \
  --tags=http-server,https-server

# 创建防火墙规则
gcloud compute firewall-rules create allow-http \
  --direction=INGRESS \
  --priority=1000 \
  --network=default \
  --action=ALLOW \
  --rules=tcp:80 \
  --source-ranges=0.0.0.0/0 \
  --target-tags=http-server

# 查看实例
gcloud compute instances list

# SSH连接到实例
gcloud compute ssh my-instance --zone=us-central1-a

4.3 使用Cloud Deploy部署应用

# 安装Cloud Deploy CLI
gcloud components install cloud-build-local

# 创建cloudbuild.yaml
cat > cloudbuild.yaml << 'EOF'
steps:
  - name: 'node:16'
    entrypoint: 'npm'
    args: ['install']
  - name: 'node:16'
    entrypoint: 'npm'
    args: ['run', 'build']
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/myapp:$BUILD_ID', '.']
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/$PROJECT_ID/myapp:$BUILD_ID']
images:
  - 'gcr.io/$PROJECT_ID/myapp:$BUILD_ID'
EOF

# 触发构建
gcloud builds submit --config cloudbuild.yaml .

5. 自动扩缩容

5.1 AWS Auto Scaling

# 创建启动模板
aws ec2 create-launch-template \
  --launch-template-name my-launch-template \
  --image-id ami-0c55b159cbfafe1f0 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-groups my-security-group

# 创建自动扩缩容组
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --launch-template LaunchTemplateName=my-launch-template \
  --min-size 1 \
  --max-size 5 \
  --desired-capacity 2 \
  --vpc-zone-identifier subnet-12345678

# 创建扩缩容策略
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name my-asg \
  --policy-name scale-up \
  --scaling-adjustment 1 \
  --adjustment-type ChangeInCapacity \
  --cooldown 300

# 创建基于CPU的扩缩容策略
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name my-asg \
  --policy-name cpu-scale-out \
  --policy-type TargetTrackingScaling \
  --target-tracking-config file://target-tracking-config.json

# target-tracking-config.json
cat > target-tracking-config.json << 'EOF'
{
  "TargetValue": 50.0,
  "PredefinedMetricSpecification": {
    "PredefinedMetricType": "ASGAverageCPUUtilization"
  }
}
EOF

5.2 Azure自动扩缩容

# 创建虚拟机规模集
az vmss create \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --image UbuntuLTS \
  --admin-username azureuser \
  --generate-ssh-keys \
  --instance-count 2 \
  --upgrade-policy-mode automatic

# 配置自动扩缩容规则
az vmss update \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --add autoscaleProfile \
  --name autoscale \
  --min 2 \
  --max 5 \
  --count 2

# 添加基于CPU的扩缩容规则
az vmss autoscale create \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --min 2 \
  --max 5 \
  --count 2 \
  --scale-in-cooldown 5 \
  --scale-out-cooldown 5

# 添加扩容规则
az vmss autoscale rule create \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --scale-name autoscale \
  --direction Increase \
  --metric-name Percentage CPU \
  --metric-resource /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet \
  --operator GreaterThan \
  --threshold 70 \
  --time-grain 1 \
  --time-window 5 \
  --cooldown 5 \
  --count 1

5.3 GCP自动扩缩容

# 创建实例模板
gcloud compute instance-templates create my-instance-template \
  --machine-type=e2-medium \
  --image-family=ubuntu-2004-lts \
  --image-project=ubuntu-os-cloud \
  --metadata-from-file startup-script=startup-script.sh

# 创建实例组
gcloud compute instance-groups managed create my-instance-group \
  --base-instance-name my-instance \
  --size 2 \
  --template my-instance-template \
  --zone us-central1-a

# 配置自动扩缩容
gcloud compute instance-groups managed set-autoscaling my-instance-group \
  --zone us-central1-a \
  --min 2 \
  --max 5 \
  --target-cpu-utilization 0.7

# 添加HTTP负载均衡器
gcloud compute instance-groups managed set-named-ports my-instance-group \
  --zone us-central1-a \
  --named-ports http:80

6. 监控与日志

6.1 AWS CloudWatch

# 创建CloudWatch告警
aws cloudwatch put-metric-alarm \
  --alarm-name cpu-alarm \
  --alarm-description "Alarm when CPU exceeds 70%" \
  --metric-name CPUUtilization \
  --namespace AWS/EC2 \
  --statistic Average \
  --period 300 \
  --threshold 70 \
  --comparison-operator GreaterThanThreshold \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0

# 查看CloudWatch指标
aws cloudwatch get-metric-statistics \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
  --start-time 2024-01-01T00:00:00Z \
  --end-time 2024-01-02T00:00:00Z \
  --period 3600 \
  --statistics Average

# 配置日志收集
aws logs create-log-group \
  --log-group-name my-app-logs

aws logs create-log-stream \
  --log-group-name my-app-logs \
  --log-stream-name my-log-stream

6.2 Azure Monitor

# 创建诊断设置
az monitor diagnostic-settings create \
  --name my-diagnostic-settings \
  --resource /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM \
  --logs '[{"category": "VMInstanceAgent","enabled": true}]' \
  --metrics '[{"category": "AllMetrics","enabled": true}]' \
  --storage-account mystorageaccount

# 查看指标
az monitor metrics list \
  --resource /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM \
  --metric "Percentage CPU"

# 创建告警规则
az monitor metrics alert create \
  --name cpu-alert \
  --resource-group myResourceGroup \
  --scopes /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM \
  --condition "avg Percentage CPU > 70" \
  --window-size 5m \
  --evaluation-frequency 1m

6.3 GCP Cloud Monitoring

# 创建监控策略
gcloud alpha monitoring policies create \
  --policy-from-file=monitoring-policy.yaml

# monitoring-policy.yaml
cat > monitoring-policy.yaml << 'EOF'
name: my-monitoring-policy
displayName: CPU Usage Alert
conditions:
  - displayName: CPU > 70%
    conditionThreshold:
      filter: 'metric.type="compute.googleapis.com/instance/cpu/utilization"'
      comparison: COMPARISON_GT
      thresholdValue: 70
      duration: 300s
      aggregations:
        - alignmentPeriod: 60s
          perSeriesAligner: ALIGN_MEAN
          crossSeriesReducer: REDUCE_MEAN
          groupByFields:
            - resource.label.instance_name
alertStrategy:
  notificationRateLimit:
    period: 3600s
    count: 1
EOF

# 查看指标
gcloud monitoring time-series list \
  --filter='metric.type="compute.googleapis.com/instance/cpu/utilization"' \
  --page-size 10

实用案例分析

案例1:使用AWS部署Web应用

场景描述

将一个Node.js Web应用部署到AWS EC2实例,并配置自动扩缩容和负载均衡。

部署步骤

  1. 准备应用代码
# 创建应用目录
mkdir my-webapp
cd my-webapp

# 初始化项目
npm init -y
npm install express

# 创建应用文件
cat > app.js << 'EOF'
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from AWS EC2!');
});

app.get('/health', (req, res) => {
  res.json({ status: 'healthy' });
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});
EOF

# 添加启动脚本
cat > package.json << 'EOF'
{
  "name": "my-webapp",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.18.0"
  }
}
EOF
  1. 创建启动脚本
# 创建启动脚本
cat > user-data.sh << 'EOF'
#!/bin/bash

# 更新系统
yum update -y

# 安装Node.js
curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
yum install -y nodejs

# 创建应用目录
mkdir /opt/myapp
cd /opt/myapp

# 复制应用文件(在实际部署中,这些文件会从S3或Git仓库获取)
cat > app.js << 'EOF'
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from AWS EC2!');
});

app.get('/health', (req, res) => {
  res.json({ status: 'healthy' });
});

app.listen(port, () => {
  console.log(\`App listening at http://localhost:\${port}\`);
});
EOF

# 初始化并安装依赖
npm init -y
npm install express

# 使用PM2运行应用
npm install -g pm2
pm2 start app.js --name myapp
pm2 startup
pm2 save

# 配置防火墙
firewall-cmd --permanent --add-port=3000/tcp
firewall-cmd --reload
EOF
  1. 创建负载均衡器和目标组
# 创建目标组
aws elbv2 create-target-group \
  --name my-targets \
  --protocol HTTP \
  --port 3000 \
  --vpc-id vpc-12345678

# 创建负载均衡器
aws elbv2 create-load-balancer \
  --name my-load-balancer \
  --subnets subnet-12345678 subnet-87654321 \
  --security-groups sg-12345678

# 创建监听器
aws elbv2 create-listener \
  --load-balancer-arn arn:aws:elasticloadbalancing:region:account-id:loadbalancer/name \
  --protocol HTTP \
  --port 80 \
  --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/id
  1. 创建自动扩缩容组
# 创建启动模板
aws ec2 create-launch-template \
  --launch-template-name my-launch-template \
  --image-id ami-0c55b159cbfafe1f0 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-groups sg-12345678 \
  --user-data file://user-data.sh

# 创建自动扩缩容组
aws autoscaling create-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --launch-template LaunchTemplateName=my-launch-template \
  --min-size 2 \
  --max-size 5 \
  --desired-capacity 2 \
  --target-group-arns arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/id \
  --vpc-zone-identifier subnet-12345678 subnet-87654321

案例2:使用Azure部署容器化应用

场景描述

将一个Docker容器化应用部署到Azure容器实例,并配置自动扩缩容。

部署步骤

  1. 准备Docker镜像
# 创建Dockerfile
cat > Dockerfile << 'EOF'
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]
EOF

# 构建镜像
docker build -t myapp:latest .

# 推送到Azure Container Registry
az acr create --resource-group myResourceGroup --name myContainerRegistry --sku Basic
az acr login --name myContainerRegistry
docker tag myapp:latest myContainerRegistry.azurecr.io/myapp:latest
docker push myContainerRegistry.azurecr.io/myapp:latest
  1. 部署到Azure容器实例
# 创建容器实例
az container create \
  --resource-group myResourceGroup \
  --name myapp \
  --image myContainerRegistry.azurecr.io/myapp:latest \
  --registry-login-server myContainerRegistry.azurecr.io \
  --registry-username myContainerRegistry \
  --registry-password <registry-password> \
  --dns-name-label myapp-unique \
  --ports 3000

# 查看容器日志
az container logs \
  --resource-group myResourceGroup \
  --name myapp \
  --follow

# 获取容器FQDN
az container show \
  --resource-group myResourceGroup \
  --name myapp \
  --query ipAddress.fqdn \
  --output tsv
  1. 配置自动扩缩容
# 创建容器应用
az containerapp create \
  --name my-containerapp \
  --resource-group myResourceGroup \
  --environment my-environment \
  --image myContainerRegistry.azurecr.io/myapp:latest \
  --registry-server myContainerRegistry.azurecr.io \
  --registry-username myContainerRegistry \
  --registry-password <registry-password> \
  --target-port 3000 \
  --ingress external \
  --min-replicas 2 \
  --max-replicas 5

# 配置基于CPU的自动扩缩容
az containerapp update \
  --name my-containerapp \
  --resource-group myResourceGroup \
  --scale-rule-name cpu-scale-rule \
  --scale-rule-type cpu \
  --scale-rule-http-concurrency 1000 \
  --min-replicas 2 \
  --max-replicas 5

课后练习

  1. 基础练习

    • 在AWS上创建一个EC2实例
    • 在Azure上创建一个虚拟机
    • 在GCP上创建一个计算引擎实例
  2. 进阶练习

    • 使用AWS CLI创建自动扩缩容组
    • 在Azure上配置负载均衡器
    • 在GCP上配置Cloud Build自动部署
  3. 挑战练习

    • 在AWS上部署一个完整的Web应用,包括负载均衡和自动扩缩容
    • 在Azure上部署一个容器化应用,并配置CI/CD流水线
    • 在GCP上实现多云部署策略
  4. 思考问题

    • 如何选择合适的云平台?
    • 如何优化云平台的成本?
    • 如何确保云平台部署的安全性?

总结

本集详细介绍了Linux系统中的云平台部署方法,包括主流云平台的选择、实例创建、应用部署、自动扩缩容以及监控管理等内容。通过本集的学习,您应该能够:

  • 理解云平台部署的概念和优势
  • 掌握AWS、Azure、GCP等主流云平台的使用方法
  • 熟悉云实例的创建和配置
  • 学习应用在云平台的部署策略
  • 能够实现云平台的自动扩缩容和监控管理

云平台部署是现代软件开发和运维的重要组成部分,它提供了弹性、可扩展性和高可用性。在实际项目中,应根据业务需求和技术栈选择合适的云平台,并建立完善的部署、监控和运维体系,以确保应用的稳定运行和持续优化。

« 上一篇 开发环境优化 下一篇 » 容器编排