7.5. 네트워크 문제 해결

7.5.1. 네트워크 인터페이스 선택 방법

베어 메탈 또는 둘 이상의 NIC(네트워크 인터페이스 컨트롤러)가 있는 가상 머신에 설치할 경우 OpenShift Container Platform이 Kubernetes API 서버와의 통신에 사용하는 NIC는 노드가 부팅될 때 systemd에서 실행하는 nodeip-configuration.service 서비스 유닛에 의해 결정됩니다. 서비스는 노드의 네트워크 인터페이스와 서브넷으로 구성된 첫 번째 네트워크 인터페이스를 반복합니다. OpenShift Container Platform 통신에 대해 API 서버의 IP 주소를 호스팅할 수 있습니다.

nodeip-configuration.service 서비스에서 올바른 NIC를 확인한 후 서비스는 /etc/systemd/system/kubelet.service.d/20-nodenet.conf 파일을 만듭니다. 20-nodenet.conf 파일은 KUBELET_NODE_IP 환경 변수를 서비스가 선택한 IP 주소로 설정합니다.

kubelet 서비스가 시작되면 20-nodenet.conf 파일에서 환경 변수 값을 읽고 IP 주소를 --node-ip kubelet 명령줄 인수 값으로 설정합니다. 결과적으로 kubelet 서비스는 선택한 IP 주소를 노드 IP 주소로 사용합니다.

설치 후 하드웨어 또는 네트워킹을 재구성하는 경우 재부팅 후 nodeip-configuration.service 서비스에서 다른 NIC를 선택할 수 있습니다. 경우에 따라 oc get nodes -o wide 명령의 출력에서 INTERNAL-IP 열을 검토하여 다른 NIC가 선택되었는지 감지할 수 있습니다.

다른 NIC가 선택되어 네트워크 통신이 중단되거나 잘못 구성된 경우 선택 프로세스를 재정의하는 한 가지 전략은 올바른 IP 주소를 명시적으로 설정하는 것입니다. 다음 목록은 높은 수준의 단계 및 고려 사항을 나타냅니다.

  • OpenShift Container Platform 통신에 사용할 IP 주소를 결정하는 쉘 스크립트를 생성합니다. 스크립트가 /etc/systemd/system/kubelet.service.d/98-nodenet-override.conf와 같은 사용자 지정 유닛 파일을 생성하도록 합니다. 사용자 지정 유닛 파일인 nmcli-nodenet-override.conf를 사용하여 KUBELET_NODE_IP 환경 변수를 IP 주소로 설정합니다.
  • /etc/systemd/system/kubelet.service.d/20-nodenet.conf 파일을 덮어쓰지 마십시오. 동일한 디렉토리 경로에서 98-nodenet-override.conf와 같이 숫자가 더 높은 파일 이름을 지정합니다. 목표는 20-nodenet.conf 다음에 사용자 지정 유닛 파일을 실행하고 환경 변수의 값을 재정의하는 것입니다.
  • 쉘 스크립트를 base64로 인코딩된 문자열로 사용하여 머신 구성 오브젝트를 생성하고 Machine Config Operator를 사용하여 /usr/local/bin/override-node-ip.sh와 같은 파일 시스템 경로에 있는 노드에 스크립트를 배포합니다.
  • 쉘 스크립트가 실행된 후 systemctl daemon-reload가 실행되는지 확인합니다. 가장 간단한 방법은 다음 샘플과 같이 시스템 구성에 ExecStart=systemctl daemon-reload를 지정하는 것입니다.

kubelet의 네트워크 인터페이스를 재정의하는 샘플 머신 구성

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
     machineconfiguration.openshift.io/role: worker
  name: 98-nodenet-override
spec:
  config:
    ignition:
      version: 3.2.0
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,<encoded_script>
        mode: 0755
        overwrite: true
        path: /usr/local/bin/override-node-ip.sh
    systemd:
      units:
      - contents: |
          [Unit]
          Description=Override node IP detection
          Wants=network-online.target
          Before=kubelet.service
          After=network-online.target
          [Service]
          Type=oneshot
          ExecStart=/usr/local/bin/override-node-ip.sh
          ExecStart=systemctl daemon-reload
          [Install]
          WantedBy=multi-user.target
        enabled: true
        name: nodenet-override.service

7.5.2. Open vSwitch 문제 해결

일부 OVS(Open vSwitch) 문제를 해결하려면 자세한 정보를 포함하도록 로그 수준을 구성해야 할 수 있습니다.

노드에서 로그 수준을 일시적으로 수정하는 경우 다음 예와 같이 노드의 머신 구성 데몬에서 로그 메시지를 받을 수 있습니다.

E0514 12:47:17.998892    2281 daemon.go:1350] content mismatch for file /etc/systemd/system/ovs-vswitchd.service: [Unit]

불일치와 관련된 로그 메시지를 방지하려면 문제 해결을 완료한 후 로그 수준 변경 사항을 되돌립니다.

