×

集群网络操作符 (CNO) 运行一个控制器,即连接检查控制器,该控制器在集群内的资源之间执行连接健康检查。通过查看健康检查的结果,您可以诊断连接问题或消除网络连接作为您正在调查的问题的原因。

已执行连接健康检查

为了验证集群资源是否可访问,将与以下每个集群 API 服务建立 TCP 连接

  • Kubernetes API 服务器服务

  • Kubernetes API 服务器端点

  • OpenShift API 服务器服务

  • OpenShift API 服务器端点

  • 负载均衡器

为了验证服务和服务端点在集群中每个节点上是否可访问,将与以下每个目标建立 TCP 连接

  • 健康检查目标服务

  • 健康检查目标端点

连接健康检查的实现

连接检查控制器协调集群中的连接验证检查。连接测试的结果存储在openshift-network-diagnostics命名空间中的PodNetworkConnectivity对象中。连接测试每分钟并行执行。

集群网络操作符 (CNO) 将多个资源部署到集群以发送和接收连接健康检查

健康检查源

此程序部署在一个由Deployment对象管理的单个 Pod 副本集中。该程序使用PodNetworkConnectivity对象并连接到每个对象中指定的spec.targetEndpoint

健康检查目标

一个在集群中每个节点上作为守护程序集一部分部署的 Pod。该 Pod 侦听传入的健康检查。此 Pod 在每个节点上的存在允许测试与每个节点的连接。

您可以使用节点选择器配置运行网络连接源和目标的节点。此外,您可以为源 Pod 和目标 Pod 指定允许的容差。配置在config.openshift.io/v1 API 组中Network API 的单例cluster自定义资源中定义。

更新配置后会发生 Pod 调度。因此,您必须在更新网络连接检查 Pod 位置之前应用您打算在选择器中使用的节点标签。更新网络连接检查 Pod 位置后应用的标签将被忽略。

请参阅以下 YAML 中的默认配置

连接源和目标 Pod 的默认配置
apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  # ...
    networkDiagnostics: (1)
      mode: "All" (2)
      sourcePlacement: (3)
        nodeSelector:
          checkNodes: groupA
        tolerations:
        - key: myTaint
          effect: NoSchedule
          operator: Exists
      targetPlacement: (4)
        nodeSelector:
          checkNodes: groupB
        tolerations:
        - key: myOtherTaint
          effect: NoExecute
          operator: Exists
1 指定网络诊断配置。如果未指定值或指定了空对象,并且在名为clusternetwork.operator.openshift.io自定义资源中设置了spec.disableNetworkDiagnostics=true,则网络诊断将被禁用。如果设置,此值将覆盖spec.disableNetworkDiagnostics=true
2 指定诊断模式。该值可以是空字符串、AllDisabled。空字符串等效于指定All
3 可选:为连接检查源 Pod 指定选择器。您可以使用nodeSelectortolerations字段来进一步指定sourceNode Pod。但是,您不必同时使用nodeSelectortolerations,无论是对于源 Pod 还是目标 Pod。这些是可以省略的可选字段。
4 可选:为连接检查目标 Pod 指定选择器。您可以使用nodeSelectortolerations字段来进一步指定targetNode Pod。但是,您不必同时使用nodeSelectortolerations,无论是对于源 Pod 还是目标 Pod。这些是可以省略的可选字段。

配置 Pod 连接检查位置

作为集群管理员,您可以通过修改名为clusternetwork.config.openshift.io对象来配置连接检查 Pod 运行的节点。

先决条件
  • 安装 OpenShift CLI (oc)。

步骤
  1. 要编辑连接检查配置,请输入以下命令

    $ oc edit network.config.openshift.io cluster
  2. 在文本编辑器中,更新networkDiagnostics节以指定您想要用于源 Pod 和目标 Pod 的节点选择器。

  3. 要提交更改,请保存更改并退出文本编辑器。

验证

