kubernetes

【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


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