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
$ 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 节点。
流程
运行以下命令设定 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}
在生成的 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 机器集。
流程
要在
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
您现在可以使用同样的命令列出目录中的文件并查看单个日志文件。例如,要查看 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 机器集。
流程
SSH 到 Windows 节点并输入 PowerShell:
C:\> powershell
运行以下命令来查看 Docker 日志:
C:\> Get-EventLog -LogName Application -Source Docker