要验证源 Pod 和目标 Pod 是否在目标节点上运行,请输入以下命令

$ oc get pods -n openshift-network-diagnostics -o wide
示例输出
NAME                                    READY   STATUS    RESTARTS   AGE     IP           NODE                                        NOMINATED NODE   READINESS GATES
network-check-source-84c69dbd6b-p8f7n   1/1     Running   0          9h      10.131.0.8   ip-10-0-40-197.us-east-2.compute.internal   <none>           <none>
network-check-target-46pct              1/1     Running   0          9h      10.131.0.6   ip-10-0-40-197.us-east-2.compute.internal   <none>           <none>
network-check-target-8kwgf              1/1     Running   0          9h      10.128.2.4   ip-10-0-95-74.us-east-2.compute.internal    <none>           <none>
network-check-target-jc6n7              1/1     Running   0          9h      10.129.2.4   ip-10-0-21-151.us-east-2.compute.internal   <none>           <none>
network-check-target-lvwnn              1/1     Running   0          9h      10.128.0.7   ip-10-0-17-129.us-east-2.compute.internal   <none>           <none>
network-check-target-nslvj              1/1     Running   0          9h      10.130.0.7   ip-10-0-89-148.us-east-2.compute.internal   <none>           <none>
network-check-target-z2sfx              1/1     Running   0          9h      10.129.0.4   ip-10-0-60-253.us-east-2.compute.internal   <none>           <none>

PodNetworkConnectivityCheck 对象字段

下表描述了PodNetworkConnectivityCheck对象的字段。

表 1. PodNetworkConnectivityCheck 对象字段
字段 类型 描述

metadata.name

字符串

对象的名称,格式如下:<source>-to-<target><target>描述的目标包含以下字符串之一

  • 负载均衡器 API(外部)

  • 负载均衡器 API(内部)

  • Kubernetes API 服务端点

  • Kubernetes API 服务集群

  • 网络检查目标

  • OpenShift API 服务端点

  • OpenShift API 服务集群

metadata.namespace

字符串

对象关联的命名空间。此值始终为openshift-network-diagnostics

spec.sourcePod

字符串

连接检查发起的 Pod 名称,例如network-check-source-596b4c6566-rgh92

spec.targetEndpoint

字符串

连接检查的目标,例如api.devcluster.example.com:6443

spec.tlsClientCert

对象

要使用的 TLS 证书配置。

spec.tlsClientCert.name

字符串

使用的 TLS 证书名称(如有)。默认值为一个空字符串。

status

对象

表示连接测试条件以及最近连接成功和失败日志的对象。

status.conditions

数组

连接检查的最新状态和任何之前的状态。

status.failures

数组

来自不成功尝试的连接测试日志。

status.outages

数组

涵盖任何中断时间的连接测试日志。

status.successes

数组

来自成功尝试的连接测试日志。

下表描述了status.conditions数组中对象的字段

表 2. status.conditions
字段 类型 描述

lastTransitionTime

字符串

连接状态从一种状态转换到另一种状态的时间。

message

字符串

关于最后一次转换的详细信息,以人类可读的格式显示。

reason

字符串

最后一次转换状态,以机器可读的格式显示。

status

字符串

条件的状态。

type

字符串

条件的类型。

下表描述了status.conditions数组中对象的字段

表 3. status.outages
字段 类型 描述

end

字符串

连接故障解决的时间戳。

endLogs

数组

连接日志条目,包括与中断成功结束相关的日志条目。

message

字符串

中断详细信息的摘要,以人类可读的格式显示。

start

字符串

首次检测到连接故障的时间戳。

startLogs

数组

连接日志条目,包括原始故障。

连接日志字段

下表描述了连接日志条目的字段。该对象用于以下字段:

  • status.failures[]

  • status.successes[]

  • status.outages[].startLogs[]

  • status.outages[].endLogs[]

表 4. 连接日志对象
字段 类型 描述

latency

字符串

