ネットワーク切断の準備 - Amazon EKS

ネットワーク切断の準備

ローカルネットワークが AWS クラウド との接続を失った場合でも、Outpost のローカルの Amazon EKS クラスターを引き続き使用できます。このトピックでは、ローカルクラスターが接続されていない状態にするための準備に関する重要な考慮事項について説明します

考慮事項

  • ローカルクラスターにより、計画外の一時的なネットワーク切断中も安定してオペレーションを継続できます。AWS Outposts は、データセンター内の AWS クラウド の拡張機能として機能する完全に接続された製品であることに変わりはありません。Outpost と AWS クラウド の間のネットワークが切断された場合、「AWS Outposts ユーザーガイド」の「AWS Outposts rack network troubleshooting checklist」(AWS Outposts ラックネットワークのトラブルシューティングチェックリスト) に従って、接続の復元を試みる必要があります。ローカルクラスターの問題をトラブルシューティングする方法については、「AWS Outposts での Amazon EKS のローカルクラスターのトラブルシューティング」を参照してください。

  • Outposts は、Outpost の接続状態を監視するために使用できる ConnectedStatus 指標を出力します。詳細については、「AWS Outposts ユーザーガイド」の「Outposts Metrics」(Outposts 指標) を参照してください。

  • ローカルクラスターでは、Kubernetes の AWS Identity and Access Management 認証を使用する、デフォルトの認証メカニズムとして IAM を使用します。ネットワークの切断中は IAM を使用できないため、ローカルクラスターは、ネットワークの切断中にクラスターの接続に使用できる x.509 証明書を使用する代替認証メカニズムをサポートします。クラスターの x.509 証明書を取得して使用する方法については、「ネットワーク切断中のローカルクラスターへの認証」を参照してください。

  • ネットワークの切断中に Route 53 にアクセスできない場合は、オンプレミス環境でローカル DNS サーバーを使用することを検討してください。Kubernetes コントロールプレーンインスタンスは静的 IP アドレスを使用します。ローカル DNS サーバーを使用する代わりに、エンドポイントのホスト名と IP アドレスを使用してクラスターに接続するホストを設定できます。詳細については、「AWS Outposts ユーザーガイド」の「DNS」を参照してください。

  • ネットワークの切断中にアプリケーショントラフィックの増加が予想される場合は、クラウドに接続したときにクラスターに予備のコンピューティング容量をプロビジョニングできます。Amazon EC2 インスタンスは AWS Outposts の料金に含まれているため、予備のインスタンスを実行しても AWS 使用コストには影響しません。

  • ネットワークが切断されている間、ワークロードの作成、更新、スケーリングオペレーションを有効にするには、アプリケーションのコンテナイメージにローカルネットワークを介してアクセスでき、クラスターに十分な容量がある必要があります。ローカルクラスターはコンテナレジストリをホストしません。ポッドがそれらのノードで以前に実行されていた場合、コンテナイメージはノードにキャッシュされます。アプリケーションのコンテナイメージをクラウドの Amazon ECR から取得することが多い場合、ネットワークの切断中にワークロードリソースの作成、更新、スケーリングオペレーションが必要になった場合は、ローカルキャッシュまたはレジストリを実行することを検討してください。

  • ローカルクラスターは、Amazon EBS を永続ボリュームのデフォルトストレージクラスとして使用し、Amazon EBS 永続ボリュームのライフサイクルを管理するために Amazon EBS CSI ドライバーを使用しています。ネットワークの切断中は、Amazon EBS によってバックアップされた pods を作成、更新、またはスケーリングすることはできません。これらのオペレーションにはクラウド内の Amazon EBS API への呼び出しが必要だからです。ステートフルワークロードをローカルクラスターにデプロイしていて、ネットワークの切断中に作成、更新、またはスケーリングオペレーションが必要な場合は、別のストレージメカニズムの使用を検討してください。

  • Amazon EKS コントロールプレーンのログは、ネットワークの切断中に Kubernetes コントロールプレーンインスタンスでローカルにキャッシュされます。再接続すると、ログは親 AWS リージョン の CloudWatch Logs に送信されます。Prometheus、Grafana、Amazon EKS パートナーソリューションなどの選択したツールを使用して、Kubernetes API サーバーの指標エンドポイントを使用して、またはログに Fluent Bit を使用してクラスターをローカルで監視できます。

  • アプリケーショントラフィックに Outposts で AWS Load Balancer Controller を使用している場合、AWS Load Balancer Controller が前面にある既存のポッドは、ネットワークの切断中もトラフィックを受信し続けます。ネットワーク切断中に作成された新しいポッドは、Outpost が AWS クラウド に再接続されるまでトラフィックを受信しません。ネットワーク切断中のスケーリングのニーズに対応するために、AWS クラウド に接続している間はアプリケーションのレプリカ数を設定することを検討してください。

  • Amazon VPC CNI plugin for Kubernetes デフォルトはセカンダリ IP モードWARM_ENI_TARGET=1 で構成されているため、プラグインは使用可能な IP アドレスの「完全なエラスティックネットワークインターフェイス」を維持できます。接続されていない状態でのスケーリングのニーズに応じて、WARM_ENI_TARGETWARM_IP_TARGETMINIMUM_IP_TARGET の値を変更することを検討してください。詳細については、「GitHub」の「プラグインの readme ファイル」を参照してください。各インスタンスタイプによりサポートされるポッドの最大数のリストについては、「GitHub」の「eni-max-pods.txt ファイル」を参照してください。

