7.10. Windows 컨테이너 워크로드 문제 해결

7.10.1. Windows Machine Config Operator가 설치되지 않음

WMCO(Windows Machine Config Operator) 설치 프로세스를 완료했지만 Operator가 InstallWaiting 단계에서 멈춘 경우 네트워킹 문제로 인해 문제가 발생한 것일 수 있습니다.

WMCO를 사용하려면 OVN-Kubernetes를 사용하는 하이브리드 네트워킹으로 OpenShift Container Platform 클러스터를 구성해야 합니다. WMCO는 사용 가능한 하이브리드 네트워킹이 없으면 설치 프로세스를 완료할 수 없습니다. 이는 다중 운영 체제(OS) 및 OS 변형에서 노드를 관리하는 데 필요합니다. 클러스터를 설치하는 동안 완료해야 합니다.

자세한 내용은 하이브리드 네트워킹 구성을 참조하십시오.

7.10.2. Windows 머신이 컴퓨팅 노드가 되지 않는 이유 조사

Windows 머신이 컴퓨팅 노드가 되지 않는 데에는 다양한 이유가 있습니다. 이 문제를 조사하는 가장 좋은 방법은 WMCO(Windows Machine Config Operator) 로그를 수집하는 것입니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.

프로세스

  • 다음 명령을 실행하여 WMCO 로그를 수집합니다.

    $ oc logs -f deployment/windows-machine-config-operator -n openshift-windows-machine-config-operator

7.10.3. Windows 노드에 액세스

oc debug node 명령을 사용하여 Windows 노드에 액세스할 수 없습니다. 이 명령을 사용하려면 노드에서 권한 있는 Pod를 실행해야 하는데, 이 기능은 아직 Windows에서 지원되지 않습니다. 대신 SSH(Secure Shell) 또는 RDP(Remote Desktop Protocol)를 사용하여 Windows 노드에 액세스할 수 있습니다. 두 방법 모두 SSH bastion이 필요합니다.

7.10.3.1. SSH를 사용하여 Windows 노드에 액세스

SSH(Secure Shell)를 사용하여 Windows 노드에 액세스할 수 있습니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.
  • cloud-private-key 보안에 사용한 키와 클러스터를 만들 때 사용한 키를 ssh-agent에 추가했습니다. 보안상의 이유로 사용 후에는 ssh-agent에서 키를 제거해야 합니다.
  • ssh-bastion Pod를 사용하여 Windows 노드에 연결했습니다.

