この文書は自動機械翻訳技術を使用して翻訳されています。 正確な翻訳を提供するように努めておりますが、翻訳された内容の完全性、正確性、信頼性については一切保証いたしません。 相違がある場合は、元の英語版 英語 が優先され、正式なテキストとなります。

アマゾンクラウドプロバイダーの設定

重要:

Kubernetes 1.27以降では、アウトオブツリーのAWSクラウドプロバイダーを使用する必要があります。インツリーのクラウドプロバイダーは廃止されました。アマゾンクラウドプロバイダーは完全に削除され、Kubernetes 1.27にアップグレードすると機能しません。以下に示す手順は、アマゾンクラウドプロバイダーを設定するために依然として必要です。IAMロールを作成し、ClusterIDを設定した後にアウトオブツリーのクラウドプロバイダーを設定することができます。

Kubernetes 1.26以前では、インツリーからアウトオブツリーのAWSクラウドプロバイダーに移行することもできます。すべての既存のクラスターは、機能を維持するためにv1.27にアップグレードする前に移行する必要があります。

Kubernetes 1.23以降では、インツリーのAWSクラウドプロバイダーを使用するために`CSIMigrationAWS`フィーチャーゲートを無効にする必要があります。これは、クラスターのKubelet、Controller Manager、API Server、およびSchedulerの高度なクラスター設定で`feature-gates=CSIMigrationAWS=false`を追加の引数として設定することで行えます。

Amazonをクラウドプロバイダーとして使用する場合、以下の機能を活用できます:

  • ロードバランサー:`Layer-4 Load Balancer`を*ポートマッピング*で選択したとき、または`Service`を`type: LoadBalancer`で起動したときにAWS Elastic Load Balancer (ELB)を起動します。

  • 永続ボリューム:永続ボリュームにはAWS Elastic Block Store (EBS)を使用します。

アマゾンクラウドプロバイダーに関する詳細は、 cloud-provider-aws READMEを参照してください。

アマゾンクラウドプロバイダーを設定するには、

1.IAMロールを作成し、インスタンスにアタッチします。

クラスターに追加されたすべてのノードは、リソースを作成および削除できるようにEC2と相互作用できる必要があります。インスタンスにアタッチされたIAMロールを使用することで、この相互作用を有効にできます。IAMロールの作成方法については、 Amazonのドキュメント:IAMロールの作成を参照してください。例となるポリシーは2つあります:

  • 最初のポリシーは、`controlplane`ロールを持つノード用です。これらのノードは、EC2リソースを作成/削除できる必要があります。以下のIAMポリシーは一例です。使用ケースに応じて不要な権限は削除するようにしてください。

  • 2つ目のポリシーは、`etcd`または`worker`ロールを持つノード用です。これらのノードは、EC2から情報を取得できる必要があります。

Amazon EC2クラスターを作成する際には、作成したIAMロールの*IAMインスタンスプロファイル*(ARNではなく)の名前を、*ノードテンプレート*作成時に入力する必要があります。

カスタムクラスターを作成する際には、IAMロールをインスタンスに手動でアタッチする必要があります。

`controlplane`ロールを持つノードのIAMポリシー:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeLaunchConfigurations",
        "autoscaling:DescribeTags",
        "ec2:DescribeInstances",
        "ec2:DescribeRegions",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeRouteTables",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVolumes",
        "ec2:CreateSecurityGroup",
        "ec2:CreateTags",
        "ec2:CreateVolume",
        "ec2:ModifyInstanceAttribute",
        "ec2:ModifyVolume",
        "ec2:AttachVolume",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CreateRoute",
        "ec2:DeleteRoute",
        "ec2:DeleteSecurityGroup",
        "ec2:DeleteVolume",
        "ec2:DetachVolume",
        "ec2:RevokeSecurityGroupIngress",
        "ec2:DescribeVpcs",
        "elasticloadbalancing:AddTags",
        "elasticloadbalancing:AttachLoadBalancerToSubnets",
        "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
        "elasticloadbalancing:CreateLoadBalancer",
        "elasticloadbalancing:CreateLoadBalancerPolicy",
        "elasticloadbalancing:CreateLoadBalancerListeners",
        "elasticloadbalancing:ConfigureHealthCheck",
        "elasticloadbalancing:DeleteLoadBalancer",
        "elasticloadbalancing:DeleteLoadBalancerListeners",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeLoadBalancerAttributes",
        "elasticloadbalancing:DetachLoadBalancerFromSubnets",
        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
        "elasticloadbalancing:ModifyLoadBalancerAttributes",
        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
        "elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
        "elasticloadbalancing:AddTags",
        "elasticloadbalancing:CreateListener",
        "elasticloadbalancing:CreateTargetGroup",
        "elasticloadbalancing:DeleteListener",
        "elasticloadbalancing:DeleteTargetGroup",
        "elasticloadbalancing:DescribeListeners",
        "elasticloadbalancing:DescribeLoadBalancerPolicies",
        "elasticloadbalancing:DescribeTargetGroups",
        "elasticloadbalancing:DescribeTargetHealth",
        "elasticloadbalancing:ModifyListener",
        "elasticloadbalancing:ModifyTargetGroup",
        "elasticloadbalancing:RegisterTargets",
        "elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
        "iam:CreateServiceLinkedRole",
        "kms:DescribeKey"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

