Calico アドオンのインストール - Amazon EKS

Calico アドオンのインストール

プロジェクト Calico は、Kubernetes のネットワークポリシーエンジンです。Calico ネットワークポリシーの適用により、ネットワークセグメンテーションとテナント分離を実装できます。これは、マルチテナント環境でテナントを相互に分離する必要がある場合や、開発、ステージング、本稼働用に個別の環境を構築する場合に便利です。ネットワークポリシーは、ネットワークの入力および出力ルールを作成できる点で AWS セキュリティグループと似ています。インスタンスをセキュリティグループに割り当てるのではなく、pod セレクタとラベルを使用してネットワークポリシーを pods に割り当てます。

考慮事項

  • Amazon EKS で Fargate を使用する場合、Calico はサポートされません。

  • Calico はノード上の iptables にルールを追加します。このルールは Calico の外部で既に実装している既存のルールより、優先度が高いことがあります。Calico ポリシーの外部のルールが Calico によって上書きされるのを防ぐため、既存の iptables ルールを Calico ポリシーに追加することを検討してください。

  • Amazon VPC CNI のアドオンのバージョン 1.10 以前を使用している場合、ブランチネットワークインターフェイス上で pods に向かう、pods 用セキュリティグループ のトラフィックフローは、Calico ネットワークポリシー適用の対象にはなりません。このポリシーの適用は、Amazon EC2 セキュリティグループに限定されます。Amazon VPC CNI アドオンの 1.11.0 以降を使用している場合、Amazon VPC CNI アドオンに POD_SECURITY_GROUP_ENFORCING_MODE=standard を設定すると、ブランチネットワークインターフェイス上の pods へのトラフィックフローは Calico ネットワークポリシーの適用の対象になります。

前提条件

  • 既存の Amazon EKS クラスター。デプロイするには、Amazon EKS の使用開始を参照してください。

  • デバイスまたは AWS CloudShell に、kubectl コマンドラインツールがインストールされていること。バージョンは、ご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが 1.22 の場合、kubectl のバージョン 1.211.22、または 1.23 が使用できます。kubectl をインストールまたはアップグレードする方法については、「kubectl のインストールまたは更新」を参照してください。

以下の手順では、Amazon EKS クラスターの Linux ノードに Calico をインストールする方法を示しています。Windows ノードに Calico をインストールするには、「Amazon EKS Windows コンテナでの Calico の使用」を参照してください。

Amazon EKS Linux ノードに Calico をインストールする

重要

Amazon EKS には、以下の手順で使用されるマニフェストまたはチャートは維持されていません。Amazon EKS に Calico をインストールする際の推奨される方法は、これらのチャートやマニフェストの代わりに、Calico Operator を使用することです。詳細については、「GitHub」の「 Important Announcement: Amazon EKS will no longer maintain and update Calico charts in this repository」(重要なお知らせ: このリポジトリでの Amazon EKS による チャートの維持および更新が終了します) を参照してください。Calico のインストールおよび使用中に問題が発生した場合は、Calico オペレーター および Calico プロジェクトに直接問題を送信してください。クラスターにインストールする際は必ず、新しい Calico オペレーターと Calico のバージョンの互換性について Tigera に問い合わせてください。

Helm またはマニフェストの手順を使用して Calico をインストールできます。

Helm

前提条件

Helm バージョン 3.0 以降がコンピュータにインストールされていることが必要です。Helm をインストールまたは更新する方法については、「Amazon EKS での Helm の使用」を参照してください。

Helm で Calico をインストールするには

  1. プロジェクト Calico を Helm リポジトリに追加します。

    helm repo add projectcalico https://docs.projectcalico.org/charts
  2. Calico をすでに追加している場合は、最新リリース版を入手するために更新することをお勧めします。

    helm repo update
  3. バージョン 3.21.4 以降の Tigera Calico オペレーターおよびカスタムリソース定義をインストールします。

    helm install calico projectcalico/tigera-operator --version v3.21.4
  4. tigera-operator 名前空間内のリソースを表示します。

    kubectl get all -n tigera-operator

    出力例を次に示します。

    replicasetDESIRED 列と READY 列の値が一致するはずです。返された値は、以下の出力の values とは異なります。

    NAME READY STATUS RESTARTS AGE pod/tigera-operator-c4b9549c7-h4zp5 1/1 Running 0 110m ... NAME DESIRED CURRENT READY AGE replicaset.apps/tigera-operator-c4b9549c7 1 1 1 2m35s
  5. calico-system 名前空間内のリソースを表示します。

    kubectl get all -n calico-system

    出力例を次に示します。

    calico-node DaemonSetDESIRED 列と READY 列の値が一致するはずです。二つの replicasetsDESIREDREADY 列の値も一致するはずです。返された値は、以下の出力の values とは異なります。

    NAME READY STATUS RESTARTS AGE pod/calico-kube-controllers-579b45dcf-z5tsf 1/1 Running 0 100m pod/calico-node-v9dhf 1/1 Running 0 100m pod/calico-typha-6f9c6786d-f2mc7 1/1 Running 0 100m ... NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/calico-node 1 1 1 1 1 kubernetes.io/os=linux 100m ... NAME DESIRED CURRENT READY AGE replicaset.apps/calico-kube-controllers-579b45dcf 1 1 1 100m replicaset.apps/calico-typha-6f9c6786d 1 1 1 100m
  6. calico-nodecalico-typha、および tigera-operator pods のいずれかのログに、ERROR が含まれていないことを確認します。次のコマンドの値を前のステップの出力で返された値に置き換えます。

    kubectl logs tigera-operator-c4b9549c7-h4zp5 -n tigera-operator | grep ERROR kubectl logs calico-node-v9dhf -n calico-system | grep ERROR kubectl logs calico-typha-6f9c6786d-f2mc7 -n calico-system | grep ERROR

    前のコマンドからの出力が返されない場合、ERROR はログに存在せず、すべてが正しく実行されているはずです。

