Calico ネットワーク ポリシーを使用してポッド トラフィックをセキュリティで保護する

適用対象: AKS on Azure Stack HCI 22H2、AKS on Windows Server

このステップ バイ ステップ ガイドを使用して、基本的なポッド間接続を確認して試し、Azure Arc デプロイによって有効になっている AKS 内のクラスター内の Calico ネットワーク ポリシーを使用します。 この記事では、Linux ノードと Windows ノードでクライアント ポッドとサーバー ポッドを作成し、ポッド間の接続を確認してから、基本的なネットワーク ポリシーを適用して AKS Arc でポッド トラフィックを分離する方法について説明します。

前提条件

AKS Arc をデプロイするには、手順に従って AKS ホストを設定します

このガイドを使用するには、次のものが必要です。

  • AKS ワークロード クラスター。
  • 少なくとも 1 つの Windows ワーカー ノードがクラスターに展開されている。
  • 少なくとも 1 つの Linux ワーカー ノードがクラスターに展開されている。
  • ワークロード クラスターの作成時に、Calico ネットワーク プラグインを有効にする必要があります。 このプラグインが有効になっていない場合は、「 New-AksHciCluster」を参照してください。

Linux ノードにポッドを作成する

最初に、Linux ノードにクライアント ポッド、busybox、およびサーバー ポッド nginx を作成します。

"policy-demo-linux.yaml" という名前の YAML ファイルを作成します

apiVersion: v1
kind: Namespace
metadata:
  name: calico-demo

---

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: busybox
  name: busybox
  namespace: calico-demo
spec:
  containers:
  - args:
    - /bin/sh
    - -c
    - sleep 360000
    image: busybox:1.28
    imagePullPolicy: Always
    name: busybox
  nodeSelector:
    beta.kubernetes.io/os: linux

---

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: calico-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.8
    ports:
    - containerPort: 80
  nodeSelector:
    beta.kubernetes.io/os: linux

Kubernetes クラスターに policy-demo-linux.yaml ファイルを適用します

PowerShell ウィンドウを開き、 コマンドを使用してターゲット クラスターの資格情報を Get-AksHciCredential 読み込みます。

次に、 を使用 kubectl して、次のように構成を policy-demo-linux.yaml 適用します。

kubectl apply -f policy-demo-linux.yaml

ウィンドウ ノードにポッドを作成する

Windows ノードでクライアント ポッド pwsh とサーバーポッド porter を作成します。

注意

ポッドのマニフェストには、mcr.microsoft.com/windows/servercore:1809 に基づくイメージを使用し ます。 より新しいバージョンの Windows Server を使用している場合は、Windows Server のバージョンと一致する Server Core イメージを使用するようにマニフェストを更新します。

policy-demo-windows.yaml を作成する

apiVersion: v1
kind: Pod
metadata:
  name: pwsh
  namespace: calico-demo
  labels:
    app: pwsh
spec:
  containers:
  - name: pwsh
    image: mcr.microsoft.com/windows/servercore:1809
    args:
    - powershell.exe
    - -Command
    - "Start-Sleep 360000"
    imagePullPolicy: IfNotPresent
  nodeSelector:
    kubernetes.io/os: windows
---
apiVersion: v1
kind: Pod
metadata:
  name: porter
  namespace: calico-demo
  labels:
    app: porter
spec:
  containers:
  - name: porter
    image: calico/porter:1809
    ports:
    - containerPort: 80
    env:
    - name: SERVE_PORT_80
      value: This is a Calico for Windows demo.
    imagePullPolicy: IfNotPresent
  nodeSelector:
    kubernetes.io/os: windows

Kubernetes クラスターに policy-demo-windows.yaml ファイルを適用します

PowerShell ウィンドウを開き、 コマンドを使用してターゲット クラスターの資格情報を Get-AksHciCredential 読み込みます。

次に、kubectl を使用して policy-demo-windows.yaml 構成を適用します。

kubectl apply -f policy-demo-windows.yaml

4 つのポッドが作成され、実行されていることを確認します。

注意

ネットワークのダウンロード速度によっては、Windows ポッドの起動に時間がかかる場合があります。

PowerShell ウィンドウを開き、 コマンドを使用してターゲット クラスターの資格情報を Get-AksHciCredential 読み込みます。

次に、kubectl を使用して、 calico-demo 名前空間内のポッドの一覧を表示します。

kubectl get pods --namespace calico-demo

次の例のような出力が表示されます。

NAME      READY   STATUS              RESTARTS   AGE
busybox   1/1     Running             0          4m14s
nginx     1/1     Running             0          4m14s
porter    0/1     ContainerCreating   0          74s
pwsh      0/1     ContainerCreating   0          2m9s

実行中の状態にある 4 つのポッドすべてが出力に表示されるまで、数分ごとにコマンドを繰り返します。

NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   0          7m24s
nginx     1/1     Running   0          7m24s
porter    1/1     Running   0          4m24s
pwsh      1/1     Running   0          5m19s

Linux ノードと Windows ノードでポッド間の接続を確認する

クライアントとサーバーのポッドが Linux と Windows の両方のノードで実行されており、Linux ノードのクライアント ポッドが Windows ノードのサーバー ポッドに接続できることを確認します。

  1. PowerShell ウィンドウを開き、 コマンドを使用してターゲット クラスターの資格情報を Get-AksHciCredential 読み込みます。

  2. kubectl を使用して、ポーターのポッド IP アドレスを決定します。

    kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}'
    
  3. busybox ポッドにサインインし、ポート 80 のポーター ポッドに到達しようとします。 '<porter_ip>' タグを前のコマンドで返された IP アドレスに置き換えます。

    kubectl exec --namespace calico-demo busybox -- nc -vz <porter_ip> 80
    

    上記の手順の両方を組み合わせることもできます。

    kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get pod porter --namespace calico-demo -o 'jsonpath={.status.podIP}') 80
    

    busybox ポッドから移植ポッドへの接続が成功すると、次の例のような出力が得られます。

    192.168.40.166 (192.168.40.166:80) open
    

    注意

    返される IP アドレスは、環境の設定によって異なる場合があります。

  4. pwsh ポッドが nginx ポッドに接続できることを確認します。

    kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po nginx -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
    

    接続が成功すると、次のような出力が表示されます。

    StatusCode        : 200
    StatusDescription : OK
    Content           : <!DOCTYPE html>
                        <html>
                        <head>
                        <title>Welcome to nginx!</title>
                        <style>
                            body {
                                width: 35em;
                                margin: 0 auto;
                                font-family: Tahoma, Verdana, Arial, sans-serif;
                            }
                        </style>
                        <...
    
  5. pwsh ポッドが porter ポッドに接続できることを確認します。

    kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5
    

    成功すると、次の例のような出力が表示されます。

    StatusCode        : 200
    StatusDescription : OK
    Content           : This is a Calico for Windows demo.
    RawContent        : HTTP/1.1 200 OK
                        Content-Length: 49
                        Content-Type: text/plain; charset=utf-8
                        Date: Fri, 21 Aug 2020 22:45:46 GMT
    
                        This is a Calico for Windows demo.
    Forms             :
    Headers           : {[Content-Length, 49], [Content-Type, text/plain;
                        charset=utf-8], [Date, Fri, 21 Aug 2020 22:45:46 GMT]}
    Images            : {}
    InputFields       : {}
    Links             : {}
    ParsedHtml        :
    RawContentLength  : 49
    
    

これで、アプリケーションのすべてのポッド間の通信が可能であることが確認されました。

Windows クライアント ポッドにポリシーを適用する

実際のデプロイでは、相互に通信することが想定されているポッドのみが許可されるようにする必要があります。 これを実現するには、 busybox ポッドのみが ポーター ポッドに到達できるようにする基本的なネットワーク ポリシーを適用します。

network-policy.yaml ファイルを作成する

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-busybox
  namespace: calico-demo
spec:
  podSelector:
    matchLabels:
      app: porter
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: busybox
    ports:
    - protocol: TCP
      port: 80

network-policy.yaml ファイルを適用する

  1. PowerShell ウィンドウを開きます。

  2. Get-AksHciCredential コマンドを使用してターゲット クラスターの資格情報を読み込みます。

  3. network-policy.yaml ファイルを適用するには、 を使用 kubectl します。

    kubectl apply -f network-policy.yaml
    

ポリシーが有効になっていることを確認する

ポリシーが設定されていれば、 busybox ポッドは引き続き porter ポッドに接続できます。 前に説明したように、コマンド ラインで手順を組み合わせることができます。

kubectl exec --namespace calico-demo busybox -- nc -vz $(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') 80

ただし、 pwsh ポッドは 移植ポッド に到達できません。

kubectl exec --namespace calico-demo pwsh -- powershell Invoke-WebRequest -Uri http://$(kubectl get po porter -n calico-demo -o 'jsonpath={.status.podIP}') -UseBasicParsing -TimeoutSec 5

要求は、次のようなメッセージでタイムアウトします。

Invoke-WebRequest : The operation has timed out.
At line:1 char:1
+ Invoke-WebRequest -Uri http://192.168.40.166 -UseBasicParsing -Timeout ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:Htt
pWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
command terminated with exit code 1

このデモでは、Linux ノードと Windows ノードでポッドを構成し、基本的なポッド接続を確認し、ポッド間トラフィックを分離するための基本的なネットワーク ポリシーを試しました。

最後の手順として、すべてのデモ リソースをクリーンアップできます。

kubectl delete namespace calico-demo

次のステップ

この記事では、ネットワーク ポリシーを使用してポッド間のトラフィックをセキュリティで保護する方法について説明しました。 次に、以下を実行できます。