7.5.2.1. 일시적으로 Open vSwitch 로그 수준 구성

단기 문제 해결을 위해 OVS(Open vSwitch) 로그 수준을 일시적으로 구성할 수 있습니다. 다음 절차에 따라 노드를 재부팅할 필요가 없습니다. 또한 노드를 재부팅할 때 마다 구성 변경 사항이 유지되지 않습니다.

이 절차를 수행하여 로그 수준을 변경하면 ovs-vswitchd.service에 대한 콘텐츠 불일치가 있음을 나타내는 머신 구성 데몬에서 로그 메시지를 수신할 수 있습니다. 로그 메시지를 방지하려면 이 절차를 반복하고 로그 수준을 원래 값으로 설정합니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

절차

  1. 노드의 디버그 Pod를 시작합니다.

    $ oc debug node/<node_name>
  2. 디버그 쉘 내에서 /host를 root 디렉터리로 설정합니다. 디버그 Pod는 Pod 내의 /host에 호스트의 root 파일 시스템을 마운트합니다. root 디렉토리를 /host로 변경하면 호스트 파일 시스템에서 바이너리를 실행할 수 있습니다.

    # chroot /host
  3. OVS 모듈의 현재 syslog 수준을 확인합니다.

    # ovs-appctl vlog/list

    다음 예제 출력은 info로 설정된 syslog의 로그 수준을 보여줍니다.

    출력 예

                     console    syslog    file
                     -------    ------    ------
    backtrace          OFF       INFO       INFO
    bfd                OFF       INFO       INFO
    bond               OFF       INFO       INFO
    bridge             OFF       INFO       INFO
    bundle             OFF       INFO       INFO
    bundles            OFF       INFO       INFO
    cfm                OFF       INFO       INFO
    collectors         OFF       INFO       INFO
    command_line       OFF       INFO       INFO
    connmgr            OFF       INFO       INFO
    conntrack          OFF       INFO       INFO
    conntrack_tp       OFF       INFO       INFO
    coverage           OFF       INFO       INFO
    ct_dpif            OFF       INFO       INFO
    daemon             OFF       INFO       INFO
    daemon_unix        OFF       INFO       INFO
    dns_resolve        OFF       INFO       INFO
    dpdk               OFF       INFO       INFO
    ...

  4. /etc/systemd/system/ovs-vswitchd.service.d/10-ovs-vswitchd-restart.conf 파일에서 로그 수준을 지정합니다.

    Restart=always
    ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /var/lib/openvswitch'
    ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /etc/openvswitch'
    ExecStartPre=-/bin/sh -c '/usr/bin/chown -R :$${OVS_USER_ID##*:} /run/openvswitch'
    ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg
    ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg

    이전 예에서 로그 수준은 dbg로 설정됩니다. syslog:<log_level>off,emer,err,warn,info 또는 dbg로 설정하여 마지막 두 행을 변경합니다. off 로그 수준은 모든 로그 메시지를 필터링합니다.

  5. 서비스를 다시 시작하십시오.

    # systemctl daemon-reload
    # systemctl restart ovs-vswitchd

7.5.2.2. 영구적으로 Open vSwitch 로그 수준 구성

OVS(Open vSwitch) 로그 수준을 장기적으로 변경할 경우 로그 수준을 영구적으로 변경할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 다음 예제와 같은 MachineConfig 오브젝트를 사용하여 99-change-ovs-loglevel.yaml과 같은 파일을 생성합니다.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master  1
      name: 99-change-ovs-loglevel
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - dropins:
            - contents: |
                [Service]
                  ExecStartPost=-/usr/bin/ovs-appctl vlog/set syslog:dbg  2
                  ExecReload=-/usr/bin/ovs-appctl vlog/set syslog:dbg
              name: 20-ovs-vswitchd-restart.conf
            name: ovs-vswitchd.service
    1
    이 절차를 수행하여 컨트롤 플레인 노드를 구성한 후 절차를 반복하고 역할을 worker로 설정하여 작업자 노드를 구성합니다.
    2
    syslog:<log_level> 값을 설정합니다. 로그 수준은 off,emer,err,warn,info 또는 dbg 입니다. 값을 off로 설정하면 모든 로그 메시지가 필터링됩니다.
  2. 머신 구성을 적용합니다.

    $ oc apply -f 99-change-ovs-loglevel.yaml

7.5.2.3. Open vSwitch 로그 표시

다음 절차에 따라 OVS(Open vSwitch) 로그를 표시합니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  • 다음 명령 중 하나를 실행합니다.

    • 클러스터 외부에서 oc 명령을 사용하여 로그를 표시합니다.

      $ oc adm node-logs <node_name> -u ovs-vswitchd
    • 클러스터의 노드에 로그인한 후 로그를 표시합니다.

      # journalctl -b -f -u ovs-vswitchd.service

      노드에 로그인하는 한 가지 방법은 oc debug node/<node_name> 명령을 사용하는 것입니다.