Google compute engine Kubernetes pod自动缩放与实例组自动缩放不同步

Google compute engine Kubernetes pod自动缩放与实例组自动缩放不同步,google-compute-engine,google-cloud-platform,kubernetes,gcloud,autoscaling,Google Compute Engine,Google Cloud Platform,Kubernetes,Gcloud,Autoscaling,我有一个简单的wordpress站点,由下面的ReplicationController和服务定义。一旦应用程序部署并顺利运行,我就在Kubernetes创建的实例组上启用了自动缩放,方法是转到GCE控制台,并使用相同的设置启用自动缩放(最多5个,cpu 10) 自动调整实例和pod的大小似乎已经足够了,只是它们彼此不同步。RC自动缩放会从CE实例中删除POD,但实例不会发生任何变化,因此它们会开始失败请求,直到LB运行状况检查失败并删除它们 有没有办法让kubernetes缩放豆荚和他们运行的

我有一个简单的wordpress站点,由下面的
ReplicationController
服务定义。一旦应用程序部署并顺利运行,我就在Kubernetes创建的实例组上启用了自动缩放,方法是转到GCE控制台,并使用相同的设置启用自动缩放(最多5个,cpu 10)

自动调整实例和pod的大小似乎已经足够了,只是它们彼此不同步。RC自动缩放会从CE实例中删除POD,但实例不会发生任何变化,因此它们会开始失败请求,直到LB运行状况检查失败并删除它们

有没有办法让kubernetes缩放豆荚和他们运行的Instance,这样就不会发生这种情况?或者有没有办法让它们保持同步? 我的过程如下:

创建集群

$gcloud容器集群创建wordpress-z us-central1-c-m f1 micro

创建rc

$kubectl create-f rc.yml

创建服务

$kubectl create-f service.yml

自动缩放rc

$kubectl自动缩放rc前端--最大5--cpu百分比=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
apiVersion: v1
kind: Service
metadata:
  labels:
    name: frontend
  name: frontend
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: wordpress
service.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
apiVersion: v1
kind: Service
metadata:
  labels:
    name: frontend
  name: frontend
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: wordpress

更新以了解更多信息


如果我不使用kubernetes autoscaler,而是将副本设置为与实例组autoscaler max instance count相同的数量,那么我似乎可以得到所需的结果。当实例添加到实例组时,kubernetes会对其进行规定,因为它们会被删除,kubernetes会相应地进行更新。此时,我想知道Kubernetes autoscaler的用途是什么。

据我所知,Kubernetes功能主要用于RCs和部署为其子系统定义cpu限制的情况。您可以使用POD的最小和最大数量以及POD的目标CPU使用率定义autoscaler,它将基于这些限制在整个集群中扩展POD,而不管集群大小如何。如果pod没有限制,那么您可能希望扩展集群并为每个额外节点安排一个额外的pod,尽管我不确定这是否符合集装箱化服务的最佳实践,因为集群中运行无限pod的任何节点都可能被控制,这可能会对其他pod的运行能力产生不利影响。这是相对不可预测的

TLDR; 在您的用例中,kubernetes只会给您带来开销。您正在实例组中的每个实例上运行1个pod(docker容器)。您还可以将Docker容器部署到App Engine flexible(以前的托管VM),并让实例组的自动缩放来处理它

更长的答案 在k8s中,不可能(目前)将实例缩放链接到pod缩放。这是因为它们是两个独立的问题。k8s的HPA意味着具有(小)POD规模,以将负载分散到集群(大机器)上,因此它们将因负载增加而扩展

如果不定义任何限制(每台机器1个pod),则可以将pod的最大数量设置为集群的最大可伸缩性,有效地将所有这些pod设置为
挂起
状态,直到另一个实例启动

如果你想让你的pod让你的节点可以伸缩,那么最好的方法(我们发现)就是让它们“过度拥挤”一个实例,这样实例组的伸缩就会起作用。为此,我们为POD设置了非常低的内存/cpu需求和较高的限制,从而有效地允许它们在实例的总可用cpu/内存上爆炸

resources:
  requests:
    cpu: 400m
    memory: 100Mi
  limits:
    cpu: 1000m
    memory: 1000Mi
有了新的功能,我现在可以让Kubernetes自动缩放我的集群和吊舱


使用我现在可以很容易地添加一个自动缩放集群,使用
--enable autoscaling
--min nodes
--max nodes
--num nodes

App Engine flexible是一个解决方案,但对于某些工作负载来说并不理想。您对所连接到的磁盘的控制较少,没有可抢占选项,以及其他问题。这种每个节点一个pod/容器的用例非常常见,如果谷歌能够为此进行优化,那就太好了。