`etcd`または`worker`ロールを持つノードのIAMポリシー:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeRegions",
        "ec2:DescribeAvailabilityZones",
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:GetRepositoryPolicy",
        "ecr:DescribeRepositories",
        "ecr:ListImages",
        "ecr:BatchGetImage"
      ],
      "Resource": "*"
    }
  ]
}

2.ClusterIDを設定します。

次のリソースには`ClusterID`でタグを付ける必要があります:

  • ノード:Rancherに追加されたすべてのホスト。

  • サブネット:クラスターに使用されるサブネット。

  • セキュリティグループ:クラスターに使用されるセキュリティグループ。

複数のセキュリティグループにタグを付けないでください。複数のグループにタグを付けると、Elastic Load Balancer(ELB)を作成する際にエラーが発生します。

Amazon EC2クラスターを作成すると、作成されたノードのために`ClusterID`が自動的に設定されます。他のリソースはまだ手動でタグを付ける必要があります。

以下のタグを使用してください:

キー = kubernetes.io/cluster/<cluster-id> = owned

タグの値を owned に設定すると、このタグを持つすべてのリソースがこのクラスターによって所有および管理されていることをクラスターに伝えます。

クラスター間でリソースを共有する場合、タグを次のように変更できます:

キー = kubernetes.io/cluster/<cluster-id> = shared

文字列値 <cluster-id> は、Kubernetes クラスターの ID です。

リソースに複数の所有または共有タグを付けないでください。

Amazon Elastic Container Registry (ECR) を使用する

kubelet コンポーネントは、IAM ロールを作成し、インスタンスにアタッチする で言及された IAM プロファイルがインスタンスにアタッチされている場合、ECR 認証情報を自動的に取得する能力があります。Kubernetes バージョンが v1.15.0 より古い場合、Amazon クラウドプロバイダーをクラスターで構成する必要があります。Kubernetes バージョン v1.15.0 以降では、kubelet はクラスターで Amazon クラウドプロバイダーを構成しなくても ECR 認証情報を取得できます。

