スタンドアロン・プログラムとしてのクラスタ・オートスケーラの作業

Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとしてインストール、構成および使用して、Container Engine for Kubernetes (OKE)を使用して作成したクラスタ内の管理対象ノード・プールのサイズを自動的に変更する方法を確認します。

Kubernetes Cluster Autoscalerをクラスタ・アドオンとしてではなくスタンドアロン・プログラムとして使用すると、次のような構成および継続的なメンテナンスを完全に制御し、責任を負うことができます:

  • クラスタで実行されているKubernetesのバージョンと互換性のあるバージョンのKubernetes Cluster Autoscalerのインストール。
  • 構成引数を正しく指定しています。
  • クラスタを新しいバージョンのKubernetesにアップグレードするときにKubernetes Cluster Autoscalerを手動でアップグレードして、Kubernetes Cluster Autoscalerがクラスタの新しいバージョンのKubernetesと互換性があることを確認します。

次の手順では、Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして実行してノード・プールを管理する方法について説明します:

ステップ1: ノード・プールへのクラスタ・オートスカラー・アクセスを有効にするためのInstance Principalまたはワークロード・アイデンティティ・プリンシパルの設定

ノード・プールを管理するために、Kubernetes Cluster Autoscalerは、他のOracle Cloud Infrastructureサービス・リソースに対してアクションを実行します。OCIサービス・リソースでこれらのアクションを実行するために、Kubernetes Cluster Autoscalerは、認可されたアクター(またはプリンシパル)の資格証明を使用します。現在、次のタイプのプリンシパルを設定して、Kubernetes Cluster AutoscalerがOCIサービス・リソースに対してアクションを実行できるようにします:

  • インスタンス・プリンシパル: Kubernetes Cluster Autoscalerは、実行中のインスタンスのアイデンティティを使用します。
  • ワークロード・アイデンティティ・プリンシパル: Kubernetes Cluster Autoscalerは、Kubernetesクラスタで実行されているワークロード・リソースのアイデンティティを使用します。

ワークロード・アイデンティティ・プリンシパルを使用して、Kubernetes Cluster AutoscalerがOCIサービスおよびリソースにアクセスできるようにすることに注意してください:

  • は、拡張クラスタでサポートされますが、基本クラスタではサポートされません。
  • は、Cluster Autoscalerバージョン1.26 (またはそれ以降)でのみサポートされています

インスタンス・プリンシパルを使用したノード・プールへのアクセスの有効化

インスタンス・プリンシパルを設定して、Kubernetes Cluster AutoscalerがOCIサービス・リソースに対してアクションを実行できるようにします。

