はじめに
AWS EKSでk8sの勉強用でクラスタを立て、マイクロサービスアプリをデプロイした時に遭遇したエラー。
忙しい人用
ソース:ノードよりも大きいメモリー要求を指定する
要約してもそのままな気がするが、OOM(Out Of Memory)によってPodが不健全な状態のため強制終了と再起動が繰り返される。
そのためPodのリソースリクエスト量を増やす必要があるが、ノードのキャパシティを超えるようなリクエストをしてしまうとPodがスケジュールされないので要注意!
このエラーの見つけ方
・kubectl describe pod xxxxxx
を実行したときにReason:
に表示される。
・kubectl get pod
実行時のSTATUS
列を見る。
この辺りで十分かなと思います。
スペック
EKSをEC2でホストし、podのマニフェストは以下のようになっています。
このくらいでいいかー。とてきとうにリソースリクエストを書いたのが悪かったです。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
labels:
app: react
spec:
replicas: 1
selector:
matchLabels:
app:react
spec:
container:
- name: react
image: xxxxxxxxx:tag
ports:
- containerPort: 8000
resources:
requests:
memory: 256Mi
cpu: 250m
limits:
memory: 512Mi
cpu: 500m
対策
- Podのスペックをあげる(足りなければノードに追加のリソースを与える or ノードの追加)
- 今回EKSをEC2でホストしているが、Fargateに変える。(limitを設けるなどすればコストの急増を抑制できる気が。)
予測可能なキャパシティであれば、ResourceQuotasを使うと管理面で便利かも。
今回は練習のためリクエスト量を直に増やす。
ノードのスペックとサービスに必要なスペックを考慮する。(過剰なリクエストは控える。)
~~~~~~~~~~~~~~
~~~~~~~~~~~~~~
spec:
container:
- name: react
image: xxxxxxxxx:tag
ports:
- containerPort: 8000
resources:
requests:
memory: 1024Mi # 256Mi -> 1024Mi
cpu: 500m # 250m -> 500m
limits:
memory: 2048Mi # 512Mi -> 2048
cpu: 1000m # 500m -> 1000m