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

## Kubernetesバージョン

1.9.3

## 知りたいこと

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

## 先に結論

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

## 検証したこと
（英語力のせいでググってもよくわからなかった）


workerはec2のt2.medium

検証用のDeploymentとHPA

```yaml: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`プロセスは合計２つになる）

```
$ 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が出たら代わりを立てるとかできないんですかね