Out-of-Tree AWS クラウドプロバイダーを使用する

  • RKE2

  • RKE

  1. ノード名の規則とその他の前提条件 は、クラウドプロバイダーがインスタンスを正しく見つけるために従う必要があります。

  2. Rancher が管理する RKE2/K3s クラスターは、providerID の構成をサポートしていません。ただし、次の設定がプロビジョニング クラスターオブジェクトに設定されている場合、エンジンはノード名を正しく設定します:

    spec:
      rkeConfig:
        machineGlobalConfig:
          cloud-provider-name: aws

    このオプションは、ノード上で実行されるさまざまな Kubernetes コンポーネントの設定に渡され、インツリーのプロバイダーが意図せずに実行されないように、コンポーネントごとにオーバーライドする必要があります:

    Etcd でのオーバーライド:

    spec:
      rkeConfig:
        machineSelectorConfig:
          - config:
              kubelet-arg:
                - cloud-provider=external
            machineLabelSelector:
              matchExpressions:
                - key: rke.cattle.io/etcd-role
                  operator: In
                  values:
                    - 'true'

    コントロールプレーンでのオーバーライド:

    spec:
      rkeConfig:
        machineSelectorConfig:
          - config:
            disable-cloud-controller: true
            kube-apiserver-arg:
              - cloud-provider=external
            kube-controller-manager-arg:
              - cloud-provider=external
            kubelet-arg:
              - cloud-provider=external
            machineLabelSelector:
              matchExpressions:
                - key: rke.cattle.io/control-plane-role
                  operator: In
                  values:
                    - 'true'

    ワーカーでのオーバーライド:

    spec:
      rkeConfig:
        machineSelectorConfig:
          - config:
              kubelet-arg:
                - cloud-provider=external
            machineLabelSelector:
              matchExpressions:
                - key: rke.cattle.io/worker-role
                  operator: In
                  values:
                    - 'true'
  3. プロバイダー ID を設定するために上記のメカニズムに依存する場合は Amazon を選択してください。そうでない場合は、Kubernetes コンポーネントのために --cloud-provider=external を設定する 外部 (アウトオブツリー) クラウドプロバイダーを選択してください。

  4. aws-cloud-controller-manager Helmチャートを追加のマニフェストとして指定します。

    spec:
      rkeConfig:
        additionalManifest: |-
          apiVersion: helm.cattle.io/v1
          kind: HelmChart
          metadata:
            name: aws-cloud-controller-manager
            namespace: kube-system
          spec:
            chart: aws-cloud-controller-manager
            repo: https://kubernetes.github.io/cloud-provider-aws
            targetNamespace: kube-system
            bootstrap: true
            valuesContent: |-
              hostNetworking: true
              nodeSelector:
                node-role.kubernetes.io/control-plane: "true"
              args:
                - --configure-cloud-routes=false
                - --v=5
                - --cloud-provider=aws
  1. クラウドプロバイダーがインスタンスを正しく見つけられるように、 ノード名の規則とその他の前提条件を遵守する必要があります。Rancherが提供するクラスターでは、`providerID`の設定はサポートされていません。

    IPベースの命名を使用する場合、ノードはインスタンスの名前の後に地域のドメイン名(ip-xxx-xxx-xxx-xxx.ec2.<region>.internal)を付けて名付ける必要があります。DHCPオプションにカスタムドメイン名が設定されている場合は、この命名規則に従って`--hostname-override`を`kube-proxy`と`kubelet`に設定する必要があります。

    ノード名の規則を満たすために、Rancherは`External Amazon`クラウドプロバイダーが選択されているときに`useInstanceMetadataHostname`を設定することを許可します。useInstanceMetadataHostname`を有効にすると、ec2メタデータサービスにクエリを実行し、`kubelet`および`kube-proxy`のために/hostname`を`hostname-override`として設定します。

    rancher_kubernetes_engine_config:
      cloud_provider:
        name: external-aws
        useInstanceMetadataHostname: true

    カスタムクラスターの`hostname-override`に対してカスタム値を設定する際には、useInstanceMetadataHostname`を有効にしてはいけません。カスタムクラスターを作成する際には、--node-name`を`docker run`ノード登録コマンドに追加して、hostname-override --を設定します。例えば、`"$(hostname -f)"`のように。これは手動で行うこともできますし、Rancher UIの*詳細オプションを表示*を使用して*ノード名*を追加することでもできます。

  2. クラウドプロバイダーを選択します。

    *外部Amazon(アウトオブツリー)*を選択すると、--cloud-provider=external`が設定され、`useInstanceMetadataHostname`が有効になります。ステップ1で述べたように、`useInstanceMetadataHostname`を有効にすると、EC2メタデータサービスがクエリされ、http://169.254.169.254/latest/meta-data/hostname`が`hostname-override`として`kubelet`と`kube-proxy`に設定されます。

    カスタムクラスターのために`node-name`を介してカスタムノード名を設定する際には、`useInstanceMetadataHostname`を無効にする必要があります。

    rancher_kubernetes_engine_config:
      cloud_provider:
        name: external-aws
        useInstanceMetadataHostname: true/false

    *外部*クラウドプロバイダーを使用している既存のクラスターは、Kubernetesコンポーネントのために`--cloud-provider=external`を設定しますが、ノード名は設定しません。

  3. クラスターのプロビジョニングが完了した後にAWSクラウドコントローラーマネージャーをインストールします。クラウドコントローラーマネージャーをデプロイするまで、クラスターは正常にプロビジョニングされておらず、ノードはまだ`uninitialized`状態にあることに注意してください。これは手動で行うこともできますし、UIのHelmチャートを介して行うこともできます。

    クラウドコントローラーマネージャーの公式AWSアップストリームドキュメントを参照してください。

CLIからのHelmチャートのインストール

  • RKE2

  • RKE

