15.6. 検証
15.6.1. サンプルアプリケーションのデプロイ
Egress IP ルールをテストするには、指定した Egress IP アドレスに制限されるサービスを作成します。これは、IP アドレスの小さなサブセットを期待する外部サービスをシミュレートします。
リクエストを複製するには、
echoserver
コマンドを実行します。$ oc -n default run demo-service --image=gcr.io/google_containers/echoserver:1.4
次のコマンドを実行して、Pod をサービスとして公開し、指定した Egress IP アドレスへの Ingress を制限します。
$ cat <<EOF | oc apply -f - apiVersion: v1 kind: Service metadata: name: demo-service namespace: default annotations: service.beta.kubernetes.io/aws-load-balancer-scheme: "internal" service.beta.kubernetes.io/aws-load-balancer-internal: "true" spec: selector: run: demo-service ports: - port: 80 targetPort: 8080 type: LoadBalancer externalTrafficPolicy: Local # NOTE: this limits the source IPs that are allowed to connect to our service. It # is being used as part of this demo, restricting connectivity to our egress # IP addresses only. # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes # are deployed. loadBalancerSourceRanges: - 10.10.100.254/32 - 10.10.150.254/32 - 10.10.200.254/32 - 10.10.100.253/32 - 10.10.150.253/32 - 10.10.200.253/32 EOF
次のコマンドを実行して、ロードバランサーのホスト名を取得し、環境変数として保存します。
$ export LOAD_BALANCER_HOSTNAME=$(oc get svc -n default demo-service -o json | jq -r '.status.loadBalancer.ingress[].hostname')
15.6.2. namespace の Egress のテスト
対話型シェルを起動して、namespace の Egress ルールをテストします。
$ oc run \ demo-egress-ns \ -it \ --namespace=demo-egress-ns \ --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \ --image=registry.access.redhat.com/ubi9/ubi -- \ bash
ロードバランサーにリクエストを送信し、正常に接続できることを確認します。
$ curl -s http://$LOAD_BALANCER_HOSTNAME
接続が成功したかどうかの出力を確認します。
注記client_address
は、Egress IP ではなく、ロードバランサーの内部 IP アドレスです。.spec.loadBalancerSourceRanges
に制限されたサービスに接続することで、クライアントアドレスが正しく設定されていることを確認できます。出力例
CLIENT VALUES: client_address=10.10.207.247 command=GET real path=/ query=nil request_version=1.1 request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com user-agent=curl/7.76.1 BODY: -no body in request-
以下のコマンドを実行して Pod を終了します。
$ exit
15.6.3. Pod の Egress のテスト
対話型シェルを起動して、Pod の Egress ルールをテストします。
$ oc run \ demo-egress-pod \ -it \ --namespace=demo-egress-pod \ --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \ --image=registry.access.redhat.com/ubi9/ubi -- \ bash
次のコマンドを実行して、ロードバランサーにリクエストを送信します。
$ curl -s http://$LOAD_BALANCER_HOSTNAME
接続が成功したかどうかの出力を確認します。
注記client_address
は、Egress IP ではなく、ロードバランサーの内部 IP アドレスです。.spec.loadBalancerSourceRanges
に制限されたサービスに接続することで、クライアントアドレスが正しく設定されていることを確認できます。出力例
CLIENT VALUES: client_address=10.10.207.247 command=GET real path=/ query=nil request_version=1.1 request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com user-agent=curl/7.76.1 BODY: -no body in request-
以下のコマンドを実行して Pod を終了します。
$ exit
15.6.4. オプション: ブロックされた Egress のテスト
オプション: 次のコマンドを実行して、Egress ルールが適用されない場合にトラフィックが正常にブロックされることをテストします。
$ oc run \ demo-egress-pod-fail \ -it \ --namespace=demo-egress-pod \ --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \ --image=registry.access.redhat.com/ubi9/ubi -- \ bash
次のコマンドを実行して、ロードバランサーにリクエストを送信します。
$ curl -s http://$LOAD_BALANCER_HOSTNAME
- コマンドが失敗すると、Egress が正常にブロックされます。
以下のコマンドを実行して Pod を終了します。
$ exit