7.9.8. 安全でない sysctl の有効化
クラスター管理者は、高パフォーマンスまたはリアルタイムのアプリケーション調整などの非常に特殊な状況で特定の安全でない sysctl を許可することができます。
安全でない sysctl を使用する必要がある場合、クラスター管理者は特定のタイプのノードに対してそれらを個別に有効にする必要があります。sysctl には namespace を使用する必要があります。
Security Context Constraints の allowedUnsafeSysctls フィールドに sysctl または sysctl パターンのリストを指定することで、どの sysctl を Pod に設定するかをさらに制御できます。
allowedUnsafeSysctls オプションは、高パフォーマンスやリアルタイムのアプリケーションチューニングなどの特定ニーズを管理します。
これらの sysctl は安全でないとみなされているため、安全でない sysctl の使用は自己責任となり、コンテナーの不適切な動作、リソース不足、ノードの破損などの深刻な問題を引き起こす可能性があります。
手順
以下のコマンドを実行して、OpenShift Container Platform クラスターの既存の
MachineConfigオブジェクトをリスト表示し、マシン設定にラベルを付ける方法を決定します。$ oc get machineconfigpool出力例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-bfb92f0cd1684e54d8e234ab7423cc96 True False False 3 3 3 0 42m worker rendered-worker-21b6cb9a0f8919c88caf39db80ac1fce True False False 3 3 3 0 42m安全でない sysctl を含むコンテナーを実行するマシン設定プールにラベルを追加するには、次のコマンドを実行します。
$ oc label machineconfigpool worker custom-kubelet=sysctlKubeletConfigカスタムリソース (CR) を定義する YAML ファイルを作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: custom-kubelet spec: machineConfigPoolSelector: matchLabels: custom-kubelet: sysctl kubeletConfig: allowedUnsafeSysctls: - "kernel.msg*" - "net.core.somaxconn"各項目の説明:
spec.machineConfigPoolSelector.matchLabels- マシン設定プールからラベルを指定します。
spec.kubeletConfig.allowedUnsafeSysctls- 許可する安全でない sysctl のリストを指定します。
以下のコマンドを実行してオブジェクトを作成します。
$ oc apply -f set-sysctl-worker.yaml以下のコマンドを実行して、Machine Config Operator が新規のレンダリングされた設定を生成し、これをマシンに適用します。
$ oc get machineconfigpool worker -w数分後、
UPDATINGのステータスが True から False に変化します。NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE worker rendered-worker-f1704a00fc6f30d3a7de9a15fd68a800 False True False 3 2 2 0 71m worker rendered-worker-f1704a00fc6f30d3a7de9a15fd68a800 False True False 3 2 3 0 72m worker rendered-worker-0188658afe1f3a183ec8c4f14186f4d5 True False False 3 3 3 0 72m次の例に示すように、Pod を定義する YAML ファイルを作成し、
securityContext仕様を追加します。apiVersion: v1 kind: Pod metadata: name: sysctl-example-safe-unsafe spec: containers: - name: podexample image: centos command: ["bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault sysctls: - name: kernel.shm_rmid_forced value: "0" - name: net.core.somaxconn value: "1024" - name: kernel.msgmax value: "65536"以下のコマンドを実行して Pod を作成します。
$ oc apply -f sysctl-example-safe-unsafe.yaml予想される出力
Warning: would violate PodSecurity "restricted:latest": forbidden sysctls (net.core.somaxconn, kernel.msgmax) pod/sysctl-example-safe-unsafe created次のコマンドを実行して、Pod が作成されていることを確認します。
$ oc get pod出力例
NAME READY STATUS RESTARTS AGE sysctl-example-safe-unsafe 1/1 Running 0 19s次のコマンドを実行して、Pod にログインします。
$ oc rsh sysctl-example-safe-unsafe設定された sysctl フラグの値を確認します。たとえば、以下のコマンドを実行して、
net.core.somaxconnパラメーターの値を調べます。sh-4.4# sysctl net.core.somaxconn予想される出力
net.core.somaxconn = 1024安全でない sysctl が許可され、値は更新された Pod 仕様の
securityContext仕様で定義されているように設定されるようになりました。