前情提要:话接上回,oracle提供的免费服务中还包含一个重头戏——VM.Standard.A1.Flex(4 个 OCPU 和 24GB RAM),但手动创建时,一直提示“主机容量不足”(Out of host Capacity),不过在我羊毛党大军面前,区区跳梁小丑,何足道哉!故写下此文以记此役。
前置条件
- oracle vps账户(申请步骤)
- 能联网的linux机器
解决问题
- 1. 手动创建大概率遇到Out of host Capacity报错
- 2. 防止机器空闲被回收
操作步骤
抢机器
- 在oracle账户中新建api
- User Settings -> Resources -> API keys -> Add API Key
- 生成密钥并下载
- 复制并保存config文件
- 获取脚本必备参数
- 新建实例(Menu -> Compute -> Instances -> Create Instance)
- 修改公共IP地址选择为"Do not assign a public IPv4 address"
- 修改SSH Keys为"No SSH keys"
- 打开浏览器的"开发者工具"(chrome快捷键:ctrl+shift+I),并切换到"network"标签,点击"创建"后弹出"Out of capacity"报错,在network中找到标红的instances API,鼠标右击复制链接(copy as curl),贴入文本文件中便于后续使用。
- 生成SSH密钥对
- ~/.ssh/id_rsa
- ~/.ssh/id_rsa.pub
ssh-keygen \
-m PEM \
-t rsa \
-b 4096 \
-C "azureuser@myserver" \
-f ~/.ssh/mykeys/myprivatekey \
-N mypassphrase
参数 | 说明 |
---|---|
ssh-keygen | 用于创建密钥的程序 |
-m PEM | 将密钥的格式设为 PEM |
-t rsa | 要创建的密钥类型,本例中为 RSA 格式 |
-b 4096 | 密钥的位数,本例中为 4096 |
-C "azureuser@myserver" | 追加到公钥文件末尾以便于识别的注释。 通常以电子邮件地址用作注释,但也可以使用任何最适合你基础结构的事物。 |
-f ~/.ssh/mykeys/myprivatekey | 私钥文件的文件名(如果选择不使用默认名称)。 追加了 .pub 的相应公钥文件在相同目录中生成。 该目录必须存在。 |
-N mypassphrase | 用于访问私钥文件的其他密码,千万要记住,忘记就废了(别问我怎么知道的..) |
- 安装脚本
git clone https://github.com/hitrov/oci-arm-host-capacity.git
cd oci-arm-host-capacity/
composer install
- 修改配置
- 复制
.env
文件以作备份
cp .env.example .env
- 根据之前保存的instances API信息修改配置文件
env | instances API | 其他 | 必须 |
---|---|---|---|
OCI_SUBNET_ID | subnetId | √ | |
OCI_IMAGE_ID | imageId | √ | |
OCI_PRIVATE_KEY_FILENAME | - | 步骤2、3文件的绝对路径 | √ |
OCI_SSH_PUBLIC_KEY | - | 步骤5生成的~/.ssh/id_rsa.pub 公钥内容 | √ |
OCI_AVAILABILITY_DOMAIN | availabilityDomain | ||
OCI_OCPUS | 可选参数:1,2,3,4 | ||
OCI_MEMORY_IN_GBS | 可选参数:6,12,18,24 |
- 检查脚本是否能正常运行
php ./index.php
如下返回结果则表示脚本可正常执行
{
"code": "InternalError",
"message": "Out of host capacity."
}
若出现如下信息,则表示实例已超过用户上限,请删除实例或修改脚本参数配置
{
"code": "LimitExceeded",
"message": "The following service limits were exceeded: standard-a1-memory-count, standard-a1-core-count. Request a service limit increase from the service limits page in the console. "
}
- 使用crontab定时执行任务(此处设为每分钟执行一次,不建议设置太频繁,被oracle收回账户得不偿失)
EDITOR=nano crontab -e
* * * * * /usr/bin/php /path/to/oci-arm-host-capacity/index.php >> /path/to/oci-arm-host-capacity/oci.log
- 之后就是听天命了,隔几天看看
oci.log
日志有没有抢到机器(亲测20天左右),成功日志如下: - 设置公共IP地址
- Instance Details -> Resources -> Attached VNICs
- Resources -> IPv4 Addresses -> Edit
- 选择"ephemeral"并更新
- Done(真香)
防回收
好不容易薅到的羊毛总不能没用几天就被收回去吧,据说空闲计算实例可能会被回收,不怕一万只怕万一,挂个lookbusy先占坑,后续任务多了再下掉。
- 安装docker compose(docker compse安装)
- 新建docker-compose.yaml文件
version: '3'
services:
lookbusy:
image: fogforest/lookbusy:latest
container_name: lookbusy
hostname: lookbusy
restart: always
environment:
- TZ=Asia/Shanghai
- CPU_UTIL=10-20 # CPU占用,单位%,不可省略,支持固定值或范围
- CPU_CORE=1 # CPU占用核心数,不指定默认跑全核,出现CPU打满的情况可以指定为1核
- MEM_UTIL=15 # 内存占用,单位%,不跑内存可省略
- SPEEDTEST_INTERVAL=120 # 网络测速间隔,单位分钟,不跑网络可省略
- 运行脚本
docker-compose up -d
- Done
Reference
- https://www.louishe.com/2022/02/23/doc-11585.html
- https://github.com/hitrov/oci-arm-host-capacity
- https://learn.microsoft.com/zh-cn/azure/virtual-machines/linux/create-ssh-keys-detailed
- https://fairysen.com/826.html
- https://community.oracle.com/customerconnect/discussion/671904/reclamation-of-idle-compute-instances
- https://www.ioiox.com/archives/165.html