虚拟机相关
术语理解
- NSG是覆盖在VM之外的防火墙,流量走不到OS的网络堆栈之前就会被NSG阻拦。因此NSG不会影响系统性能。
- 虚拟机的代数:除了CPU型号不同,底层虚拟化技术、软硬件架构也可能有所提升。
- cores和vCPU:由于超线程的存在,一个core可能会虚拟出2个vCPU的算力,所以用vCPU来表达比较合适。
- baremetal:裸金属服务器,云厂商尽最大可能将物理裸机以云产品的方式暴露出来。用于一些追求极致性能,或者在非虚拟化的环境运行软件的场景。
价格优化
- 竞价实例
- 原理是把云上的闲置机器拿出来拍卖,价高者得;这种一般比较便宜,比按时计费有1~2折。
- 但是如果闲置资源不足,或有正经非竞价用户用户抢占,或者出价高者抢占,随时可能会被回收。
- 适合非持久化、可打断的工作,比如后台批量计算、爬虫、性能测试等。
-
创建竞价实例的时候,可以选择手动设定可以接受的最高价格;或者随市场价提升。
-
性能突增型实例
- 这种类型,性能和普通机型一样但是价格便宜;特点是:CPU性能表现采用积分制,积分会随着时间推移增加,但是会随着算力输出而减少。
- 积分充裕时,CPU可以按需跑满到100%,同时较快消耗积分;积分不足的时候,CPU只能跑到标称值的5%-40%不等。虽然积分积累有上线,但是也足够支撑全速运行几个小时;可以理解为临时突增的能力,像汽车涡轮增压一样。
- 适合时间不均匀型负载,负载较低的半夜,攒积分;白天业务高峰消耗积分,发挥全部性能。
- Azure B系列:B 系列可突增 - Azure 虚拟机 - Azure Virtual Machines | Microsoft Learn
硬盘相关
- 云硬盘,也叫块存储,与linux中的块设备对应,可以格式化并施加文件系统。
- 计算存储分离架构,计算集群通过内部专用IO线路连接到存储集群。
- 如何理解disk性能和容量有关:可以理解为,云硬盘底层由许多大容量磁盘组成,某一块大盘里面切出来一小块给你用,相应的在大盘的读写通道里面分出一部分作为IO能力,容量越大,分到的比例越高。
网络相关
- 虚拟机放置在虚拟网络中,连接点就是网卡;VM创建的时候选子网其实就是把虚拟机自动生成的网卡接入到subnet,网卡一方面和虚拟机绑定,一方面嵌入VNET的subnet。
- 网卡的弹性体现在:
- 一个虚拟机可以绑定多个网卡
- 一个网卡隶属于一个子网,可以配置同一子网里面的多个内网IP
- VM的辅助网卡可以动态解绑到另一台VM上
网关
- 如果一台VM没分配公网IP,他就失去了访问外网的能力,但是有时候需要一些公网流量出入站,就需要在subnet中开个口子。
-
绑定一个公网IP是一个办法,但是这是双向连接,有时候我们只需要单向连接。
-
网关就是用于管理私有网络和外部通信。
- NAT gateway用于允许多台没有公有IP的VM访问外网。
- SNAT源地址转换:让subnet里面的VM,共享某个公网IP接入公网。这是从内到外的单向形式。
- VPN Gateway
- 提供从外到内的连接,使用VPN技术从其他设备连接到subnet
PaaS概念
- 举例:日志服务,如果使用IaaS自动搭建,需要配置ELK(Elasticsearch+Logstash+Kibana)技术栈来自行搭建日志存储分析系统;云平台直接提供端到端的日志解决方案,只需要简单设置就能用。
对象存储
-
对象:指的是二进制对象,保存到云上通常是以二进制文件的形式。
-
同样是存储服务,对象存储和磁盘存储有啥区别:
-
访问的接口和形式:云硬盘是挂载到虚拟机的硬盘,通过实现OS级别的底层接口,作为虚拟机的块设备存在;对象存储本质是一个网络化服务,调用方通过高层的API和SDK交互,不论是公开互联网服务还是与内部应用对接,都是通过HTTP网络接口来实现的,独立性强,不需要其他组件。
[!note]
虽然有S3FS、OSSFS等工具可以模拟磁盘并挂载到虚拟机,但也是基于对象存储的API进行了封装,不改变实质。 -
核心差异:对象存储内部不存在文件系统,而是接近K-V形式的存储服务。
-
这里的key,就是对象的路径,包含"/",value就是存储对象的二进制文件。
-
硬盘中文件系统保存了更多的元数据,尤其是实现了目录结构和目录操作;而K-V存储中,所谓目录就是多个对象共享路径前缀,用前缀模拟出了目录。
[!tip] K-V存储的优缺点
这种K-V存储,简化了对象存储的设计和逻辑,可以让云厂商着重于对象存储的分布式架构和高可用上面。相应的,这也带来了代价,就是对象存储中的目录操作代价变高了,需要对目录下所有文件进行修改和删除,所以,很多对象存储默认不提供目录级别的功能。
-
-
容量:对象存储轻松实现PB级别存储,是disk不能企及的。
-
将本地数据中心数据转移到云存储?
-
如果用类似azcopy的工具,可以提高并行度,但是理论上也有个上限就是本地数据中心到互联网的带宽,很多时候这个带宽并不高。
- 如果先将数据传到虚拟机,再从虚拟机转移到storage;理论上都是通过互联网连接到数据中心,带宽本质上区别不大的。
- 解决方法:可以加一条VPN到本地数据中心;带宽还不够的话,找运营商架专线。
应用托管服务
- app service,托管网站代码、脚本、资源等,背后采用的隔离技术对用户一般是不可见的。可能是VM、docker等其他容器技术。Azure App Serv其实是用了docker来封装运行网站程序。
示例:计算菲波那切数列的app service
- 本地写代码:app.js
const express = require('express');
const ip = require('ip');
const os = require('os');
const app = express();
//使用递归计算菲波那切数列第n项的值
function fibo(n) {
if (n === 0 || n === 1) return n;
return fibo(n - 1) + fibo(n - 2);
}
app.get('/', function (req, res) {res.write('I am healthy'); res.end();});
app.get('/fibo/:n', function (req, res){
var n = parseInt(req.params['n']);
var f = fibo(n);
res.write(`Fibo(${n}) = ${f} \n`);
res.write(`Comupted bu ${os.hostname()} with private IP ${ip.address()}\n`);
res.end();
});
app.listen(process.env.PORT);
- 依赖项文件和部署文件
package.json
{
"name": "fibo-app",
"version": "0.1.1",
"private": true,
"scripts": {
"start": "node ./app.js"
},
"dependencies": {
"express": "4.0.0",
"ip": "1.1.5"
}
}
.deployment
[config]
SCM_DO_BUILD_DURING_DEPLOYMENT = True
-
portal上创建app service plan
-
vscode直接部署

