地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】コンテナとカーネルパラメータ

背景

コンテナはカーネル共有型の仮想化というのはよく言われてる話で理解はしているつもりだった。と同時に一部のコネクションメニーな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に紐づく形で実装されている。

github.com

k8sでのドキュメント

kubernetes.io

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"
  ...

参考記事

qiita.com