记录操作的持续时间。

message

字符串

以人类可读的格式提供状态。

reason

字符串

以机器可读的格式提供状态原因。值为TCPConnectTCPConnectErrorDNSResolveDNSError之一。

success

布尔值

指示日志条目是成功还是失败。

time

字符串

连接检查的开始时间。

验证端点的网络连接

作为集群管理员,您可以验证端点(例如 API 服务器、负载均衡器、服务或 Pod)的连接性,并验证网络诊断是否已启用。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 以具有cluster-admin角色的用户身份访问集群。

步骤
  1. 要确认网络诊断已启用,请输入以下命令:

    $ oc get network.config.openshift.io cluster -o yaml
    示例输出
      # ...
      status:
      # ...
        conditions:
        - lastTransitionTime: "2024-05-27T08:28:39Z"
          message: ""
          reason: AsExpected
          status: "True"
          type: NetworkDiagnosticsAvailable
  2. 要列出当前的PodNetworkConnectivityCheck对象,请输入以下命令:

    $ oc get podnetworkconnectivitycheck -n openshift-network-diagnostics
    示例输出
    NAME                                                                                                                                AGE
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1   73m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2   75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-default-service-cluster                                 75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-external                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-internal                                         75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-0            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-1            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-master-2            75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-c-n8mbf      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-ln-x5sv9rb-f76d1-4rzrp-worker-d-4hnrz      74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-service-cluster                               75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1    75m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2    74m
    network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-service-cluster                                75m
  3. 查看连接测试日志

    1. 从上一个命令的输出中,找到要查看其连接日志的端点。

    2. 要查看对象,请输入以下命令:

      $ oc get podnetworkconnectivitycheck <name> \
        -n openshift-network-diagnostics -o yaml

      其中<name>指定PodNetworkConnectivityCheck对象的名称。

      示例输出
      apiVersion: controlplane.operator.openshift.io/v1alpha1
      kind: PodNetworkConnectivityCheck
      metadata:
        name: network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0
        namespace: openshift-network-diagnostics
        ...
      spec:
        sourcePod: network-check-source-7c88f6d9f-hmg2f
        targetEndpoint: 10.0.0.4:6443
        tlsClientCert:
          name: ""
      status:
        conditions:
        - lastTransitionTime: "2021-01-13T20:11:34Z"
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnectSuccess
          status: "True"
          type: Reachable
        failures:
        - latency: 2.241775ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:10:34Z"
        - latency: 2.582129ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:09:34Z"
        - latency: 3.483578ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
            to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
            connection refused'
          reason: TCPConnectError
          success: false
          time: "2021-01-13T20:08:34Z"
        outages:
        - end: "2021-01-13T20:11:34Z"
          endLogs:
          - latency: 2.032018ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              tcp connection to 10.0.0.4:6443 succeeded'
            reason: TCPConnect
            success: true
            time: "2021-01-13T20:11:34Z"
          - latency: 2.241775ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:10:34Z"
          - latency: 2.582129ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:09:34Z"
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
          message: Connectivity restored after 2m59.999789186s
          start: "2021-01-13T20:08:34Z"
          startLogs:
          - latency: 3.483578ms
            message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
              failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
              connect: connection refused'
            reason: TCPConnectError
            success: false
            time: "2021-01-13T20:08:34Z"
        successes:
        - latency: 2.845865ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:14:34Z"
        - latency: 2.926345ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:13:34Z"
        - latency: 2.895796ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:12:34Z"
        - latency: 2.696844ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:11:34Z"
        - latency: 1.502064ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:10:34Z"
        - latency: 1.388857ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:09:34Z"
        - latency: 1.906383ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:08:34Z"
        - latency: 2.089073ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:07:34Z"
        - latency: 2.156994ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:06:34Z"
        - latency: 1.777043ms
          message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
            connection to 10.0.0.4:6443 succeeded'
          reason: TCPConnect
          success: true
          time: "2021-01-13T21:05:34Z"