$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')
OVN 和 OVS 流量可以由名为ovnkube-trace
的单个实用程序模拟。ovnkube-trace
实用程序运行 ovn-trace
、ovs-appctl ofproto/trace
和 ovn-detrace
,并将这些信息关联到单个输出中。
您可以从专用容器执行ovnkube-trace
二进制文件。对于 OpenShift Container Platform 4.7 之后的发行版,您还可以将二进制文件复制到本地主机并在该主机上执行它。
ovnkube-trace
工具追踪 OVN-Kubernetes 驱动的 OpenShift Container Platform 集群中任意 UDP 或 TCP 流量在各个点之间的分组模拟。将ovnkube-trace
二进制文件复制到您的本地主机,使其可用于针对集群运行。
您已安装 OpenShift 命令行界面 (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
使用以下命令创建一个 pod 变量
$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')
在您的本地主机上运行以下命令,以从ovnkube-control-plane
pod 复制二进制文件
$ oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace -c ovnkube-cluster-manager ovnkube-trace
如果您使用 Red Hat Enterprise Linux (RHEL) 8 运行 |
通过运行以下命令使ovnkube-trace
可执行
$ chmod +x ovnkube-trace
通过运行以下命令显示ovnkube-trace
可用的选项
$ ./ovnkube-trace -help
Usage of ./ovnkube-trace:
-addr-family string
Address family (ip4 or ip6) to be used for tracing (default "ip4")
-dst string
dest: destination pod name
-dst-ip string
destination IP address (meant for tests to external targets)
-dst-namespace string
k8s namespace of dest pod (default "default")
-dst-port string
dst-port: destination port (default "80")
-kubeconfig string
absolute path to the kubeconfig file
-loglevel string
loglevel: klog level (default "0")
-ovn-config-namespace string
namespace used by ovn-config itself
-service string
service: destination service name
-skip-detrace
skip ovn-detrace command
-src string
src: source pod name
-src-namespace string
k8s namespace of source pod (default "default")
-tcp
use tcp transport protocol
-udp
use udp transport protocol
支持的命令行参数是熟悉的 Kubernetes 结构,例如命名空间、pod、服务,因此您无需查找 MAC 地址、目标节点的 IP 地址或 ICMP 类型。
日志级别为
0(最小输出)
2(更详细的输出,显示跟踪命令的结果)
5(调试输出)
运行ovn-trace
模拟OVN逻辑网络中的数据包转发。
您已安装 OpenShift 命令行界面 (oc
)。
您已使用具有cluster-admin
权限的用户登录到集群。
您已在本地主机上安装了ovnkube-trace
此示例演示如何测试从已部署的 Pod 到集群中运行的核心 DNS Pod 的 DNS 解析。
通过输入以下命令,在默认命名空间中启动一个 Web 服务
$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
列出在openshift-dns
命名空间中运行的 Pod
oc get pods -n openshift-dns
NAME READY STATUS RESTARTS AGE
dns-default-8s42x 2/2 Running 0 5h8m
dns-default-mdw6r 2/2 Running 0 4h58m
dns-default-p8t5h 2/2 Running 0 4h58m
dns-default-rl6nk 2/2 Running 0 5h8m
dns-default-xbgqx 2/2 Running 0 5h8m
dns-default-zv8f6 2/2 Running 0 4h58m
node-resolver-62jjb 1/1 Running 0 5h8m
node-resolver-8z4cj 1/1 Running 0 4h59m
node-resolver-bq244 1/1 Running 0 5h8m
node-resolver-hc58n 1/1 Running 0 4h59m
node-resolver-lm6z4 1/1 Running 0 5h8m
node-resolver-zfx5k 1/1 Running 0 5h
运行以下ovnkube-trace
命令以验证 DNS 解析是否正常
$ ./ovnkube-trace \
-src-namespace default \ (1)
-src web \ (2)
-dst-namespace openshift-dns \ (3)
-dst dns-default-p8t5h \ (4)
-udp -dst-port 53 \ (5)
-loglevel 0 (6)
1 | 源 Pod 的命名空间 |
2 | 源 Pod 名称 |
3 | 目标 Pod 的命名空间 |
4 | 目标 Pod 名称 |
5 | 使用udp 传输协议。端口 53 是 DNS 服务使用的端口。 |
6 | 将日志级别设置为 0(0 为最小级别,5 为调试级别) |
src&dst
Pod 位于同一节点上的示例输出ovn-trace source pod to destination pod indicates success from web to dns-default-p8t5h
ovn-trace destination pod to source pod indicates success from dns-default-p8t5h to web
ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-p8t5h
ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-p8t5h to web
ovn-detrace source pod to destination pod indicates success from web to dns-default-p8t5h
ovn-detrace destination pod to source pod indicates success from dns-default-p8t5h to web
src&dst
Pod 位于不同节点上的示例输出ovn-trace source pod to destination pod indicates success from web to dns-default-8s42x
ovn-trace (remote) source pod to destination pod indicates success from web to dns-default-8s42x
ovn-trace destination pod to source pod indicates success from dns-default-8s42x to web
ovn-trace (remote) destination pod to source pod indicates success from dns-default-8s42x to web
ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-8s42x
ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-8s42x to web
ovn-detrace source pod to destination pod indicates success from web to dns-default-8s42x
ovn-detrace destination pod to source pod indicates success from dns-default-8s42x to web
输出表明从已部署的 Pod 到 DNS 端口的连接成功,并且也表明反向连接也成功。因此,如果您想让 Web Pod 从核心 DNS 进行 DNS 解析,则知道 UDP 端口 53 上支持双向流量。
例如,如果这不起作用,并且您想获取ovn-trace
、ovs-appctl
的proto/trace
和ovn-detrace
以及更多调试信息,请将日志级别提高到 2,然后再次运行以下命令
$ ./ovnkube-trace \
-src-namespace default \
-src web \
-dst-namespace openshift-dns \
-dst dns-default-467qw \
-udp -dst-port 53 \
-loglevel 2
此提高的日志级别的输出过多,无法在此列出。在出现故障的情况下,此命令的输出显示哪个流正在丢弃该流量。例如,集群上可能配置了不允许该流量的出站或入站网络策略。
此示例演示如何使用调试输出识别入站默认拒绝策略如何阻止流量。
创建以下 YAML,该 YAML 定义一个deny-by-default
策略,以拒绝来自所有命名空间中所有 Pod 的入站流量。将 YAML 保存到deny-by-default.yaml
文件中
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
namespace: default
spec:
podSelector: {}
ingress: []
通过输入以下命令应用策略
$ oc apply -f deny-by-default.yaml
networkpolicy.networking.k8s.io/deny-by-default created
通过输入以下命令,在default
命名空间中启动一个 Web 服务
$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
运行以下命令以创建prod
命名空间
$ oc create namespace prod
运行以下命令以标记prod
命名空间
$ oc label namespace/prod purpose=production
运行以下命令在prod
命名空间中部署alpine
镜像并启动一个 shell
$ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
打开另一个终端会话。
在这个新的终端会话中,运行ovn-trace
以验证在命名空间prod
中运行的源 Pod test-6459
和在default
命名空间中运行的目标 Pod 之间的通信故障
$ ./ovnkube-trace \
-src-namespace prod \
-src test-6459 \
-dst-namespace default \
-dst web \
-tcp -dst-port 80 \
-loglevel 0
ovn-trace source pod to destination pod indicates failure from test-6459 to web
通过运行以下命令,将日志级别提高到 2 以显示故障原因
$ ./ovnkube-trace \
-src-namespace prod \
-src test-6459 \
-dst-namespace default \
-dst web \
-tcp -dst-port 80 \
-loglevel 2
...
------------------------------------------------
3. ls_out_acl_hint (northd.c:7454): !ct.new && ct.est && !ct.rpl && ct_mark.blocked == 0, priority 4, uuid 12efc456
reg0[8] = 1;
reg0[10] = 1;
next;
5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 0, priority 500, uuid 69372c5d
reg8[30..31] = 1;
next(4);
5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 1, priority 500, uuid 2fa0af89
reg8[30..31] = 2;
next(4);
4. ls_out_acl_eval (northd.c:7691): reg8[30..31] == 2 && reg0[10] == 1 && (outport == @a16982411286042166782_ingressDefaultDeny), priority 2000, uuid 447d0dab
reg8[17] = 1;
ct_commit { ct_mark.blocked = 1; }; (1)
next;
...
1 | 由于默认拒绝策略生效,入站流量被阻止。 |
创建允许来自具有标签purpose=production
的特定命名空间中所有 Pod 的流量的策略。将 YAML 保存到web-allow-prod.yaml
文件中
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-prod
namespace: default
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: production
通过输入以下命令应用策略
$ oc apply -f web-allow-prod.yaml
运行ovnkube-trace
以验证现在是否允许流量,方法是输入以下命令
$ ./ovnkube-trace \
-src-namespace prod \
-src test-6459 \
-dst-namespace default \
-dst web \
-tcp -dst-port 80 \
-loglevel 0
ovn-trace source pod to destination pod indicates success from test-6459 to web
ovn-trace destination pod to source pod indicates success from web to test-6459
ovs-appctl ofproto/trace source pod to destination pod indicates success from test-6459 to web
ovs-appctl ofproto/trace destination pod to source pod indicates success from web to test-6459
ovn-detrace source pod to destination pod indicates success from test-6459 to web
ovn-detrace destination pod to source pod indicates success from web to test-6459
在步骤六中打开的 shell 中运行以下命令以将 nginx 连接到 web 服务器
wget -qO- --timeout=2 http://web.default
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="https://nginx.ac.cn/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>