- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在Google Cloud Platform上建立了GKE集群。
我们的 Activity 需要“爆发”计算能力。
想象一下,我们通常通常平均每小时进行100次计算,然后突然我们需要能够在不到两分钟的时间内处理100000次。但是,在大多数情况下,一切都接近于闲置。
我们不想99%的时间为空闲服务器付费,而是要根据实际使用来扩展集群(不需要数据持久性,以后可以删除服务器)。我查看了kubernetes上有关自动缩放的文档,以使用HPA添加更多的pod并使用cluster autoscaler添加更多的节点
但是,这些解决方案似乎都无法降低我们的成本或提高性能,因为它们似乎并没有超出GCP计划:
假设我们有一个带有8个CPU的google plan。我的理解是,如果我们使用集群自动缩放器添加更多节点,我们将不再使用例如2个节点,每个节点使用4个CPU,我们将有4个节点,每个节点使用2个CPU。但是总可用计算能力仍为8 CPU。
HPA具有更多 pod 而不是更多节点的理由相同。
如果我们有8个CPU的付款计划,但只使用其中4个,我的理解是我们仍然要为8个计费,因此缩减规模并不是真正有用的。
我们想要的是自动缩放以临时更改我们的付款计划(想象从n1-standard-8到n1-standard-16)并获得实际的新计算能力。
我不敢相信我们是唯一拥有这种用例的人,但是我在任何地方都找不到关于此用例的任何文档!我误会了吗?
最佳答案
TL; DR:
Starting June 6, 2020, GKE will charge a cluster management fee of $0.10 per cluster per hour. The following conditions apply to the cluster management fee:
- One zonal cluster per billing account is free.
- The fee is flat, irrespective of cluster size and topology.
- Billing is computed on a per-second basis for each cluster. The total amount is rounded to the nearest cent, at the end of each month.
GKE uses Compute Engine instances for worker nodes in the cluster. You are billed for each of those instances according to Compute Engine's pricing, until the nodes are deleted. Compute Engine resources are billed on a per-second basis with a one-minute minimum usage cost.
automatically resize your GKE cluster’s node pools based on the demands of your workloads. When demand is high, cluster autoscaler adds nodes to the node pool. When demand is low, cluster autoscaler scales back down to a minimum size that you designate. This can increase the availability of your workloads when you need it, while controlling costs.
A node pool is a group of nodes within a cluster that all have the same configuration. Every cluster has at least one default node pool, but you can add other node pools as needed.
n1-standard-8
。 PROJECT_ID="YOUR_PROJECT_ID"
GCP_ZONE="CLUSTER_ZONE"
GKE_CLUSTER_NAME="CLUSTER_NAME"
AUTOSCALE_POOL="power-pool"
gcloud container clusters create ${GKE_CLUSTER_NAME} \
--machine-type="n1-standard-1" \
--num-nodes=1 \
--zone=${GCP_ZONE} \
--project=${PROJECT_ID}
gcloud container node-pools create ${GKE_BURST_POOL} \
--cluster=${GKE_CLUSTER_NAME} \
--machine-type=n1-standard-8 \
--node-labels=load=on-demand \
--node-taints=reserved-pool=true:NoSchedule \
--enable-autoscaling \
--min-nodes=0 \
--max-nodes=4 \
--zone=${GCP_ZONE} \
--project=${PROJECT_ID}
--node-labels=load=on-demand
:在动力池中的节点上添加标签,以允许使用node selector在我们的AI作业中选择它们。 --node-taints=reserved-pool=true:NoSchedule
:在节点上添加taint,以防止在此节点池中意外调度任何其他工作负载。 parallelism: 4
:使用所有4个节点来增强性能nodeSelector.load: on-demand
:分配给带有该标签的节点。 podAntiAffinity
:声明我们不希望两个带有相同标签app: greedy-job
的容器在同一节点上运行(可选)。 tolerations:
使容差与我们附加到节点的异味相匹配,因此允许在这些节点中调度这些Pod。 apiVersion: batch/v1
kind: Job
metadata:
name: greedy-job
spec:
parallelism: 4
template:
metadata:
name: greedy-job
labels:
app: greedy-app
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "300"
nodeSelector:
load: on-demand
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- greedy-app
topologyKey: "kubernetes.io/hostname"
tolerations:
- key: reserved-pool
operator: Equal
value: "true"
effect: NoSchedule
restartPolicy: OnFailure
greedyjob.yaml
)。该作业将运行四个进程,这些进程将并行运行,并在大约5分钟后完成。 $ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 42m v1.14.10-gke.27
$ kubectl get pods
No resources found in default namespace.
$ kubectl apply -f greedyjob.yaml
job.batch/greedy-job created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 0/1 Pending 0 11s
greedy-job-72j8r 0/1 Pending 0 11s
greedy-job-9dfdt 0/1 Pending 0 11s
greedy-job-wqct9 0/1 Pending 0 11s
$ kubectl describe pod greedy-job-2xbvx
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 28s (x2 over 28s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match node selector.
Normal TriggeredScaleUp 23s cluster-autoscaler pod triggered scale-up: [{https://content.googleapis.com/compute/v1/projects/owilliam/zones/us-central1-b/instanceGroups/gke-autoscale-to-zero-clus-power-pool-564148fd-grp 0->1 (max: 4)}]
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 0/1 Pending 0 93s
greedy-job-72j8r 0/1 ContainerCreating 0 93s
greedy-job-9dfdt 0/1 Pending 0 93s
greedy-job-wqct9 0/1 Pending 0 93s
$ kubectl nodes
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 44m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 11s v1.14.10-gke.27
$ k describe pod greedy-job-2xbvx
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal TriggeredScaleUp 2m45s cluster-autoscaler pod triggered scale-up: [{https://content.googleapis.com/compute/v1/projects/owilliam/zones/us-central1-b/instanceGroups/gke-autoscale-to-zero-clus-power-pool-564148fd-grp 0->1 (max: 4)}]
Warning FailedScheduling 93s (x3 over 2m50s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match node selector.
Warning FailedScheduling 79s (x3 over 83s) default-scheduler 0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) had taints that the pod didn't tolerate.
Normal TriggeredScaleUp 62s cluster-autoscaler pod triggered scale-up: [{https://content.googleapis.com/compute/v1/projects/owilliam/zones/us-central1-b/instanceGroups/gke-autoscale-to-zero-clus-power-pool-564148fd-grp 1->2 (max: 4)}]
Warning FailedScheduling 3s (x3 over 68s) default-scheduler 0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod affinity/anti-affinity, 1 node(s) didn't satisfy existing pods anti-affinity rules.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 0/1 Pending 0 3m39s
greedy-job-72j8r 1/1 Running 0 3m39s
greedy-job-9dfdt 0/1 Pending 0 3m39s
greedy-job-wqct9 1/1 Running 0 3m39s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 46m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 2m16s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-sf6q Ready <none> 28s v1.14.10-gke.27
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 0/1 Pending 0 5m19s
greedy-job-72j8r 1/1 Running 0 5m19s
greedy-job-9dfdt 1/1 Running 0 5m19s
greedy-job-wqct9 1/1 Running 0 5m19s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 48m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 Ready <none> 63s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 4m8s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-sf6q Ready <none> 2m20s v1.14.10-gke.27
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 1/1 Running 0 6m12s
greedy-job-72j8r 1/1 Running 0 6m12s
greedy-job-9dfdt 1/1 Running 0 6m12s
greedy-job-wqct9 1/1 Running 0 6m12s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 48m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 Ready <none> 113s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv Ready <none> 26s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 4m58s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-sf6q Ready <none> 3m10s v1.14.10-gke.27
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 1/1 Running 0 7m22s
greedy-job-72j8r 0/1 Completed 0 7m22s
greedy-job-9dfdt 1/1 Running 0 7m22s
greedy-job-wqct9 1/1 Running 0 7m22s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
greedy-job-2xbvx 0/1 Completed 0 11m
greedy-job-72j8r 0/1 Completed 0 11m
greedy-job-9dfdt 0/1 Completed 0 11m
greedy-job-wqct9 0/1 Completed 0 11m
$ while true; do kubectl get nodes ; sleep 60; done
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 54m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 Ready <none> 7m26s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv Ready <none> 5m59s v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 10m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-sf6q Ready <none> 8m43s v1.14.10-gke.27
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 62m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 Ready <none> 15m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv Ready <none> 14m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 18m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-sf6q NotReady <none> 16m v1.14.10-gke.27
NotReady
并开始删除它们:NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 64m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 NotReady <none> 17m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv NotReady <none> 16m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw Ready <none> 20m v1.14.10-gke.27
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 65m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-39m2 NotReady <none> 18m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv NotReady <none> 17m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-qxkw NotReady <none> 21m v1.14.10-gke.27
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 66m v1.14.10-gke.27
gke-autoscale-to-zero-clus-power-pool-564148fd-ggxv NotReady <none> 18m v1.14.10-gke.27
NAME STATUS ROLES AGE VERSION
gke-autoscale-to-zero-cl-default-pool-9f6d80d3-x9lb Ready <none> 67m v1.14.10-gke.27
gke-cluster-1-default-pool
来自另一个集群,我将其添加到了屏幕截图中,向您展示了除了默认的持久节点之外,集群
gke-autoscale-to-zero
中没有其他节点。)
When scaling down, cluster autoscaler respects scheduling and eviction rules set on Pods. These restrictions can prevent a node from being deleted by the autoscaler. A node's deletion could be prevented if it contains a Pod with any of these conditions: An application's PodDisruptionBudget can also prevent autoscaling; if deleting nodes would cause the budget to be exceeded, the cluster does not scale down.
Preemptible VMs are Compute Engine VM instances that last a maximum of 24 hours and provide no availability guarantees. Preemptible VMs are priced lower than standard Compute Engine VMs and offer the same machine types and options.
关于kubernetes - 如何在限制GCP成本的同时扩展kubernetes集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61626566/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
声明引用会导致运行时成本吗? Typename a; auto& b=a; func(b); 在循环内声明引用会导致多倍的运行时成本吗? Typename a=Typename();//defa
给定一组代表(成本, yield )的样本数据 items = [ (1000, 300), (500, 150), (400, 120), (300, 100), (200, 50), (55, 2
我从 link 得到这个其中谈到了外部归并排序。 来自幻灯片 6 示例:使用 5 个缓冲页,对 108 页文件进行排序 第 0 次:[108/5] = 22 次排序运行,每次运行 5 页(最后一次运行
使用 Javascript 在 localStorage 中查找值的速度有多快? 有没有人有指向任何性能测试的链接,这些测试表明是否值得在 JavaScript 对象中缓存数据?或者浏览器是否已经缓存
我正在尝试创建一个电子表格,以跟踪具有已知保质期的元素的当前和 future 成本。这包括产品是什么、产品成本、产品生命周期(以月为单位)和最后购买日期。 我已经尝试了几种方法来摆弄 Excel 公式
我正在使用最佳匹配算法在 TraMineR 中进行序列分析。不幸的是,我的 由于右删失数据,序列长度不等 .我的序列的最小长度是 5,最大长度是 11。长度的变化对于我感兴趣的序列之间的差异没有意义。
我读过一些文章说你应该将成本设置为至少 16 (216),但其他人说 8 左右就可以了。 是否有任何官方标准应该将成本设置为多高? 最佳答案 您应该使用的成本取决于您的硬件(和实现)的速度。 一般来说
我记得在我的架构类中假设L1缓存命中为1个周期(即与寄存器访问时间相同),但是在现代x86处理器上实际上是真的吗? L1缓存命中需要几个周期?与注册访问权限相比如何? 最佳答案 这是一篇很棒的文章:
我正在尝试确定来自托管我的 azure 函数的 azure 存储帐户的成本。我主要在本地进行开发,并使用 azure 存储模拟器并运行 func start cmd。我的问题是,此设置是否仍然会增加我
我有一个为工作编写的大型复杂 VBA 脚本。我正在清理它,并注意到我可以用比我所做的更动态的方式定义我的数组。 最初我将数组定义为字符串,如下所示: Dim header_arr(6) As Stri
任何人都可以为我指定以下情况下的费用: 当使用快照监听器的查询监听集合并且集合中的一个文档将被添加或更新时,我是否需要为已更新的文档或查询中的所有文档付费? 示例:我在用户集合上有一个快照监听器,其中
摘要 我正在使用 Octave 和 Ling-Spam 语料库构建垃圾邮件与普通邮件的分类器;我的分类方法是逻辑回归。 较高的学习率会导致计算成本为 NaN 值,但它不会破坏/降低分类器本身的性能。
我正在从事一个项目,其中我的代码的吞吐量非常重要,经过一番考虑后我选择让我的程序线程化。 主线程和子线程都在两个共享字典中添加和删除。考虑到在 python 中锁定的性能,我一直在通过互联网查看一些输
所以我在 TCP 套接字上发送数据,以数据大小为前缀,如下所示: write(socket, &length, sizeof(length)); write(socket, data, length)
我正在评估 Azure 媒体服务作为我们正在构建的解决方案的托管平台。我已成功使用 DRM 设置动态加密并使用 Azure AD 设置内容保护。我还检查了定价,我知道您必须为编码作业(一次性)、流媒体
AWS S3 Java SDK 提供了一种方法 doesObjectExist()检查 S3 中是否存在对象。它内部使用什么操作?是吗GET , LIST , 或 HEAD ? 我的担忧主要与它的成本
我一直在使用 three.js 来试验和学习 GLSL 和 WebGL。我来自 3d 艺术世界,所以我了解网格、3d 数学、照明等的概念。虽然我确实查阅了 OpenGL 和 WebGL 文献(以及 g
我正在 Azure 中设计一个 Web 服务。是否可以计量每个最终用户的实际 Azure 平台使用成本? Azure 是否向最终用户提供计费服务? 最佳答案 如今的 Windows Azure 计费模
我目前在 MySql 中有一个表,如果我运行此查询,则有 730 万行,大小为 1.5GB: How to get the sizes of the tables of a mysql databas
我是一名优秀的程序员,十分优秀!