8.2. Red Hat OpenShift Service on AWS のノードが保持できる Pod の数の見積り
クラスター管理者は、OpenShift Cluster Capacity Tool を使用して、現在のリソースが使い切られる前にそれらを増やすべくスケジュール可能な Pod 数を表示し、スケジュール可能な Pod 数を表示したり、Pod を今後スケジュールできるようにすることができます。この容量は、クラスター内の個別ノードからのものを集めたものであり、これには CPU、メモリー、ディスク領域などが含まれます。
8.2.1. OpenShift Cluster Capacity Tool について
OpenShift Cluster Capacity Tool は、より正確な見積もりを出すべく、スケジュールの一連の意思決定をシミュレーションし、リソースが使い切られる前にクラスターでスケジュールできる入力 Pod のインスタンス数を判別します。
ノード間に分散しているすべてのリソースがカウントされないため、残りの割り当て可能な容量は概算となります。残りのリソースのみが分析対象となり、クラスターでのスケジュール可能な所定要件を持つ Pod のインスタンス数という点から消費可能な容量を見積もります。
Pod のスケジューリングはその選択およびアフィニティー条件に基づいて特定のノードセットだけがサポートされる可能性があります。そのため、クラスターでスケジュール可能な残りの Pod 数を見積もることが困難になる場合があります。
OpenShift Cluster Capacity Tool は、コマンドラインからスタンドアロンのユーティリティーとして実行することも、Red Hat OpenShift Service on AWS クラスター内の Pod でジョブとして実行することもできます。これを Pod 内のジョブとしてツールを実行すると、介入なしに複数回実行することができます。
8.2.2. コマンドラインでの OpenShift Cluster Capacity Tool の実行
コマンドラインから OpenShift Cluster Capacity Tool を実行して、クラスターにスケジュール設定可能な Pod 数を見積ることができます。
ツールがリソース使用状況を見積もるために使用するサンプル Pod 仕様ファイルを作成します。pod spec はそのリソース要件を limits
または requests
として指定します。クラスター容量ツールは、Pod のリソース要件をその見積もりの分析に反映します。
前提条件
- OpenShift Cluster Capacity Tool を実行します。これは、Red Hat エコシステムカタログからコンテナーイメージとして入手できます。
サンプルの Pod 仕様ファイルを作成します。
以下のような YAML ファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: small-pod labels: app: guestbook tier: frontend spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: php-redis image: gcr.io/google-samples/gb-frontend:v4 imagePullPolicy: Always resources: limits: cpu: 150m memory: 100Mi requests: cpu: 150m memory: 100Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
クラスターロールを作成します。
$ oc create -f <file_name>.yaml
以下に例を示します。
$ oc create -f pod-spec.yaml
手順
コマンドラインでクラスター容量ツールを使用するには、次のようにします。
ターミナルから、Red Hat レジストリーにログインします。
$ podman login registry.redhat.io
クラスター容量ツールのイメージをプルします。
$ podman pull registry.redhat.io/openshift4/ose-cluster-capacity
クラスター容量ツールを実行します。
$ podman run -v $HOME/.kube:/kube:Z -v $(pwd):/cc:Z ose-cluster-capacity \ /bin/cluster-capacity --kubeconfig /kube/config --<pod_spec>.yaml /cc/<pod_spec>.yaml \ --verbose
ここでは、以下のようになります。
- <pod_spec>.yaml
- 使用する Pod の仕様を指定します。
- verbose
- クラスター内の各ノードでスケジュールできる Pod の数の詳細な説明を出力します。
出力例
small-pod pod requirements: - CPU: 150m - Memory: 100Mi The cluster can schedule 88 instance(s) of the pod small-pod. Termination reason: Unschedulable: 0/5 nodes are available: 2 Insufficient cpu, 3 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate. Pod distribution among nodes: small-pod - 192.168.124.214: 45 instance(s) - 192.168.124.120: 43 instance(s)
上記の例では、クラスターにスケジュールできる推定 Pod の数は 88 です。
8.2.3. OpenShift Cluster Capacity Tool を Pod 内のジョブとして実行する
OpenShift Cluster Capacity Tool を Pod 内のジョブとして実行すると、ユーザーの介入を必要とせずにツールを複数回実行できます。OpenShift Cluster Capacity Tool は、ConfigMap
オブジェクトを使用してジョブとして実行します。
前提条件
OpenShift Cluster Capacity Tool をダウンロードしてインストールします。
手順
クラスター容量ツールを実行するには、以下の手順を実行します。
クラスターロールを作成します。
以下のような YAML ファイルを作成します。
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: cluster-capacity-role rules: - apiGroups: [""] resources: ["pods", "nodes", "persistentvolumeclaims", "persistentvolumes", "services", "replicationcontrollers"] verbs: ["get", "watch", "list"] - apiGroups: ["apps"] resources: ["replicasets", "statefulsets"] verbs: ["get", "watch", "list"] - apiGroups: ["policy"] resources: ["poddisruptionbudgets"] verbs: ["get", "watch", "list"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "watch", "list"]
次のコマンドを実行して、クラスターのロールを作成します。
$ oc create -f <file_name>.yaml
以下に例を示します。
$ oc create sa cluster-capacity-sa
サービスアカウントを作成します。
$ oc create sa cluster-capacity-sa -n default
ロールをサービスアカウントに追加します。
$ oc adm policy add-cluster-role-to-user cluster-capacity-role \ system:serviceaccount:<namespace>:cluster-capacity-sa
ここでは、以下のようになります。
- <namespace>
- Pod が配置されている名前空間を指定します。
Pod 仕様を定義して、作成します。
以下のような YAML ファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: small-pod labels: app: guestbook tier: frontend spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: php-redis image: gcr.io/google-samples/gb-frontend:v4 imagePullPolicy: Always resources: limits: cpu: 150m memory: 100Mi requests: cpu: 150m memory: 100Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
以下のコマンドを実行して Pod を作成します。
$ oc create -f <file_name>.yaml
以下に例を示します。
$ oc create -f pod.yaml
以下のコマンドを実行して config map オブジェクトを作成します。
$ oc create configmap cluster-capacity-configmap \ --from-file=pod.yaml=pod.yaml
クラスター容量分析は、
cluster-capacity-configmap
という名前の config map オブジェクトを使用してボリュームにマウントされ、入力 Pod 仕様ファイルpod.yaml
はパス/test-pod
のボリュームtest-volume
にマウントされます。ジョブ仕様ファイルの以下のサンプルを使用して、ジョブを作成します。
以下のような YAML ファイルを作成します。
apiVersion: batch/v1 kind: Job metadata: name: cluster-capacity-job spec: parallelism: 1 completions: 1 template: metadata: name: cluster-capacity-pod spec: containers: - name: cluster-capacity image: openshift/origin-cluster-capacity imagePullPolicy: "Always" volumeMounts: - mountPath: /test-pod name: test-volume env: - name: CC_INCLUSTER 1 value: "true" command: - "/bin/sh" - "-ec" - | /bin/cluster-capacity --podspec=/test-pod/pod.yaml --verbose restartPolicy: "Never" serviceAccountName: cluster-capacity-sa volumes: - name: test-volume configMap: name: cluster-capacity-configmap
- 1
- クラスター容量ツールにクラスター内で Pod として実行されていることを認識させる環境変数です。
ConfigMap
のpod.yaml
キーはPod
仕様ファイル名と同じですが、これは必須ではありません。これを実行することで、入力 Pod 仕様ファイルは/test-pod/pod.yaml
として Pod 内でアクセスできます。
次のコマンドを実行して、クラスター容量イメージを Pod 内のジョブとして実行します。
$ oc create -f cluster-capacity-job.yaml
検証
ジョブログを確認し、クラスター内でスケジュールできる Pod の数を確認します。
$ oc logs jobs/cluster-capacity-job
出力例
small-pod pod requirements: - CPU: 150m - Memory: 100Mi The cluster can schedule 52 instance(s) of the pod small-pod. Termination reason: Unschedulable: No nodes are available that match all of the following predicates:: Insufficient cpu (2). Pod distribution among nodes: small-pod - 192.168.124.214: 26 instance(s) - 192.168.124.120: 26 instance(s)