使用OKE的Worker节点来使用可抢占实例
首先
现在,你可以在 OKE(Kubernetes 的容器引擎)的工作节点中使用常规的按需实例以外,还可以使用抢占性实例。
强制停止实例与普通按需实例的功能通常是一样的,但当其他用户试图使用该实例的资源时,该实例会被停止。
与按需实例相比,它的成本会减少一半。
在AWS中,等价于Spot实例。
可以设置可预约实例。
如果在OKE的Worker节点上使用可抢占实例,可以有两种方式来创建和添加集群。
创建新项目
如果要在新建时使用可预先中断的实例,需要进行自定义创建。
在创建节点池的界面上,展示配置扩展选项,并选择预留容量作为容量类型。
增加
在添加节点池到现有集群时,可以添加可抢占实例。
另外,尽管节点池内可以混合使用按需实例和可预置的实例,但出于管理考虑,建议在节点池内统一实例类型更为合适。
此外,建议至少有一个节点池由按需实例组成,这也是在手册中作为最佳实践给出的建议。
我们将在此次操作中向按需实例的节点池(pool1)添加可抢占式实例的节点池(pool2)。
展示扩展选项,以选择可抢占式容量,就像新建一样。
当您在控制台上确认添加的实例时,可以看到容量类型为可抢占式。
确认
在集群上查看节点。
预先抢占实例已经设置了标签和宿主机污点。
$ k describe nodes 10.0.10.216 |grep preemptible
oci.oraclecloud.com/oke-is-preemptible=true
Taints: oci.oraclecloud.com/oke-is-preemptible:NoSchedule
$ k get node -L oci.oraclecloud.com/oke-is-preemptible
NAME STATUS ROLES AGE VERSION OKE-IS-PREEMPTIBLE
10.0.10.152 Ready node 44h v1.26.2
10.0.10.216 Ready node 7m47s v1.26.2 true
Pod部署
由於設置了Taint,因此Pod僅部署在按需實例上。
$ k create deployment nginx --image nginx --replicas 4
deployment.apps/nginx created
$ k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-748c667d99-cxgw7 1/1 Running 0 12s 10.244.0.12 10.0.10.152 <none> <none>
nginx-748c667d99-g5qd6 1/1 Running 0 13s 10.244.0.9 10.0.10.152 <none> <none>
nginx-748c667d99-gl5n7 1/1 Running 0 12s 10.244.0.10 10.0.10.152 <none> <none>
nginx-748c667d99-jmjqq 1/1 Running 0 12s 10.244.0.11 10.0.10.152 <none> <none>
一旦刪除了。
$ k delete deployments.apps nginx
deployment.apps "nginx" deleted
设置宽容度,使Pod能够部署在可抢占的实例上。
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx-tolerations
name: nginx-tolerations
spec:
replicas: 4
selector:
matchLabels:
app: nginx-tolerations
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx-tolerations
spec:
containers:
- image: nginx
name: nginx
resources: {}
tolerations:
- key: "oci.oraclecloud.com/oke-is-preemptible"
operator: "Exists"
effect: "NoSchedule"
status: {}
$ k apply -f nginx-tolerations.yaml
deployment.apps/nginx-tolerations created
$ k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tolerations-6f5b554fbc-cxwfb 1/1 Running 0 24s 10.244.0.134 10.0.10.216 <none> <none>
nginx-tolerations-6f5b554fbc-dq425 1/1 Running 0 24s 10.244.0.133 10.0.10.216 <none> <none>
nginx-tolerations-6f5b554fbc-mxsvg 1/1 Running 0 24s 10.244.0.14 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-wwghl 1/1 Running 0 24s 10.244.0.15 10.0.10.152 <none> <none>
这次部署同时使用了按需实例和可预留实例。
总结
由于不知道可抢占式实例何时会被停止,为了确保即使实例停止了业务也不会停止,需要注意集群设计和Deployment的副本配置等方面。但话虽如此,将容器部署在不依赖于物理环境的云原生环境中是基础中的基础,因此我认为能够巧妙利用可抢占式实例来降低成本是值得考虑的选项。
另外,我对可抢占实例的下线频率很在意,但目前还没有发生下线,所以不清楚。如果发生下线,我打算更新集群和Pod的情况。
(附加)摔倒时的动作
在创建集群后的24小时内,它已经崩溃了两次。我认为这取决于区域(本例为伦敦区域)和时间,所以请理解它仅作为一个例子。
以下是Preemptible实例停止和重新创建的日志。
这次发生在21:41的停机事件一次就重新开始了。
在这种情况下,停在21:38,然后在21:41完成了重新开始,所以大约延误了大约3分钟。
第二次停在了3:08,但是尝试重新创建了几次都失败了,大约两个小时后才成功重新创建。每次失败后,重新创建的时间间隔似乎会延长。
此外,还会每分钟输出Node和Pod的状态。通过观察这些输出,可以发现在删除可抢占实例之前,首先进行了Pod的排空操作,然后将其从调度目标中剔除,并最终删除了该Node。
----
Mon Jun 12 03:07:30 GMT 2023
NAME STATUS ROLES AGE VERSION
10.0.10.152 Ready node 2d18h v1.26.2
10.0.10.175 Ready node 5h26m v1.26.2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tolerations-6f5b554fbc-4tltw 1/1 Running 0 4h4m 10.244.1.10 10.0.10.175 <none> <none>
nginx-tolerations-6f5b554fbc-5hmvf 1/1 Running 0 4h4m 10.244.1.9 10.0.10.175 <none> <none>
nginx-tolerations-6f5b554fbc-86wrj 1/1 Running 0 4h4m 10.244.0.2 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-pglxz 1/1 Running 0 4h4m 10.244.0.3 10.0.10.152 <none> <none>
----
Mon Jun 12 03:08:41 GMT 2023
NAME STATUS ROLES AGE VERSION
10.0.10.152 Ready node 2d18h v1.26.2
10.0.10.175 Ready,SchedulingDisabled node 5h27m v1.26.2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tolerations-6f5b554fbc-76b28 1/1 Running 0 58s 10.244.0.4 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-86wrj 1/1 Running 0 4h5m 10.244.0.2 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-pglxz 1/1 Running 0 4h5m 10.244.0.3 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-pv26h 1/1 Running 0 58s 10.244.0.5 10.0.10.152 <none> <none>
・・・
----
Mon Jun 12 03:12:12 GMT 2023
NAME STATUS ROLES AGE VERSION
10.0.10.152 Ready node 2d19h v1.26.2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-tolerations-6f5b554fbc-76b28 1/1 Running 0 4m30s 10.244.0.4 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-86wrj 1/1 Running 0 4h9m 10.244.0.2 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-pglxz 1/1 Running 0 4h9m 10.244.0.3 10.0.10.152 <none> <none>
nginx-tolerations-6f5b554fbc-pv26h 1/1 Running 0 4m30s 10.244.0.5 10.0.10.152 <none> <none>