Kubernetes pod 自动扩缩与实例组自动扩缩不同步
Posted
技术标签:
【中文标题】Kubernetes pod 自动扩缩与实例组自动扩缩不同步【英文标题】:Kubernetes pod autoscaling out of sync with Instance Group autoscaling 【发布时间】:2016-08-24 19:33:41 【问题描述】:我有一个简单的 wordpress 网站,由下面的 ReplicationController
和 Service
定义。应用部署并顺利运行后,我在 Kubernetes 创建的实例组上启用了自动扩展,方法是转到 GCE 控制台并使用相同的设置(最大 5,cpu 10)启用自动扩展。
自动缩放实例和 Pod 似乎工作得很好,只是它们之间总是不同步。 RC 自动缩放会从 CE 实例中移除 pod,但这些实例不会发生任何事情,因此它们会开始失败请求,直到 LB 健康检查失败并移除它们。
有没有办法让 kubernetes 像扩展它们运行的实例一样扩展 pod,这样就不会发生这种情况?或者有没有办法让它们保持同步?
我的流程如下:
创建集群
$ gcloud container clusters create wordpress -z us-central1-c -m f1-micro
创建 rc
$ kubectl create -f rc.yml
创建服务
$ kubectl create -f service.yml
自动缩放 rc
$ kubectl autoscale rc frontend --max 5 --cpu-percent=10
然后我在控制台中启用了自动缩放,并给服务器负载以使其可缩放。
rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
spec:
replicas: 1
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: custom-wordpress-image
name: wordpress
ports:
- containerPort: 80
hostPort: 80
service.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: frontend
name: frontend
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: wordpress
更新了解更多信息
如果我不使用 kubernetes 自动扩缩器,而是将副本设置为与实例组自动扩缩器最大实例数相同的数量,我似乎得到了想要的结果。当实例被添加到实例组时,kubernetes 会配置它们,因为它们被删除 kubernetes 会相应地更新。在这一点上,我想知道 Kubernetes 自动扩缩器的目的是什么。
【问题讨论】:
【参考方案1】:据我了解,kubernetes autoscaler 功能主要用于 RC 和部署为其子级定义了 cpu 限制的情况。您可以定义一个自动缩放器,其中包含最小和最大 pod 数量以及 pod 的目标 CPU 使用率,它会根据这些限制在集群中扩展 pod,而不管集群大小。如果 pod 没有限制,那么您可能希望扩展集群并为每个额外节点安排一个额外的 pod,但我不确定这是否符合容器化服务的最佳实践,因为集群中运行无限 pod 的任何节点都可以主导,这可能会对其他 pod 的运行能力产生不利影响。比较难以预测。
【讨论】:
【参考方案2】:TLDR;
在您的用例中,kubernetes 只会给您带来开销。您在实例组中的每个实例上运行 1 个 pod(docker 容器)。您还可以将 Docker 容器部署到 App Engine 灵活(以前的托管虚拟机)https://cloud.google.com/appengine/docs/flexible/custom-runtimes/ 并让您的实例组的自动缩放来处理它。
更长的答案
在 k8s 中,(目前)无法将实例缩放链接到 Pod 缩放。这是因为它们是两个不同的问题。 k8s 的 HPA 旨在让(小型)pod 扩展以将负载分散到您的集群(大型机器)上,因此它们会因负载增加而扩展。
如果您没有定义任何限制(每台机器 1 个 pod),您可以将最大 pod 数量设置为集群的最大扩展,有效地将所有这些 pod 设置为 pending
状态,直到另一个实例启动。
如果你想让你的 pod 让你的节点扩展,那么最好的方法(我们发现)是让它们“过度拥挤”一个实例,这样实例组扩展就会启动。我们通过设置相当低的内存来做到这一点/我们的 pod 的 cpu 要求和上限,有效地允许它们在实例的总可用 CPU/内存上突增。
resources:
requests:
cpu: 400m
memory: 100Mi
limits:
cpu: 1000m
memory: 1000Mi
【讨论】:
App Engine flexible 是一种解决方案,但它并不适合某些工作负载。您对所连接的磁盘的控制较少,没有可抢占的选项以及其他问题。这种每个节点一个 pod/容器的用例非常常见,如果 Google 可以针对它进行优化,那就太好了。【参考方案3】:通过新增的 Kubernetes 1.3 autoscaling,我现在可以让 Kubernetes 自动扩展我的集群和我的 pod。
使用GCP's create command,我现在可以使用--enable-autoscaling
结合--min-nodes
、--max-nodes
和--num-nodes
轻松添加自动缩放集群。
【讨论】:
以上是关于Kubernetes pod 自动扩缩与实例组自动扩缩不同步的主要内容,如果未能解决你的问题,请参考以下文章