インスタンス・プリンシパルを設定するには:

  1. コンソールにログインします。
  2. クラスタ内のワーカー・ノード(コンピュート・インスタンス)を含む新しいコンパートメント・レベルの動的グループを作成します:

    1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ドメイン」をクリックします。「アイデンティティ・ドメイン」で、「動的グループ」をクリックします。
    2. クラスタを含むコンパートメントを選択します。
    3. 動的グループを作成するにはの手順に従って、動的グループに名前を付けます(たとえば、acme-oke-cluster-autoscaler-dyn-grp)。
    4. コンパートメント内のワーカー・ノードを含むルールを次の形式で入力します:

      ALL {instance.compartment.id = '<compartment-ocid>'}

      <compartment-ocid>は、クラスタが属するコンパートメントのOCIDです。

      例:

      ALL {instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa23______smwa'}
    5. 「動的グループの作成」をクリックします。
  3. ワーカー・ノードにノード・プールの管理を許可するポリシーを作成します:

    1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
    2. ポリシーを作成するにはの手順に従って、ポリシーに名前を付けます(たとえば、acme-oke-cluster-autoscaler-dyn-grp-policy)。
    3. ワーカー・ノードがノード・プールを管理できるようにするポリシー・ステートメントを(ワーカー・ノードの初期化に関連する他のポリシー・ステートメントとともに)次の形式で入力します:

      Allow dynamic-group <dynamic-group-name> to manage cluster-node-pools in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to manage instance-family in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to use subnets in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to read virtual-network-family in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to use vnics in compartment <compartment-name>
      Allow dynamic-group <dynamic-group-name> to inspect compartments in compartment <compartment-name>

      ここでは:

      • <dynamic-group-name>は、以前に作成した動的グループの名前です。たとえば、acme-oke-cluster-autoscaler-dyn-grpです動的グループがデフォルトのアイデンティティ・ドメインにない場合は、dynamic-group '<identity-domain-name>'/'<dynamic-group-name>'の形式で、動的グループ名の前にアイデンティティ・ドメイン名を入力します。OCIDを使用して、dynamic-group id <dynamic-group-ocid>の形式で動的グループを指定することもできます。
      • <compartment-name>は、クラスタが属するコンパートメントの名前です。たとえば、acme-oke-cluster-autoscaler-compartmentです

      例:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage cluster-node-pools in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage instance-family in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to read virtual-network-family in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment acme-oke-cluster-autoscaler-compartment
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment acme-oke-cluster-autoscaler-compartment
    4. 「作成」をクリックして、新しいポリシーを作成します。
    ノート

    ノード・プールが1つのコンパートメントに属し、ノード・プールで使用されるネットワーク・リソースが別のコンパートメントに属している場合、両方のコンパートメントに次のようにポリシーを作成する必要があります:

    • ノード・プールのコンパートメントで、次の形式のポリシー・ステートメントを使用してポリシーを作成します:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage cluster-node-pools in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to manage instance-family in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment <nodepool-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment <nodepool-compartment-name>
    • ネットワーク・リソースのコンパートメントで、次の形式のポリシー・ステートメントを使用してポリシーを作成します:

      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use subnets in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to read virtual-network-family in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to use vnics in compartment <network-compartment-name>
      Allow dynamic-group acme-oke-cluster-autoscaler-dyn-grp to inspect compartments in compartment <network-compartment-name>

ワークロード・アイデンティティ・プリンシパルを使用したノード・プールへのアクセスの有効化

Kubernetes Cluster AutoscalerがOCIサービス・リソースに対してアクションを実行できるように、ワークロード・アイデンティティ・プリンシパルを設定できます。ワークロード・アイデンティティ・プリンシパルは、拡張クラスタでのみ使用できます。

ワークロード・アイデンティティ・プリンシパルを設定するには:

  1. クラスタのOCIDを取得します(たとえば、コンソール「クラスタの詳細」タブを使用します)。
  2. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
  3. ポリシーの作成の手順に従って、ポリシーの名前(たとえば、acme-oke-cluster-autoscaler-policy)を指定します。
  4. ノード・プール管理を許可するポリシー・ステートメントを次の形式で入力します:

    Allow any-user to manage cluster-node-pools in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to manage instance-family in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use subnets in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to read virtual-network-family in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 

    ここでは:

    • <compartment-name>は、クラスタが属するコンパートメントの名前です。たとえば、acme-oke-cluster-autoscaler-compartmentです
    • <cluster-ocid>は、以前に取得したクラスタのOCIDです。

    例:

    Allow any-user to manage cluster-node-pools in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to manage instance-family in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to use subnets in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to read virtual-network-family in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to use vnics in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'}
    Allow any-user to inspect compartments in compartment acme-oke-cluster-autoscaler-compartment where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaa______ska'} 
  5. 「作成」をクリックして、新しいポリシーを作成します。
ノート

ノード・プールが1つのコンパートメントに属し、ノード・プールで使用されるネットワーク・リソースが別のコンパートメントに属している場合、両方のコンパートメントに次のようにポリシーを作成する必要があります:

  • ノード・プールのコンパートメントで、次の形式のポリシー・ステートメントを使用してポリシーを作成します:

    Allow any-user to manage cluster-node-pools in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to manage instance-family in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use subnets in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <nodepool-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 
  • ネットワーク・リソースのコンパートメントで、次の形式のポリシー・ステートメントを使用してポリシーを作成します:

    Allow any-user to use subnets in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to read virtual-network-family in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to use vnics in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'}
    Allow any-user to inspect compartments in compartment <network-compartment-name> where ALL {request.principal.type='workload', request.principal.namespace ='kube-system', request.principal.service_account = 'cluster-autoscaler', request.principal.cluster_id = '<cluster-ocid>'} 

ステップ2: Cluster Autoscaler構成ファイルのコピーおよびカスタマイズ

  1. テキスト・エディタで、次の内容のcluster-autoscaler.yamlというファイルを作成します:

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
      name: cluster-autoscaler
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cluster-autoscaler
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    rules:
      - apiGroups: [""]
        resources: ["events", "endpoints"]
        verbs: ["create", "patch"]
      - apiGroups: [""]
        resources: ["pods/eviction"]
        verbs: ["create"]
      - apiGroups: [""]
        resources: ["pods/status"]
        verbs: ["update"]
      - apiGroups: [""]
        resources: ["endpoints"]
        resourceNames: ["cluster-autoscaler"]
        verbs: ["get", "update"]
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["watch", "list", "get", "patch", "update"]
      - apiGroups: [""]
        resources:
          - "pods"
          - "services"
          - "replicationcontrollers"
          - "persistentvolumeclaims"
          - "persistentvolumes"
        verbs: ["watch", "list", "get"]
      - apiGroups: ["extensions"]
        resources: ["replicasets", "daemonsets"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["policy"]
        resources: ["poddisruptionbudgets"]
        verbs: ["watch", "list"]
      - apiGroups: ["apps"]
        resources: ["statefulsets", "replicasets", "daemonsets"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses", "csinodes"]
        verbs: ["watch", "list", "get"]
      - apiGroups: ["batch", "extensions"]
        resources: ["jobs"]
        verbs: ["get", "list", "watch", "patch"]
      - apiGroups: ["coordination.k8s.io"]
        resources: ["leases"]
        verbs: ["create"]
      - apiGroups: ["coordination.k8s.io"]
        resourceNames: ["cluster-autoscaler"]
        resources: ["leases"]
        verbs: ["get", "update"]
      - apiGroups: [""]
        resources: ["namespaces"]
        verbs: ["watch", "list"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["csidrivers", "csistoragecapacities"]
        verbs: ["watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    rules:
      - apiGroups: [""]
        resources: ["configmaps"]
        verbs: ["create","list","watch"]
      - apiGroups: [""]
        resources: ["configmaps"]
        resourceNames: ["cluster-autoscaler-status", "cluster-autoscaler-priority-expander"]
        verbs: ["delete", "get", "update", "watch"]
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: cluster-autoscaler
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-autoscaler
    subjects:
      - kind: ServiceAccount
        name: cluster-autoscaler
        namespace: kube-system
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        k8s-addon: cluster-autoscaler.addons.k8s.io
        k8s-app: cluster-autoscaler
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: cluster-autoscaler
    subjects:
      - kind: ServiceAccount
        name: cluster-autoscaler
        namespace: kube-system
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
      labels:
        app: cluster-autoscaler
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: cluster-autoscaler
      template:
        metadata:
          labels:
            app: cluster-autoscaler
          annotations:
            prometheus.io/scrape: 'true'
            prometheus.io/port: '8085'
        spec:
          serviceAccountName: cluster-autoscaler
          containers:
            - image: iad.ocir.io/oracle/oci-cluster-autoscaler:{{ image tag }}
              name: cluster-autoscaler
              resources:
                limits:
                  cpu: 100m
                  memory: 300Mi
                requests:
                  cpu: 100m
                  memory: 300Mi
              command:
                - ./cluster-autoscaler
                - --v=4
                - --stderrthreshold=info
                - --cloud-provider=oci
                - --max-node-provision-time=25m
                - --nodes=1:5:{{ node pool ocid 1 }}
                - --nodes=1:5:{{ node pool ocid 2 }}
                - --scale-down-delay-after-add=10m
                - --scale-down-unneeded-time=10m
                - --unremovable-node-recheck-timeout=5m
                - --balance-similar-node-groups
                - --balancing-ignore-label=displayName
                - --balancing-ignore-label=hostname
                - --balancing-ignore-label=internal_addr
                - --balancing-ignore-label=oci.oraclecloud.com/fault-domain
              imagePullPolicy: "Always"
              env:
              - name: OKE_USE_INSTANCE_PRINCIPAL
                value: "true"
              - name: OCI_SDK_APPEND_USER_AGENT
                value: "oci-oke-cluster-autoscaler"
  2. 作成したcluster-autoscaler.yamlファイルで、クラスタで実行されているKubernetesのバージョンに対して--cloud-providerパラメータが正しく設定されていることを確認します。デフォルトでは、このパラメータは、クラスタがKubernetesバージョン1.27以降(または1.23以前)を実行しており、ociに設定されていることを前提としています。クラスタでKubernetesバージョン1.26、1.25または1.24が実行されている場合は、--cloud-providerパラメータの値をoci-okeに変更します。
    1. cluster-autoscaler.yamlファイルで、次の行を見つけます:

      - --cloud-provider=oci
    2. クラスタでKubernetesバージョン1.26、1.25または1.24が実行されている場合は、--cloud-providerパラメータの値をoci-okeに変更します:
      - --cloud-provider=oci-oke
    3. cluster-autoscaler.yamlファイルを保存します。
  3. 作成したcluster-autoscaler.yamlファイルで、Kubernetes Cluster Autoscalerイメージのイメージ・パスをOracle Cloud Infrastructure Registryからダウンロードするように変更します。イメージは多くのリージョンで入手できます。最高のパフォーマンスを得るには、クラスタがデプロイされているリージョンに最も近いリージョンを選択します:
    1. cluster-autoscaler.yamlファイルで、次のテンプレート行を見つけます:

      - image: iad.ocir.io/oracle/oci-cluster-autoscaler:{{ image tag }}
    2. Kubernetes Cluster Autoscalerを実行するクラスタの場所およびKubernetesバージョンに応じて、イメージ・パスを次のいずれかに変更します:

      イメージの位置 Kubernetesバージョン イメージ・パス
      ドイツ中央部(フランクフルト) Kubernetes 1.27以上 fra.ocir.io/oracle/oci-cluster-autoscaler:1.27.2-9
      ドイツ中央部(フランクフルト) Kubernetes 1.28以上 fra.ocir.io/oracle/oci-cluster-autoscaler:1.28.2-3
      ドイツ中央部(フランクフルト) Kubernetes 1.29以上 fra.ocir.io/oracle/oci-cluster-autoscaler:1.29.0-10
      ドイツ中央部(フランクフルト) Kubernetes 1.30以上 fra.ocir.io/oracle/oci-cluster-autoscaler:1.30.1-2
      英国南部(ロンドン) Kubernetes 1.27以上 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.27.2-9
      英国南部(ロンドン) Kubernetes 1.28以上 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.28.2-3
      英国南部(ロンドン) Kubernetes 1.29以上 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.29.0-10
      英国南部(ロンドン) Kubernetes 1.30以上 lhr.ocir.io/oracle/oci-cluster-autoscaler:1.30.1-2
      米国東部(アッシュバーン) Kubernetes 1.27以上 iad.ocir.io/oracle/oci-cluster-autoscaler:1.27.2-9
      米国東部(アッシュバーン) Kubernetes 1.28以上 iad.ocir.io/oracle/oci-cluster-autoscaler:1.28.2-3
      米国東部(アッシュバーン) Kubernetes 1.29以上 iad.ocir.io/oracle/oci-cluster-autoscaler:1.29.0-10
      米国東部(アッシュバーン) Kubernetes 1.30以上 iad.ocir.io/oracle/oci-cluster-autoscaler:1.30.1-2
      米国西部(フェニックス) Kubernetes 1.27以上 phx.ocir.io/oracle/oci-cluster-autoscaler:1.27.2-9
      米国西部(フェニックス) Kubernetes 1.28以上 phx.ocir.io/oracle/oci-cluster-autoscaler:1.28.2-3
      米国西部(フェニックス) Kubernetes 1.29以上 phx.ocir.io/oracle/oci-cluster-autoscaler:1.29.0-10
      米国西部(フェニックス) Kubernetes 1.30以上 phx.ocir.io/oracle/oci-cluster-autoscaler:1.30.1-2

      たとえば、英国南リージョンにあるKubernetes 1.30クラスタでKubernetes Cluster Autoscalerを実行する場合は、次のイメージを指定します:

      - image: lhr.ocir.io/oracle/oci-cluster-autoscaler:1.30.1-2
      ヒント

      Cluster Autoscalerイメージを含むOracleリポジトリのいずれとも同じリージョンにないKubernetesクラスタにKubernetes Cluster Autoscalerをデプロイする場合は、次のように、クラスタと同じリージョンにあるリポジトリにイメージをプッシュすることをお薦めします。

      i。 docker pullコマンドを使用して、Oracleリポジトリからイメージをプルします。Docker CLIを使用したイメージのプルを参照してください。

      はい。 (docker tagコマンドを使用して)イメージにタグ付けし、(docker pushコマンドを使用して)Kubernetes Cluster Autoscalerを実行するクラスタと同じリージョンにあるOracle Cloud Infrastructure Registryのリポジトリにイメージをプッシュします。Docker CLIを使用したイメージのプッシュを参照してください。

      iii. cluster-autoscaler.yamlファイルでイメージの場所を指定します。

      ノート

      イメージ検証を有効にしたKubernetesクラスタにKubernetes Cluster Autoscalerをデプロイする場合、単にcluster-autoscaler.yamlファイルでいずれかのOracleリポジトリからのイメージ・パスを指定しないでください。かわりに、次のようにします:

      i。 docker pullコマンドを使用して、Oracleリポジトリからイメージをプルします。Docker CLIを使用したイメージのプルを参照してください。

      はい。 (docker tagコマンドを使用して)イメージにタグ付けし、(docker pushコマンドを使用して)Kubernetes Cluster Autoscalerを実行するクラスタと同じリージョンにあるOracle Cloud Infrastructure Registryのリポジトリにイメージをプッシュします。Docker CLIを使用したイメージのプッシュを参照してください。

      iii. Vaultサービスでマスター・キーとキー・バージョンを使用してイメージに署名し、イメージ署名を作成します。セキュリティのためのイメージの署名を参照してください。

      iv. cluster-autoscaler.yamlファイルで署名済イメージの場所を指定します。イメージ・タグではなくイメージ・ダイジェストを使用してイメージを参照します(レジストリからの署名付きイメージの使用の強制を参照)。

    3. cluster-autoscaler.yamlファイルを保存します。
  4. 作成したcluster-autoscaler.yamlファイルで、Kubernetes Cluster Autoscalerで管理するクラスタの各ノード・プールを指定します。

    cluster-autoscaler.yamlファイルで複数のノード・プールを指定できます。Kubernetes Cluster Autoscalerによって管理されていないノード・プールを常に少なくとも1つ作成することをお薦めします。また、構成ファイルで指定しないノード・プールを手動でスケーリングする必要があります。

    1. cluster-autoscaler.yamlファイルで、次のテンプレート行を見つけます:

      - --nodes=1:5:{{ node pool ocid 1 }}

      --nodesパラメータの形式は次のとおりです:

      --nodes=<min-nodes>:<max-nodes>:<nodepool-ocid>

      ここでは:

      • <min-nodes>は、ノード・プールで許可される最小ノード数です。Kubernetes Cluster Autoscalerは、ノード数をこの数より少なくすることはありません。
      • <max-nodes>は、ノード・プールで許可される最大ノード数です。Kubernetes Cluster Autoscalerは、ノード数をこの数より多くすることはありません。指定するノードの最大数が、ノード・プールに定義されているワーカー・ノード・シェイプのテナンシ制限を超えないようにしてください。
      • <nodepool-ocid>は、1つ以上のノード・プールのOCIDです。
    2. --nodesパラメータの値を次のように変更します:

      • ノード・プールで許可される最小ノード数。例: 1
      • ノード・プールで許可される最大ノード数。例: 5
      • Kubernetes Cluster Autoscalerで管理するノード・プールのOCID。

      例:

      --nodes=1:5:ocid1.nodepool.oc1.iad.aaaaaaaaaeydq...
    3. Kubernetes Cluster Autoscalerでクラスタ内の単一ノード・プールのみを管理する場合は、cluster-autoscaler.yamlファイルで次の行を見つけて削除します:
      - --nodes=1:5:{{ node pool ocid 2 }}
    4. Kubernetes Cluster Autoscalerでクラスタ内の別のノード・プールを管理する場合は、cluster-autoscaler.yamlファイルで次の行を探し、--nodesパラメータに適切な値を設定します:
      - --nodes=1:5:{{ node pool ocid 2 }}
    5. Kubernetes Cluster Autoscalerでより多くのノード・プールを管理する場合は、cluster-autoscaler.yamlファイルに追加の--nodesパラメータを挿入し、それらに適切な値を設定します。
    6. cluster-autoscaler.yamlファイルを保存します。
  5. 作成したcluster-autoscaler.yamlファイルで、Kubernetes Cluster Autoscalerで管理するノード・プールの数に、CPUおよびメモリー制限パラメータのデフォルト値が十分であることを確認します。デフォルトの制限は比較的低いため、Kubernetes Cluster Autoscalerで多数のノード・プールを管理する場合は、制限を増やすことを検討してください。制限を適切な値に設定するのはユーザーの責任です。

    1. cluster-autoscaler.yamlファイルで、次の行を見つけます:

                resources:
                  limits:
                    cpu: 100m
                    memory: 300Mi
    2. CPUおよびメモリー制限を、Kubernetes Cluster Autoscalerで管理するノード・プールの数に適した値に設定します。例:
                resources:
                  limits:
                    cpu: 200m
                    memory: 600Mi
    3. cluster-autoscaler.yamlファイルを保存します。
  6. 作成したcluster-autoscaler.yamlファイルで、Kubernetes Cluster Autoscalerのその他のパラメータを指定します。設定できるパラメータの詳細は、サポートされているKubernetes Cluster Autoscalerパラメータを参照してください。

  7. cluster-autoscaler.yamlファイルを保存して閉じます。

ステップ3: Kubernetes Cluster Autoscalerのクラスタでのデプロイおよびデプロイメントの成功の確認

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. 次のように入力して、Kubernetes Cluster Autoscalerをクラスタにデプロイします:
    kubectl apply -f cluster-autoscaler.yaml
  3. 次のように入力して、Kubernetes Cluster Autoscalerログを表示し、正常にデプロイされ、クラスタ内のノード・プールのワークロードを現在モニターしていることを確認します:
    kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler
  4. 次のように入力して、cluster-autoscaler.yamlファイルに定義されている3つのKubernetes Cluster Autoscalerポッドのうち、現在アクションを実行しているものを特定します:
    kubectl -n kube-system get lease
  5. 次のように入力して、kube-systemネームスペースのconfigmapからKubernetes Cluster Autoscalerの状態の概要を取得します:
    kubectl -n kube-system get cm cluster-autoscaler-status -oyaml

ステップ4: スケーリング操作の表示

デプロイしたKubernetes Cluster Autoscalerが、ノード・プール内のワーカー・ノードを自動的にスケーリングするのをモニターできます。スケーリング操作がよくわかるようにするために、次の提案を検討してください(これらは監視のみを目的としており、本番環境でKubernetes Cluster Autoscalerを使用する場合の推奨事項に示されている推奨事項に反する場合があります):

  • 単一のノード・プール(Kubernetes Cluster Autoscalerによって管理されているノード・プール)を持つクラスタを監視します。
  • 監視するクラスタに複数のノード・プールがある場合は、ポッドをKubernetes Cluster Autoscalerによって管理されている単一ノード・プール上のノードでの実行に制限します。Kubernetesのドキュメントの、ノードへのポッドの割当てを参照してください。
  • Kubernetes Cluster Autoscalerによって管理されているノード・プールのいずれかのノードから開始します。
  • Kubernetes Cluster Autoscaler構成ファイルで、ノード・プールで許可されるノードの最大数を指定します。指定するノードの最大数が、ノード・プールに定義されているワーカー・ノード・シェイプのテナンシ制限を超えないようにしてください。

Kubernetes Cluster Autoscalerによるワーカー・ノードの自動スケーリングを表示するには:

  1. 次のように入力して、クラスタ内のワーカー・ノードの現在の合計数を確認します:
    kubectl get nodes
  2. テキスト・エディタで、次の内容でnginx.yamlというファイルを作成し、サンプルNginxアプリケーションを定義します:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
            resources:
              requests:
                memory: "500Mi"

    リソース・リクエスト制限が設定されていることを確認します。

  3. 次のように入力してサンプル・アプリケーションをデプロイします:
    kubectl create -f nginx.yaml
  4. 次のように入力して、デプロイメントのポッド数を(2から)100に増やします:
    kubectl scale deployment nginx-deployment --replicas=100

    これで、Kubernetes Cluster Autoscalerは、増加したワークロードを満たすためにワーカー・ノードをノード・プールに追加します。

  5. 次のように入力して、デプロイメントのステータスを確認します:
    kubectl get deployment nginx-deployment --watch
  6. 数分後、次のように入力して、クラスタ内のワーカー・ノードの増加した合計数を表示します:
    kubectl get nodes

    表示されるワーカー・ノードの数は、ワーカー・ノードのシェイプおよびKubernetes Cluster Autoscaler構成ファイルで指定されているノードの最大数によって異なります。

ステップ5: クリーンアップ

  1. 次のように入力して、サンプルNginxアプリケーションを削除します:
    kubectl delete deployment nginx-deployment
  2. 10分後、次のように入力して、ワーカー・ノードが元の数に削減されたことを確認します:
    kubectl get nodes

サンプルNginxアプリケーションを削除して待機した後、表示されるワーカー・ノードは少なくなりますが、元の数を超える場合があります。これは、kube-systemポッドがこれらのノードで実行されるようにスケジュールされているためである可能性があります。Autoscalerのskip-nodes-with-system-podsパラメータがデフォルトでtrueに設定されているため、kube-systemポッドはKubernetes Cluster Autoscalerがノードを削除できない可能性があります。