Amazon Web Services ブログ

Amazon EKS Windows コンテナで Calico を使用する



この投稿は、ソフトウェア開発エンジニアの Anuj Singh 氏とエンタープライズソリューションアーキテクトの Steven David 氏によって提供されたものです。

このブログ投稿では、Amazon Elastic Kubernetes Service (EKS) で実行されている Calico for Windows コンテナをインストールして使用する方法について、順を追って説明します。

Tigera Calico for Windows は、Kubernetes ベースの Windows ワークロード向けのネットワーキングおよびネットワークセキュリティソリューションです。.NET アプリケーションなどの Windows ワークロードを EKS 環境に移動でき、ネットワークポリシーの適用の管理に Calico を役立てることができます。ネットワークポリシーは、ポッドなどの低レベルのデプロイでネットワークを定義できる AWS セキュリティグループに似ています。

Calico は以前 Amazon EKS Linux 環境で検証されました。プロセスはこちらに記載されています。本日は、EKS Windows ワーカーノードにおける Calico のサポートについて詳しく説明しています。Windows ノードの Calico は、Linux ノードのポッドとは対照的に、Windows サービスとして実行されます。

Tigera Calico for Windows は通常、Tigera の Essentials サブスクリプションサービスを介してエンタープライズグレードのサポートで一般的に利用できます。以下の設定では、EKS_Optimized Tigera Calico バイナリファイルとライセンスキーを取得する必要があります。Tigera サポートに連絡してこれらを入手してください。

以下の手順は、既存の EKS Container Network Interface (CNI) 構成を利用して Calico for Windows を有効にするものであり、カスタム CNI プラグインのインストールは不要です。

前提条件:

  • AWS CLI をインストールして設定します。
  • Linux と Windows の両方のワーカーノードで EKS クラスターをセットアップします。EKS のドキュメントを参照してください。
  • Windows ノードへの RDP クライアントのアクセスを設定します。
  • Tigera から EKS_Optimized-TigeraCalicov3.9.5.zip を取得します。
  • Tigera からライセンスキーを取得します。

このブログでは、以下を行います。

  • EKS コントロールプレーンと Linux ワーカーノードに Calico リソースをインストールします。
  • Calico for Windows を使用するには、ライセンスキーを適用します。
  • Calico を EKS Windows ワーカーノードで Windows サービスとしてセットアップします。
  • デモを実行してネットワークポリシーを適用します。

手順 1: EKS コントロールプレーンと Linux ワーカーノードに Calico リソースをインストールする

Calico for Windows を使用するには、calico daemon-set、いくつかのカスタムリソース定義、適切な cluster-role/role-bindings などのリソースが必要です。kubectl を使用して、以下のようなリソースを作成します。

kubectl apply -f https://eks-windows-calico.s3-us-west-2.amazonaws.com/latest/calico.yaml

Calico daemon-set が実行されていることを確認します。

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

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

注意: これにより、Stars Policy Demo などの Linux ワークロードの Calico サポートも有効になります。

手順 2: Calico for Windows を使用するためのライセンスキーを適用する

Calico リソースをインストールした後、以下のようにライセンスキーを EKS クラスターに適用します。

kubectl apply -f license-key.yaml

ライセンスキーが適用されていることを確認します。

kubectl get licensekeys

手順 3: EKS Windows ワーカーノードで Calico を Windows サービスとしてセットアップする

注意: Calico をインストールするすべての Windows ワーカーノードに次の変更が適用されていることを確認してください。

3.1 EKS Windows ワーカーノードに「EKS_Optimized-TigeraCalicov3.9.zip」をダウンロードして解凍します

Expand-Archive .\EKS_Optimized-TigeraCalicov3.9.5.zip C:\

 

TigerCalicov3.9 ファイル

3.2 Windows ワーカーノードの config.ps1 を変更します。

Calico では、セットアップの一部としていくつかの環境変数を設定する必要があります。これらの構成は「.\TigeraCalico\config.ps1」にあります。このファイルを任意のテキストエディタで開きます。

54 行目の $env:NODENAME の値を Windows ワーカーノード (EC2 インスタンス) のプライベート DNS 名に置き換えます。必ず "" で囲んでください。残りの環境変数はそのままにして、config.ps1 ファイルを保存します。

 

