第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: json2.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 table2.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.sh3. 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 tsv3.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 nginx4. 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-a4.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-a4.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"
}
}
EOF5.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 15.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:806. 监控与日志
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-stream6.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 1m6.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实例,并配置自动扩缩容和负载均衡。
部署步骤
- 准备应用代码
# 创建应用目录
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- 创建启动脚本
# 创建启动脚本
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- 创建负载均衡器和目标组
# 创建目标组
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- 创建自动扩缩容组
# 创建启动模板
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容器实例,并配置自动扩缩容。
部署步骤
- 准备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- 部署到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- 配置自动扩缩容
# 创建容器应用
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课后练习
基础练习
- 在AWS上创建一个EC2实例
- 在Azure上创建一个虚拟机
- 在GCP上创建一个计算引擎实例
进阶练习
- 使用AWS CLI创建自动扩缩容组
- 在Azure上配置负载均衡器
- 在GCP上配置Cloud Build自动部署
挑战练习
- 在AWS上部署一个完整的Web应用,包括负载均衡和自动扩缩容
- 在Azure上部署一个容器化应用,并配置CI/CD流水线
- 在GCP上实现多云部署策略
思考问题
- 如何选择合适的云平台?
- 如何优化云平台的成本?
- 如何确保云平台部署的安全性?
总结
本集详细介绍了Linux系统中的云平台部署方法,包括主流云平台的选择、实例创建、应用部署、自动扩缩容以及监控管理等内容。通过本集的学习,您应该能够:
- 理解云平台部署的概念和优势
- 掌握AWS、Azure、GCP等主流云平台的使用方法
- 熟悉云实例的创建和配置
- 学习应用在云平台的部署策略
- 能够实现云平台的自动扩缩容和监控管理
云平台部署是现代软件开发和运维的重要组成部分,它提供了弹性、可扩展性和高可用性。在实际项目中,应根据业务需求和技术栈选择合适的云平台,并建立完善的部署、监控和运维体系,以确保应用的稳定运行和持续优化。