- 通过url访问:

https://fibonnodeis.chinacloudsites.cn
https://fibonnodeis.chinacloudsites.cn/fibo/10
- 将代码上传至github
git init
git add .
git commit -m "js fibo app"
git status
git branch -M main
git remote add origin https://github.com/hangx969/js-fibo-demo.git
git push -u origin main
- deployment center中配置CICD
(mooncake连不到github,这一步卡住了;遂转移到global azure上面配置)

只要通过满足触发条件的git push操作,就能自动触发构建、直接更新线上的app:

- 配置application insights - 查看性能、日志等
数据库
-
云上关系型数据库 vs 传统数据库
-
共同点:云db保持了与原版db几乎一致的编程接口和使用体验。
-
不同点:云db有一些高级特性
- 支持读写分离:当并发量上升时,关系型数据库容易出现性能瓶颈;有用的办法是基于多库同步的读写分离;云db较为方便的实现:建立从库-建立同步-读写流量分发
- 支持自动调优:自动分析性能瓶颈、热点查询等,给出优化建议
-
各厂商数据库类型

大数据
-
云上大数据服务,也是计算存储分离的;存储端,可以用对象存储存数据源和结果,可以不需要依赖HDFS文件系统。
-
各大厂商的大数据计算产品

容器与云原生
示例:将应用打包成容器运行在ACI上
- 创建dockerfile
FROM node:10
WORKDIR /usr/src/app
COPY package.json ./
COPY app.js ./
RUN npm install
ENV PORT=80
EXPOSE 80
CMD ["node", "app.js"]
把代码文件和dockerfile放到一起
- 打包
docker build --pull --rm -f "fiboonnodejs-dockerfile/dockerfile" -t fiboapp:1.0.0 "fiboonnodejs-dockerfile"
docker images
- 连接到ACR
az acr login -n xhacrtest.azurecr.cn
- 给image打标签
docker images
docker tag fiboapp:1.0.0 xhacrtest.azurecr.cn/fiboapp:1.0.0
- 推送到ACR
docker push xhacrtest.azurecr.cn/fiboapp:1.0.0
- 新建ACI,装载镜像运行

示例:将容器部署到K8S中
-
首先将AKS和ACR配通
-
两条命令部署
kubectl create deployment fiboonnodejs --image=xhacrtest.azurecr.cn/fiboapp:1.0.0 --port=80 --replicas=3
kubectl expose deployment fiboonnodejs --port=80 --target-port=80 --type=LoadBalancer
将pod以external LB的方式暴露服务,可以在LB的前端IP访问pod
Serverless
- 传统C/S架构中,需要一台server来持续运行服务,响应请求。例如web网站跑在服务器上,不论有没有client访问,服务器都要保持运行,持续消耗电力、网络;并且这种架构也不方便扩缩容,有时候也需要有维护窗口。
- 无服务器:云平台托管你提供的网站代码,平台会根据请求动态分配并执行这些代码,有用户访问,就分配到server上执行,计费也是按照运行时间计费。当访问量大的时候,就分配更多计算资源。
- 无服务器模型下,传统的大型程序会被拆分成许多组成部分,每部分都以无服务器形式运行,形成彼此独立的微服务。
触发器
- serverless采用事件模型,事件的起始要依靠:触发器
- API触发器、对象存储触发器、队列触发器、定时触发器等,常用场景:
- 对象存储触发器:上传一个文件,后台程序就被处罚,对这个文件进行处理
- 定时触发器:代替crontab
- 队列触发器:队列中有新的消息进入,出发云函数,将消息作为事件参数传递给云函数,云函数再传递,形成工作流。