注意
マニュアルにも記載されているとおり、デフォルトの設定を変更することで、サポートが得られなくなる可能性がありますので、ご注意ください。(変更により生じた問題の解析等は行えなかったり、その可能性を排除するために、デフォルトの状態に戻しても同じ問題が再現することの確認を求められる可能性があります)
デフォルトの設定を変更する場合は、お客様自身の責任で行ってください。 変更された設定に対してテストを実行すること、および環境内の設定変更が原因で発生する可能性がある障害についてはお客様が責任を持ちます。
とはいえ変更しないとPodが起動しない状況になってしまったので、試してみました。
参照した情報
Tuning performance - IBM Cloud Docs
確認した環境
- Red Hat OpenShift on IBM Cloud(ROKS)
- 4.10
- ワーカープールはRHEL8に更新済み
- ワーカーのバージョン:4.10.50_1554_openshift
経緯
とあるPod(SonarQube)が以下のようなエラーで起動してくれなかったので調査。
2023.02.04 04:55:10 INFO es[][o.e.b.BootstrapChecks] explicitly enforcing bootstrap checks
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [255732] is too low, increase to at least [262144]
デバッグPodで侵入して確認すると、確かに小さい。
$ oc debug node/[ノードのIPアドレス]
# cat /proc/sys/vm/max_map_count
255732
ここでsysctlコマンドで変更しても、ノードのリブートやリプレースがかかると元に戻ってしまうので、永続的に設定を反映させる方法が必要になります。
冒頭のリンク先の後半にあるinitContainerによる方法を試します。(Node Tuning Operatorの方法は、なぜかうまくいきませんでした・・・)
マニュアルにあるサンプルを編集したファイルを用意します。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kernel-optimization
namespace: kube-system
labels:
tier: management
app: kernel-optimization
spec:
selector:
matchLabels:
name: kernel-optimization
template:
metadata:
labels:
name: kernel-optimization
spec:
hostNetwork: true
hostPID: true
hostIPC: true
initContainers:
- command:
- sh
- -c
- sysctl -w vm.max_map_count=262144;
image: alpine:3.6
imagePullPolicy: IfNotPresent
name: sysctl
resources: {}
securityContext:
privileged: true
capabilities:
add:
- NET_ADMIN
volumeMounts:
- name: modifysys
mountPath: /sys
containers:
- resources:
requests:
cpu: 0.01
image: alpine:3.6
name: sleepforever
command: ["/bin/sh", "-c"]
args:
- >
while true; do
sleep 100000;
done
volumes:
- name: modifysys
hostPath:
path: /sys
そして適用します。
$ oc apply -f worker-node-kernel-settings.yaml
daemonset.apps/kernel-optimization created
しばらくすると反映されたようで、CrashLoopBackOffだったPodも無事起動してきました。
試しに、ノードをリプレースしてみても、デフォルトの設定が更新されており、問題なく起動してくることが確認出来ました。
戻し方
マニュアルにあるコマンドではネームスペースの指定がありませんので、-n kube-system
を追加して削除を実行し、その後すべてのノードを順次リブートします。
$ oc delete ds kernel-optimization -n kube-system
daemonset.apps "kernel-optimization" deleted
おしまい
ElasticSearchでも同様の事象が多くあるようですが、サポートの点があるので、そこを十分ご理解いただきつつ、ご参考まで。