第14章 チューニングプラグインを使用してシステムコントロールとインターフェイス属性を設定する
Linux では、管理者は sysctl を使用してランタイム時にカーネルパラメーターを変更できます。チューニング Container Network Interface (CNI) メタプラグインを使用して、インターフェイスレベルのネットワーク sysctl を変更できます。チューニング CNI メタプラグインは、図に示すように、メインの CNI プラグインとチェーンで動作します。
![CNI プラグイン](https://access.redhat.com/webassets/avalon/d/OpenShift_Container_Platform-4.17-Networking-ja-JP/images/af56fdca7a66f114406dd89fc4fb9ca9/264_OpenShift_CNI_plugin_chain_0722.png)
メインの CNI プラグインはインターフェイスを割り当て、それをランタイム時にチューニング CNI メタプラグインに渡します。チューニング CNI メタプラグインを使用して、ネットワーク namespace の一部の sysctl といくつかのインターフェイス属性 (プロミスキャスモード、オールマルチキャストモード、MTU、および MAC アドレス) を変更できます。
14.1. チューニング CNI を使用してシステム制御を設定する
次の手順では、チューニング CNI を設定し、インターフェイスレベルのネットワーク net.ipv4.conf.IFNAME.accept_redirects
sysctl を変更します。この例では、ICMP リダイレクトパケットの受け入れと送信を有効にします。チューニング CNI メタプラグイン設定では、インターフェイス名は IFNAME
トークンで表され、ランタイム時にインターフェイスの実際の名前に置き換えられます。
手順
次の内容で、
tuning-example.yaml
などのネットワーク接続定義を作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <name> 1 namespace: default 2 spec: config: '{ "cniVersion": "0.4.0", 3 "name": "<name>", 4 "plugins": [{ "type": "<main_CNI_plugin>" 5 }, { "type": "tuning", 6 "sysctl": { "net.ipv4.conf.IFNAME.accept_redirects": "1" 7 } } ] }
- 1
- 作成する追加のネットワーク割り当ての名前を指定します。名前は指定された namespace 内で一意である必要があります。
- 2
- オブジェクトが関連付けられている namespace を指定します。
- 3
- CNI 仕様のバージョンを指定します。
- 4
- 設定の名前を指定します。設定名をネットワーク接続定義の name の値に一致させることが推奨されます。
- 5
- 設定するメイン CNI プラグインの名前を指定します。
- 6
- CNI メタプラグインの名前を指定します。
- 7
- 設定する sysctl を指定します。インターフェイス名は
IFNAME
トークンで表され、ランタイム時にインターフェイスの実際の名前に置き換えられます。
YAML ファイルの例を次に示します。
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 1 spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 2 runAsGroup: 3000 3 allowPrivilegeEscalation: false 4 capabilities: 5 drop: ["ALL"] securityContext: runAsNonRoot: true 6 seccompProfile: 7 type: RuntimeDefault
- 1
- 設定済みの
NetworkAttachmentDefinition
の名前を指定します。 - 2
runAsUser
は、コンテナーが実行されるユーザー ID を制御します。- 3
runAsGroup
は、コンテナーが実行されるプライマリーグループ ID を制御します。- 4
allowPrivilegeEscalation
は、Pod が特権の昇格を許可するように要求できるかどうかを決定します。指定しない場合、デフォルトで true に設定されます。このブール値は、no_new_privs
フラグがコンテナープロセスに設定されるかどうかを直接制御します。- 5
capabilities
は、完全なルートアクセスを許可せずに権限操作を許可します。このポリシーにより、すべての機能が Pod から削除されます。- 6
runAsNonRoot: true
は、コンテナーが 0 以外の任意の UID を持つユーザーで実行されることを要求します。- 7
RuntimeDefault
は、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