15.6. 验证
15.6.1. 部署示例应用程序
要测试出口 IP 规则,请创建一个仅限于我们指定的出口 IP 地址的服务。这会模拟一个外部服务,该服务预期一小部分 IP 地址。
运行
echoserver
命令以复制请求:$ oc -n default run demo-service --image=gcr.io/google_containers/echoserver:1.4
运行以下命令,将 pod 公开为服务,并将入口限制为您指定的出口 IP 地址:
$ 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. 测试命名空间出口
启动交互式 shell 以测试命名空间出站规则:
$ 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
是负载均衡器的内部 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 出口
启动交互式 shell 以测试 pod 出站规则:
$ 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
是负载均衡器的内部 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. 可选:测试会阻止的出口
可选: 运行以下命令来测试当出口规则没有应用时流量被成功阻止:
$ 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
- 如果命令失败,则出口可以成功阻止。
运行以下命令来退出 pod:
$ exit