Kubernetesバージョン
1.9.3
知りたいこと
kubernetes の horizontal pod autoscaler(以下HPA)は、
対象DeploymentのPodの中にReadinessがfailしているものがある時、どういう動きをするのか
先に結論
Readinessがfailしているものも平均を出すための頭数には入れつつ、そのcpu使用率は無視(しておそらく0と)しているようです
しかし、表示されるcpu使用率の数値は少しおかしいような感じが
検証したこと
(英語力のせいでググってもよくわからなかった)
workerはec2のt2.medium
検証用のDeploymentとHPA
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が出たら代わりを立てるとかできないんですかね