×

OVN 和 OVS 流量可以由名为ovnkube-trace的单个实用程序模拟。ovnkube-trace 实用程序运行 ovn-traceovs-appctl ofproto/traceovn-detrace,并将这些信息关联到单个输出中。

您可以从专用容器执行ovnkube-trace二进制文件。对于 OpenShift Container Platform 4.7 之后的发行版,您还可以将二进制文件复制到本地主机并在该主机上执行它。

在本地主机上安装 ovnkube-trace

ovnkube-trace工具追踪 OVN-Kubernetes 驱动的 OpenShift Container Platform 集群中任意 UDP 或 TCP 流量在各个点之间的分组模拟。将ovnkube-trace二进制文件复制到您的本地主机,使其可用于针对集群运行。

先决条件
  • 您已安装 OpenShift 命令行界面 (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

步骤
  1. 使用以下命令创建一个 pod 变量

    $  POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')
  2. 在您的本地主机上运行以下命令,以从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工具,则必须将文件/usr/lib/rhel8/ovnkube-trace复制到您的本地主机。

  3. 通过运行以下命令使ovnkube-trace可执行

    $  chmod +x ovnkube-trace
  4. 通过运行以下命令显示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(调试输出)

运行 ovnkube-trace

运行ovn-trace模拟OVN逻辑网络中的数据包转发。

先决条件
  • 您已安装 OpenShift 命令行界面 (oc)。

  • 您已使用具有cluster-admin权限的用户登录到集群。

  • 您已在本地主机上安装了ovnkube-trace

示例:测试已部署 Pod 的 DNS 解析是否正常

此示例演示如何测试从已部署的 Pod 到集群中运行的核心 DNS Pod 的 DNS 解析。

步骤
  1. 通过输入以下命令,在默认命名空间中启动一个 Web 服务

    $ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
  2. 列出在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
  3. 运行以下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-traceovs-appctlproto/traceovn-detrace以及更多调试信息,请将日志级别提高到 2,然后再次运行以下命令

$ ./ovnkube-trace \
  -src-namespace default \
  -src web \
  -dst-namespace openshift-dns \
  -dst dns-default-467qw \
  -udp -dst-port 53 \
  -loglevel 2

此提高的日志级别的输出过多,无法在此列出。在出现故障的情况下,此命令的输出显示哪个流正在丢弃该流量。例如,集群上可能配置了不允许该流量的出站或入站网络策略。

示例:使用调试输出验证已配置的默认拒绝

此示例演示如何使用调试输出识别入站默认拒绝策略如何阻止流量。

步骤
  1. 创建以下 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: []
  2. 通过输入以下命令应用策略

    $ oc apply -f deny-by-default.yaml
    示例输出
    networkpolicy.networking.k8s.io/deny-by-default created
  3. 通过输入以下命令,在default命名空间中启动一个 Web 服务

    $ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80
  4. 运行以下命令以创建prod命名空间

    $ oc create namespace prod
  5. 运行以下命令以标记prod命名空间

    $ oc label namespace/prod purpose=production
  6. 运行以下命令在prod命名空间中部署alpine镜像并启动一个 shell

    $ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh
  7. 打开另一个终端会话。

  8. 在这个新的终端会话中,运行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
  9. 通过运行以下命令,将日志级别提高到 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 由于默认拒绝策略生效,入站流量被阻止。
  10. 创建允许来自具有标签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
  11. 通过输入以下命令应用策略

    $ oc apply -f web-allow-prod.yaml
  12. 运行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
  13. 在步骤六中打开的 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>