Helmチャートのインストールに関する公式アップストリームドキュメントはGitHubで見つけることができます。

  1. Helmリポジトリを追加します:

    helm repo add aws-cloud-controller-manager https://kubernetes.github.io/cloud-provider-aws
    helm repo update
  2. デフォルトの`values.yaml`を上書きするために、次の内容を持つ`values.yaml`ファイルを作成します:

    # values.yaml
    hostNetworking: true
    tolerations:
      - effect: NoSchedule
        key: node.cloudprovider.kubernetes.io/uninitialized
        value: 'true'
      - effect: NoSchedule
        value: 'true'
        key: node-role.kubernetes.io/control-plane
    nodeSelector:
      node-role.kubernetes.io/control-plane: 'true'
    args:
      - --configure-cloud-routes=false
      - --use-service-account-credentials=true
      - --v=2
      - --cloud-provider=aws
    clusterRoleRules:
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - create
          - patch
          - update
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - '*'
      - apiGroups:
          - ""
        resources:
          - nodes/status
        verbs:
          - patch
      - apiGroups:
          - ""
        resources:
          - services
        verbs:
          - list
          - patch
          - update
          - watch
      - apiGroups:
          - ""
        resources:
          - services/status
        verbs:
          - list
          - patch
          - update
          - watch
      - apiGroups:
         - ''
        resources:
          - serviceaccounts
        verbs:
        - create
        - get
      - apiGroups:
          - ""
        resources:
          - persistentvolumes
        verbs:
          - get
          - list
          - update
          - watch
      - apiGroups:
          - ""
        resources:
          - endpoints
        verbs:
          - create
          - get
          - list
          - watch
          - update
      - apiGroups:
          - coordination.k8s.io
        resources:
          - leases
        verbs:
          - create
          - get
          - list
          - watch
          - update
      - apiGroups:
          - ""
        resources:
          - serviceaccounts/token
        verbs:
          - create
  3. Helmチャートをインストールします:

    helm upgrade --install aws-cloud-controller-manager aws-cloud-controller-manager/aws-cloud-controller-manager --values values.yaml

    Helmチャートが正常にインストールされたことを確認します:

    helm status -n kube-system aws-cloud-controller-manager
  4. (オプション)クラウドコントローラーマネージャーの更新が成功したことを確認します:

    kubectl rollout status daemonset -n kube-system aws-cloud-controller-manager

Helmチャートのインストールに関する公式アップストリームドキュメントはGitHubで見つけることができます。

  1. Helmリポジトリを追加します:

    helm repo add aws-cloud-controller-manager https://kubernetes.github.io/cloud-provider-aws
    helm repo update
  2. デフォルトの`values.yaml`を上書きするために、次の内容を持つ`values.yaml`ファイルを作成します:

    # values.yaml
    hostNetworking: true
    tolerations:
      - effect: NoSchedule
        key: node.cloudprovider.kubernetes.io/uninitialized
        value: 'true'
      - effect: NoSchedule
        value: 'true'
        key: node-role.kubernetes.io/controlplane
    nodeSelector:
      node-role.kubernetes.io/controlplane: 'true'
    args:
      - --configure-cloud-routes=false
      - --use-service-account-credentials=true
      - --v=2
      - --cloud-provider=aws
    clusterRoleRules:
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - create
          - patch
          - update
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - '*'
      - apiGroups:
          - ""
        resources:
          - nodes/status
        verbs:
          - patch
      - apiGroups:
          - ""
        resources:
          - services
        verbs:
          - list
          - patch
          - update
          - watch
      - apiGroups:
          - ""
        resources:
          - services/status
        verbs:
          - list
          - patch
          - update
          - watch
      - apiGroups:
         - ''
        resources:
          - serviceaccounts
        verbs:
        - create
        - get
      - apiGroups:
          - ""
        resources:
          - persistentvolumes
        verbs:
          - get
          - list
          - update
          - watch
      - apiGroups:
          - ""
        resources:
          - endpoints
        verbs:
          - create
          - get
          - list
          - watch
          - update
      - apiGroups:
          - coordination.k8s.io
        resources:
          - leases
        verbs:
          - create
          - get
          - list
          - watch
          - update
      - apiGroups:
          - ""
        resources:
          - serviceaccounts/token
        verbs:
          - create
  3. Helmチャートをインストールします:

    helm upgrade --install aws-cloud-controller-manager -n kube-system aws-cloud-controller-manager/aws-cloud-controller-manager --values values.yaml

    Helmチャートが正常にインストールされたことを確認します:

    helm status -n kube-system aws-cloud-controller-manager
  4. 存在する場合、デーモンセットを編集してデフォルトのノードセレクター`node-role.kubernetes.io/control-plane: ""`を削除します:

    kubectl edit daemonset aws-cloud-controller-manager -n kube-system
  5. (オプション)クラウドコントローラーマネージャーの更新が成功したことを確認します:

    kubectl rollout status daemonset -n kube-system aws-cloud-controller-manager

