第1章 チューニングプラグインを使用してシステムコントロールとインターフェイス属性を設定する
OpenShift Container Platform で実行時にカーネルパラメーターとインターフェイス属性を変更するには、Container Network Interface (CNI) メタプラグインのチューニングを使用できます。このプラグインはメインの CNI プラグインと連携して動作し、プロミスキャスモード、オールマルチキャストモード、MTU、MAC アドレスなどの sysctl やインターフェイス属性を変更できます。
1.1. チューニング CNI を使用してシステム制御を設定する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でインターフェイスレベルのネットワーク sysctl を設定するには、ネットワークアタッチメント定義でチューニング CNI メタプラグインを使用できます。ICMP リダイレクトパケットの受信と送信を有効にするには、net.ipv4.conf.IFNAME.accept_redirects sysctl を設定してください。
手順
次の内容を含む、
tuning-example.yamlなどのネットワークアタッチメント定義を作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "<name>", "plugins": [{ "type": "<main_CNI_plugin>" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }ここでは、以下のようになります。
metadata.name- 作成する追加のネットワーク割り当ての名前を指定します。名前は指定された namespace 内で一意である必要があります。
metadata.namespace- オブジェクトが関連付けられている namespace を指定します。
spec.config.cniVersion- CNI 仕様のバージョンを指定します。
spec.config.name- 設定の名前を指定します。設定名をネットワークアタッチメント定義の名前の値と一致させることを推奨します。
spec.config.plugins.type- 設定するメイン CNI プラグインの名前を指定します。
spec.config.plugins.tuning.sysctl-
設定する sysctl を指定します。インターフェイス名は
IFNAMEトークンで表され、ランタイム時にインターフェイスの実際の名前に置き換えられます。
ネットワーク接続定義の例
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: tuningnad namespace: default spec: config: '{ "cniVersion": "0.4.0", "name": "tuningnad", "plugins": [{ "type": "bridge" }, { "type": "tuning", "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" } } ] }'以下のコマンドを実行して YAML を適用します。
$ oc apply -f tuning-example.yaml出力例
networkattachmentdefinition.k8.cni.cncf.io/tuningnad created次のようなネットワークアタッチメント定義を使用して、
examplepod.yamlなどの Pod を作成します。apiVersion: v1 kind: Pod metadata: name: tunepod namespace: default annotations: k8s.v1.cni.cncf.io/networks: tuningnad 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ここでは、以下のようになります。
metadata.annotations.k8s.v1.cni.cncf.io/networks-
設定された
NetworkAttachmentDefinitionの名前を指定します。 spec.containers.securityContext.runAsUser- コンテナーを実行するユーザー ID を指定します。
spec.containers.securityContext.runAsGroup- コンテナーの実行に使用するプライマリーグループ ID を指定します。
spec.containers.securityContext.allowPrivilegeEscalation-
Pod が特権昇格を許可するよう要求できるかどうかを指定します。指定しない場合、デフォルトで true に設定されます。このブール値は、
no_new_privsフラグがコンテナープロセスに設定されるかどうかを直接制御します。 spec.containers.securityContext.capabilities- 完全なルートアクセス権限を与えずに、特権的な操作を指定します。このポリシーにより、すべての機能が Pod から削除されます。
spec.securityContext.runAsNonRoot: true- UID が 0 以外のユーザーでコンテナーが実行されるように指定します。
spec.securityContext.seccompProfile- Pod またはコンテナーワークロードのデフォルトの seccomp プロファイルを指定します。
以下のコマンドを実行して yaml を適用します。
$ oc apply -f examplepod.yaml次のコマンドを実行して、Pod が作成されていることを確認します。
$ oc get pod出力例
NAME READY STATUS RESTARTS AGE tunepod 1/1 Running 0 47s次のコマンドを実行して、Pod にログインします。
$ oc rsh tunepod設定された sysctl フラグの値を確認します。たとえば、次のコマンドを実行して、値
net.ipv4.conf.net1.accept_redirectsを見つけます。sh-4.4# sysctl net.ipv4.conf.net1.accept_redirects予想される出力
net.ipv4.conf.net1.accept_redirects = 1