Service Mesh (ASM) Ambient モードでは、メッシュ内のサービスのアウトバウンドトラフィックを 2 つのレベルで管理できます。1 つは ServiceEntry と Waypoint を使用したサービスごとのきめ細かい制御、もう 1 つは EgressPolicy を使用したグローバルなポリシー適用です。
方法の選択
|
方法 |
ユースケース |
制御の粒度 |
一般的な用途 |
|
ServiceEntry + Waypoint |
特定の外部サービスに対して、ルーティング、可観測性、またはアクセス制御を設定します。 |
単一の外部サービス |
TLS 終端、リクエスト認可、トラフィック監査 |
|
EgressPolicy |
メッシュからのすべてのアウトバウンドトラフィックに許可または拒否ポリシーを適用します。 |
グローバル (名前空間または CIDR ブロック別) |
内部 CIDR ブロックへのアクセスをブロックするか、特定の名前空間からのトラフィックを許可します。 |
注意 両方の方法を併用できます。メッシュは ServiceEntry で宣言された外部サービスを既知の宛先として扱うため、EgressPolicy はそのトラフィックに影響を与えません。EgressPolicy は、メッシュ内の既知の Service または Workload に一致しないトラフィックにのみ適用されます。
重要 EgressPolicy を使用するには、バージョン 1.29 以降の ASM インスタンスが必要です。
前提条件
-
Ambient モードが有効になっている ASM インスタンスを作成済みであること。
-
ASM インスタンスにクラスターを追加済みであること。
-
アウトバウンドトラフィックを管理する名前空間で Ambient モードを有効にしていること。
-
egress プロキシをデプロイするための
egress-gateway名前空間を作成しました。
方法 1: ServiceEntry と Waypoint
ServiceEntry を使用して外部サービスをメッシュ内の既知の宛先として宣言し、Waypoint プロキシを使用してそのトラフィックにルーティング、可観測性、またはアクセス制御を適用します。
-
エグレス Waypoint のデプロイ
エグレストラフィック専用の Waypoint プロキシを作成します。このプロキシは、外部サービスにアクセスするメッシュ内のサービスにとって、統一された出口点として機能します:
kubectl apply -n egress-gateway -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: egress-waypoint spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE EOFWaypoint が準備できていることを確認します:
kubectl get pods -n egress-gateway -l gateway.istio.io/managed=istio.io-mesh-controller期待される出力では、ポッドのステータスは
Runningです:NAME READY STATUS RESTARTS AGE egress-waypoint-xxxxxxxxx-xxxxx 1/1 Running 0 30s -
ServiceEntry の作成
httpbin.orgを例に、ServiceEntry を作成してこの外部サービスをメッシュ内の既知の宛先として宣言し、前の手順でデプロイされた Waypoint にバインドします:apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: httpbin namespace: egress-gateway labels: istio.io/use-waypoint: egress-waypoint spec: hosts: - httpbin.org location: MESH_EXTERNAL ports: - number: 80 name: http protocol: HTTP - number: 443 name: https protocol: HTTPS resolution: DNS注意
istio.io/use-waypoint: egress-waypointラベルは、この ServiceEntry のトラフィックを指定された Waypoint プロキシにルーティングします。resolution: DNSは、メッシュが DNS 解決によって外部サービスの実際の IP アドレスを取得することを示します。kubectl apply -f httpbin-serviceentry.yaml -
(オプション) アクセスポリシーの設定
AuthorizationPolicy を使用して、この外部サービスにアクセスできるサービスを制限します:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-frontend-to-httpbin namespace: egress-gateway spec: targetRefs: - kind: ServiceEntry group: networking.istio.io name: httpbin action: ALLOW rules: - from: - source: namespaces: ["default"] to: - operation: methods: ["GET"] paths: ["/get", "/headers"]kubectl apply -f httpbin-authz.yamlこのポリシーにより、
default名前空間のサービスは、GET メソッドを使用してhttpbin.orgの/getパスと/headersパスにアクセスできます。 -
結果の検証
default名前空間の Pod からリクエストを送信して、トラフィックが Waypoint プロキシを通過することを確認します:kubectl exec -n default deploy/test-pod -- curl -sI http://httpbin.org/headersHTTP 200 レスポンスが期待されます。
Waypoint のアクセスログをチェックして、リクエストが記録されたことを確認します:
kubectl logs -n egress-gateway -l gateway.istio.io/managed=istio.io-mesh-controller --tail=20ログには、
httpbin.orgへのリクエストのレコードとして、ソース名前空間、リクエストパス、およびレスポンスステータスコードが含まれていることが想定されます。認可されていない名前空間からリクエストを送信し、アクセスが拒否されることを確認します:
kubectl exec -n other-ns deploy/test-pod -- curl -sI http://httpbin.org/headersRBAC: access deniedというレスポンスが返され、AuthorizationPolicy が適用されていることが示されます。
方法 2: EgressPolicy
EgressPolicy を使用して、メッシュから認識されていないすべてのアウトバウンドトラフィックに許可または拒否ルールを適用します。この方法には、バージョン 1.29 以降の ASM インスタンスが必要です。
EgressPolicy の詳細な手順については、「Ztunnel Configuration Instructions」をご参照ください。次のセクションでは、設定例を示します。
設定例
istio-system 名前空間内の ztunnel-config ConfigMap で EgressPolicy を設定します:
kubectl apply -n istio-system -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: ztunnel-config
data:
ztunnel-config.yaml: |
egressPolicies:
# 指定された名前空間の Pod が外部サービスに直接アクセスすることを許可します
- namespaces:
- common-infrastructure
policy: Passthrough
# すべての名前空間が内部 CIDR ブロックにアクセスするのを防ぎます
- matchCidrs:
- 172.16.0.0/16
- 2001:0db8::/32
policy: Deny
EOF
重要 EgressPolicy 機能には、バージョン 1.29 以降の ASM インスタンスが必要です。
検証
default 名前空間の Pod から、拒否された CIDR ブロック内の宛先にリクエストを送信します:
kubectl exec -n default deploy/test-pod -- curl -sI --connect-timeout 5 http://172.16.0.1
接続が拒否されるはずです。これは、Deny ポリシーが適用されていることを示します。
方法の組み合わせ
本番環境では、2 つの方法を組み合わせることを推奨します:
-
API ゲートウェイやサードパーティの決済サービスなど、きめ細かい管理が必要な外部サービスに対して、ServiceEntry と Waypoint を使用してルーティングとアクセス制御を設定します。これにより、可観測性、認可、TLS 終端などの機能が有効になります。
-
EgressPolicy をグローバルなフォールバックポリシーとして使用し、メッシュ内のサービスが機密性の高い内部 CIDR ブロックにアクセスするのをブロックし、不正なネットワークアクセスを防ぎます。
EgressPolicy は、ServiceEntry で宣言された外部サービスには影響しません。2 つの方法は競合しません。
注意事項
-
EgressPolicy は、メッシュレベルですべてのアウトバウンドトラフィックを傍受することを保証するものではありません。メッシュから明示的に除外された Workload は、これらのポリシーをバイパスできます。多層防御戦略の一環として Kubernetes NetworkPolicy を使用することを推奨します。
-
EgressPolicy のルール順序が一致の優先度を決定します。最初に一致したルールが適用されます。
-
IP アドレスではなくドメイン名に基づいてグローバル制御を実装するには、ServiceEntry メソッドを使用します。EgressPolicy の
matchCidrsフィールドは、宛先 IP アドレスにのみ一致します。