UIからのHelmチャートのインストール

  • RKE2

  • RKE

  1. *☰*をクリックし、左側のナビゲーションからクラスターの名前を選択します。

  2. アプリ > *リポジトリ*を選択します。

  3. Create]ボタンをクリックします。

  4. https://kubernetes.github.io/cloud-provider-aws*インデックスURL*フィールドにを入力します。

  5. 左側のナビゲーションから*アプリ* > *チャート*を選択し、*aws-cloud-controller-manager*をインストールします。

  6. ネームスペース`kube-system`を選択し、*インストール前にHelmオプションをカスタマイズする*を有効にします。

  7. 次のコンテナ引数を追加します:

      - '--use-service-account-credentials=true'
      - '--configure-cloud-routes=false'
  8. `get`内の`verbs`リソースに対して、`serviceaccounts`に`clusterRoleRules`を追加します。これにより、クラウドコントローラーマネージャーは起動時にサービスアカウントを取得できるようになります。

      - apiGroups:
          - ''
        resources:
          - serviceaccounts
        verbs:
          - create
          - get
  9. Rancherによって提供されたRKE2ノードは`node-role.kubernetes.io/control-plane`で汚染されています。トレランスとノードセレクターを更新します:

    tolerations:
      - effect: NoSchedule
        key: node.cloudprovider.kubernetes.io/uninitialized
        value: 'true'
      - effect: NoSchedule
        value: 'true'
        key: node-role.kubernetes.io/control-plane
    nodeSelector:
      node-role.kubernetes.io/control-plane: 'true'

    現在、ノードセレクターはRancher UIから更新できない 既知の問題があります。 チャートのインストールを続行し、デーモンセットを手動で編集して`nodeSelector`を設定します:

    +

    nodeSelector:
      node-role.kubernetes.io/control-plane: 'true'
  10. チャートをインストールし、デーモンセット`aws-cloud-controller-manager`が実行中であることを確認します。対象のネームスペース(ステップ6で変更されていない場合は`kube-system`)で`aws-cloud-controller-manager`ポッドが実行されていることを確認します。

  1. *☰*をクリックし、左側のナビゲーションからクラスターの名前を選択します。

  2. アプリ > *リポジトリ*を選択します。

  3. Create]ボタンをクリックします。

  4. https://kubernetes.github.io/cloud-provider-aws*インデックスURL*フィールドにを入力します。

  5. 左側のナビゲーションから*アプリ* > *チャート*を選択し、*aws-cloud-controller-manager*をインストールします。

  6. ネームスペース`kube-system`を選択し、*インストール前にHelmオプションをカスタマイズする*を有効にします。

  7. 次のコンテナ引数を追加します:

      - '--use-service-account-credentials=true'
      - '--configure-cloud-routes=false'
  8. `get`内の`verbs`リソースに対して、`serviceaccounts`に`clusterRoleRules`を追加します。これにより、クラウドコントローラーマネージャーは起動時にサービスアカウントを取得できるようになります:

      - apiGroups:
          - ''
        resources:
          - serviceaccounts
        verbs:
          - create
          - get
  9. RancherによってプロビジョニングされたRKEノードは`node-role.kubernetes.io/controlplane`で汚染されています。トレランスとノードセレクターを更新します:

    tolerations:
      - effect: NoSchedule
        key: node.cloudprovider.kubernetes.io/uninitialized
        value: 'true'
      - effect: NoSchedule
        value: 'true'
        key: node-role.kubernetes.io/controlplane
    nodeSelector:
      node-role.kubernetes.io/controlplane: 'true'

    現在、 既知の問題があり、`nodeSelector`はRancher UIから更新できません。 チャートのインストールを続け、その後手動でデーモンセットを編集して`nodeSelector`を設定します:

    +

    nodeSelector:
      node-role.kubernetes.io/controlplane: 'true'
  10. チャートをインストールし、デーモンセット `aws-cloud-controller-manager`が正常にデプロイされることを確認します:

    kubectl rollout status deployment -n kube-system aws-cloud-controller-manager