ネットワーク切断中のローカルクラスターへの認証

AWS Identity and Access Management は、ネットワークの切断中は使用できません。切断されている間は、IAM 認証情報を使用してローカルクラスターを認証することはできません。切断時に x509 証明書を使用して、ローカルネットワークを介してクラスターに接続できます。切断時に使用するクライアント X509 証明書をダウンロードして保存する必要があります。このトピックでは、証明書を作成して使用し、クラスターが接続されていない状態のときにクラスターを認証する方法を説明します。

  1. 証明書署名リクエストを作成します。

    1. 証明書署名リクエストを生成します。

      openssl req -new -newkey rsa:4096 -nodes -days 365 \ -keyout admin.key -out admin.csr -subj "/CN=admin"
    2. Kubernetes で証明書署名リクエストを作成します。

      BASE64_CSR=$(cat admin.csr | base64 -w 0) cat << EOF > admin-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: admin-csr spec: signerName: kubernetes.io/kube-apiserver-client request: ${BASE64_CSR} usages: - client auth EOF
  2. kubectl を使用して証明書署名リクエストを作成します。

    kubectl create -f admin-csr.yaml
  3. 証明書登録リクエストのステータスを確認します。

    kubectl get csr admin-csr

    出力例を次に示します。

    NAME AGE REQUESTOR CONDITION admin-csr 11m kubernetes-admin Pending

    Kubernetes が証明書署名リクエストを作成しました。

  4. 証明書署名リクエストを承認します。

    kubectl certificate approve admin-csr
  5. 証明書署名リクエストのステータスが「承認済み」であることを再確認します。

    kubectl get csr admin-csr

    出力例を次に示します。

    NAME AGE REQUESTOR CONDITION admin-csr 11m kubernetes-admin Approved
  6. 証明書を取得して検証します。

    1. 証明書を取得する。

      kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
    2. 証明書を検証する。

      cat admin.crt
  7. admin ユーザーのクラスターロールバインディングを作成します。

    kubectl create clusterrolebinding admin --clusterrole=cluster-admin \ --user=admin --group=system:masters
  8. 接続されていない状態のユーザースコープの kubeconfig を生成します。

    ダウンロードした admin 証明書を使用して kubeconfig ファイルを生成できます。次のコマンドの my-clusterapiserver-endpoint を置き換えます。

    aws eks describe-cluster --name my-cluster \ --query "cluster.certificateAuthority" \ --output text | base64 --decode > ca.crt
    kubectl config --kubeconfig admin.kubeconfig set-cluster my-cluster \ --certificate-authority=ca.crt --server apiserver-endpoint --embed-certs
    kubectl config --kubeconfig admin.kubeconfig set-credentials admin \ --client-certificate=admin.crt --client-key=admin.key --embed-certs
    kubectl config --kubeconfig admin.kubeconfig set-context admin@my-cluster \ --cluster my-cluster --user admin
    kubectl config --kubeconfig admin.kubeconfig use-context admin@my-cluster
  9. kubeconfig ファイルを表示する。

    kubectl get nodes --kubeconfig admin.kubeconfig
  10. Outpost で既にサービスが稼働している場合は、この手順をスキップしてください。Outpost で実行されているサービスが Amazon EKS のみで、その Outpost が現在稼働していない場合は、ネットワークの切断をシミュレートできます。ローカルクラスターで本番環境に入る前に、切断をシミュレートして、接続されていない状態でもクラスターにアクセスできることを確認できます。

    1. Outpostを AWS リージョン に接続するネットワークデバイスにファイアウォールルールを適用します。これにより、Outpost のサービスリンクが切断されます。新しいインスタンスを作成することはできません。現在実行中のインスタンスは、AWS リージョン およびインターネットへの接続を失います。

    2. x509 証明書を使用して、切断時にローカルクラスターへの接続をテストできます。kubeconfig を前の手順で作成した admin.kubeconfig に必ず変更してください。my-cluster の部分は、お客様のローカルクラスター名に置き換えます。

      kubectl config use-context admin@my-cluster --kubeconfig admin.kubeconfig

    ローカルクラスターが接続されていない状態で問題が発生した場合は、サポートチケットを開くことをお勧めします。