8.9.3. Ingress Controller の自動スケーリング
Ingress Controller は、ルーティングのパフォーマンスや可用性の要件に合わせて動的に自動的にスケーリングできます。たとえば、処理能力を向上させる必要性などが挙げられる。
以下の手順では、デフォルトの Ingress Controller をスケールアップする例を示します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとして OpenShift Container Platform クラスターにアクセスできる。 VMware vSphere、ベアメタル、および Nutanix installer-provisioned infrastructure では、Ingress ControllerPod をスケールアップしても、外部トラフィックのパフォーマンスは向上しません。パフォーマンスを向上させるには、以下の前提条件を満たしていることを確認してください。
- クラスター用に、ユーザー管理型のロードバランサーを手動で設定しました。
- イングレスコントローラーからの受信トラフィックを処理するクラスターノードに対して、ロードバランサーが正しく設定されていることを確認しました。
Custom Metrics Autoscaler Operator と関連する KEDA Controller がインストールされている。
-
Web コンソールのソフトウェアカタログを使用して Operator をインストールできます。Operator をインストールしたら、
KedaControllerのインスタンスを作成できます。
-
Web コンソールのソフトウェアカタログを使用して Operator をインストールできます。Operator をインストールしたら、
手順
以下のコマンドを実行して、Thanos で認証するためのサービスアカウントを作成します。
$ oc create -n openshift-ingress-operator serviceaccount thanos && oc describe -n openshift-ingress-operator serviceaccount thanos出力例
Name: thanos Namespace: openshift-ingress-operator Labels: <none> Annotations: <none> Image pull secrets: thanos-dockercfg-kfvf2 Mountable secrets: thanos-dockercfg-kfvf2 Tokens: <none> Events: <none>次のコマンドを使用して、サービスアカウントシークレットトークンを手動で作成します。
$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: thanos-token namespace: openshift-ingress-operator annotations: kubernetes.io/service-account.name: thanos type: kubernetes.io/service-account-token EOFサービスアカウントのトークンを使用して、
openshift-ingress-operatornamespace 内でTriggerAuthenticationオブジェクトを定義します。TriggerAuthenticationオブジェクトを作成し、secret変数の値をTOKENパラメーターに渡します。$ oc apply -f - <<EOF apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: keda-trigger-auth-prometheus namespace: openshift-ingress-operator spec: secretTargetRef: - parameter: bearerToken name: thanos-token key: token - parameter: ca name: thanos-token key: ca.crt EOF
Thanos からメトリクスを読み取るためのロールを作成して適用します。
Pod およびノードからメトリクスを読み取る新規ロール
thanos-metrics-reader.yamlを作成します。thanos-metrics-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: thanos-metrics-reader namespace: openshift-ingress-operator rules: - apiGroups: - "" resources: - pods - nodes verbs: - get - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch - apiGroups: - "" resources: - namespaces verbs: - get以下のコマンドを実行して新規ロールを適用します。
$ oc apply -f thanos-metrics-reader.yaml
以下のコマンドを入力して、新しいロールをサービスアカウントに追加します。
$ oc adm policy -n openshift-ingress-operator add-role-to-user thanos-metrics-reader -z thanos --role-namespace=openshift-ingress-operator$ oc adm policy -n openshift-ingress-operator add-cluster-role-to-user cluster-monitoring-view -z thanos注記引数
add-cluster-role-to-userは、namespace 間のクエリーを使用する場合にのみ必要になります。以下の手順では、この引数を必要とするkube-metricsnamespace からのクエリーを使用します。デフォルトの Ingress Controller デプロイメントをターゲットにする新しい
ScaledObjectYAML ファイルingress-autoscaler.yamlを作成します。ScaledObject定義の例apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: ingress-scaler namespace: openshift-ingress-operator spec: scaleTargetRef:1 apiVersion: operator.openshift.io/v1 kind: IngressController name: default envSourceContainerName: ingress-operator minReplicaCount: 1 maxReplicaCount: 202 cooldownPeriod: 1 pollingInterval: 1 triggers: - type: prometheus metricType: AverageValue metadata: serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:90913 namespace: openshift-ingress-operator4 metricName: 'kube-node-role' threshold: '1' query: 'sum(kube_node_role{role="worker",service="kube-state-metrics"})'5 authModes: "bearer" authenticationRef: name: keda-trigger-auth-prometheus- 1
- 対象とするカスタムリソース。この場合、Ingress Controller。
- 2
- オプション: レプリカの最大数。このフィールドを省略すると、デフォルトの最大値は 100 レプリカに設定されます。
- 3
openshift-monitoringnamespace の Thanos サービスエンドポイント。- 4
- Ingress Operator namespace。
- 5
- この式は、デプロイされたクラスターに存在するワーカーノードの数に対して評価されます。重要
namespace 間クエリーを使用している場合は、
serverAddressフィールドのポート 9092 ではなくポート 9091 をターゲットにする必要があります。また、このポートからメトリクスを読み取るには、昇格した権限が必要です。
以下のコマンドを実行してカスタムリソース定義を適用します。
$ oc apply -f ingress-autoscaler.yaml
検証
以下のコマンドを実行して、デフォルトの Ingress Controller が
kube-state-metricsクエリーによって返される値に一致するようにスケールアウトされていることを確認します。grepコマンドを使用して、Ingress Controller YAML ファイルでレプリカの数を検索します。$ oc get -n openshift-ingress-operator ingresscontroller/default -o yaml | grep replicas:openshift-ingressプロジェクトで Pod を取得します。$ oc get pods -n openshift-ingress出力例
NAME READY STATUS RESTARTS AGE router-default-7b5df44ff-l9pmm 2/2 Running 0 17h router-default-7b5df44ff-s5sl5 2/2 Running 0 3d22h router-default-7b5df44ff-wwsth 2/2 Running 0 66s