7.10. Windows 容器工作负载问题故障排除

7.10.1. 没有安装 Windows Machine Config Operator

如果已完成了安装 Windows Machine Config Operator(WMCO)的过程,但 Operator 一直处于 InstallWaiting 阶段,问题可能是由网络问题造成的。

WMCO 要求使用 OVN-Kubernetes 配置 OpenShift Container Platform 集群和混合网络。WMCO 在没有混合网络的情况下无法完成安装过程。这是管理多个操作系统(OS)和 OS 变体的节点所必需的。这必须在集群安装过程中完成。

如需更多信息,请参阅配置混合网络

7.10.2. 检查为什么 Windows 机器没有成为计算节点

Windows 机器没有成为计算节点的原因有很多。调查此问题的最佳方法是收集 Windows Machine Config Operator(WMCO)日志。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装 Windows Machine Config Operator(WMCO)。
  • 您已创建了 Windows 计算机器集。

流程

  • 运行以下命令来收集 WMCO 日志:

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

7.10.3. 访问 Windows 节点

Windows 节点无法使用 oc debug node 命令访问 ; 命令需要在该节点上运行特权 pod,但 Windows 还不支持这个 pod。可以使用 SSH 或 Remote Desktop Protocol(RDP)访问 Windows 节点。两种方法都需要一个 SSH 堡垒。

7.10.3.1. 使用 SSH 访问 Windows 节点

您可以使用 SSH 访问 Windows 节点。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装了 Windows Machine Config Operator(WMCO)。
  • 您已创建了 Windows 计算机器集。
  • 您已将 cloud-private-key secret 中使用的密钥以及创建集群时使用的密钥添加到 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
    指定云供应商用户名,如 Amazon Web Services(AWS)的 Administrator 或 Microsoft Azure 的 capi
    2
    指定节点的内部 IP 地址,可通过运行以下命令来发现该地址:
    $ oc get nodes <node_name> -o jsonpath={.status.addresses[?\(@.type==\"InternalIP\"\)].address}

7.10.3.2. 使用 RDP 访问 Windows 节点

您可以使用 Remote Desktop Protocol(RDP)访问 Windows 节点。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装 Windows Machine Config Operator(WMCO)。
  • 您已创建了 Windows 计算机器集。
  • 您已将 cloud-private-key secret 中使用的密钥以及创建集群时使用的密钥添加到 ssh-agent。为安全起见,请记住在使用后从 ssh-agent 中删除密钥。
  • 已使用 ssh-bastion pod 连接到 Windows 节点。

流程

  1. 运行以下命令设定 SSH tunnel:

    $ 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 地址,可通过运行以下命令来发现该地址:
    $ oc get nodes <node_name> -o jsonpath={.status.addresses[?\(@.type==\"InternalIP\"\)].address}
  2. 在生成的 shell 中 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 节点日志。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装 Windows Machine Config Operator(WMCO)。
  • 您已创建了 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 机器收集应用程序事件日志。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装 Windows Machine Config Operator(WMCO)。
  • 您已创建了 Windows 计算机器集。

流程

  • 要查看所有应用程序日志记录到 Windows 机器上的事件日志的日志,请运行:

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

    使用 oc adm must-gather 收集日志时执行同样的命令。

    还可以通过使用 -u 标志指定相应服务来收集来自事件日志的其它 Windows 应用程序日志。例如,您可以运行以下命令来收集 docker runtime 服务的日志:

    $ 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 服务造成的问题。

先决条件

  • 已使用 Operator Lifecycle Manager(OLM)安装 Windows Machine Config Operator(WMCO)。
  • 您已创建了 Windows 计算机器集。

流程

  1. SSH 到 Windows 节点并输入 PowerShell:

    C:\> powershell
  2. 运行以下命令来查看 Docker 日志:

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

7.10.7. 其他资源