LoginSignup
1
0

More than 5 years have passed since last update.

【kubernetes】ReadinessがfailしたPodが存在する時のHPAの動き

Posted at

Kubernetesバージョン

1.9.3

知りたいこと

kubernetes の horizontal pod autoscaler(以下HPA)は、
対象DeploymentのPodの中にReadinessがfailしているものがある時、どういう動きをするのか

先に結論

Readinessがfailしているものも平均を出すための頭数には入れつつ、そのcpu使用率は無視(しておそらく0と)しているようです
しかし、表示されるcpu使用率の数値は少しおかしいような感じが

検証したこと

(英語力のせいでググってもよくわからなかった)

workerはec2のt2.medium

検証用のDeploymentとHPA

test.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: test
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
        - name: test
          image: nginx
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 1
              memory: "100Mi"
          readinessProbe:
            httpGet:
              path: /index.html
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 10
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 3
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: test
  namespace: default
spec:
  maxReplicas: 5
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: test
  targetCPUUtilizationPercentage: 50

この設定で作ったnginxコンテナ(以下A)でyesを実行すると

$ kubectl get hpa
NAME                        REFERENCE                              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
test                        Deployment/test                        99%/50%   1         5         1          11m

こうなり、scaleして

$ kubectl get hpa
NAME                        REFERENCE                              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
test                        Deployment/test                        49%/50%   1         5         2          14m

こうなります

ここで、新しく追加されたコンテナ(以下B)のindex.htmlを消すなどしてReadinessをfailさせると、
コンテナのReadyがfalseになり、それによりPodのReadyもfalseになります、そしてHPAは

$ kubectl get hpa
NAME                        REFERENCE                              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
test                        Deployment/test                        99%/50%   1         5         2          18m

こうなりますが、scaleはしません
conditionsを見ても

Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive   True    ValidMetricFound    the HPA was able to succesfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range

異常を示している様子はなく、スタンバイOKのようです
この状態で、Bでyesを実行してみたところscaleは起こりませんでした
一方Aで更にyesを実行したところ、(このコンテナでのyesプロセスは合計2つになる)

$ kubectl get hpa
NAME                        REFERENCE                              TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
test                        Deployment/test                        194%/50%   1         5         2          28m

こうなり、Podは4つにscaleしました

ReadinessがfailしているPodがある間はHPAは動作しないのかと思いましたがそういうことではなく、
failしているものも平均を出す頭数には入れつつ、そのCPU使用率は無視して(0として)計算しているような動きに見えます
しかしHPAのapiで得られる数値には、failしているものは頭数からも外して計算したような値が表示されているようです(バグ?)
少ない検証結果からの推測ではありますが、これで大体合ってるのではないでしょうか

また、使用しているkubernetesがv1.9.3と少し古いので新しいバージョンでは変更や修正がされているかもしれません

ちなみにこの現象はReadinessがfailしたPodが存在するというよりReady=falseなPodが存在する状況で起こるものだと考えてよいのではないかと思います

以上です

(ところで)
UnhealtyなPodが出たら代わりを立てるとかできないんですかね

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0