Manifests

マニフェストを使用して Calico をインストールするには

  1. Calico マニフェストをクラスターに適用します。これらのマニフェストは calico-system 名前空間に DaemonSet を作成します。

    kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml
  2. calico-system 名前空間内のリソースを表示します。

    kubectl get daemonset calico-node --namespace calico-system

    出力例を次に示します。

    DESIRED 列と READY 列の値は一致するはずです。返された値は、以下の出力の values とは異なります。

    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE calico-node 1 1 1 1 1 kubernetes.io/os=linux 26m

Stars Policy デモ

このセクションは、「プロジェクト Calico のドキュメント」で提供される「Stars ポリシーのデモ」について説明しますが、クラスター上での Calico 機能には必要ありません。このデモでは、Amazon EKS クラスターにフロントエンド、バックエンド、およびクライアントサービスを作成します。また、このデモでは、各サービス間で利用可能な入力および出力のパスを示す管理グラフィカルユーザーインターフェースが作成されます。実稼働ワークロードを実行しないクラスターでデモを完了することをお勧めします。

ネットワークポリシーを作成する前に、サービスはすべて、双方向に通信できます。ネットワークポリシーを適用すると、クライアントはフロントエンドサービスとのみ通信でき、バックエンドはフロントエンドからのみトラフィックを受け付けます。

Stars Policy デモを実行するには

  1. フロントエンド、バックエンド、クライアント、および管理ユーザーインターフェイスサービスを適用します。

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml
  2. クラスター上のすべての pods を表示します。

    kubectl get pods -A

    出力例を次に示します。

    この出力では、下記の出力にある名前空間に pods が表示されます。READY 列内の pod とpods の数 は、下記の出力とは異なります。類似した名前を持ち、それらすべてで STATUS 列内に Running がある pods が表示されるまで、次に進まないでください。

    NAMESPACE NAME READY STATUS RESTARTS AGE ... client client-xlffc 1/1 Running 0 5m19s ... management-ui management-ui-qrb2g 1/1 Running 0 5m24s stars backend-sz87q 1/1 Running 0 5m23s stars frontend-cscnf 1/1 Running 0 5m21s ...
  3. 管理ユーザーインターフェイスに接続するには、ローカルポート 9001 をクラスター上で実行されている management-ui サービスに転送します。

    kubectl port-forward service/management-ui -n management-ui 9001
  4. ローカルシステムでブラウザを開き、http://localhost:9001/ を指定します。管理ユーザーインターフェイスが表示されます。[C] ノードはクライアントサービス、[F] ノードはフロントエンドサービス、[B] ノードはバックエンドサービスを表します。各ノードには、太字の色付きの行で示されるように、他のすべてのノードへの完全な通信アクセスが含まれます。

    
                        オープンネットワークポリシー
  5. 相互にサービスを分離するには、次のネットワークポリシーを適用します。

    kubectl apply -n stars -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/default-deny.yaml kubectl apply -n client -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/default-deny.yaml
  6. ブラウザを更新します。管理ユーザーインターフェイスはノードに到達できなくなるため、ユーザーインターフェイスに表示されないことがわかります。

  7. 管理ユーザーインターフェイスがサービスにアクセスできるように、次のネットワークポリシーを適用します。

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/allow-ui.yaml kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/allow-ui-client.yaml
  8. ブラウザを更新します。管理ユーザーインターフェイスは再びノードにアクセスできますが、ノードは相互に通信できないことがわかります。

    
                        UI アクセスネットワークポリシー
  9. フロントエンドサービスからバックエンドサービスへのトラフィックを許可するには、次のネットワークポリシーを適用します。

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/backend-policy.yaml
  10. ブラウザを更新します。フロントエンドがバックエンドと通信できることがわかります。

    
                        フロントエンドからバックエンドまでのポリシー
  11. クライアントからフロントエンドサービスへのトラフィックを許可するには、次のネットワークポリシーを適用します。

    kubectl apply -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/policies/frontend-policy.yaml
  12. ブラウザを更新します。クライアントがフロントエンドサービスと通信できることがわかります。フロントエンドサービスは、バックエンドサービスと引き続き通信できます。

    
                        最終ネットワークポリシー
  13. (オプション) デモが完了したら、そのリソースを削除することができます。

    kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/04-client.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/03-frontend.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/02-backend.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/01-management-ui.yaml kubectl delete -f https://docs.projectcalico.org/v3.5/getting-started/kubernetes/tutorials/stars-policy/manifests/00-namespace.yaml

    リソースを削除した後でも、ノード上に iptables ルールが残っている場合があり、それがクラスター内のネットワークを予期しない方法で妨げることがあります。Calico を削除する唯一の確実な方法は、すべてのノードを終了してリサイクルすることです。すべてのノードを終了するには、Auto Scaling グループの必要数を 0 に設定してから目的数にバックアップするか、単にノードを終了します。ノードをリサイクルできない場合は、最後の手段として、Calico GitHub リポジトリの 「Calico ポリシーの無効化と削除」を参照してください。

Calico を削除します。

Calico をインストールした方法を使用して Calico を削除します。

Helm

クラスターから Calico を削除します。

helm uninstall calico
Manifests

クラスターから Calico を削除します。

kubectl delete -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml kubectl delete -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml