このページでは、PriorityClass、RuntimeClass、Pod内のセキュリティコンテキストを含む高度なPod設定に関するトピックを扱い、スケジューリングとの関連についても説明します。
PriorityClass を使用すると、他のPodと比較したPodの重要度を設定することができます。
Podに優先度クラスを割り当てると、Kubernetesは指定したPriorityClassに基づいて、そのPodの.spec.priorityフィールドを設定します(ただし、.spec.priorityを直接設定することはできません)。
Podがスケジュールできず、その問題がリソース不足によるものである場合、kube-schedulerは、より高い優先度のPodのスケジューリングを可能にするため、より低い優先度のPodをプリエンプトしようとします。
PriorityClassは、優先度クラス名を整数の優先度値にマッピングするクラスタースコープのAPIオブジェクトです。 数値が大きいほど高い優先度であることを示します。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 10000
globalDefault: false
description: "Priority class for high-priority workloads"
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
priorityClassName: high-priorityKubernetesは2つのビルトインのPriorityClassを提供します:
system-cluster-critical: クラスターにとって重要なシステムコンポーネント用。system-node-critical: 個々のノードにとって重要なシステムコンポーネント用。
これはKubernetesでPodが持つことができる最も高い優先度です。詳細については、Podの優先度とプリエンプションを参照してください。
RuntimeClass を使用すると、Podの低レベルなコンテナランタイムを指定できます。 これは、異なる分離レベルやランタイム機能が必要な場合など、異なる種類のPodに対して異なるコンテナランタイムを指定したい場合に役立ちます。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: myclass
containers:
- name: mycontainer
image: nginxRuntimeClassは、クラスター内の一部またはすべてのノードで利用可能なコンテナランタイムを表すクラスタースコープのオブジェクトです。
クラスター管理者は、RuntimeClassを支える具体的なランタイムをインストールおよび設定します。
管理者は、その特別なコンテナランタイム設定をすべてのノードに設定する場合もあれば、一部のノードのみに設定する場合もあります。
詳細については、RuntimeClassのドキュメントを参照してください。
Pod仕様内のsecurityContextフィールドは、Podとコンテナのセキュリティ設定をきめ細かく制御できます。
securityContextセキュリティ設定の中には、Pod全体に適用されるものがあります。 その他の設定については、コンテナレベルでオーバーライドせずにデフォルトを設定することもできます。
以下は、PodレベルでPod全体のsecurityContextを使用する例です:
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext: # この設定は、Pod全体に適用されます
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- name: sec-ctx-demo
image: registry.k8s.io/e2e-test-images/agnhost:2.45
command: ["sh", "-c", "sleep 1h"]特定のコンテナに対してのみ、セキュリティコンテキストを指定できます。 以下はその例です:
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
containers:
- name: sec-ctx-demo-2
image: gcr.io/google-samples/node-hello:1.0
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefaultsecurityContextを使用して、Linuxコンテナで特権モードを許可することもできます。
特権モードは、securityContextの他の多くのセキュリティ設定を上書きします。
securityContextの他のフィールドを使用して同等の権限を付与できない場合を除き、この設定を使用することは避けてください。
PodレベルのセキュリティコンテキストでwindowsOptions.hostProcessフラグを設定することで、同様の特権モードでWindowsコンテナを実行できます。
詳細とその手順については、Windows HostProcess Podの作成を参照してください。詳細については、Podまたはコンテナのセキュリティコンテキストの設定を参照してください。
Kubernetesは、Podがどのノードにスケジュールされるかを制御するためのいくつかのメカニズムを提供します。
最もシンプルな形式のノード選択制約:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssdノードアフィニティを使用すると、Podをスケジュールできるノードを制約するルールを指定できます。
以下は、topology.kubernetes.io/zoneラベルの値に基づいて選択し、特定の大陸(continent)にあるとラベル付けされたノードでの実行を優先するPodの例です。
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
containers:
- name: with-node-affinity
image: registry.k8s.io/pause:3.8ノードアフィニティに加えて、ノード上ですでに実行されている 他のPod のラベルに基づいて、Podがスケジュールされるノードを制約することもできます。 Podアフィニティを使用すると、他のPodとの位置関係に基づいてPodを配置するルールを指定できます。
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- database
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:3.8Toleration を使用すると、一致するTaintを持つノードにPodをスケジュールできます:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myapp
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"詳細については、ノード上へのPodのスケジューリングを参照してください。
Podのオーバーヘッドを使用すると、コンテナのリソース要求とリソース制限に加えて、Podのインフラストラクチャが消費するリソースを考慮できます。
---
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: kvisor-runtime
handler: kvisor-runtime
overhead:
podFixed:
memory: "2Gi"
cpu: "500m"
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
runtimeClassName: kvisor-runtime
containers:
- name: myapp
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"