我的所有的代码最终都做成了 Docker image,因此可以非常方便的拿出来部署,自然也可以部署在各种 managed container或者managed k8s的环境。
更重要的是,Azure Container Apps 提供一定的免费额度,一般普通用户都够用的了!
这次的情况有点特殊:
- 如何部署到 Azure Container Apps上,并且让这个容器可以与 Azure 内的某虚拟机内网互通?
- 在CPU使用率比较高的情况下,如何自动扩容?如果做不到这点那也没必要用托管k8s了呀
虚拟网络
通常来说,在 Azure 上的虚拟机,如果是同一个数据中心的,想要内网互通,直接都创建在一个虚拟网络下就可以了,默认情况下就是互通的,而且默认的安全组是允许同一个虚拟网络的通信的。
如果是不同的数据中心,或者不同的订阅,那么就要创建不同的虚拟网络,不同的网段,然后创建 peering
创建的过程非常简单,鼠标点点下一步就可以了
容器应用的虚拟网络
容器应用需要使用独享的虚拟网络,因此没法重复利用虚拟机已有的虚拟网络。
在创建容器应用时,选择数据中心,这里就建议就近选择啦。然后Container Apps Environment 点击create new
在新的窗口中选择 Networking,配置自己的虚拟网络,如果你的容器不需要被访问,那么甚至可以选择 internal
配置容器
下一步需要配置我们使用什么镜像
需要注意的是 Command Override和Arguments Override这两个。Command Override并不是docker
和docker-compose
中的command
,比如你像 docker-compose.yml
里这样写的
services: generic: image: ghcr.io/webp-pt/webplb:latest command: webplb -mode=worker -queue=generic
,把这个webplb -mode=worker -queue=generic
复制到 Azure Portal上,那就错了……
- Command Override:指的是ENTRYPOINT
- Arguments Override:指的是 CMD 😢
那就简单了嘛!直接把 webplb -mode=worker -queue=generic
这一串粘贴到 Arguments Override的文本框,恭喜你又错了🎉。
因为,每一个参数都要用逗号和空格隔开,正确的形式是这样的
webplb, -mode=worker, -queue=generic
再接下来选择容器的配置,小到 0.25C 0.5G RAM,大到 4C 8G都在这里,如需环境变量也可以一起配置
再下一步选择端口映射,一个是容器的一个是发布的端口
创建的过程比较慢,大概要10-20分钟。如果你的应用有 ingress,那么还会看到一个 Application URL。
测试通信
容器创建好之后,在 Monitoring – Console 可以连接到容器,或者说是pod内部,之后可以用ping……嗯?😐 其实是通的,nc一下就知道了,我检查了很多地方也检查了安全组的ICMP配置,但是还是没法ping通不过就这样了吧😐
配置缩放
http-scaler
通过http请求数量去扩容,实时的,默认就应该有这条规则,可以根据自身的情况进行配置。在满足条件时会自动扩容
CPU使用率缩放
需要使用 Custom,azure使用的是KEDA, 在metadata中填入两个字段
- type,有使用率Utilization和平均值AverageValue两种
- value:值
比如下图的写法,就是CPU使用率超过80%就触发;内存也同理,只需要把cpu改成memory就可以
缩放上下限
在这里可以配置缩放的上下限,上限是1000,下限……可以选择0。
对于 Container Apps来说,最低副本数量是可以为0的。这意味着,如果你的网站没有收到任何流量或请求,ACA 将会自动缩减到零副本,从而节省资源。
当然这样有一定的冷启动时间……所以如果希望长时间运行,可以改成1或者任何合适的数值。
需要注意的是,缩放出来的新的容器的配置,都和最开始创建时配置的是一样的哦。
默认缩放行为
轮询间隔30秒(KEDA),冷却期300秒。这些参数无法改动。
重新部署
如果镜像更新了,或者需要更改配置,在 Azure Portal上也可以轻松完成
Containers – Edit and deploy 在下面container image这里就可以重新配置了,包括环境变量在内。
当然了懂得都懂,一个pod可以包含多个container,这里也可以加另外一个container的。
最终结果
这我是没想到的!
在急需扩容的时候,我的代码却出了问题,导致程序直接卡死并不退出,无法触发扩容规则🤡
参考文档
在 Azure 容器应用中设置缩放规则 https://learn.microsoft.com/zh-cn/azure/container-apps/scale-app?pivots=azure-portal
Scaling options in Azure Container Apps https://techcommunity.microsoft.com/t5/apps-on-azure-blog/scaling-options-in-azure-container-apps/ba-p/3878282