使用OKE的Worker节点来使用可抢占实例

首先

现在,你可以在 OKE(Kubernetes 的容器引擎)的工作节点中使用常规的按需实例以外,还可以使用抢占性实例。

 

强制停止实例与普通按需实例的功能通常是一样的,但当其他用户试图使用该实例的资源时,该实例会被停止。
与按需实例相比,它的成本会减少一半。

在AWS中,等价于Spot实例。

 

可以设置可预约实例。

如果在OKE的Worker节点上使用可抢占实例,可以有两种方式来创建和添加集群。

创建新项目

如果要在新建时使用可预先中断的实例,需要进行自定义创建。

スクリーンショット 2023-06-09 15.06.10.png

在创建节点池的界面上,展示配置扩展选项,并选择预留容量作为容量类型。

スクリーンショット 2023-06-11 15.25.19.png

增加

在添加节点池到现有集群时,可以添加可抢占实例。

另外,尽管节点池内可以混合使用按需实例和可预置的实例,但出于管理考虑,建议在节点池内统一实例类型更为合适。
此外,建议至少有一个节点池由按需实例组成,这也是在手册中作为最佳实践给出的建议。

我们将在此次操作中向按需实例的节点池(pool1)添加可抢占式实例的节点池(pool2)。

スクリーンショット 2023-06-11 13.56.42.png

展示扩展选项,以选择可抢占式容量,就像新建一样。

スクリーンショット 2023-06-11 13.57.37.png

当您在控制台上确认添加的实例时,可以看到容量类型为可抢占式。

スクリーンショット 2023-06-11 14.04.14.png

确认

在集群上查看节点。
预先抢占实例已经设置了标签和宿主机污点。

$ 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实例停止和重新创建的日志。

スクリーンショット 2023-06-12 14.20.30.png

这次发生在21:41的停机事件一次就重新开始了。
在这种情况下,停在21:38,然后在21:41完成了重新开始,所以大约延误了大约3分钟。

スクリーンショット 2023-06-12 14.19.38.png

第二次停在了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>
广告
将在 10 秒后关闭
bannerAds