セキュリティグループのルール、リスナー、その他の変更が Amazon EKS のロードバランサーに戻らないようにする方法を教えてください。

所要時間2分
0

Amazon Elastic Kubernetes サービス (Amazon EKS) のロードバランサーに変更を加えようとすると、変更が自動的に元に戻ります。

簡単な説明

AWS Load Balancer Controller を使用して負荷分散サービスまたは Ingress リソースを作成する場合、コントローラーは多くのデフォルトパラメータを設定します。これには、ヘルスチェックパス、デフォルトタイムアウト、セキュリティグループルールなど、マニフェストファイルで指定しないパラメーターも含まれます。

ただし、AWS API 呼び出しを使用してデフォルト設定を直接変更することはできます。この API 呼び出しは、Amazon Elastic Compute Cloud (Amazon EC2) コンソール、AWS コマンドラインインターフェイス (AWS CLI)、またはその他のサードパーティツールから行うことができます。この場合、コントローラーは次のクラスター調整時にこれらの変更を元の値に戻します。詳細については、Kubernetes Cluster API ウェブサイトの「Controllers and Reconciliation (コントローラーと調整)」を参照してください。

以下の問題は、Amazon EKS のロードバランサーの変更が元に戻されたために一般的に発生します。

  • ロードバランサーのカスタムセキュリティグループルールが自動的に 0.0.0.0/0 に戻るか、表示されなくなる。
  • ロードバランサーが自動的にリスナールールを削除または追加する。
  • カスタムのアイドルタイムアウト値が自動的にデフォルト値に戻る。
  • 証明書が自動的に以前のバージョンに戻る。
  • Amazon EKS が値を元に戻したため、ヘルスチェックパスを更新できない。
  • Amazon EKS がロードバランサーのプロパティを使用してロールを変更する。

これらの問題をトラブルシューティングするには、まずロードバランサーがこれらの変更を行った原因を特定します。具体的には、変更されたリソースに関連する API 呼び出しと、その呼び出しを行ったツールを見つけてください。次に、マニフェストファイルに変更を実装します。

**注:**以下の解決策では、「ロードバランサー」とは、Network Load Balancer や Classic Load Balancer などの負荷分散サービスを指します。または、ロードバランサーは Application Load Balancer などの Ingress リソースである場合もあります。

解決方法

ロードバランサーの予想される状態を定義するには、マニフェストファイルの注釈に変更を指定する必要があります。そうしないと、注釈によって変更がデフォルトの変更されていない値に強制的に戻されます。

AWS API 呼び出しを使用してこれらの値を直接変更しようとすると、コントローラはこれをオフバンドの変更と見なします。次の調整時に、コントローラは変更を元の値に戻し、Kubernetes のサービスマニフェストの設定と同期します。コントローラーが元に戻す属性によっては、サービスのダウンタイムが長くなる可能性があります。

AWS Load Balancer Controller は複数のロジックパスを使用して調整します。次のシナリオでは、aws-load-balancer-controller ポッドが再起動する可能性があります。

  • コントロールプレーン、ワーカーノード、またはプラットフォームのアップグレード
  • ハードウェア障害や健康問題などの根本的な問題によるインスタンスの更新
  • コントローラーポッドの更新、削除、またはパッチ API 呼び出しにつながるすべてのアクティビティ
  • 自動的かつ定期的な調整
    **注:**デフォルトでは、コントローラーの調整期間は 1 時間です。ただし、この機能はバージョン 2.4.7 以前の Amazon EKS では機能しません。

その場合、AWS Load Balancer Controller が調整を開始し、ロードバランサーは最新のマニフェストファイル設定を参照します。以前に API 呼び出しによってロードバランサーに変更を加えた場合、それらの変更は元に戻ります。

変更の原因を特定する

更新されたリソースに関連する API 呼び出しを検索します。AWS CloudTrail で変更が発生した時間枠を検索します。すべての AWS ロードバランサー API 呼び出しについては、「Elastic Load Balancing (ELB) API リファレンス」を参照してください。Amazon EC2 API 呼び出しについては、「 Amazon EC2 API リファレンス」を参照してください。

例えば、コントローラが SecurityGroup ルールを元に戻した場合、API RevokeSecurityGroupIngress が呼び出されていることがわかります。その後、対応する CloudTrail イベントを使用して API ユーザーを識別できます。コントローラが WorkerNode ロールを使用している場合、API 呼び出しを行ったノードのロールが表示されます。

....
"type": "AssumedRole",
"arn": "arn:aws:sts::***********:assumed-role/eksctl-mycluster-NodeInstanceRole/i-***********",
"sessionContext": {
    "sessionIssuer": {
        "type": "Role",
        "arn": "arn:aws:iam::***********:role/eksctl-mycluster-nodegr-NodeInstanceRole",
        "userName": "eksctl-mycluster-nodegr-NodeInstanceRole"
    },
    ...
    eventName ": "
    RevokeSecurityGroupIngress ",
    "userAgent": "elbv2.k8s.aws/v2.4.5 aws-sdk-go/1.42.27 (go1.19.3; linux; amd64)",
    "requestParameters": {
        "groupId": "sg-****",
        "ipPermissions": {
            "items": [{
                        "ipProtocol": "tcp",
                        "fromPort": 443,
                        "toPort": 443,
                        "groups": {},
                        "ipRanges": {
                            "items": [{
                                "cidrIp": "0.0.0.0/0"
                            }]
                        }]

AWS Load Balancer Controller 用の専用のロールを使用している場合、サービスアカウントの AWS Identity and Access Management (IAM) ロールが表示されます。

望ましくない変更を回避する

ロードバランサーの任意のパラメータに対してオフバンドの変更を行わないでください。これには、Amazon EC2 コンソール、AWS CLI、または AWS API を直接呼び出すツールからの変更も含まれます。

たとえば、セキュリティグループのルールを更新したいとします。.spec.loadBalancerSourceRanges または service.beta.kubernetes.io/load-balancer-source-ranges 注釈を使用してください。これらの注釈を使用して、ロードバランサーの CIDR IP アドレスを制限できます。これらの注釈の詳細については、AWS Load Balancer Controller GitHub ウェブサイトの「アクセスコントロール」を参照してください。

タイムアウト値、ヘルスチェックパス、証明書 ARN、およびその他のプロパティを更新するには、マニフェストファイルには適切な注釈のみを使用してください。サポートされているすべてのサービスと Ingress 注釈については、AWS Load Balancer Controller GitHub ウェブサイトの「サービス注釈」と「Ingress 注釈」を参照してください。

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