config.ps1 の NODENAME

3.3 install-calico.ps1 スクリプトを実行して Calico サービスをインストールします。

./install-calico.ps1

コンテナ vSwitch の作成により、リモートデスクトップセッションへの接続が一時的に失われる場合があることに注意してください。インストールが完了したら、kubelet サービスを再起動することをお勧めします。

Restart-Service kubelet

3.4 すべての Calico サービスと EKS サービスが実行されていることを確認します。

Get-Service | where Name -Like 'Tigera*' 
Get-Service | where Name -Like 'kube*'

 

サービスが実行されていることを確認します

また、.\TigeraCalico\logs\tiger-node.err と .\TigeraCalico\logs\tigera-felix.err にあるログを調べることで、Calico サービスが正しくインストールされたことを確認することができます。理想的には、これらが空で、エラーがない状態であるべきです。

ステップ 4: デモを実行してネットワークポリシーを適用する

4.1 Windows および Linux デプロイを起動します。

以下のようなポッド仕様を使用して、それぞれのワーカーノードで Windows および Linux ポッドを起動します。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: windows-server-iis
spec:
  selector:
    matchLabels:
      app: windows-server-iis
  replicas: 2
  template:
    metadata:
      labels:
        app: windows-server-iis
    spec:
      containers:
      - name: windows-server-iis
        image: mcr.microsoft.com/windows/servercore:1809
        imagePullPolicy: IfNotPresent
        command:
        - powershell.exe
        - -command
        - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; "
      nodeSelector:
        kubernetes.io/os: windows
    
--- 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        securityContext:
            privileged: true
      nodeSelector:
        beta.kubernetes.io/os: linux

上記のスペックファイルに sample-deployments.yaml という名前を付けて、次のように適用します。

kubectl apply -f sample-deployments.yaml

ポッドが「実行中」の状態であることを確認します。

kubectl get pods -o wide --watch

4.2 ポッド間の ping 接続をテストします。

まず、すべてのポッド間にネットワーク接続があることを確認します。各ポッド内で、他の 2 つのポッドの IP に ping します。以下の <nginx-pod-name> を、クラスターに表示されるポッド名で更新します。

kubectl exec -it <nginx-pod-name> /bin/bash

Linux ポッドから Windows ポッド IP に ping します

同様に、Windows ポッドの 1 つに SSH で接続します。以下の <windows-pod-name> を、クラスターに表示されるポッド名で更新します。

kubectl exec -it <windows-pod-name> powershell

Windows ポッドから ping します

4.3 ネットワークポリシーを適用して ping 接続を制限します。

ネットワークポリシーの仕様を適用して、すべてのポッドへの ping トラフィックを拒否します。

---
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
  name: block-icmp
spec:
  order: 200
  selector: all()
  types:
  - Ingress
  - Egress
  ingress:
  - action: Deny
    protocol: ICMP
  - action: Deny
    protocol: ICMPv6
  egress:
  - action: Deny
    protocol: ICMP
  - action: Deny
    protocol: ICMPv6

上記のスペックファイルに deny-icmp.yaml という名前を付けて、次のように適用します。

kubectl apply -f deny_icmp.yaml

4.4 ポッド間の ping 接続をテストします。

ステップ 4.2 に従って、ping 接続をもう一度確認します。今回は、ポッド間のトラフィックが拒否されていることがわかります。

Linux ポッド内から拒否されたトラフィックを確認しています。

Windows ポッド内から拒否されたトラフィックを確認しています

4.5 適用されたネットワークポリシーを削除します。

ネットワークポリシーをテストしたので、ネットワークポリシーを削除して、ping 接続が再度確立されているかどうかをテストします。

kubectl delete -f deny-icmp.yaml

まとめ

これで完了です。 Tigera Calico for Windows で EKS Windows ワーカーノードを設定することができました。

このブログ投稿では、Amazon EKS Windows ワーカーノードに Tigera Calico をインストールして使用する方法を示しました。このブログ記事に関するコメントやご質問は、以下のコメントセクションからお送りください。