Container Service for Kubernetes (ACK) が提供するネットワークポリシーを使用して、ポリシーベースのアクセス制御を実装できます。 Terwayネットワークプラグインを使用し、IPアドレスまたはポートに基づいてネットワークトラフィックを制御する場合は、特定のアプリケーションへのアクセスを制御するようにネットワークポリシーを設定できます。 このトピックでは、ACKクラスターでネットワークポリシーを使用する方法と、ネットワークポリシーの一般的な使用シナリオについて説明します。
前提条件
ACK管理クラスターまたはACK専用クラスターが作成され、ネットワークプラグインとしてTerwayが選択されます。 詳細については、「ACK管理クラスターの作成」または「ACK専用クラスターの作成」をご参照ください。
使用上の注意
ACKコンソールでネットワークポリシーを使用するには、クォータセンターコンソールページに移動してアプリケーションを送信します。
CLIを介してネットワークポリシーを使用するには、ホワイトリストへの追加を申請する必要はありません。
ネットワークポリシーでラベルセレクターを使用して、名前空間とポッドを選択できます。 クラスターに多数のネットワークポリシーを作成する場合、ネットワークポリシーのルールに対してリクエストを照合するプロセスに時間がかかります。 さらに、クラスターに多数のネットワークポリシーがある場合、クラスターの管理とトラブルシューティングが複雑になります。 クラスターに40未満のネットワークポリシーを作成することを推奨します。
サポートされているアイテム
クラスターを作成する場合、ネットワークポリシーの実装はTerwayプラグインのバージョンによって異なります。
バージョン1.9.0以降
コンポーネント | ネットワークポリシーの実装 |
terway-eniip | eBPF |
ネットワークポリシーを使用してクラスター内のポッドを照合する場合は、
podSelector
またはnamespaceSelector
を使用できます。ipBlock
セレクターを使用して、クラスター外のアドレスを照合できます。クラスターを作成するときにTerwayの初期バージョンが1.9.0より前の場合、Terwayが1.9.0以降に更新された後もネットワークポリシーの実装は変更されません。
拡張バークレーパケットフィルタ (eBPF) ベースのネットワークポリシーに必要なカーネルバージョンは、4.19またはそれ以降である必要があります。 ノードのカーネルバージョンが4.19より前の場合、ネットワークポリシーは有効になりません。
上記の説明は、Terwayを実行する通常のElastic Containerインスタンスにのみ適用されます。 仮想ノードでネットワークポリシーを有効にする方法の詳細については、「ネットワークポリシーの使用」をご参照ください。
1.9.0より前のバージョン
コンポーネント | ネットワークポリシーの実装 |
terway-eniipコンポーネントがインストールされ、DataPath V2またはIPVLANが無効になります。 | iptables |
terway-eniipコンポーネントがインストールされ、DataPath V2またはIPVLANが有効になります。 | eBPF |
ネットワークポリシーを使用してクラスター内のポッドを照合する場合は、
podSelector
またはnamespaceSelector
を使用できます。 eBPFベースのネットワークポリシーでは、ipBlock
セレクターを使用してクラスター外のアドレスを照合できます。クラスターを作成するときにTerwayの初期バージョンが1.9.0より前の場合、Terwayが1.9.0以降に更新された後もネットワークポリシーの実装は変更されません。
eBPFベースのネットワークポリシーに必要なカーネルバージョンは、4.19以降である必要があります。 ノードのカーネルバージョンが4.19より前の場合、ネットワークポリシー機能はiptablesモードに戻ります。 ネットワークポリシーは期待どおりに有効にならない場合があります。
上記の説明は、Terwayを実行する通常のElastic Containerインスタンスにのみ適用されます。 仮想ノードでネットワークポリシーを有効にする方法の詳細については、「ネットワークポリシーの使用」をご参照ください。
ネットワークポリシーの有効化
ネットワークポリシーは、クラスターの作成時またはクラスターの作成後に有効にできます。
作成されたクラスター
クラスターを作成するときに、[ネットワークポリシーのサポート] を選択して、ネットワークポリシー機能を有効にします。 詳細については、「ACK Proクラスターの作成」をご参照ください。
既存のクラスター
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ネットワーキング] タブをクリックし、terway-eniipコンポーネントを見つけて、[設定] をクリックします。 表示されるダイアログボックスで、[ネットワークポリシーの有効化] を選択し、[OK] をクリックします。
ネットワークポリシーの使用例
アプリケーションの準備
次の手順を実行して、他のポッドからのアクセスを許可するNGINXアプリケーションを作成します。
ACKコンソールの使用
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスターページで、管理するクラスターの名前をクリックし、 左側のナビゲーションウィンドウに表示されます。
[デプロイメント] タブで、[イメージから作成] をクリックします。 [作成] ページで、nginxという名前のアプリケーションを作成し、サービスを使用してアプリケーションを公開します。 アプリケーションの設定が完了したら、[作成] をクリックします。
次の表の説明に基づいて次のパラメーターを設定し、他のパラメーターにはデフォルト設定を使用できます。 詳細については、「」をご参照ください。イメージからのデプロイの作成.
パラメーター
説明
例
基本情報
名前
カスタムアプリケーション名を指定します。
nginx
レプリカ
ビジネス要件に基づいて値を指定します。
1
Container
イメージ名
コンテナイメージの名前を指定します。
nginx: 最新
高度
サービス
[サービス] の右側にある [作成] をクリックします。 [サービスの作成] ダイアログボックスで、パラメーターを設定します。
名前: nginx
データ型:
Server Load Balancer
パブリックアクセス
SLBインスタンスの作成
ポートマッピング:
名前: nginx
サービスポート: 80
コンテナポート: 80
プロトコル: TCP
[デプロイメント] ページに戻り、[イメージから作成] をクリックします。 [作成] ページで、busyboxという名前のクライアントアプリケーションを作成し、前の手順で作成したnginxサービスのアクセシビリティをテストします。
次の表の説明に基づいて、busyboxクライアントアプリケーションに次のパラメーターを設定し、他のパラメーターにはデフォルト設定を使用できます。 詳細については、「」をご参照ください。イメージからのデプロイの作成.
パラメーター
説明
例
基本情報
名前
カスタムアプリケーション名を指定します。
busybox
レプリカ
ビジネス要件に基づいて値を指定します。
1
コンテナー開始パラメーター
イメージ名
コンテナイメージの名前を指定します。
busybox: 最新
コンテナー開始パラメーター
なし。
stdinとttyを選択します。
busyboxクライアントアプリケーションがnginx Serviceにアクセスできるかどうかを確認します。
[デプロイメント] ページで、busyboxアプリケーションを見つけ、その名前をクリックします。
[ポッド] ページで、busybox-{hash value} という名前のポッドを選択し、[操作] 列の [ターミナル] をクリックします。
ターミナルで、
wget nginx
コマンドを実行してnginxサービスにアクセスします。上記の出力は、busyboxがnginx Serviceにアクセスできることを示しています。
CLIの使用
次のコマンドを実行して、nginxという名前のアプリケーションを作成します。 次に、nginxという名前のサービスを作成して、アプリケーションを公開します。
nginxという名前のアプリケーションを作成します。
kubectl run nginx -- image=nginx
期待される出力:
pod/nginx作成
アプリケーションのポッドが起動しているかどうかを照会します。
kubectl getポッド
期待される出力:
の名前準備ができているステータスの履歴書 nginx 1/1ランニング0 45s
nginxという名前のサービスを作成します。
kubectl公開ポッドnginx -- port=80
期待される出力:
service/nginx公開
サービスを見る:
kubectl getサービス
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 kubernetes ClusterIP 172.XX. XX.1 <none> 443/TCP 30m nginx ClusterIP 172.XX. XX.48 <none> 80/TCP 12s
次のコマンドを実行してbusyboxという名前のポッドを作成し、そのポッドを使用してnginxサービスにアクセスします。
kubectl run busybox -- rm -ti -- image=busybox /bin/sh
期待される出力:
コマンドプロンプトが表示されない場合は、enterキーを押してみてください。 / # / #
nginxサービスを取得します。
コマンドプロンプトが表示されない場合は、enterキーを押してみてください。 /# / # wget nginx# wget nginxを入力します。
期待される出力:
nginxへの接続 (172.XX. XX.48:80) 'index.html 'に保存する index.html 100% | **************************************************************************************************************************************************** | 612 0:00:00 ETA 'index.html 'を保存しました
シナリオ1: 特定のラベルを持つアプリケーションのみがサービスにアクセスできるようにする
ACKコンソールの使用
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[ネットワークポリシー] ページの上部で、ネットワークポリシーを作成する名前空間を選択します。 この例では、default名前空間が選択されています。 ページの右上隅にある [作成] をクリックします。 [作成] パネルで、ネットワークポリシーを設定します。
パラメーター
説明
例
項目
カスタムネットワークポリシー名を指定します。
access-nginx
ポッドセレクター
[+ ワークロードの種類とラベルの指定] をクリックし、ネットワークポリシーのポッドセレクターを指定します。
説明ポッドセレクターを設定しない場合、ネットワークポリシーは指定された名前空間のすべてのポッドに適用されます。
この例では、次の設定が使用されます。
タイプ: Deployment
ワークロード: nginx
ラベル: app=nginx
ソース
各ネットワークポリシーは、許可されたイングレスルールのホワイトリストを含むことができる。 各ルールは、ソースセクションとポートセクションの両方に一致するネットワークトラフィックを許可します。
ルール:
podSelector: ネットワークポリシーと同じ名前空間のポッドを選択し、これらのポッドからのインバウンドトラフィックを許可します。
namespaceSelector: 指定した名前空間からポッドを選択し、これらのポッドからのインバウンドトラフィックを許可します。
ipBlock: 指定されたCIDRブロックを選択し、これらのCIDRブロックからのインバウンドトラフィックを許可します。
ポート: TCPとUDPがサポートされています。
説明ルールを追加しない場合、ネットワークポリシーが適用されるポッドへのアクセスは許可されません。
クラスターに対してDataPath V2またはIPVLANが有効になっている場合は、ipBlockセレクターの代わりにpodSelectorセレクターを使用して、ネットワークポリシーが適用されるポッドへのアクセスを許可するポッドを制限する必要があります。
この例では、入力ルールは追加されません。
目的地
各ネットワークポリシーは、許可された出口ルールのホワイトリストを含むことができる。 各ルールは、宛先セクションとポートセクションの両方に一致するネットワークトラフィックを許可します。
ルール:
podSelector: ネットワークポリシーと同じ名前空間のポッドを選択し、これらのポッドへのアウトバウンドトラフィックを許可します。
namespaceSelector: 指定した名前空間からポッドを選択し、これらのポッドへのアウトバウンドトラフィックを許可します。
ipBlock: 指定されたCIDRブロックを選択し、これらのCIDRブロックへのアウトバウンドトラフィックを許可します。
ポート: TCPとUDPがサポートされています。
説明クラスターに対してDataPath V2またはIPVLANが有効になっている場合は、ipBlockセレクターの代わりにpodSelectorセレクターを使用して、ネットワークポリシーが適用されるポッドにアクセスできるポッドを制限する必要があります。
この例では、出力ルールは追加されません。
[次へ] をクリックします。 [OK] をクリックします。
busyboxポッドの端末で
wget nginx
コマンドを実行して、nginxサービスのアクセシビリティをテストします。 詳細については、「ステップ5」をご参照ください。ネットワークポリシーがbusyboxポッドからのアクセスを許可していないため、接続がタイムアウトしました。
busyboxポッドからのアクセスを許可するようにネットワークポリシーを変更します。
[NetworkPolicies] ページで、access-nginxネットワークポリシーを見つけ、[操作] 列の [編集] をクリックします。
ingressルールを追加します。
[ソース] の右側にある [+ 追加] をクリックし、次の手順を実行します。
[ルール] の右側にある [+ 追加] をクリックします。 次の表に、ルールパラメーターを示します。
パラメーター
例
セレクター
podSelector
タイプ
Deployment
ワークロード
busybox
ラベル
app=busybox
[ポート] の右側にある [+ 追加] をクリックします。 次の表に、ポートパラメーターを示します。
パラメーター
例
プロトコル
TCP
ポート
80
クリック次へをクリックし、OK.
を実行します。Run the
wget -O /dev/null nginx
コマンドを実行して、ネットワークポリシーの変更後にbusyboxポッドからのnginx Serviceのアクセシビリティをテストします。ingressルールがネットワークポリシーに追加されると、busyboxポッドはnginx Serviceにアクセスできます。
CLIの使用
vimを実行する
policy.yaml
という名前のファイルを作成するには、policy.yamlを次のYAMLテンプレートに置き換えます。vim policy.yaml
次のコードブロックは、YAMLテンプレートの内容を示しています。
種類: NetworkPolicy apiVersion: networking.k8s.io/v1 メタデータ: 名前: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true"
次のコマンドを実行して、上記のpolicy.yamlファイルを使用してネットワークポリシーを作成します。
kubectl apply -f policy.yaml
期待される出力:
networkpolicy.net working.k8s.io/access-nginx created
次のコマンドを実行して、nginxサービスにアクセスします。 指定されたラベルがポッドにないため、接続タイムアウトエラーが返されます。
kubectl run busybox -- rm -ti -- image=busybox /bin/sh
nginxサービスのアクセシビリティのテスト:
wget nginx
期待される出力:
nginxへの接続 (172.19.XX.XX:80) wget: リモートホストに接続できません (172.19.XX.XX): 接続がタイムアウト
次のコマンドを実行して、指定したラベルをポッドに追加します。
kubectl run busybox -- rm -ti -- labels="access=true" -- image=busybox /bin/sh
nginxサービスのアクセシビリティのテスト:
wget nginx
期待される出力:
nginxへの接続 (172.21.XX.XX:80) 'index.html 'に保存する index.html 100% | **************************************************************************************************************************************************** | 612 0:00:00 ETA 'index.html 'を保存しました
出力は、接続の進行が100% であることを示す。 これは、ポッドが期待どおりにnginxサービスにアクセスできることを示します。
シナリオ2: 特定の送信元IPアドレスのみがインターネット接続SLBインスタンスを介してサービスにアクセスできるようにする
ACKコンソールの使用
nginxサービスのネットワークポリシーを作成します。 詳細については、「特定のラベルを持つアプリケーションのみにサービスへのアクセスを許可する」をご参照ください。
[サービス] ページで、nginxサービスを見つけ、そのIPアドレス (47.xxx. xx.x) を [外部エンドポイント] 列にコピーします。 ブラウザでIPアドレスにアクセスします。
事前に設定されたネットワークポリシーのため、nginxサービスにアクセスできません。
ネットワークポリシーを変更して、特定のIPアドレスがサービスにアクセスできるようにします。
訪問myip.ipip.netブラウザで、オンプレミスマシンのIPアドレスを取得します。
[NetworkPolicies] ページで、access-nginxネットワークポリシーを見つけ、[操作] 列の [編集] をクリックします。 [編集] パネルにingressルールを追加します。
[ソース] の右側にある [+ 追加] をクリックし、次の手順を実行します。
[ルール] の右側にある [+ 追加] をクリックします。 オンプレミスマシンのIPアドレスをルールに追加します。
パラメーター
例
セレクター
ipBlock
cidr
<オンプレミスマシンのIPアドレス>/32
例: 42.xx. xx.xx/32。
[ルール] の右側にある [+ 追加] をクリックします。 Server Load Balancer (SLB) ヘルスチェックに使用するCIDRブロックをルールに追加します。
パラメーター
例
セレクター
ipBlock
cidr
100.0.0.0/8
[ポート] の右側にある [+ 追加] をクリックします。 次の表に、ポートパラメーターを示します。
パラメーター
例
プロトコル
TCP
ポート
80
次へをクリックし、OKをクリックします。
[サービス] ページで、nginxサービスを見つけ、[外部エンドポイント] 列のIPアドレス (47.xxx. xx.x:80) をクリックします。
ネットワークポリシーが変更されると、オンプレミスのマシンからインターネットに接続されたSLBインスタンスを介してnginxサービスにアクセスできます。
CLIの使用
次のコマンドを実行して、前述のnginxアプリケーション用のSLBインスタンスを作成します。 インターネット経由でアプリケーションにアクセスできるようにするには、サービスタイプを
LoadBalancer
に設定します。vim nginx-service.yaml
この例では、nginx-service.yamlという名前のファイルが使用されています。
# 次のYAMLコンテンツをnginx-service.yamlファイルにコピーします。apiVersion: v1 種類: サービス メタデータ: ラベル: run: nginx 名前: nginx-slb spec: externalTrafficPolicy: Local ポート: - port: 80 protocol: TCP targetPort: 80 セレクタ: run: nginx タイプ: LoadBalancer
次のコマンドを実行し、nginx-service.yamlファイルを使用してネットワークポリシーを作成します。
kubectl apply -f nginx-service.yaml
期待される出力:
service/nginx-slbが作成されました
nginxサービスを使用してアプリケーションが公開されているかどうかを確認します。
kubectl get service nginx-slb
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 nginx-slb LoadBalancer 172.19.xx.xxx 47.110.xxx 80:32240/TCP 8m
次のコマンドを実行して、作成されたSLBインスタンスのIPアドレスに接続します。47.110.xxx.xxx 出力は接続が失敗したことを示します。
wget 47.110.xxx.xxx
期待される出力:
-- 2018-11-21 11:46:05 -- http:// 47.110.xx.xxx / 47.110への接続。XX.XX:80... 失敗: 接続が拒否されました。
説明次の理由で接続に失敗しました。
nginxサービスには、
access=true
ラベルを持つアプリケーションのみがアクセスできます。オンプレミスマシンからSLBインスタンスのIPアドレスに接続すると、Kubernetesクラスターの外部からnginxサービスにアクセスします。 これは、ネットワークポリシーを使用して、指定されたラベルを持つアプリケーションのみがnginxサービスにアクセスできるようにする場合と同じではありません。
解決策: ネットワークポリシーを変更して、送信元IPアドレスがnginxサービスにアクセスできるようにします。
次のコマンドを実行して、オンプレミスマシンのIPアドレスを照会します。
cur l myip.ipip.net
期待される出力:
IPアドレス: 10.0.x.x。 から: 中国北京北京# これは例です。 実際のIPアドレスを使用します。
次のコマンドを実行して、policy.yamlファイルを変更します。
vim policy.yaml
policy.yamlファイルの例:
# 次の内容は、YAMLファイルの例です。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 メタデータ: 名前: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" - ipBlock: cidr: 100.64.0.0/10 - ipBlock: cidr: 10.0.0.1/24# これは例である。 実際のIPアドレスを使用します。
次のコマンドを実行して、上記のpolicy.yamlファイルを使用してネットワークポリシーを作成します。
kubectl apply -f policy.yaml
期待される出力:
networkpolicy.net working.k8s.io/access-nginx unchanged
説明要求は、異なるIPアドレスから来ることができる。 したがって、マスク長が24のCIDRブロックを指定します。
SLBがヘルスチェックに使用するIPアドレスは、
100.64.0.0/10
CIDRブロック内にあります。 したがって、必ず100.64.0.0/10
をルールに追加してください。
次のコマンドを実行して、nginxサービスにプロビジョニングされるリソースを作成します。
kubectl run busybox -- rm -ti -- labels="access=true" -- image=busybox /bin/sh
nginxサービスにアクセスする:
wget 47.110.XX.XX
期待される出力:
47.110.XX.XXへの接続 (47.110.XX.XX:80) index.html 100% | *********************************************************** | 612 0:00:00 ETA
出力が100% を示す場合、これはnginxサービスにアクセスできることを示します。
シナリオ3: ポッドが特定のアドレスにアクセスできるようにする
ACKコンソールの使用
このセクションでは、www.aliyun.comとregistry.aliyuncs.comを例として使用します。 ネットワークポリシーでは、ポッドがregistry.aliyuncs.comにのみアクセスできるようにします。
Pingコマンドを使用して、IPアドレス (120.55.XXX.XXX) を照会します。registry.aliyuncs.comドメイン名が解決されました。
ネットワークポリシーを作成し、busyboxアプリケーションへのアクセスのみを許可する出力ルールを追加します。registry.aliyuncs.com.
[NetworkPolicies] ページの右上隅にある [作成] をクリックします。 [作成] パネルで、パラメーターを設定します。
タイプ: Deployment
ワークロード: busybox
ラベル: app=busybox
セレクター: ipBlock
CIDR: 120.55.XXX.XXX/32
[ルール] の右側にある [+ 追加] をクリックします。 すべての名前空間を選択するルールを次の表に示します。
[ポート] の右側にある [+ 追加] をクリックします。 UDPポート53を追加して、アプリケーションがDNSルックアップを実行できるようにします。
ルール:
セレクター: namespaceSelector
名前空間: すべて
ポート:
プロトコル: UDP
ポート: 53
クリック次へをクリックし、OK.
busyboxポッドのターミナルに移動し、次のコマンドを実行してwww.aliyun.comとregistry.aliyuncs.comに順番にアクセスします。
nc -vz -w 1 www.aliyunc.com 443
nc-
nc -vz -w 1 registry.aliyuncs.com 443
ネットワークポリシーが追加された後、busyboxアプリケーションは1つのy registry.aliyuncs.comにアクセスできます。
パラメーターの詳細については、「特定のラベルを持つアプリケーションのみにサービスへのアクセスを許可する」をご参照ください。 次の表に、構成のサンプルを示します。
パラメーター
説明
例
項目
カスタムネットワークポリシー名を指定します。
busybox-ポリシー
ポッドセレクター
[+ ワークロードの種類とラベルの指定] をクリックし、ネットワークポリシーのポッドセレクターを指定します。
説明ポッドセレクターを設定しない場合、ネットワークポリシーは指定された名前空間のすべてのポッドに適用されます。
この例では、次の設定が使用されます。
目的地
[宛先] の右側の [+ 追加] をクリックします。 次に、[ルール] の右側にある [+ 追加] をクリックします。
ipBlockを選択し、registry.aliyuncs.comが解決されるIPアドレスを追加します。 この例では、IPアドレスは120.55.XXX.XXX/32です。
[宛先] の右側の [+ 追加] をクリックします。 namespaceSelectorを選択し、UDPポート53を介してすべての名前空間のポッドへのアウトバウンドトラフィックを許可します。 これにより、アプリケーションがDNSルックアップを実行できるようになります。
CLIの使用
次のコマンドを実行して、www.aliyun.comが解決されるIPアドレスを照会します。
dig + shor t www.aliyun.com
期待される出力:
www-jp-de-intl-adns.aliyun.com。 www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. v6wagbridge.aliyun.com. v6wagbridge.aliyun.com.gds.alibabadns.com. 106.XX.XX.21 140.XX.XX.4 140.XX.XX.13 140.XX.XX.3
次のコマンドを実行して、busybox-policyという名前のファイルを作成します。
vim busybox-policy.yaml
busybox-policyファイルの例:
# 次のコンテンツはサンプルYAMLファイルです。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 メタデータ: 名前: busybox-policy spec: podSelector: matchLabels: run: busybox egress: - to: - ipBlock: cidr: 106.XX. XX.21/32 - ipBlock: cidr: 140.XX. XX.4/32 - ipBlock: cidr: 140.XX. XX.13/32 - ipBlock: cidr: 140.XX. XX.3/32 - to: - ipBlock: cidr: 0.0.0.0/0 -namespaceSelector: {} ポート: - protocol: UDP ポート: 53
説明エグレスルールは、アプリケーションからのアウトバウンドアクセスを制限するためにbusybox-policyファイルで構成されています。 アプリケーションがUDPポート53にアクセスできるようにする必要があります。 それ以外の場合、ドメインネームシステム (DNS) 解決は機能しません。
次のコマンドを実行して、busybox-policyファイルに基づいてネットワークポリシーを作成します。
kubectl apply -f busybox-policy.yaml
期待される出力:
networkpolicy.net working.k8s.io/busybox-policy作成
次のコマンドを実行して、busyboxアプリケーションを作成します。
kubectl run busybox -- rm -ti -- image=busybox /bin/sh
アクセスwww.aliyun.com以外のWebサイト (www.taobao.comなど):
wge t www.taobao.com
期待される出力:
接続t o www.taobao.com (64.13.XX.XX:80) wget: リモートホストに接続できません (64.13.XX.XX): 接続がタイムアウト
出力には、[リモートホストに接続できません] メッセージが表示されます。 これは、アプリケーションがドメイン名にアクセスできなかったことを示します。
次のコマンドを実行してwww.aliyun.comにアクセスします。
wge t www.aliyun.com
期待される出力:
接続t o www.aliyun.com (140.205.XX.XX:80) 接続t o www.aliyun.com (140.205.XX.XX:443) wget: note: TLS証明書の検証が実装されていません index.html 100% | *********************************************************** | 462k 0:00:00 ETA
出力は、接続の進行が100% であることを示す。 これは、アプリケーションが期待どおりにドメイン名にアクセスできることを示します。
シナリオ4: 特定の名前空間でのインターネットへのポッドアクセスの制御
このセクションの操作は、インターネットと通信するサービスに影響を与える可能性があります。 次の操作を実行するには、空の名前空間を作成することを推奨します。
ACKコンソールの使用
[NetworkPolicies] ページの右上隅にある [作成] をクリックします。 [作成] パネルで、パラメーターを設定します。
パラメーターの詳細については、「特定のラベルを持つアプリケーションのみにサービスへのアクセスを許可する」をご参照ください。 次の表に、構成のサンプルを示します。
パラメーター
例
項目
deny-public-net
ポッドセレクター
TypeをAllに設定します。
ソース
次のingressルールを追加します。
namespaceSelectorをAllに設定します。
ipBlockを0.0.0.0/0に設定します。
目的地
ポッドが内部ネットワークのみにアクセスできるようにする出力ルールを追加します。
namespaceSelectorをAllに設定します。 これにより、ポッドは内部ネットワーク内の他のすべてのポッドにアクセスできます。
3つのルールを作成し、ipBlockを次のCIDRブロックに順番に設定します。
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
説明1つのルールでipBlockパラメーターに複数のCIDRブロックを指定することはできません。
クリック次へをクリックし、OK.
クラスターの詳細ページの [基本情報] タブで、プライベートIPアドレスとポートを取得します。
busyboxポッドの端末で次のコマンドを実行して、ポッドがインターネットと内部ネットワークにアクセスできるかどうかをテストします。
nc -vz -w 1 www.aliyunc.com 443
nc -vz -w 1 10.xx.xx.xx:<IP port> # Specify the private IP address.
出力は、ポッドがインターネットではなく内部ネットワークにアクセスできることを示しています。
CLIの使用
次のコマンドを実行して、テスト用の名前空間を作成します。
test-npという名前の名前空間を作成します。
kubectl create ns test-np
期待される出力:
namespace/test-npが作成されました
次のコマンドを実行して、test-np名前空間のポッドが内部サービスのみにアクセスできるようにするデフォルトのネットワークポリシーを作成します。
vim default-deny.yaml
default-deny.yamlファイルの例:
# 次のコンテンツはサンプルYAMLファイルです。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 メタデータ: 名前空間: test-np 名前: deny-public-net spec: podSelector: {} ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 192.168.0.0/16 - ipBlock: cidr: 172.16.0.0/12 - ipBlock: cidr: 10.0.0.0/8
default-deny.yamlファイルを使用してネットワークポリシーが作成されているか確認してください。
kubectl apply -f default-deny.yaml
期待される出力:
networkpolicy.net working.k8s.io/deny-public-net created
ネットワークポリシーを表示する:
kubectl get networkpolicy -n test-np
期待される出力:
名POD-セレクター年齢 deny-public-net <none> 1m
次のコマンドを実行して、特定のラベルを持つポッドがインターネットにアクセスできるようにします。
vim allow-specify-label.yaml
この例では、
public-network=true
ラベルが使用されます。# 次のコンテンツはサンプルYAMLファイルです。 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 メタデータ: name: allow-public-network-for-labels 名前空間: test-np spec: podSelector: matchLabels: public-network: "true" ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 0.0.0.0/0 -namespaceSelector: matchLabels: ns: kube-system
次のコマンドを実行して、ネットワークポリシーを作成します。
kubectl apply -f allow-specify-label.yaml
期待される出力:
networkpolicy.net working.k8s.io/allow-public-network-for-labels created
ネットワークポリシーを表示する:
kubectl get networkpolicy -n test-np
期待される出力:
名POD-セレクター年齢 allow-public-network-for-labels public-network=true 1m deny-public-net <none> 3m
次のコマンドを実行して、指定されたラベルのないポッドがインターネットにアクセスできないことを確認します。
kubectl run -it -- namespace test-np -- rm -- image busybox busybox-intranet
ピンg aliyun.com
期待される出力:
PIN G aliyun.com (106.11.2xx.xxx): 56データバイト ^ C --- aliyun.com ping統計 --- 9パケット送信、0パケット受信、100% パケット損失
出力は、0パケット受信を示す。 これは、ポッドがインターネットにアクセスできなかったことを示します。
説明deny-public-netネットワークポリシーではtest-np名前空間のポッドがインターネットにアクセスできないため、ポッドはインターネットにアクセスできませんでした。 したがって、デフォルトラベルのポッドはインターネットにアクセスできません。
次のコマンドを実行して、public-network=trueラベルを持つポッドがインターネットにアクセスできることを確認します。
kubectl run -it -- namespace test-np -- labels public-network=true -- rm -- image busybox busybox-internet
ピンg aliyun.com
期待される出力:
PIN G aliyun.com (106.11.1xx.xx): 56データバイト 106.11.1xx.xxから64バイト: seq=0 ttl=47 time=4.235 ms 106.11.1xx.xxから64バイト: seq=1 ttl=47 time=4.200 ms 106.11.1xx.xxから64バイト: seq=2 ttl=47 time=4.182 ms ^ C --- aliyun.com ping統計 --- 3パケット送信、3パケット受信、0% パケット損失 ラウンドトリップmin/avg/max = 4.182/4.205/4.235 ms
出力は0% パケット損失を示す。 これは、ポッドがインターネットにアクセスできることを示します。
説明allow-public-network-for-labelsネットワークポリシーでは、public-network=trueラベルを持つポッドがインターネットにアクセスできるため、ポッドはインターネットにアクセスできます。 busybox-internetのポッドにはこのラベルが付いているため、インターネットにアクセスできます。