프로세스

  • 다음 명령을 실행하여 Windows 노드에 액세스합니다.

    $ ssh -t -o StrictHostKeyChecking=no -o ProxyCommand='ssh -A -o StrictHostKeyChecking=no \
        -o ServerAliveInterval=30 -W %h:%p core@$(oc get service --all-namespaces -l run=ssh-bastion \
        -o go-template="{{ with (index (index .items 0).status.loadBalancer.ingress 0) }}{{ or .hostname .ip }}{{end}}")' <username>@<windows_node_internal_ip> 1 2
    1
    AWS(Amazon Web Services)의 Administrator 또는 Microsoft Azure의 capi와 같은 클라우드 공급자 사용자 이름을 지정합니다.
    2
    노드의 내부 IP 주소를 지정합니다. 이 IP 주소는 다음 명령을 실행하여 검색할 수 있습니다.
    $ oc get nodes <node_name> -o jsonpath={.status.addresses[?\(@.type==\"InternalIP\"\)].address}

7.10.3.2. RDP를 사용하여 Windows 노드에 액세스

RDP(Remote Desktop Protocol)를 사용하여 Windows 노드에 액세스할 수 있습니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.
  • cloud-private-key 보안에 사용한 키와 클러스터를 만들 때 사용한 키를 ssh-agent에 추가했습니다. 보안상의 이유로 사용 후에는 ssh-agent에서 키를 제거해야 합니다.
  • ssh-bastion Pod를 사용하여 Windows 노드에 연결했습니다.

프로세스

  1. 다음 명령을 실행하여 SSH 터널을 설정합니다.

    $ ssh -L 2020:<windows_node_internal_ip>:3389 \ 1
        core@$(oc get service --all-namespaces -l run=ssh-bastion -o go-template="{{ with (index (index .items 0).status.loadBalancer.ingress 0) }}{{ or .hostname .ip }}{{end}}")
    1
    노드의 내부 IP 주소를 지정합니다. 이 IP 주소는 다음 명령을 실행하여 검색할 수 있습니다.
    $ oc get nodes <node_name> -o jsonpath={.status.addresses[?\(@.type==\"InternalIP\"\)].address}
  2. 결과 쉘 내에서 SSH를 통해 Windows 노드에 연결하고 다음 명령을 실행하여 사용자 암호를 만듭니다.

    C:\> net user <username> * 1
    1
    클라우드 공급자 사용자 이름을 지정합니다(예: AWS의 Administrator, Azure의 capi).

이제 RDP 클라이언트를 사용하여 localhost:2020에서 Windows 노드에 원격으로 액세스할 수 있습니다.

7.10.4. Windows 컨테이너에 대한 Kubernetes 노드 로그 수집

Windows 컨테이너 로깅은 Linux 컨테이너 로깅과 다르게 작동합니다. Windows 워크로드에 대한 Kubernetes 노드 로그는 기본적으로 C:\var\logs 디렉터리로 스트리밍됩니다. 따라서 해당 디렉터리에서 Windows 노드 로그를 수집해야 합니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.

절차

  1. C:\var\logs의 모든 디렉터리에 있는 로그를 보려면 다음 명령을 실행합니다.

    $ oc adm node-logs -l kubernetes.io/os=windows --path= \
        /ip-10-0-138-252.us-east-2.compute.internal containers \
        /ip-10-0-138-252.us-east-2.compute.internal hybrid-overlay \
        /ip-10-0-138-252.us-east-2.compute.internal kube-proxy \
        /ip-10-0-138-252.us-east-2.compute.internal kubelet \
        /ip-10-0-138-252.us-east-2.compute.internal pods
  2. 동일한 명령을 사용하여 디렉터리의 파일을 나열하고 개별 로그 파일을 볼 수 있습니다. 예를 들어 kubelet 로그를 보려면 다음 명령을 실행합니다.

    $ oc adm node-logs -l kubernetes.io/os=windows --path=/kubelet/kubelet.log

7.10.5. Windows 애플리케이션 이벤트 로그 수집

kubelet logs 끝점의 Get-WinEvent shim을 사용하여 Windows 머신에서 애플리케이션 이벤트 로그를 수집할 수 있습니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.

절차

  • Windows 머신의 이벤트 로그에 로깅하는 모든 애플리케이션의 로그를 보려면 다음을 실행합니다.

    $ oc adm node-logs -l kubernetes.io/os=windows --path=journal

    oc adm must-gather로 로그를 수집할 때와 같은 명령이 실행됩니다.

    -u 플래그를 사용하여 각 서비스를 지정하면 이벤트 로그의 다른 Windows 애플리케이션 로그도 수집할 수 있습니다. 예를 들어 다음 명령을 실행하면 Docker 런타임 서비스에 대한 로그를 수집할 수 있습니다.

    $ oc adm node-logs -l kubernetes.io/os=windows --path=journal -u docker

7.10.6. Windows 컨테이너에 대한 Docker 로그 수집

Windows Docker 서비스는 로그를 stdout에 스트리밍하지 않고 대신 Windows의 이벤트 로그에 기록합니다. Docker 이벤트 로그를 확인하여 Windows Docker 서비스로 발생할 수 있는 문제를 조사할 수 있습니다.

사전 요구 사항

  • OLM(Operator Lifecycle Manager)을 사용하여 WMCO(Windows Machine Config Operator)를 설치했습니다.
  • Windows 컴퓨팅 머신 세트를 생성했습니다.

절차

  1. Windows 노드에 SSH로 연결하고 PowerShell로 이동합니다.

    C:\> powershell
  2. 다음 명령을 실행하여 Docker 로그를 확인합니다.

    C:\> Get-EventLog -LogName Application -Source Docker

7.10.7. 추가 리소스