unsafe sysctl を許可する Kubernetes 構成

unsafe sysctl は Pod 間の分離やノードの安定性に影響するため、必要な範囲だけに使用を制限してください。

説明

ワークロードの securityContext.sysctls とノードの許可設定で unsafe sysctl を使用すると、Pod 間の分離やノードの安定性に影響する場合があります。一般的なアプリケーションでは、使用する Kubernetes と Linux カーネルのバージョンでサポートされる安全な sysctl を優先してください。

unsafe sysctl は既定で無効であり、対象ノードで明示的に許可する必要があります。従来の PodSecurityPolicy の allowedUnsafeSysctls も許可範囲を広げます。PSP は Kubernetes 1.21 で非推奨となり、1.25 で削除されたため、現在のクラスターでは Pod Security Admission などのアドミッションポリシーで制限してください。

想定される影響

  • 不適切なカーネル設定がコンテナーの動作やノードの安定性に影響する場合があります。
  • 同じノードの別の Pod が、リソース不足や分離の弱体化の影響を受ける可能性があります。
  • 許可されていない sysctl を要求する Pod は起動できず、サービスの開始に失敗する場合があります。

対処方法

  • 不要な unsafe sysctl の要求と許可設定を削除してください。安全な sysctl でも、対応バージョンと必要な値を確認してください。
  • 例外が不可欠な場合は影響を検証し、専用ノードとスケジューリングの制限で使用範囲を絞ってください。
  • 変更後に Pod の起動、リソース使用量、他のワークロードの正常動作を確認してください。

例

次の例は Deployment の sysctl 設定を比較します。イメージと実行コマンドは実際のアプリケーションに合わせて設定してください。

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      securityContext:
        sysctls:
          - name: kernel.sem
            value: "128 32768 128 4096"
      containers:
        - name: test-ubuntu
          image: ubuntu

kernel.sem は unsafe sysctl です。ノードで明示的に許可しないと Pod は起動しません。許可する前に、リソースと分離への影響を確認する必要があります。

変更後

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app-neg
spec:
  selector:
    matchLabels:
      app: test-app-neg
  template:
    metadata:
      labels:
        app: test-app-neg
    spec:
      securityContext:
        sysctls:
          - name: kernel.shm_rmid_forced
            value: "0"
          - name: net/ipv4/tcp_syncookies
            value: "1"
      containers:
        - name: test-ubuntu
          image: ubuntu

どちらも Kubernetes の安全な sysctl の一覧に含まれる設定です。名前に / を使う表記は Kubernetes 1.25 以降でサポートされます。値がアプリケーションの要件に合っていることも確認してください。

参考資料