虚拟机相关

术语理解

  • 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直接部署

image-20230527094625535

  • 通过url访问:

image-20230527094830468

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上面配置)

image-20230527101253367

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

image-20230527102525343

  • 配置application insights - 查看性能、日志等

数据库

  • 云上关系型数据库 vs 传统数据库

  • 共同点:云db保持了与原版db几乎一致的编程接口和使用体验。

  • 不同点:云db有一些高级特性

    • 支持读写分离:当并发量上升时,关系型数据库容易出现性能瓶颈;有用的办法是基于多库同步的读写分离;云db较为方便的实现:建立从库-建立同步-读写流量分发
    • 支持自动调优:自动分析性能瓶颈、热点查询等,给出优化建议
  • 各厂商数据库类型

image-20230527111921478

大数据

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

  • 各大厂商的大数据计算产品

image-20230527112908139

容器与云原生

示例:将应用打包成容器运行在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,装载镜像运行

image-20230527130108717

示例:将容器部署到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
  • 队列触发器:队列中有新的消息进入,出发云函数,将消息作为事件参数传递给云函数,云函数再传递,形成工作流。