背景
コンテナはカーネル共有型の仮想化というのはよく言われてる話で理解はしているつもりだった。と同時に一部のコネクションメニーなwebアプリとかをコンテナで動かす場合にnet.core.somaxconn
とかをいじることでカーネルがもつキューを伸ばすみたいなことが可能なことも知っていて。
ここで共有しているカーネルでカーネルパラメータをコンテナ毎に設定できるのは何故?となったのがタイトル。
結論
勘のいい人なら既に分かってる気がしますが原理としてはnamespaceでプロセス毎にカーネルパラメータを設定しているみたいです。例えばsomaxconnとかだとlinux/net/core/net_namespace.c
辺りでnamespace毎に設定されていたりします。
static int __net_init net_defaults_init_net(struct net *net) { net->core.sysctl_somaxconn = SOMAXCONN; return 0; }
portrangeとかもnet_namespaceに紐づく形で実装されている。
k8sでのドキュメント
pod毎にパラメータを管理者は設定できる。設定できる値はpodに入ってsysctl -a
するなり/proc/sys
をみればよい。pod単位で設定できるものもあればnamespace毎に別れていないノードレベルのsysctlもあるらしい。
apiVersion: v1 kind: Pod metadata: name: sysctl-example spec: securityContext: sysctls: - name: kernel.shm_rmid_forced value: "0" - name: net.core.somaxconn value: "1024" - name: kernel.msgmax value: "65536" ...