ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する - Amazon EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

ハイブリッドノード用に Kubernetes ネットワークポリシーを設定する

AWS は、EKS Hybrid Nodes と共に Cilium を CNI として使用する際に、ポッドの受信トラフィックと送信トラフィック用に Kubernetes ネットワークポリシー (レイヤー 3/レイヤー 4) をサポートします。AWS クラウド内のノードで EKS クラスターを実行している場合、AWS は Kubernetes ネットワークポリシー用の Amazon VPC CNI をサポートします。

このトピックでは、EKS Hybrid Nodes で Cilium および Kubernetes ネットワークポリシーを設定する方法について説明します。Kubernetes ネットワークポリシーの詳細については、Kubernetes のドキュメントの「Kubernetes Network Policies」を参照してください。

ネットワークポリシーの設定

考慮事項

  • AWS は、ポッドの送受信に関するアップストリームの Kubernetes ネットワークポリシーと仕様をサポートしています。AWS は、現時点では CiliumNetworkPolicyCiliumClusterwideNetworkPolicy をサポートしていません。

  • policyEnforcementMode Helm 値を使用すると、デフォルトの Cilium ポリシーの適用動作を制御できます。デフォルトの動作では、すべての送受信トラフィックが許可されます。ネットワークポリシーによってエンドポイントが選択されると、default-deny 状態に遷移して、明示的に許可したトラフィックのみが許可されます。デフォルトポリシーモードポリシー適用モードの詳細については、Cilium のドキュメントを参照してください。

  • 既存の Cilium インストールで policyEnforcementMode を変更する場合は、Cilium エージェント DaemonSet を再起動して、変更後のポリシー適用モードを適用する必要があります。

  • namespaceSelector および podSelector を使用すると、ラベルが一致する名前空間およびポッドに対してトラフィックを許可または拒否できます。namespaceSelector および podSelectormatchLabels または matchExpressions と共に使用すると、それぞれのラベルに基づいて名前空間とポッドを選択できます。

  • ingress.ports および egress.ports を使用すると、ポートおよびプロトコルに対してトラフィックを許可または拒否できます。

  • ipBlock フィールドでは、ポッド IP アドレス (#9209) に対してトラフィックを選択的に許可または拒否することはできません。ノード IP に ipBlock セレクターを使用する機能は、Cilium のベータ機能であり、AWS ではサポートされていません。

  • Kubernetes ネットワークポリシーに使用可能なフィールドの詳細については、Kubernetes のドキュメントの「NetworkPolicy resource」を参照してください。

前提条件

手順

次の手順では、コンポーネントがアプリケーションの動作に必要な他のコンポーネントとのみ通信できるように、サンプルマイクロサービスアプリケーション用のネットワークポリシーを設定します。この手順では、Istio Bookinfo サンプルマイクロサービスアプリケーションを使用します。

Bookinfo アプリケーションは、4 つの個別のマイクロサービスで構成されており、以下のような関係があります。

  • productpage。productpage マイクロサービスは、details マイクロサービスと reviews マイクロサービスを呼び出して、ページに値を入力します。

  • details。details マイクロサービスには、書籍情報が含まれています。

  • reviews。reviews マイクロサービスには、書籍レビューが含まれています。また、ratings マイクロサービスも呼び出します。

  • ratings。ratings マイクロサービスには、書籍レビューに伴う書籍ランキング情報が含まれています。

    1. サンプルアプリケーションを作成します。

      kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
    2. サンプルアプリケーションが正常に動作していることを確認し、productpage マイクロサービスのポッド IP アドレスを書き留めます。後続のステップでは、このポッド IP アドレスを使用して、各マイクロサービスをクエリします。

      kubectl get pods -o wide
      NAME READY STATUS RESTARTS AGE IP NODE details-v1-766844796b-9wff2 1/1 Running 0 7s 10.86.3.7 mi-0daa253999fe92daa productpage-v1-54bb874995-lwfgg 1/1 Running 0 7s 10.86.2.193 mi-082f73826a163626e ratings-v1-5dc79b6bcd-59njm 1/1 Running 0 7s 10.86.2.232 mi-082f73826a163626e reviews-v1-598b896c9d-p2289 1/1 Running 0 7s 10.86.2.47 mi-026d6a261e355fba7 reviews-v2-556d6457d-djktc 1/1 Running 0 7s 10.86.3.58 mi-0daa253999fe92daa reviews-v3-564544b4d6-g8hh4 1/1 Running 0 7s 10.86.2.69 mi-09183e8a3d755abf6
    3. ネットワークポリシーをテストするために全体を通して使用されるポッドを作成します。このポッドは、access: true というラベルが付けられて default 名前空間に作成されることに注意してください。

      kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
    4. productpage マイクロサービスへのアクセスをテストします。以下の例では、productpage ポッド (10.86.2.193) のポッド IP アドレスを使用して、マイクロサービスをクエリしています。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

      curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
      <title>Simple Bookstore App</title>
    5. exit と入力してテスト用 curl ポッドを終了し、次のコマンドを実行してポッドに再アタッチできます。

      kubectl attach curl-pod -c curl-pod -i -t
    6. 以降の手順でネットワークポリシーの効果を実証するには、まず BookInfo マイクロサービスに対するトラフィックをすべて拒否するネットワークポリシーを作成します。deny ネットワークポリシーを定義するファイルを network-policy-deny-bookinfo.yaml という名前で作成します。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-bookinfo namespace: default spec: podSelector: matchExpressions: - key: app operator: In values: ["productpage", "details", "reviews", "ratings"] policyTypes: - Ingress - Egress
    7. クラスターに deny ネットワークポリシーを適用します。

      kubectl apply -f network-policy-default-deny-bookinfo.yaml
    8. BookInfo アプリケーションへのアクセスをテストします。以下の例では、productpage ポッド (10.86.2.193) のポッド IP アドレスを使用して、マイクロサービスをクエリしています。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

      curl http://10.86.2.193:9080/productpage --max-time 10
      curl: (28) Connection timed out after 10001 milliseconds
    9. productpage ネットワークポリシーを定義するファイルを network-policy-productpage.yaml という名前で作成します。このポリシーには、以下のルールがあります。

      • access: true というラベルが付いたポッド (前のステップで作成した curl ポッド) からの受信トラフィックを許可する

      • ポート 9080 で、details、reviews、ratings の各マイクロサービスに関する送信 TCP トラフィックを許可する

      • ポート 53 で、kube-system 名前空間内で動作する CoreDNS に関する送信 TCP/UDP トラフィックを許可する

        apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: productpage-policy namespace: default spec: podSelector: matchLabels: app: productpage policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: access: "true" egress: - to: - podSelector: matchExpressions: - key: app operator: In values: ["details", "reviews", "ratings"] ports: - port: 9080 protocol: TCP - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
    10. クラスターに productpage ネットワークポリシーを適用します。

      kubectl apply -f network-policy-productpage.yaml
    11. curl ポッドに接続して、Bookinfo アプリケーションへのアクセスをテストします。productpage マイクロサービスへのアクセスが許可されるようになりましたが、他のマイクロサービスは依然として deny ネットワークポリシーの対象であるため、引き続き拒否されます。以下の例では、productpage ポッド (10.86.2.193) のポッド IP アドレスを使用して、マイクロサービスをクエリします。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

      kubectl attach curl-pod -c curl-pod -i -t
      curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
      curl -s http://10.86.2.193:9080/api/v1/products/1 {"error": "Sorry, product details are currently unavailable for this book."}
      curl -s http://10.86.2.193:9080/api/v1/products/1/reviews {"error": "Sorry, product reviews are currently unavailable for this book."}
      curl -s http://10.86.2.193:9080/api/v1/products/1/ratings {"error": "Sorry, product ratings are currently unavailable for this book."}
    12. details ネットワークポリシーを定義するファイルを network-policy-details.yaml という名前で作成します。このポリシーは、productpage マイクロサービスからの受信トラフィックのみを許可します。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: details-policy namespace: default spec: podSelector: matchLabels: app: details policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: productpage
    13. reviews ネットワークポリシーを定義するファイルを network-policy-reviews.yaml という名前で作成します。このポリシーは、productpage マイクロサービスからの受信トラフィックと、ratings マイクロサービスと CoreDNS への送信トラフィックのみを許可します。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: reviews-policy namespace: default spec: podSelector: matchLabels: app: reviews policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: productpage egress: - to: - podSelector: matchLabels: app: ratings - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
    14. ratings ネットワークポリシーを定義するファイルを network-policy-ratings.yaml という名前で作成します。このポリシーは、productpage マイクロサービスと reviews マイクロサービスからの受信トラフィックのみを許可します。

      apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ratings-policy namespace: default spec: podSelector: matchLabels: app: ratings policyTypes: - Ingress ingress: - from: - podSelector: matchExpressions: - key: app operator: In values: ["productpage", "reviews"]
    15. クラスターに details、reviews、ratings の各ネットワークポリシーを適用します。

      kubectl apply -f network-policy-details.yaml kubectl apply -f network-policy-reviews.yaml kubectl apply -f network-policy-ratings.yaml
    16. curl ポッドに接続して、Bookinfo アプリケーションへのアクセスをテストします。以下の例では、productpage ポッド (10.86.2.193) のポッド IP アドレスを使用して、マイクロサービスをクエリします。この IP アドレスをお使いの環境の productpage ポッドのポッド IP アドレスに置き換えます。

      kubectl attach curl-pod -c curl-pod -i -t

      details マイクロサービスをテストします。

      curl -s http://10.86.2.193:9080/api/v1/products/1
      {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}

      reviews マイクロサービスをテストします。

      curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
      {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}

      ratings マイクロサービスをテストします。

      curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
      {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
    17. この手順で作成したリソースをクリーンアップします。

      kubectl delete -f network-policy-deny-bookinfo.yaml kubectl delete -f network-policy-productpage.yaml kubectl delete -f network-policy-details.yaml kubectl delete -f network-policy-reviews.yaml kubectl delete -f network-policy-ratings.yaml kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml kubectl delete pod curl-pod