【问题标题】:HPA with different namespaces具有不同命名空间的 HPA
【发布时间】:2021-03-01 13:28:01
【问题描述】:

我有一个带有以下内容的 kubernetes 设置

sn.  type          service  namespace
1.   statefulset   rabbitmq rabbitmq
2.   deployment    pods     default
3.   hpa           hpa      default

指标在 `/apis/custom.metrics.k8s.io/v1beta1 上导出,如下所示

{
  "kind": "APIResourceList",
  "apiVersion": "v1",
  "groupVersion": "custom.metrics.k8s.io/v1beta1",
  "resources": [
    {
      "name": "services/rabbitmq_queue_messages_ready",
      "singularName": "",
      "namespaced": true,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    },
    {
      "name": "namespaces/rabbitmq_queue_messages_ready",
      "singularName": "",
      "namespaced": false,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    },
    {
      "name": "pods/rabbitmq_queue_messages_ready",
      "singularName": "",
      "namespaced": true,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    }
  ]
}

hpa的配置

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: demo-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-pod2
  minReplicas: 1
  maxReplicas: 2
  metrics:
  - type: Object
    object:
      metric:
        name: "rabbitmq_queue_messages_ready"
      describedObject:
        apiVersion: custom.metrics.k8s.io/v1/beta1
        kind: Service
        name: rabbitmq
      target:
        type: Value
        value: 50

每当我尝试在 default 命名空间中部署 hpa 时,我都会收到以下错误。

 ScalingActive  False   FailedGetObjectMetric  the HPA was unable to compute the replica count: unable to get metric rabbitmq_queue_messages_ready: Service on default rabbitmq/unable to fetch metrics from custom metrics API: the server could not find the metric rabbitmq_queue_messages_ready for services rabbitmq

但是当设置相同的 hpa 时,请使用 hpa 执行命名空间 rabbitmq

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: demo-hpa
  namespace: rabbitmq
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-pod2
  minReplicas: 1
  maxReplicas: 2
  metrics:
  - type: Object
    object:
      metric:
        name: "rabbitmq_queue_messages_ready"
      describedObject:
        apiVersion: custom.metrics.k8s.io/v1/beta1
        kind: Service
        name: rabbitmq
      target:
        type: Value
        value: 50

和 deployment.yaml 一样

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-pod2
  labels:
    app: test-pod2
  namespace: rabbimtq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-pod2
  template:
    metadata:
      labels:
        app: test-pod2
    spec:
      containers:
        - name: test-pod2
          image: golang:1.16
          command: ["sh", "-c", "tail -f /etc/hosts"]

部署完美。

有没有办法,我可以将服务 rabbitmq 的指标从rabbitmq 命名空间导出到任何其他命名空间,然后我可以将其用于扩展???

【问题讨论】:

    标签: kubernetes rabbitmq kubernetes-helm hpa


    【解决方案1】:

    HPA 是一个namespaced 资源。这意味着它只能扩展与 HPA 本身在同一命名空间中的部署。这就是为什么它只有在 HPA 和 Deployment 都在 namespace: rabbitmq 时才有效。您可以通过运行在集群中检查它:

        kubectl api-resources --namespaced=true | grep hpa
        NAME                        SHORTNAMES   APIGROUP                    NAMESPACED   KIND
        horizontalpodautoscalers    hpa          autoscaling                 true         HorizontalPodAutoscaler
    

    使其工作的最简单方法是简单地将 HPA 的 Namespace 值设置为您想要扩展的相同部署命名空间。例如,如果您的部署设置如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: rabbimtq
    

    HPA 也必须在同一个命名空间中:

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      namespace: rabbitmq
    

    换句话说:将 HPA 的 metadata.namespace 值设置为 Deployment 的 metadata.namespace 值,因为 HPA 无法在其命名空间之外扩展 Deployment。

    命名空间就像集群中的独立“盒子”。命名空间资源不能在它们所在的命名空间之外工作。他们看不到不在他们“盒子”中的资源。

    通过这种方式,无需重新配置自定义指标。

    【讨论】:

    • 嗨@Wytrzymały Wiktor。你能分享一些例子,或者进一步解释一下。所以,同样的namespace 是指我对test-pod2hparabbitmq 的部署都需要在同一个命名空间中正确吗?
    • 嗨@Wytrzymały Wiktor,所以如果我理解正确,我对hpamy test podsrabbitmq 的所有部署都需要在同一个命名空间中?但由于这是一个生产架构,我想根据命名空间(依赖项和服务)分离服务,在这种情况下,有什么方法可以实现呢?
    • @whoami 是的。它会这样工作。 HPA 所基于的自定义指标也应该在同一个命名空间中。
    • 嗨@Wytrzymały Wiktor,我可以通过任何其他方式为不同的命名空间实现这一点,hpatest deployment 在一个命名空间中,rabbitmq 在另一个命名空间中??
    • @whoami No. Namespaced resourced 只能在他们的 Namespace 中工作。
    猜你喜欢
    • 2014-09-27
    • 2017-02-21
    • 2011-12-01
    • 2016-03-05
    • 2011-04-10
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多