registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel8:v4.8.7
OpenShift Virtualization 的数据收集。
registry.redhat.io/openshift-serverless-1/svls-must-gather-rhel8
OpenShift Serverless 的数据收集。
registry.redhat.io/openshift-service-mesh/istio-must-gather-rhel8
Red Hat OpenShift Service Mesh 的数据收集。
registry.redhat.io/rhmtc/openshift-migration-must-gather-rhel8:v1.7
MTC 的数据收集。
registry.redhat.io/ocs4/ocs-must-gather-rhel8
Red Hat OpenShift Container Storage 的数据收集。
registry.redhat.io/openshift-logging/cluster-logging-rhel8-operator
OpenShift Logging 的数据收集。
registry.redhat.io/openshift4/ose-local-storage-mustgather-rhel8
Local Storage Operator 的数据收集。
要收集除特定功能数据外的默认
must-gather
数据,请添加
--image-stream=openshift/must-gather
参数。
使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift Container Platform CLI (
oc
)。
进入存储
must-gather
数据的目录。
使用一个或多个
--image
或
--image-stream
参数运行
oc adm must-gather
命令。例如,使用以下命令可收集默认集群数据和 OpenShift Virtualization 特定信息:
$ oc adm must-gather \
--image-stream=openshift/must-gather \ 1
--image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel8:v4.8.7 2
-
1
-
默认 OpenShift Container Platform
must-gather
镜像
OpenShift Virtualization 的 must-gather 镜像
您可以将
must-gather
工具与额外参数搭配使用,以收集集群中与 OpenShift Logging 和 Red Hat OpenShift Logging Operator 相关的数据。对于 OpenShift Logging,运行以下命令:
$ oc adm must-gather --image=$(oc -n openshift-logging get deployment.apps/cluster-logging-operator \
-o jsonpath='{.spec.template.spec.containers[?(@.name == "cluster-logging-operator")].image}')
例 5.1. OpenShift Logging 的
must-gather
输出示例
├── cluster-logging
│ ├── clo
│ │ ├── cluster-logging-operator-74dd5994f-6ttgt
│ │ ├── clusterlogforwarder_cr
│ │ ├── cr
│ │ ├── csv
│ │ ├── deployment
│ │ └── logforwarding_cr
│ ├── collector
│ │ ├── fluentd-2tr64
│ ├── eo
│ │ ├── csv
│ │ ├── deployment
│ │ └── elasticsearch-operator-7dc7d97b9d-jb4r4
│ ├── es
│ │ ├── cluster-elasticsearch
│ │ │ ├── aliases
│ │ │ ├── health
│ │ │ ├── indices
│ │ │ ├── latest_documents.json
│ │ │ ├── nodes
│ │ │ ├── nodes_stats.json
│ │ │ └── thread_pool
│ │ ├── cr
│ │ ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
│ │ └── logs
│ │ ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
│ ├── install
│ │ ├── co_logs
│ │ ├── install_plan
│ │ ├── olmo_logs
│ │ └── subscription
│ └── kibana
│ ├── cr
│ ├── kibana-9d69668d4-2rkvz
├── cluster-scoped-resources
│ └── core
│ ├── nodes
│ │ ├── ip-10-0-146-180.eu-west-1.compute.internal.yaml
│ └── persistentvolumes
│ ├── pvc-0a8d65d9-54aa-4c44-9ecc-33d9381e41c1.yaml
├── event-filter.html
├── gather-debug.log
└── namespaces
├── openshift-logging
│ ├── apps
│ │ ├── daemonsets.yaml
│ │ ├── deployments.yaml
│ │ ├── replicasets.yaml
│ │ └── statefulsets.yaml
│ ├── batch
│ │ ├── cronjobs.yaml
│ │ └── jobs.yaml
│ ├── core
│ │ ├── configmaps.yaml
│ │ ├── endpoints.yaml
│ │ ├── events
│ │ │ ├── elasticsearch-im-app-1596020400-gm6nl.1626341a296c16a1.yaml
│ │ │ ├── elasticsearch-im-audit-1596020400-9l9n4.1626341a2af81bbd.yaml
│ │ │ ├── elasticsearch-im-infra-1596020400-v98tk.1626341a2d821069.yaml
│ │ │ ├── elasticsearch-im-app-1596020400-cc5vc.1626341a3019b238.yaml
│ │ │ ├── elasticsearch-im-audit-1596020400-s8d5s.1626341a31f7b315.yaml
│ │ │ ├── elasticsearch-im-infra-1596020400-7mgv8.1626341a35ea59ed.yaml
│ │ ├── events.yaml
│ │ ├── persistentvolumeclaims.yaml
│ │ ├── pods.yaml
│ │ ├── replicationcontrollers.yaml
│ │ ├── secrets.yaml
│ │ └── services.yaml
│ ├── openshift-logging.yaml
│ ├── pods
│ │ ├── cluster-logging-operator-74dd5994f-6ttgt
│ │ │ ├── cluster-logging-operator
│ │ │ │ └── cluster-logging-operator
│ │ │ │ └── logs
│ │ │ │ ├── current.log
│ │ │ │ ├── previous.insecure.log
│ │ │ │ └── previous.log
│ │ │ └── cluster-logging-operator-74dd5994f-6ttgt.yaml
│ │ ├── cluster-logging-operator-registry-6df49d7d4-mxxff
│ │ │ ├── cluster-logging-operator-registry
│ │ │ │ └── cluster-logging-operator-registry
│ │ │ │ └── logs
│ │ │ │ ├── current.log
│ │ │ │ ├── previous.insecure.log
│ │ │ │ └── previous.log
│ │ │ ├── cluster-logging-operator-registry-6df49d7d4-mxxff.yaml
│ │ │ └── mutate-csv-and-generate-sqlite-db
│ │ │ └── mutate-csv-and-generate-sqlite-db
│ │ │ └── logs
│ │ │ ├── current.log
│ │ │ ├── previous.insecure.log
│ │ │ └── previous.log
│ │ ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
│ │ ├── elasticsearch-im-app-1596030300-bpgcx
│ │ │ ├── elasticsearch-im-app-1596030300-bpgcx.yaml
│ │ │ └── indexmanagement
│ │ │ └── indexmanagement
│ │ │ └── logs
│ │ │ ├── current.log
│ │ │ ├── previous.insecure.log
│ │ │ └── previous.log
│ │ ├── fluentd-2tr64
│ │ │ ├── fluentd
│ │ │ │ └── fluentd
│ │ │ │ └── logs
│ │ │ │ ├── current.log
│ │ │ │ ├── previous.insecure.log
│ │ │ │ └── previous.log
│ │ │ ├── fluentd-2tr64.yaml
│ │ │ └── fluentd-init
│ │ │ └── fluentd-init
│ │ │ └── logs
│ │ │ ├── current.log
│ │ │ ├── previous.insecure.log
│ │ │ └── previous.log
│ │ ├── kibana-9d69668d4-2rkvz
│ │ │ ├── kibana
│ │ │ │ └── kibana
│ │ │ │ └── logs
│ │ │ │ ├── current.log
│ │ │ │ ├── previous.insecure.log
│ │ │ │ └── previous.log
│ │ │ ├── kibana-9d69668d4-2rkvz.yaml
│ │ │ └── kibana-proxy
│ │ │ └── kibana-proxy
│ │ │ └── logs
│ │ │ ├── current.log
│ │ │ ├── previous.insecure.log
│ │ │ └── previous.log
│ └── route.openshift.io
│ └── routes.yaml
└── openshift-operators-redhat
├── ...
-
使用一个或多个
--image
或
--image-stream
参数运行
oc adm must-gather
命令。例如,使用以下命令可收集默认集群数据和 KubeVirt 特定信息:
$ oc adm must-gather \
--image-stream=openshift/must-gather \ 1
--image=quay.io/kubevirt/must-gather 2
-
1
-
默认 OpenShift Container Platform
must-gather
镜像
KubeVirt 的 must-gather 镜像
从工作目录中刚刚创建的
must-gather
目录创建一个压缩文件。例如,在使用 Linux 操作系统的计算机上运行以下命令:
$ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
-
1
-
务必将
must-gather-local.5421342344627712289/
替换为实际目录名称。
在
红帽客户门户
中为您的问题单附上压缩文件。
您可以收集审计日志,它们是与安全相关的按时间排序的记录,记录各个用户、管理员或其他系统组件影响系统的一系列活动。您可以收集以下的审计日志:
etcd 服务器
Kubernetes API 服务器
OpenShift OAuth API 服务器
OpenShift API 服务器
使用
-- /usr/bin/gather_audit_logs
标志运行
oc adm must-gather
命令:
$ oc adm must-gather -- /usr/bin/gather_audit_logs
-
从工作目录中刚刚创建的
must-gather
目录创建一个压缩文件。例如,在使用 Linux 操作系统的计算机上运行以下命令:
$ tar cvaf must-gather.tar.gz must-gather.local.472290403699006248 1
-
1
-
将
must-gather-local.472290403699006248
替换为实际目录名称。
在
红帽客户门户
中为您的问题单附上压缩文件。
在向红帽支持提供信息时,提供集群的唯一标识符会很有帮助。您可以使用 OpenShift Container Platform Web 控制台自动填充集群 ID。您还可以使用 web 控制台或 OpenShift CLI(
oc
)手工获取集群 ID。
使用具有
cluster-admin
角色的用户访问集群。
访问安装的 web 控制台或 OpenShift CLI(
oc
)。
使用 Web 控制台开支持问题单并自动填充集群 ID:
从工具栏导航至
(?) help
→
Open Support Case
。
Cluster ID
的值会被自动填充 。
使用 web 控制台手动获取集群 ID:
导航到
Home
→
Dashboards
→
Overview
。
该值包括在
Details
中的
Cluster ID
项中。
要使用 OpenShift CLI(
oc
)获取集群 ID,请运行以下命令:
$ oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}'
sosreport
是一个从 Red Hat Enterprise Linux((RHEL)和 Red Hat Enterprise Linux CoreOS(RHCOS)系统收集配置详情、系统信息和诊断数据的工具。
sosreport
提供了一种标准的方法来收集有关节点的诊断信息,然后可以提供给红帽支持以进行诊断。
在一些情况下,红帽支持可能会要求您为特定 OpenShift Container Platform 节点收集
sosreport
归档。例如,有时可能需要查看系统日志或其他没有包括在
oc adm must-gather
输出的针对于节点的特定数据。
5.4. 为 OpenShift Container Platform 集群节点生成 sosreport 归档
为 OpenShift Container Platform 4.8 集群节点生成
sosreport
的建议方法是通过 debug pod。
您可以使用具有
cluster-admin
角色的用户访问集群。
您需要有到主机的 SSH 访问权限。
已安装 OpenShift CLI(
oc
)。
您有红帽标准订阅或高级订阅。
您有红帽客户门户网站帐户。
您已有一个红帽支持问题单 ID。
获取集群节点列表:
$ oc get nodes
在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug
的 debug pod:
$ oc debug node/my-cluster-node
要在目标节点上进入带有
NoExecute
效果的 debug 会话,请向 dummy 命名空间添加一个容限,并在 dummy 命名空间中启动 debug pod:
$ oc new-project dummy
$ oc patch namespace dummy --type=merge -p '{"metadata": {"annotations": { "scheduler.alpha.kubernetes.io/defaultTolerations": "[{\"operator\": \"Exists\"}]"}}}'
$ oc debug node/my-cluster-node
将
/host
设置为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
启动
toolbox
容器,其中包括运行
sosreport
所需的二进制文件和插件:
# toolbox
如果一个已存在的
toolbox
pod 已在运行,则
toolbox
命令会输出
'toolbox-' already exists.Trying to start…
.使用
podman rm toolbox-
删除正在运行的 toolbox容器,并生成新的 toolbox 容器以避免
sosreport
插件出现问题。
收集
sosreport
归档。
运行
sosreport
命令并启用
crio.all
和
crio.logs
CRI-O 容器引擎
sosreport
插件:
# sosreport -k crio.all=on -k crio.logs=on 1
-
1
-
-k
可让您在默认值之外定义
sosreport
插件参数。
提示后按
Enter
键继续。
提供红帽支持问题单 ID。
sosreport
将 ID 添加到存档的文件名中。
sosreport
输出提供了归档的位置和 checksum。以下示例输出引用支持问题单 ID
01234567
:
Your sosreport has been generated and saved in:
/host/var/tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz 1
The checksum is: 382ffc167510fd71b4f12a4f40b97a4e
-
1
-
sosreport
归档的文件路径在
chroot
环境之外,因为 toolbox 容器会在
/host
挂载主机的根目录。
使用以下方法之一为红帽支持提供
sosreport
归档以供分析。
将文件直接从 OpenShift Container Platform 集群上传到现有红帽支持问题单。
在 toolbox 容器内,运行
redhat-support-tool
将存档直接附加到现有红帽支持问题单中。这个示例使用问题单 ID
01234567
:
# redhat-support-tool addattachment -c 01234567 /host/var/tmp/my-sosreport.tar.xz 1
-
1
-
toolbox 容器将主机的根目录挂载到
/host
。当指定要通过
redhat-support-tool
命令上传的文件时,使用 toolbox 容器的根目录(包括
/host/
)的绝对路径。
将文件上传到现有红帽支持问题单中。
运行
oc debug node/<node_name>
命令调整
sosreport
归档,并将输出重定向到文件中。此命令假设您已退出以前的
oc debug
会话:
$ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz' > /tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz 1
-
1
-
debug 容器将主机的根目录挂载到
/host
。在指定用于连接的目标文件时,引用 debug 容器的根目录的绝对路径,包括
/host
。
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用
scp
从集群节点传输
sosreport
归档,这会使节点出现
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以通过运行
scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>
从节点复制
sosreport
归档文件。
进入
https://access.redhat.com/support/cases/
中的现有支持问题单。
选择
Attach files
并按提示上传该文件。
如果遇到与 bootstrap 相关的问题,可以从 bootstrap 节点收集
bootkube.service
journald
单元日志和容器日志。
具有到 bootstrap 节点的 SSH 访问权限。
具有 bootstrap 节点的完全限定域名。
在 OpenShift Container Platform 安装过程中,查询 bootstrap 节点的
bootkube.service
journald
单元日志。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> journalctl -b -f -u bootkube.service
bootstrap 节点上的
bootkube.service
日志会输出 etcd
connection refused
错误,这表示 bootstrap 服务器无法在 control plane 节点(也称为 master 节点)上连接到 etcd。在各个 control plane 节点上启动 etcd 且节点已加入集群后,这个错误应该会停止。
使用 bootstrap 节点上的
podman
从 bootstrap 节点容器收集日志。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> 'for pod in $(sudo podman ps -a -q); do sudo podman logs $pod; done'
您可以在独立集群节点的
/var/log
中收集
journald
单元日志和其他日志。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
查询 OpenShift Container Platform 集群节点的
kubelet
journald
单元日志。以下示例仅查询 control plane 节点(也称为 master 节点):
$ oc adm node-logs --role=master -u kubelet 1
-
1
-
根据情况替换
kubelet
以查询其他单元日志。
从集群节点上
/var/log/
下的特定子目录收集日志。
获取
/var/log/
子目录中所含的日志列表。以下示例列出所有 control plane 节点上的
/var/log/openshift-apiserver/
中的文件:
$ oc adm node-logs --role=master --path=openshift-apiserver
-
检查
/var/log/
子目录中的特定日志。以下示例输出来自所有 control plane 节点的
/var/log/openshift-apiserver/audit.log
内容:
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log
-
如果 API 无法正常工作,请使用 SSH 来查看每个节点上的日志。以下示例是
/var/log/openshift-apiserver/audit.log
的尾部的内容:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo tail -f /var/log/openshift-apiserver/audit.log
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
5.7. 从 OpenShift Container Platform 节点或容器收集网络追踪(trace)
在调查与网络相关的 OpenShift Container Platform 问题时,红帽可能会从特定的 OpenShift Container Platform 集群节点或从特定容器请求网络数据包追踪。在 OpenShift Container Platform 中捕获网络 trace 的建议方法是通过 debug pod。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您有红帽标准订阅或高级订阅。
您有红帽客户门户网站帐户。
您已有一个红帽支持问题单 ID。
您需要有到主机的 SSH 访问权限。
获取集群节点列表:
$ oc get nodes
在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug
的 debug pod:
$ oc debug node/my-cluster-node
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
在
chroot
环境控制台中获取节点接口名称:
# ip ad
启动
toolbox
容器,其中包括运行
sosreport
所需的二进制文件和插件:
# toolbox
如果一个已存在的
toolbox
pod 已在运行,则
toolbox
命令会输出
'toolbox-' already exists.Trying to start…
.要避免
tcpdump
出现问题,请使用
podman rm toolbox-
删除正在运行的 toolbox 容器,并生成新 toolbox 容器。
在集群节点中启动
tcpdump
会话,并将输出重定向到捕获文件中。这个示例使用
ens5
作为接口名称:
$ tcpdump -nn -s 0 -i ens5 -w /host/var/tmp/my-cluster-node_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap 1
-
1
-
tcpdump
捕获文件路径在
chroot
环境之外,因为 toolbox 容器会在
/host
中挂载主机的根目录。
如果节点上的特定容器需要
tcpdump
捕获,请按照以下步骤操作。
确定目标容器 ID。
chroot host
命令先于这一步中的
crictl
命令,因为 toolbox 容器在
/host
中挂载主机的根目录:
# chroot /host crictl ps
确定容器的进程 ID。在本例中,容器 ID 是
a7fe32346b120
:
# chroot /host crictl inspect --output yaml a7fe32346b120 | grep 'pid' | awk '{print $2}'
在容器上启动
tcpdump
会话,并将输出重定向到捕获文件中。本例使用
49628
作为容器的进程 ID,
ens5
是接口名称。
nsenter
命令进入目标进程的命名空间并在命名空间中运行命令。因为本例中的目标进程是一个容器的进程 ID,
tcpdump
命令从主机在容器的命名空间中运行:
# nsenter -n -t 49628 -- tcpdump -nn -i ens5 -w /host/var/tmp/my-cluster-node-my-container_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap.pcap 1
-
1
-
tcpdump
捕获文件路径在
chroot
环境之外,因为 toolbox 容器会在
/host
中挂载主机的根目录。
使用以下方法之一向红帽支持提供
tcpdump
捕获文件进行分析。
将文件直接从 OpenShift Container Platform 集群上传到现有红帽支持问题单。
在 toolbox 容器内,运行
redhat-support-tool
将该文件直接附加到现有红帽支持问题单中。这个示例使用问题单 ID
01234567
:
# redhat-support-tool addattachment -c 01234567 /host/var/tmp/my-tcpdump-capture-file.pcap 1
-
1
-
toolbox 容器将主机的根目录挂载到
/host
。当指定要通过
redhat-support-tool
命令上传的文件时,使用 toolbox 容器的根目录(包括
/host/
)的绝对路径。
将文件上传到现有红帽支持问题单中。
运行
oc debug node/<node_name>
命令调整
sosreport
归档,并将输出重定向到文件中。此命令假设您已退出以前的
oc debug
会话:
$ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-tcpdump-capture-file.pcap' > /tmp/my-tcpdump-capture-file.pcap 1
-
1
-
debug 容器将主机的根目录挂载到
/host
。在指定用于连接的目标文件时,引用 debug 容器的根目录的绝对路径,包括
/host
。
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用
scp
从集群节点传输
tcpdump
捕获文件,这会使节点出现
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以运行
scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>
从一个节点复制
tcpdump
捕获文件。
进入
https://access.redhat.com/support/cases/
中的现有支持问题单。
选择
Attach files
并按提示上传该文件。
在解决 OpenShift Container Platform 问题时,红帽可能会要求您将诊断数据上传到支持问题单中。文件可以通过红帽客户门户网站或使用
redhat-support-tool
命令直接从 OpenShift Container Platform 集群上传到支持问题单。
您可以使用具有
cluster-admin
角色的用户访问集群。
您需要有到主机的 SSH 访问权限。
已安装 OpenShift CLI(
oc
)。
您有红帽标准订阅或高级订阅。
您有红帽客户门户网站帐户。
您已有一个红帽支持问题单 ID。
通过红帽客户门户网站将诊断数据上传到现有红帽支持问题单中。
使用
oc debug node/<node_name>
命令调整一个 OpenShift Container Platform 节点中包含的诊断文件,并将输出重定向到文件中。以下示例将 debug 容器中的
/host/var/tmp/my-diagnostic-data.tar.gz
复制到
/var/tmp/my-diagnostic-data.tar.gz
:
$ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-diagnostic-data.tar.gz' > /var/tmp/my-diagnostic-data.tar.gz 1
-
1
-
debug 容器将主机的根目录挂载到
/host
。在指定用于连接的目标文件时,引用 debug 容器的根目录的绝对路径,包括
/host
。
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用
scp
从集群节点传输文件,这会使节点出现
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>
从一个节点复制诊断文件。
进入
https://access.redhat.com/support/cases/
中的现有支持问题单。
选择
Attach files
并按提示上传该文件。
将诊断数据直接从 OpenShift Container Platform 集群上传到现有红帽支持问题单中。
获取集群节点列表:
$ oc get nodes
-
在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug
的 debug pod:
$ oc debug node/my-cluster-node
-
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
启动
toolbox
容器,其中包含运行
redhat-support-tool
所需的二进制文件:
# toolbox
如果一个已存在的
toolbox
pod 已在运行,则
toolbox
命令会输出
'toolbox-' already exists.Trying to start…
.使用
podman rm toolbox-
删除正在运行的 toolbox 容器,并生成新的 toolbox 容器以避免出现问题。
运行
redhat-support-tool
将 debug pod 的文件直接附加到现有的红帽支持问题单中。这个示例使用支持问题单 ID '01234567' 和示例文件路径
/host/var/tmp/my-diagnostic-data.tar.gz
:
# redhat-support-tool addattachment -c 01234567 /host/var/tmp/my-diagnostic-data.tar.gz 1
-
1
-
toolbox 容器将主机的根目录挂载到
/host
。当指定要通过
redhat-support-tool
命令上传的文件时,使用 toolbox 容器的根目录(包括
/host/
)的绝对路径。
6.1. 通过
clusterversion
总结集群规格
您可以通过查询
clusterversion
资源来获取一个 OpenShift Container Platform 集群规格的总结数据。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
查询集群版本、可用性、运行时间以及常规状态:
$ oc get clusterversion
获取集群规格、更新可用性和更新历史记录的详细概述:
$ oc describe clusterversion
当对 OpenShift Container Platform 安装问题进行故障排除时,可以监控安装日志来确定在哪个阶段出现问题。然后,检索与该阶段相关的诊断数据。
OpenShift Container Platform 安装过程包括以下阶段:
创建 Ignition 配置文件。
启动引导计算机并开始托管要启动的 control plane 机器(也称为 master 机器)所需的远程资源。
control plane 机器从 bootstrap 机器获取远程资源并完成启动。
control plane 机器使用 bootstrap 机器组成 etcd 集群。
bootstrap 机器使用新的 etcd 集群启动临时 Kubernetes control plane。
临时 control plane 将生产环境 control plane 调度到 control plane 机器。
临时 control plane 关机,并将控制权交给生产环境 control plane。
bootstrap 机器将 OpenShift Container Platform 组件添加到生产环境 control plane。
安装程序关闭 bootstrap 机器。
control plane 设置 worker 节点。
control plane 以一组 Operator 的形式安装其他服务。
集群下载并配置日常运作所需的其余组件,包括在受支持的环境中创建 worker 机器。
默认安装方法使用安装程序置备的基础架构。对于安装程序置备的基础架构的集群,OpenShift Container Platform 可以管理集群的所有方面,包括操作系统本身。若有可能,可以使用此功能来避免置备和维护集群基础架构。
您也可以在自己提供的基础架构上安装 OpenShift Container Platform 4.8。如果您使用这个安装方法,请完全遵循用户置备的基础架构安装文档中的内容。另外,在安装前请考虑以下事项:
查看
Red Hat Enterprise Linux(RHEL)生态系统
中的内容来决定您所使用的服务器硬件或虚拟环境可以获得的 Red Hat Enterprise Linux CoreOS(RHCOS)对其支持的级别。
很多虚拟化和云环境需要在客户端操作系统中安装代理。确保将这些代理作为通过守护进程集部署的容器化工作负载安装。
如果要启用动态存储、按需服务路由、节点主机名到 Kubernetes 主机名解析以及集群自动扩展等功能,请安装云供应商集成。
不可能在混合有不同云供应商,或跨多个物理或虚拟平台的 OpenShift Container Platform 环境中启用云供应商集成。节点生命周期控制器不允许将来自现有供应商外部的节点添加到集群中,且无法指定多个云供应商集成。
如果要使用机器集或自动扩展来自动置备 OpenShift Container Platform 集群节点,则需要针对于供应商的 Machine API 实现。
检查您所选云供应商是否提供了将 Ignition 配置文件注入主机的方法作为其初始部署的一部分。如果不这样做,则需要使用 HTTP 服务器托管 Ignition 配置文件。解决 Ignition 配置文件问题的步骤会因部署了这两种方法的不同而有所不同。
如果要利用可选的框架组件,如嵌入式容器 registry、Elasticsearch 或 Prometheus,则需要手动置备存储。除非明确进行了配置,用户置备的基础架构安装中不定义默认存储类。
在高可用性 OpenShift Container Platform 环境中,需要一个负载均衡器来在所有 control plane 节点(也称为 master 节点)之间分发 API 请求。您可以使用任何满足 OpenShift Container Platform DNS 路由和端口要求的基于 TCP 的负载平衡解决方案。
7.1.3. 在 OpenShift Container Platform 安装前检查负载均衡器配置
在开始 OpenShift Container Platform 安装前,请检查您的负载均衡器配置。
已根据选择配置了外部负载均衡器,准备 OpenShift Container Platform 安装。以下示例基于使用 HAProxy 为集群提供负载均衡服务的 Red Hat Enterprise Linux(RHEL)主机。
为准备 OpenShift Container Platform 安装已配置了 DNS 准备。
有到负载均衡器的 SSH 访问权限。
检查
haproxy
systemd 服务是否活跃:
$ ssh <user_name>@<load_balancer> systemctl status haproxy
验证负载均衡器是否在监听所需端口。以下示例引用端口
80
、
443
、
6443
和
22623
。
对于在 Red Hat Enterprise Linux(RHEL)6 上运行的 HAProxy 实例,请使用
netstat
命令验证端口状态:
$ ssh <user_name>@<load_balancer> netstat -nltupe | grep -E ':80|:443|:6443|:22623'
对于在 Red Hat Enterprise Linux(RHEL)7 或 8 上运行的 HAProxy 实例,请使用
ss
命令验证端口状态:
$ ssh <user_name>@<load_balancer> ss -nltupe | grep -E ':80|:443|:6443|:22623'
红帽建议在 Red Hat Enterprise Linux(RHEL)7 或更高版本中使用
ss
命令而不是
netstat
。
SS
由 iproute 软件包提供。有关
ss
命令的详情请参考
Red Hat Enterprise Linux(RHEL)7 性能调节指南
。
检查通配符 DNS 记录是否被解析为负载均衡器:
$ dig <wildcard_fqdn> @<dns_server>
7.1.4. 指定 OpenShift Container Platform 安装程序日志级别
默认情况下,OpenShift Container Platform 安装程序日志级别设置为
info
。如果在诊断失败的 OpenShift Container Platform 安装时需要更详细的日志记录,您可以在重新开始安装时将
openshift-install
日志级别提高为
debug
。
有访问安装主机的访问权限。
在启动安装时将安装日志级别设置为
debug
:
$ ./openshift-install --dir <installation_directory> wait-for bootstrap-complete --log-level debug 1
-
1
-
可能的日志级别包括
info
、
warn
、error
和
debug
。
7.1.5. openshift-install 命令问题故障排除
如果您在运行
openshift-install
命令时遇到问题,请检查以下内容:
安装过程在 Ignition 配置文件创建后 24 小时内启动。运行以下命令时创建 Ignition 文件:
$ ./openshift-install create ignition-configs --dir=./install_dir
install-config.yaml
文件与安装程序位于同一个目录中。如果使用
./openshift-install --dir
选项声明了其他不同的安装路径,请验证
install-config.yaml
文件是否存在于该目录中。
您可以在 OpenShift Container Platform 安装过程中监控高级别安装、bootstrap 和 control plane 日志。这提高了安装过程的可视性,并有助于识别安装失败的阶段。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
您有 bootstrap 和 control plane 节点的完全限定域名(也称为 master 节点)。
初始
kubeadmin
密码可在安装主机的
<install_directory>/auth/kubeadmin-password
中找到。
在安装过程中监控安装日志:
$ tail -f ~/<installation_directory>/.openshift_install.log
在 bootstrap 节点引导后,监控
bootkube.service
journald 单元日志。这可让您了解第一个 control plane 的 bootstrap。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> journalctl -b -f -u bootkube.service
bootstrap 节点上的
bootkube.service
日志会输出 etcd
connection refused
错误,这表示 bootstrap 服务器无法在 control plane 节点上连接到 etcd。在各个 control plane 节点上启动 etcd 且节点已加入集群后,这个错误应该会停止。
引导后,监控 control plane 节点上的
kubelet.service
journald 单元日志。这可让您了解 control plane 节点代理活动。
使用
oc
监控日志:
$ oc adm node-logs --role=master -u kubelet
如果 API 无法正常工作,使用 SSH 来查看日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<master-node>.<cluster_name>.<base_domain> journalctl -b -f -u kubelet.service
引导后,监控 control plane 节点上的
crio.service
journald 单元日志。这可让您了解 control plane 节点 CRI-O 容器运行时的活动。
使用
oc
监控日志:
$ oc adm node-logs --role=master -u crio
如果 API 无法正常工作,使用 SSH 来查看日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh [email protected]_name.sub_domain.domain journalctl -b -f -u crio.service
7.1.7. 收集 bootstrap 节点诊断数据
当遇到与 bootstrap 相关的问题,可以从 bootstrap 节点收集
bootkube.service
journald
单元日志和容器日志。
具有到 bootstrap 节点的 SSH 访问权限。
具有 bootstrap 节点的完全限定域名。
如果使用 HTTP 服务器托管 Ignition 配置文件,则必须具有 HTTP 服务器的完全限定域名和端口号。还必须有到 HTTP 主机的 SSH 访问权限。
如果可以访问 bootstrap 节点的控制台,请监控控制台,直到节点可以提供登录提示。
验证 Ignition 文件配置。
如果您使用 HTTP 服务器托管 Ignition 配置文件。
验证 bootstrap 节点 Ignition 文件 URL。将
<http_server_fqdn>
替换为 HTTP 服务器的完全限定域名:
$ curl -I http://<http_server_fqdn>:<port>/bootstrap.ign 1
-
1
-
-I
选项只返回标头。如果指定的 URL 中有 Ignition 文件,该命令会返回
200 OK
状态。如果没有,该命令会返回
404 file not found
。
要验证 bootstrap 节点是否收到 Ignition 文件,请查询服务主机上的 HTTP 服务器日志。例如,如果您使用 Apache web 服务器提供 Ignition 文件,请输入以下命令:
$ grep -is 'bootstrap.ign' /var/log/httpd/access_log
如果收到 bootstrap Ignition 文件,相关的
HTTP GET
日志消息将包含
200 OK
成功状态,这表示请求成功。
如果未收到 Ignition 文件,请检查 Ignition 文件是否存在,是否在服务主机上具有适当的文件和 Web 服务器权限。
如果您使用云供应商机制将 Ignition 配置文件注入主机作为其初始部署的一部分。
查看 bootstrap 节点的控制台,以确定机制是否正确注入 bootstrap 节点 Ignition 文件。
验证 bootstrap 节点分配的存储设备是否可用。
验证 bootstrap 节点是否已从 DHCP 服务器分配了一个 IP 地址。
从 bootstrap 节点收集
bootkube.service
journald 单元日志。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> journalctl -b -f -u bootkube.service
bootstrap 节点上的
bootkube.service
日志会输出 etcd
connection refused
错误,这表示 bootstrap 服务器无法在 control plane 节点(也称为 master 节点)上连接到 etcd。在各个 control plane 节点上启动 etcd 且节点已加入集群后,这个错误应该会停止。
从 bootstrap 节点容器收集日志。
使用 bootstrap 节点上的
podman
来收集日志。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> 'for pod in $(sudo podman ps -a -q); do sudo podman logs $pod; done'
-
如果 bootstrap 过程失败,请验证以下内容。
您可从安装主机解析
api.<cluster_name>.<base_domain>
。
负载均衡器代理端口 6443 连接到 bootstrap 和 control plane 节点。确保代理配置满足 OpenShift Container Platform 安装要求。
7.1.8. 调查 control plane 节点安装问题
如果您遇到 control plane 节点(也称为 master 节点)安装问题,请确定 control plane 节点 OpenShift Container Platform 软件定义的网络 (SDN) 和网络 Operator 状态。收集
kubelet.service
、
crio.service
journald 单元日志和 control plane 节点容器日志,以检查 control plane 节点代理、CRI-O 容器运行时和 pod 的情况。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
您有 bootstrap 和 control plane 节点的完全限定域名。
如果使用 HTTP 服务器托管 Ignition 配置文件,则必须具有 HTTP 服务器的完全限定域名和端口号。还必须有到 HTTP 主机的 SSH 访问权限。
初始
kubeadmin
密码可在安装主机的
<install_directory>/auth/kubeadmin-password
中找到。
如果您可以访问 control plane 节点的控制台,请监控控制台,直到节点可以提供登录提示。在安装过程中,Ignition 日志消息输出到控制台。
验证 Ignition 文件配置。
如果您使用 HTTP 服务器托管 Ignition 配置文件。
验证 control plane 节点 Ignition 文件 URL。将
<http_server_fqdn>
替换为 HTTP 服务器的完全限定域名:
$ curl -I http://<http_server_fqdn>:<port>/master.ign 1
-
1
-
-I
选项只返回标头。如果指定的 URL 中有 Ignition 文件,该命令会返回
200 OK
状态。如果没有,该命令会返回
404 file not found
。
要验证 control plane 节点是否收到 Ignition 文件,请查询服务主机上的 HTTP 服务器日志。例如,如果您使用 Apache web 服务器提供 Ignition 文件:
$ grep -is 'master.ign' /var/log/httpd/access_log
如果收到 master Ignition 文件,相关的
HTTP GET
日志消息将包含
200 OK
成功状态,表示请求成功。
如果未收到 Ignition 文件,请检查是否直接存在于服务主机上。确定有适当的文件权限和网页服务器权限。
如果您使用云供应商机制将 Ignition 配置文件注入主机作为其初始部署的一部分。
查看 control plane 节点的控制台,以确定机制是否正确注入 control plane 节点 Ignition 文件。
检查分配给 control plane 节点的存储设备是否可用。
验证 control plane 节点是否已从 DHCP 服务器分配了一个 IP 地址。
确定 control plane 节点状态。
查询 control plane 节点状态:
$ oc get nodes
-
如果一个 control plane 节点没有处于
Ready
状态,检索详细的节点描述:
$ oc describe node <master_node>
如果某个安装问题导致 OpenShift Container Platform API 无法运行,或者 kubelet 还没有在每个节点上运行,则无法运行
oc
命令:
确定 OpenShift Container Platform SDN 状态。
在
openshift-sdn
命名空间内查看
sdn-controller
、
sdn
和
ovs
守护进程集的状态:
$ oc get daemonsets -n openshift-sdn
-
如果这些资源列为
Not found
,查看
openshift-sdn
命名空间中的 pod:
$ oc get pods -n openshift-sdn
-
检查
openshift-sdn
命名空间中与失败的 OpenShift Container Platform SDN pod 相关的日志:
$ oc logs <sdn_pod> -n openshift-sdn
-
确定集群网络配置状态。
查看集群的网络配置是否存在:
$ oc get network.config.openshift.io cluster -o yaml
-
如果安装程序无法创建网络配置,请再次生成 Kubernetes 清单并查看消息输出:
$ ./openshift-install create manifests
-
查看
openshift-network-operator
命名空间中的 pod 状态,以确定 Cluster Network Operator(CNO)是否在运行:
$ oc get pods -n openshift-network-operator
-
从
openshift-network-operator
命名空间中收集网络 Operator pod 日志:
$ oc logs pod/<network_operator_pod_name> -n openshift-network-operator
引导后,监控 control plane 节点上的
kubelet.service
journald 单元日志。这可让您了解 control plane 节点代理活动。
使用
oc
检索日志:
$ oc adm node-logs --role=master -u kubelet
如果 API 无法正常工作,使用 SSH 来查看日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<master-node>.<cluster_name>.<base_domain> journalctl -b -f -u kubelet.service
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
引导后,在 control plane 节点上检索
crio.service
journald 单元日志。这可让您了解 control plane 节点 CRI-O 容器运行时的活动。
使用
oc
检索日志:
$ oc adm node-logs --role=master -u crio
如果 API 无法正常工作,使用 SSH 来查看日志:
$ ssh core@<master-node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.service
从 control plane 节点上的
/var/log/
下的特定子目录收集日志。
获取
/var/log/
子目录中所含的日志列表。以下示例列出所有 control plane 节点上的
/var/log/openshift-apiserver/
中的文件:
$ oc adm node-logs --role=master --path=openshift-apiserver
检查
/var/log/
子目录中的特定日志。以下示例输出来自所有 control plane 节点的
/var/log/openshift-apiserver/audit.log
内容:
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log
如果 API 无法正常工作,请使用 SSH 来查看每个节点上的日志。以下示例是
/var/log/openshift-apiserver/audit.log
的尾部的内容:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo tail -f /var/log/openshift-apiserver/audit.log
使用 SSH 查看 control plane 节点容器日志。
列出容器:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl ps -a
使用
crictl
检索容器日志:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl logs -f <container_id>
如果您遇到 control plane 节点配置问题,请验证 MCO、MCO 端点和 DNS 记录是否正常工作。Machine Config Operator(MCO)在安装过程中管理操作系统配置。同时还要检查系统时钟准确性以及证书的有效性。
测试 MCO 端点是否可用。将
<cluster_name>
替换为适当的值:
$ curl https://api-int.<cluster_name>:22623/config/master
如果端点不响应,请验证负载均衡器配置。确保端点配置为在端口 22623 上运行。
验证 MCO 端点的 DNS 记录是否已配置并解析到负载均衡器。
对定义的 MCO 端点名称运行 DNS 查找:
$ dig api-int.<cluster_name> @<dns_server>
在负载均衡器上对分配的 MCO IP 地址进行逆向查询:
$ dig -x <load_balancer_mco_ip_address> @<dns_server>
验证 MCO 是否直接从 bootstrap 节点运行。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> curl https://api-int.<cluster_name>:22623/config/master
系统时钟时间必须在 bootstrap、master 和 worker 节点间保持同步。检查每个节点的系统时钟参考时间和时间同步统计信息:
$ ssh core@<node>.<cluster_name>.<base_domain> chronyc tracking
检查证书的有效性:
$ openssl s_client -connect api-int.<cluster_name>:22623 | openssl x509 -noout -text
如果在安装过程中遇到 etcd 问题,您可以检查 etcd pod 状态并收集 etcd pod 日志。您还可以验证 etcd DNS 记录并检查 control plane 节点上的 DNS 可用性(也称为 master 节点)。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
您有 control plane 节点的完全限定域名。
检查 etcd pod 的状态。
查看
openshift-etcd
命名空间中的 pod 状态:
$ oc get pods -n openshift-etcd
查看
openshift-etcd-operator
命名空间中的 pod 状态:
$ oc get pods -n openshift-etcd-operator
如果以上命令中列出的任何 pod 没有显示
Running
或
Completed
状态,请为 pod 收集诊断信息。
检查 pod 的事件:
$ oc describe pod/<pod_name> -n <namespace>
检查 pod 的日志:
$ oc logs pod/<pod_name> -n <namespace>
如果 pod 有多个容器,以上命令会创建一个错误并在错误消息中提供容器名称。检查每个容器的日志:
$ oc logs pod/<pod_name> -c <container_name> -n <namespace>
如果 API 无法正常工作,请使用 SSH 来查看每个 control plane 节点上的 etcd pod 和容器日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值。
列出每个 control plane 节点上的 etcd pod:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl pods --name=etcd-
对于没有显示
Ready
状态的 pod,详细检查 pod 状态。将
<pod_id>
替换为上一命令输出中列出的 pod ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspectp <pod_id>
列出与 pod 相关的容器:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl ps | grep '<pod_id>'
对于没有显示
Ready
状态的容器,请详细检查容器状态。将
<container_id>
替换为上一命令输出中列出的容器 ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspect <container_id>
检查任何未显示
Ready
状态的容器的日志。将
<container_id>
替换为上一命令输出中列出的容器 ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl logs -f <container_id>
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
验证 control plane 节点的主和从属 DNS 服务器连接。
7.1.10. 调查 control plane 节点 kubelet 和 API 服务器问题
要在安装过程中调查 control plane 节点(也称为 master 节点)kubelet 和 API 服务器问题,请检查 DNS、DHCP 和负载均衡器功能。另外,请确认证书没有过期。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
您有 control plane 节点的完全限定域名。
验证 API 服务器的 DNS 记录是否将 control plane 节点上的 kubelet 定向到
https://api-int.<cluster_name>.<base_domain>:6443
。确保记录引用负载均衡器。
确保负载均衡器的端口 6443 定义引用每个 control plane 节点。
检查 DHCP 是否提供了唯一的 control plane 节点主机名。
检查每个 control plane 节点上的
kubelet.service
journald 单元日志。
使用
oc
检索日志:
$ oc adm node-logs --role=master -u kubelet
如果 API 无法正常工作,使用 SSH 来查看日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<master-node>.<cluster_name>.<base_domain> journalctl -b -f -u kubelet.service
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
检查 control plane 节点 kubelet 日志中的证书过期信息。
使用
oc
检索日志:
$ oc adm node-logs --role=master -u kubelet | grep -is 'x509: certificate has expired'
如果 API 无法正常工作,使用 SSH 来查看日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<master-node>.<cluster_name>.<base_domain> journalctl -b -f -u kubelet.service | grep -is 'x509: certificate has expired'
如果遇到 worker 节点安装问题,可以查看 worker 节点的状态。收集
kubelet.service
、
crio.service
journald 单元日志和 worker 节点容器日志,以检查 worker 节点代理、CRI-O 容器运行时和 pod 的情况。另外,还可以检查 Ignition 文件和 Machine API Operator 是否正常工作。如果 worker 节点安装后配置失败,检查 Machine Config Operator(MCO)和 DNS 是否正常工作。您还可以验证 bootstrap、master 和 worker 节点之间的系统时钟是否同步,并验证证书。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
您有 bootstrap 和 worker 节点的完全限定域名。
如果使用 HTTP 服务器托管 Ignition 配置文件,则必须具有 HTTP 服务器的完全限定域名和端口号。还必须有到 HTTP 主机的 SSH 访问权限。
初始
kubeadmin
密码可在安装主机的
<install_directory>/auth/kubeadmin-password
中找到。
如果可以访问 worker 节点的控制台,请监控控制台,直到节点可以提供登录提示。在安装过程中,Ignition 日志消息输出到控制台。
验证 Ignition 文件配置。
如果您使用 HTTP 服务器托管 Ignition 配置文件。
验证 worker 节点 Ignition 文件 URL。将
<http_server_fqdn>
替换为 HTTP 服务器的完全限定域名:
$ curl -I http://<http_server_fqdn>:<port>/worker.ign 1
-
1
-
-I
选项只返回标头。如果指定的 URL 中有 Ignition 文件,该命令会返回
200 OK
状态。如果没有,该命令会返回
404 file not found
。
要验证 worker 节点是否收到 Ignition 文件,请查询 HTTP 主机上的 HTTP 服务器日志。例如,如果您使用 Apache web 服务器提供 Ignition 文件:
$ grep -is 'worker.ign' /var/log/httpd/access_log
如果收到 worker Ignition 文件,相关的
HTTP GET
日志消息将包含
200 OK
成功状态,表示请求成功。
如果未收到 Ignition 文件,请检查是否直接存在于服务主机上。确定有适当的文件权限和网页服务器权限。
如果您使用云供应商机制将 Ignition 配置文件注入主机作为其初始部署的一部分。
查看 worker 节点的控制台,以确定机制是否正确注入 worker 节点 Ignition 文件。
检查 worker 节点分配的存储设备是否可用。
验证 worker 节点是否已从 DHCP 服务器分配了一个 IP 地址。
确定 worker 节点状态。
查询节点状态:
$ oc get nodes
-
获取没有显示
Ready
状态的 worker 节点的详细节点描述:
$ oc describe node <worker_node>
如果某个安装问题导致 OpenShift Container Platform API 无法运行,或者 kubelet 还没有在每个节点上运行,则无法运行
oc
命令。
与 control plane 节点(也称为 master 节点)不同,worker 节点使用 Machine API Operator 部署和扩展。检查 Machine API Operator 的状态。
查看 Machine API Operator pod 状态:
$ oc get pods -n openshift-machine-api
-
如果 Machine API Operator pod 没有处于
Ready
状态,请详细列出 pod 的事件:
$ oc describe pod/<machine_api_operator_pod_name> -n openshift-machine-api
-
检查
machine-api-operator
容器日志。容器在
machine-api-operator
pod 中运行:
$ oc logs pod/<machine_api_operator_pod_name> -n openshift-machine-api -c machine-api-operator
-
同时检查
kube-rbac-proxy
容器日志。容器也会在
machine-api-operator
pod 中运行:
$ oc logs pod/<machine_api_operator_pod_name> -n openshift-machine-api -c kube-rbac-proxy
-
引导后,监控 worker 节点上的
kubelet.service
journald 单元日志。这可让您了解 worker 节点代理活动。
使用
oc
检索日志:
$ oc adm node-logs --role=worker -u kubelet
-
如果 API 无法正常工作,使用 SSH 来查看日志。将
<worker-node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<worker-node>.<cluster_name>.<base_domain> journalctl -b -f -u kubelet.service
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
引导后,在 worker 节点上获取
crio.service
journald 单元日志。这可让您了解 worker 节点 CRI-O 容器运行时的活动。
使用
oc
检索日志:
$ oc adm node-logs --role=worker -u crio
-
如果 API 无法正常工作,使用 SSH 来查看日志:
$ ssh core@<worker-node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.service
从 worker 节点上的
/var/log/
下的特定子目录收集日志。
获取
/var/log/
子目录中所含的日志列表。以下示例列出所有 worker 节点上
/var/log/sssd/
中的文件:
$ oc adm node-logs --role=worker --path=sssd
检查
/var/log/
子目录中的特定日志。以下示例输出来自所有 worker 节点的
/var/log/sssd/audit.log
内容:
$ oc adm node-logs --role=worker --path=sssd/sssd.log
如果 API 无法正常工作,请使用 SSH 来查看每个节点上的日志。以下示例显示
/var/log/sssd/sssd.log
的尾部信息:
$ ssh core@<worker-node>.<cluster_name>.<base_domain> sudo tail -f /var/log/sssd/sssd.log
使用 SSH 查看 worker 节点容器日志。
列出容器:
$ ssh core@<worker-node>.<cluster_name>.<base_domain> sudo crictl ps -a
使用
crictl
检索容器日志:
$ ssh core@<worker-node>.<cluster_name>.<base_domain> sudo crictl logs -f <container_id>
如果您遇到 worker 节点配置问题,检查 MCO、MCO 端点和 DNS 记录是否正常运行。Machine Config Operator(MCO)在安装过程中管理操作系统配置。同时还要检查系统时钟准确性以及证书的有效性。
测试 MCO 端点是否可用。将
<cluster_name>
替换为适当的值:
$ curl https://api-int.<cluster_name>:22623/config/worker
如果端点不响应,请验证负载均衡器配置。确保端点配置为在端口 22623 上运行。
验证 MCO 端点的 DNS 记录是否已配置并解析到负载均衡器。
对定义的 MCO 端点名称运行 DNS 查找:
$ dig api-int.<cluster_name> @<dns_server>
在负载均衡器上对分配的 MCO IP 地址进行逆向查询:
$ dig -x <load_balancer_mco_ip_address> @<dns_server>
验证 MCO 是否直接从 bootstrap 节点运行。将
<bootstrap_fqdn>
替换为 bootstrap 节点的完全限定域名:
$ ssh core@<bootstrap_fqdn> curl https://api-int.<cluster_name>:22623/config/worker
系统时钟时间必须在 bootstrap、master 和 worker 节点间保持同步。检查每个节点的系统时钟参考时间和时间同步统计信息:
$ ssh core@<node>.<cluster_name>.<base_domain> chronyc tracking
检查证书的有效性:
$ openssl s_client -connect api-int.<cluster_name>:22623 | openssl x509 -noout -text
7.1.12. 安装后查询 Operator 状态
您可以在安装结束时检查 Operator 状态。检索不可用的 Operator 的诊断数据。检查所有列为
Pending
或具有错误状态的 Operator pod 的日志。验证有问题的 pod 所使用的基础镜像。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
检查安装结束时,是否所有集群 Operator 都可用。
$ oc get clusteroperators
验证所有所需的证书签名请求(CSR)是否已批准。有些节点可能无法变为
Ready
状态,且有些集群 Operator 可能无法使用(如果待处理的 CSR)。
检查 CSR 的状态,并确保添加到集群中的每台机器都有
Pending
或
Approved
状态的客户端和服务器请求:
$ oc get csr
查看 Operator 事件:
$ oc describe clusteroperator <operator_name>
查看 Operator 命名空间中的 Operator pod 状态:
$ oc get pods -n <operator_namespace>
获取没有处于
Running
状态的 pod 的详细描述:
$ oc describe pod/<operator_pod_name> -n <operator_namespace>
检查 pod 日志:
$ oc logs pod/<operator_pod_name> -n <operator_namespace>
遇到与 pod 基础镜像相关的问题时,请查看基础镜像状态。
获取有问题的 pod 使用的基础镜像的详情:
$ oc get pod -o "jsonpath={range .status.containerStatuses[*]}{.name}{'\t'}{.state}{'\t'}{.image}{'\n'}{end}" <operator_pod_name> -n <operator_namespace>
列出基础镜像发行信息:
$ oc adm release info <image_path>:<tag> --commits
如果您为安装程序提供了 SSH 密钥,则可以收集有关失败安装的数据。
与从正在运行的集群收集日志相比,您可以使用其他命令收集失败安装的日志。如果必须从正在运行的集群中收集日志,请使用
oc adm must-gather
命令。
在 bootstrap 过程完成前,OpenShift Container Platform 安装会失败。bootstrap 节点正在运行,并可通过 SSH 访问。
ssh-agent
进程在您的计算机上处于活跃状态,并且为
ssh-agent
进程和安装程序提供了相同的 SSH 密钥。
如果尝试在您置备的基础架构上安装集群,则必须具有 bootstrap 和 control plane 节点(也称为 master 节点)的完全限定域名。
生成从 bootstrap 和 control plane 机器获取安装日志的命令:
如果您使用安装程序置备的基础架构,请切换到包含安装程序的目录,并运行以下命令:
$ ./openshift-install gather bootstrap --dir <installation_directory> 1
-
1
-
installation_directory
是您在运行时指定的目录
。/openshift-install create cluster
。此目录包含安装程序创建的 OpenShift Container Platform 定义文件。
对于安装程序置备的基础架构,安装程序会保存有关集群的信息,因此您不用指定主机名或 IP 地址。
如果您使用您置备的基础架构,请切换到包含安装程序的目录,并运行以下命令:
$ ./openshift-install gather bootstrap --dir <installation_directory> \ 1
--bootstrap <bootstrap_address> \ 2
--master <master_1_address> \ 3
--master <master_2_address> \ 4
--master <master_3_address>" 5
-
1
-
对于
installation_directory
,请指定您在运行时指定的同一目录
。/openshift-install create cluster
。此目录包含安装程序创建的 OpenShift Container Platform 定义文件。
<bootstrap_address>
是集群 bootstrap 机器的完全限定域名或 IP 地址。
-
3
4
5
-
对于集群中的每个 control plane 或 master 机器,将
<master_*_address>
替换为其完全限定域名或 IP 地址。
默认集群包含三台 control plane 机器。如所示,列出所有 control plane 机器,无论您的集群使用了多少个。
INFO Pulling debug logs from the bootstrap machine
INFO Bootstrap gather logs captured here "<installation_directory>/log-bundle-<timestamp>.tar.gz"
如果需要创建关安装失败的红帽支持问题单,请在问题单中附上压缩日志。
-
如需了解更多与 OpenShift Container Platform
安装类型和流程
相关的详细信息,请参阅安装过程。
查看集群节点健康状况、资源消耗统计和节点日志。另外,在单个节点上查询
kubelet
状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出集群中所有节点的名称、状态和角色:
$ oc get nodes
总结集群中每个节点的 CPU 和内存使用情况:
$ oc adm top nodes
总结特定节点的 CPU 和内存使用情况:
$ oc adm top node my-node
您可以查看集群节点健康状况、资源消耗统计和节点日志。另外,您还可以在单个节点上查询
kubelet
状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
kubelet 通过每个节点上的 systemd 服务来管理。通过在 debug pod 中查询
kubelet
systemd 服务来查看 kubelet 的状态。
为节点启动 debug pod:
$ oc debug node/my-node
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或
kubelet
在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
检查
kubelet
systemd 服务是否在该节点上活跃:
# systemctl is-active kubelet
输出更详细的
kubelet.service
状态概述:
# systemctl status kubelet
您可以在独立集群节点的
/var/log
中收集
journald
单元日志和其他日志。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
您需要有到主机的 SSH 访问权限。
查询 OpenShift Container Platform 集群节点的
kubelet
journald
单元日志。以下示例仅查询 control plane 节点(也称为 master 节点):
$ oc adm node-logs --role=master -u kubelet 1
-
1
-
根据情况替换
kubelet
以查询其他单元日志。
从集群节点上
/var/log/
下的特定子目录收集日志。
获取
/var/log/
子目录中所含的日志列表。以下示例列出所有 control plane 节点上的
/var/log/openshift-apiserver/
中的文件:
$ oc adm node-logs --role=master --path=openshift-apiserver
-
检查
/var/log/
子目录中的特定日志。以下示例输出来自所有 control plane 节点的
/var/log/openshift-apiserver/audit.log
内容:
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log
-
如果 API 无法正常工作,请使用 SSH 来查看每个节点上的日志。以下示例是
/var/log/openshift-apiserver/audit.log
的尾部的内容:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo tail -f /var/log/openshift-apiserver/audit.log
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
CRI-O 是 Kubernetes 的原生容器运行时实现,可与操作系统紧密集成来提供高效和优化的 Kubernetes 体验。CRI-O,提供用于运行、停止和重启容器的工具。
CRI-O 容器运行时引擎由在每个 OpenShift Container Platform 集群节点上使用 systemd 服务进行管理。当出现容器运行时问题时,验证每个节点上的
crio
systemd 服务的状态。从清单容器运行时问题的节点收集 CRI-O journald 单元日志。
您可以在每个集群节点上验证 CRI-O 容器运行时引擎状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
通过在节点上查询 debug pod 中的
crio
systemd 服务来查看 CRI-O 状态。
为节点启动 debug pod:
$ oc debug node/my-node
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
检查
crio
systemd 服务在该节点上是否活跃:
# systemctl is-active crio
输出更详细的
crio.service
状态概述:
# systemctl status crio.service
7.3.3. 收集 CRI-O journald 单元日志
如果遇到 CRI-O 问题,您可以从节点获取 CRI-O journald 单元日志。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
您有 control plane 或 control plane 机器的完全限定域名(也称为 master 机器)。
收集 CRI-O journald 单元日志。以下示例从所有 control plane 节点(在集群中)收集日志:
$ oc adm node-logs --role=master -u crio
从特定节点收集 CRI-O journald 单元日志:
$ oc adm node-logs <node_name> -u crio
如果 API 无法正常工作,使用 SSH 来查看日志。将
<node>.<cluster_name>.<base_domain>
替换为适当的值:
$ ssh core@<node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.service
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
如果遇到以下问题,您可以手动清除 CRI-O 临时存储:
节点无法在任何 pod 上运行,并出现以下错误:
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to mount container XXX: error recreating the missing symlinks: error reading name of symlink for XXX: open /var/lib/containers/storage/overlay/XXX/link: no such file or directory
您无法在工作节点上创建新容器,并出现 “can’t stat lower layer” 错误:
can't stat lower layer ... because it does not exist. Going through storage to recreate the missing symlinks.
在集群升级后或尝试重启节点时,您的节点处于
NotReady
状态。
容器运行时实施 (
crio
) 无法正常工作。
您无法使用
oc debug node/<nodename>
在节点上启动 debug shell,因为容器运行时实例 (
crio
) 无法正常工作。
按照以下步骤完全擦除 CRI-O 存储并解决错误。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
在节点上使用
cordon
。这是为了避免在节点处于
Ready
状态时调度任何工作负载。当您的 Status 部分中存在
SchedulingDisabled
时代表调度被禁用:
$ oc adm cordon <nodename>
以 cluster-admin 用户身份排空节点:
$ oc adm drain <nodename> --ignore-daemonsets --delete-emptydir-data
pod 或 pod 模板的
terminationGracePeriodSeconds
属性控制安全终止的时间。此属性的默认值为 30 秒,但可以根据需要针对每个应用程序进行自定义。如果设置的值大于 90 秒,则 pod 可能会标记为
SIGKILL
,且无法成功终止。
当节点返回时,通过 SSH 或控制台连接节点。然后连接到 root 用户:
$ ssh [email protected]
$ sudo -i
手动停止 kubelet:
# systemctl stop kubelet
停止容器和 pod:
使用以下命令停止
HostNetwork
中没有的 pod。必须首先删除它们,因为它们依赖于
HostNetwork
中的网络插件 pod。
.. for pod in $(crictl pods -q); do if [[ "$(crictl inspectp $pod | jq -r .status.linux.namespaces.options.network)" != "NODE" ]]; then crictl rmp -f $pod; fi; done
停止所有其他 pod:
# crictl rmp -fa
手动停止 crio 服务:
# systemctl stop crio
运行这些命令后,您可以完全擦除临时存储:
# crio wipe -f
启动 crio 和 kubelet 服务:
# systemctl start crio
# systemctl start kubelet
如果 crio 和 kubelet 服务启动,且节点处于
Ready
状态时,代表清理操作已正常工作:
$ oc get nodes
OpenShift Container Platform 在 RHCOS 上运行。您可以按照以下步骤排除与操作系统相关的问题。
kdump
服务包括在
kexec-tools
中,它提供了一个崩溃转储机制。您可以使用这个服务保存系统内存内容,以便稍后进行分析。
kdump
服务只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参考
https://access.redhat.com/support/offerings/techpreview/
。
RHCOS 附带
kexec-tools
,但需要手动配置才能启用
kdump
。
执行以下步骤在 RHCOS 上启用
kdump
:
要在第一次内核引导的过程中为崩溃内核保留内存,请输入以下命令提供内核参数:
# rpm-ostree kargs --append='crashkernel=256M'
可选: 要通过网络写入崩溃转储,或将其写入其他位置而不是默认的本地
/var/crash
位置,请编辑
/etc/kdump.conf
配置文件。
使用 LUKS 时需要网络转储。
kdump
不支持 LUKS 加密设备的本地崩溃转储。
有关配置
kdump
服务的详情,请查看
/etc/sysconfig/kdump
、
/etc/kdump.conf
和
kdump.conf
手册页中的注释。有关配置转储目标的详情,请参阅
RHEL
kdump
文档
。
启用
kdump
systemd 服务:
# systemctl enable kdump.service
重启系统:
# systemctl reboot
确认
kdump
已加载了崩溃内核,检查
kdump.service
已成功启动并退出,
cat /sys/kernel/kexec_crash_loaded
输出
1
。
kdump
服务旨在为每个节点启用调试内核问题。由于启用了
kdump
会增加成本,且这些成本会与启用了
kdump
的额外节点一起积累,因此建议只在需要的节点中启用
kdump
。在每个节点中启用
kdump
的潜在成本包括:
因为为崩溃内核保留了内存,所以可用 RAM 较少。
内核转储内核时节点不可用。
用于存储崩溃转储的额外存储空间。
因为
kdump
服务只是一个
技术预览
,所以它并不是生产环境就绪的。
如果您了解启用
kdump
服务所带来的影响,则可以根据具体情况在集群范围内启用
kdump
。虽然当前还不支持特定于具体机器的机器配置,但您可以在第 1 天通过
MachineConfig
对象中的
systemd
单元来执行前面的步骤,并在集群的所有节点上启用 kdump。您可以创建
MachineConfig
对象,并将该对象注入 Ignition 在集群设置过程中使用的清单文件集合中。如需有关如何使用 Ignition 配置的更多信息和示例,请参阅
Installing → Installation configuration
部分中的"自定义节点"。
为集群范围配置创建
MachineConfig
对象:
创建一个 Butane 配置文件
99-worker-kdump.bu
,用于配置并启用 kdump:
variant: openshift
version: 4.8.0
metadata:
name: 99-worker-kdump 1
labels:
machineconfiguration.openshift.io/role: worker 2
openshift:
kernel_arguments: 3
- crashkernel=256M
storage:
files:
- path: /etc/kdump.conf 4
mode: 0644
overwrite: true
contents:
inline: |
path /var/crash
core_collector makedumpfile -l --message-level 7 -d 31
- path: /etc/sysconfig/kdump 5
mode: 0644
overwrite: true
contents:
inline: |
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr novmcoredd hest_disable"
KEXEC_ARGS="-s"
KDUMP_IMG="vmlinuz"
systemd:
units:
- name: kdump.service
enabled: true
-
1
2
-
在为 control plane 节点创建
MachineConfig
对象时,将
worker
替换为两个位置的
master
。
提供内核参数来为崩溃内核保留内存。如果需要,您可以添加其他内核参数。
如果要从默认更改
/etc/kdump.conf
的内容,请包含此部分并相应地修改
inline
子部分。
如果要从默认更改
/etc/sysconfig/kdump
的内容,请包含此部分并相应地修改
inline
子部分。
使用 Butane 生成机器配置 YAML 文件
99-worker-kdump.yaml
,包含要提供给节点的配置:
$ butane 99-worker-kdump.bu -o 99-worker-kdump.yaml
-
在集群设置过程中将 YAML 文件放入清单中。您还可以使用 YAML 文件在集群设置后创建此
MachineConfig
对象:
$ oc create -f ./99-worker-kdump.yaml
如果无法置备机器,Ignition 会失败,RHCOS 将引导至紧急 shell。使用以下步骤获取调试信息。
运行以下命令显示哪个服务单元失败:
$ systemctl --failed
可选:在单个服务单元上运行以下命令查找更多信息:
$ journalctl -u <unit>.service
对于在裸机上安装,或在具有多个网络接口控制器(NIC)的虚拟机中安装时,OpenShift Container Platform 用于与 Kubernetes API 服务器通信的 NIC 由节点引导时 systemd 运行的
nodeip-configuration.service
服务单元决定。该服务会逐个检查节点上的每个网络接口,当第一个配置了可以用于 API 服务器的 IP 地址的子网的网络接口被选择用来进行 OpenShift Container Platform 通讯。
在
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 地址。以下列表确定了高级步骤和注意事项:
创建一个 shell 脚本,以确定用于 OpenShift Container Platform 通信的 IP 地址。让脚本创建一个自定义单元文件,如
/etc/systemd/system/kubelet.service.d/98-nodenet-override.conf
。使用自定义单元文件
98-nodenet-override.conf
,将
KUBELET_NODE_IP
环境变量设置为 IP 地址。
不要覆盖
/etc/systemd/system/kubelet.service.d/20-nodenet.conf
文件。指定同一目录路径中的数值较高的文件名,如
98-nodenet-override.conf
。这样做的目标是使自定义单元文件在
20-nodenet.conf
之后运行,并覆盖环境变量的值。
使用 shell 脚本创建一个机器配置对象,作为 base64 编码字符串,并使用 Machine Config Operator 将脚本部署到文件系统路径(如
/usr/local/bin/override-node-ip.sh
)的节点。
确保
systemctl daemon-reload
在 shell 脚本运行后运行。最简单的方法是在机器配置中指定
ExecStart=systemctl daemon-reload
,如下例所示。
7.5.2. Open vSwitch 问题故障排除
若要对一些 Open vSwitch (OVS) 问题进行故障排除,您可能需要配置日志级别以包含更多信息。
如果临时修改节点上的日志级别,请注意您可以像以下示例一样从节点上的机器配置守护进程接收日志消息:
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 日志级别
对于短期故障排除,您可以临时配置 Open vSwitch (OVS) 日志级别。以下流程不需要重启该节点。另外,每当您重新引导节点时,配置更改都不会保留。
执行此步骤更改日志级别后,您可以接收来自机器配置守护进程的日志消息,该守护进程指出
ovs-vswitchd.service
的内容不匹配。要避免日志消息,请重复此步骤,并将日志级别设置为原始值。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
为节点启动 debug pod:
$ oc debug node/<node_name>
将
/host
设置为 debug shell 中的根目录。debug pod 从 pod 中的
/host
中的主机挂载 root 文件系统。将根目录改为
/host
,您可以从主机文件系统中运行二进制文件:
# chroot /host
查看 OVS 模块的当前 syslog 级别:
# ovs-appctl vlog/list
以下示例输出显示了 syslog 设置为
info
的日志级别。
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
指定 /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 日志级别会过滤掉所有日志消息。
重启服务:
# systemctl daemon-reload # systemctl restart ovs-vswitchd
7.5.2.2. 永久配置 Open vSwitch 日志级别
对于对 Open vSwitch (OVS) 日志级别的长期更改,您可以永久更改日志级别。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
使用类似以下示例的
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
-
执行此步骤以配置 control plane 节点后,重复这个过程,并将角色设置为
worker
以配置 worker 节点。
设置
syslog:<log_level>
值。日志级别为
off
、
emer
、
err
、
warn
、
info
或
dbg
。将值设置为
off
会过滤掉所有日志消息。
应用机器配置:
$ oc apply -f 99-change-ovs-loglevel.yaml
7.5.2.3. 显示 Open vSwitch 日志
使用以下步骤显示 Open vSwitch (OVS) 日志。
您可以使用具有
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>
命令。
7.6. Troubleshooting Operator 的问题
Operator 是一种打包、部署和管理 OpenShift Container Platform 应用程序的方法。它可以被看作是软件厂商的工程团队的扩展,可以在 OpenShift Container Platform 监控软件的运行情况,并根据软件的当前状态实时做出决策。Operator 被设计为用来无缝地处理升级过程,并对出现的错误自动进行响应,而且不会采取“捷径”(如跳过软件备份过程来节省时间)。
OpenShift Container Platform 4.8 包括了一组默认的 Operator,它们是集群正常工作所需的。这些默认 Operator 由 Cluster Version Operator(CVO)管理。
作为集群管理员,您可使用 OpenShift Container Platform Web 控制台或 CLI 安装来自 OperatorHub 的应用程序 Operator。然后,您可将 Operator 订阅至一个或多个命名空间,供集群上的开发人员使用。应用程序 Operator 由 Operator Lifecycle Manager(OLM)进行管理。
如果遇到 Operator 问题,请验证 Operator 订阅状态。检查集群中的 Operator pod 健康状况,并收集 Operator 日志以进行诊断。
订阅可报告以下状况类型:
表 7.1. 订阅状况类型
状况
|
描述
|
CatalogSourcesUnhealthy
用于解析的一个或多个目录源不健康。
InstallPlanMissing
缺少订阅的安装计划。
InstallPlanPending
订阅的安装计划正在安装中。
InstallPlanFailed
订阅的安装计划失败。
默认 OpenShift Container Platform 集群 Operator 由 Cluster Version Operator(CVO)管理,它们没有
Subscription
对象。应用程序 Operator 由 Operator Lifecycle Manager(OLM)管理,它们具有
Subscription
对象。
7.6.2. 使用 CLI 查看 Operator 订阅状态
您可以使用 CLI 查看 Operator 订阅状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出 Operator 订阅:
$ oc get subs -n <operator_namespace>
使用
oc describe
命令检查
Subscription
资源:
$ oc describe sub <subscription_name> -n <operator_namespace>
在命令输出中,找到 Operator 订阅状况类型的
Conditions
部分。在以下示例中,
CatalogSourcesUnhealthy
条件类型具有
false
状态,因为所有可用目录源都健康:
Conditions:
Last Transition Time: 2019-07-29T13:42:57Z
Message: all available catalogsources are healthy
Reason: AllCatalogSourcesHealthy
Status: False
Type: CatalogSourcesUnhealthy
默认 OpenShift Container Platform 集群 Operator 由 Cluster Version Operator(CVO)管理,它们没有
Subscription
对象。应用程序 Operator 由 Operator Lifecycle Manager(OLM)管理,它们具有
Subscription
对象。
7.6.3. 使用 CLI 查看 Operator 目录源状态
您可以使用 CLI 查看 Operator 目录源的状态。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出命名空间中的目录源。例如,您可以检查
openshift-marketplace
命名空间,该命名空间用于集群范围的目录源:
$ oc get catalogsources -n openshift-marketplace
7.6.4. 查询 Operator pod 状态
您可以列出集群中的 Operator pod 及其状态。您还可以收集详细的 Operator pod 概述。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
列出集群中运行的 Operator。输出包括 Operator 版本、可用性和运行时间信息:
$ oc get clusteroperators
列出在 Operator 命名空间中运行的 Operator pod,以及 pod 状态、重启和年龄:
$ oc get pod -n <operator_namespace>
输出详细的 Operator pod 概述:
$ oc describe pod <operator_pod_name> -n <operator_namespace>
如果 Operator 问题特定于某个节点,则在该节点上查询 Operator 容器状态。
为节点启动 debug pod:
$ oc debug node/my-node
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
列出节点容器的详细信息,包括状态和关联的 pod ID:
# crictl ps
列出节点上特定 Operator 容器的信息。以下示例列出了
network-operator
容器的信息:
# crictl ps --name network-operator
退出 debug shell。
如果遇到 Operator 问题,您可以从 Operator pod 日志中收集详细诊断信息。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
您有 control plane 或 control plane 机器的完全限定域名(也称为 master 机器)。
列出在 Operator 命名空间中运行的 Operator pod,以及 pod 状态、重启和年龄:
$ oc get pods -n <operator_namespace>
检查 Operator pod 的日志:
$ oc logs pod/<pod_name> -n <operator_namespace>
如果 Operator pod 具有多个容器,则上述命令将会产生一个错误,其中包含每个容器的名称。从独立容器查询日志:
$ oc logs pod/<operator_pod_name> -c <container_name> -n <operator_namespace>
如果 API 无法正常工作,请使用 SSH 来查看每个 control plane 节点上的 Operator pod 和容器日志。将
<master-node>.<cluster_name>.<base_domain>
替换为适当的值。
列出每个 control plane 节点上的 pod:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl pods
对于任何未显示
Ready
状态的 Operator pod,详细检查 Pod 的状态。将
<operator_pod_id>
替换为上一命令输出中列出的 Operator pod ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspectp <operator_pod_id>
列出与 Operator pod 相关的容器:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl ps --pod=<operator_pod_id>
对于任何未显示
Ready
状态的 Operator 容器,请详细检查容器的状态。将
<container_id>
替换为上一命令输出中列出的容器 ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspect <container_id>
检查任何未显示
Ready
状态的 Operator 容器的日志。将
<container_id>
替换为上一命令输出中列出的容器 ID:
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl logs -f <container_id>
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。在尝试通过 SSH 收集诊断数据前,请运行
oc adm must gather
和其他
oc
命令看它们是否可以提供足够的数据。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
7.6.6. 禁用 Machine Config Operator 自动重新引导
当 Machine Config Operator(MCO)进行配置更改时,Red Hat Enterprise Linux CoreOS(RHCOS)必须重启才能使更改生效。无论配置更改是自动还是手动的,RHCOS 节点都会自动重启,除非它已被暂停。
以下修改不会触发节点重新引导:
当 MCO 检测到以下任何更改时,它会在不排空或重启节点的情况下应用更新:
在机器配置的
spec.config.passwd.users.sshAuthorizedKeys
参数中更改 SSH 密钥。
在
openshift-config
命名空间中更改全局 pull secret 或 pull secret。
Kubernetes API Server Operator 自动轮转
/etc/kubernetes/kubelet-ca.crt
证书颁发机构(CA)。
当 MCO 检测到对
/etc/containers/registries.conf
文件的更改时,如添加或编辑
ImageDigestMirrorSet
或
ImageTagMirrorSet
对象,它会排空对应的节点,应用更改并取消记录节点。节点排空不会发生以下更改:
增加了一个 registry,带有为每个镜像(mirror)设置了
pull-from-mirror = "digest-only"
参数。
增加了一个镜像(mirror),带有在一个 registry 中设置的
pull-from-mirror = "digest-only"
参数。
在
unqualified-search-registries
列表中添加项目。
为了避免不必要的中断,您可以修改机器配置池(MCP)以防止在 Operator 更改机器配置后自动重启。
暂停 MCP 可防止 MCO 在关联的节点上应用任何配置更改。暂停 MCP 还可以防止任何自动轮转的证书被推送到关联的节点,包括自动轮转
kube-apiserver-to-kubelet-signer
CA 证书。如果在
kube-apiserver-to-kubelet-signer
CA 证书过期且 MCO 尝试自动续订证书时,MCP 会暂停,但不会在暂停的 MCP 中跨节点应用新证书。这会导致多个
oc
命令失败,包括但不限于
oc debug
、
oc logs
、
oc exec
和
oc attach
。在暂停 MCP 时应该非常小心,需要仔细考虑
kube-apiserver-to-kubelet-signer
CA 证书过期的问题,且仅在短时间内暂停。
新 CA 证书会在自安装日期起的 292 天生成,并在自该日期起的 365 天后删除。要确定下一个自动 CA 证书轮转,请参阅
Red Hat OpenShift 4 中的了解 CA 证书自动续订
。
7.6.6.1. 使用控制台禁用 Machine Config Operator 自动重新引导
为了避免对 Machine Config Operator(MCO)所做的更改造成不必要的中断,您可以使用 OpenShift Container Platform Web 控制台修改机器配置池(MCP),以防止 MCO 在那个池中对节点进行任何更改。这会防止任何通常属于 MCO 更新过程一部分的重启。
暂停 MCP 可防止 MCO 在关联的节点上应用任何配置更改。暂停 MCP 还可以防止任何自动轮转的证书被推送到关联的节点,包括自动轮转
kube-apiserver-to-kubelet-signer
CA 证书。如果在
kube-apiserver-to-kubelet-signer
CA 证书过期且 MCO 尝试自动续订证书时,MCP 会暂停,但不会在暂停的 MCP 中跨节点应用新证书。这会导致多个
oc
命令失败,包括但不限于
oc debug
、
oc logs
、
oc exec
和
oc attach
。在暂停 MCP 时应该非常小心,需要仔细考虑
kube-apiserver-to-kubelet-signer
CA 证书过期的问题,且仅在短时间内暂停。
新 CA 证书会在自安装日期起的 292 天生成,并在自该日期起的 365 天后删除。要确定下一个自动 CA 证书轮转,请参阅
Red Hat OpenShift 4 中的了解 CA 证书自动续订
。
您可以使用具有
cluster-admin
角色的用户访问集群。
要暂停或取消暂停自动 MCO 更新重新引导:
暂停自动引导过程:
以具有
cluster-admin
角色的用户身份登录到 OpenShift Container Platform web 控制台。
点
Compute
→
MachineConfigPools
。
在
MachineConfigPools
页面中,点击
master
或
worker
,具体取决于您要暂停重新引导的节点。
在
master
或
worker
页面中,点
YAML
。
在 YAML 中,将
spec.paused
字段更新为
true
。
7.6.6.2. 使用 CLI 禁用 Machine Config Operator 自动重新引导
为了避免对 Machine Config Operator(MCO)所做的更改造成不必要的中断,您可以使用 OpenShift CLI(oc)来修改机器配置池(MCP),以防止 MCO 在那个池中对节点进行任何更改。这会防止任何通常属于 MCO 更新过程一部分的重启。
暂停 MCP 可防止 MCO 在关联的节点上应用任何配置更改。暂停 MCP 还可以防止任何自动轮转的证书被推送到关联的节点,包括自动轮转
kube-apiserver-to-kubelet-signer
CA 证书。如果在
kube-apiserver-to-kubelet-signer
CA 证书过期且 MCO 尝试自动续订证书时,MCP 会暂停,但不会在暂停的 MCP 中跨节点应用新证书。这会导致多个
oc
命令失败,包括但不限于
oc debug
、
oc logs
、
oc exec
和
oc attach
。在暂停 MCP 时应该非常小心,需要仔细考虑
kube-apiserver-to-kubelet-signer
CA 证书过期的问题,且仅在短时间内暂停。
新 CA 证书会在自安装日期起的 292 天生成,并在自该日期起的 365 天后删除。要确定下一个自动 CA 证书轮转,请参阅
Red Hat OpenShift 4 中的了解 CA 证书自动续订
。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
要暂停或取消暂停自动 MCO 更新重新引导:
暂停自动引导过程:
更新
MachineConfigPool
自定义资源,将
spec.paused
字段设置为
true
。
在 Operator Lifecycle Manager(OLM)中,如果您订阅的是引用网络中无法访问的镜像的 Operator,您可以在
openshift-marketplace
命名空间中找到带有以下错误的作业:
ImagePullBackOff for
Back-off pulling image "example.com/openshift4/ose-elasticsearch-operator-bundle@sha256:6d2587129c846ec28d384540322b40b05833e7e00b25cca584e004af9a1d292e"
rpc error: code = Unknown desc = error pinging docker registry example.com: Get "https://example.com/v2/": dial tcp: lookup example.com on 10.0.0.1:53: no such host
因此,订阅会处于这个失败状态,Operator 无法安装或升级。
您可以通过删除订阅、集群服务版本(CSV)及其他相关对象来刷新失败的订阅。重新创建订阅后,OLM 会重新安装 Operator 的正确版本。
您有一个失败的订阅,无法拉取不能访问的捆绑包镜像。
已确认可以访问正确的捆绑包镜像。
从安装 Operator 的命名空间中获取
Subscription
和
ClusterServiceVersion
对象的名称:
$ oc get sub,csv -n <namespace>
OpenShift Container Platform 利用 Kubernetes 的 pod 概念,它是共同部署在同一主机上的一个或多个容器。pod 是可在 OpenShift Container Platform 4.8 上定义、部署和管理的最小计算单元。
在定义了 pod 后,它将分配到节点上运行,直到容器退出,或直到它被删除为止。根据策略和退出代码,Pod 可在退出或保留后删除,以便访问其日志。
首先要检查 pod 出现问题时 pod 的状态。如果发生 pod 故障,请观察 pod 的错误状态以识别特定镜像、容器或 pod 网络问题。根据错误状态集中诊断数据收集。查看 pod 事件消息以及 pod 和容器日志信息。通过访问命令行中运行的 pod,或根据 Pod 的部署配置启动具有 root 访问权限的调试 pod 来动态诊断问题。
pod 失败返回显式错误状态,可在
oc get pods
输出的
status
字段中观察到。Pod 错误状态会涵盖镜像、容器和容器网络相关的故障。
下表提供了 pod 错误状态及其描述列表。
表 7.2. Pod 错误状态
Pod 错误状态
|
描述
|
ErrImagePull
通用镜像检索错误。
ErrImagePullBackOff
镜像检索失败。
ErrInvalidImageName
指定镜像名称无效。
ErrImageInspect
镜像检查没有成功。
ErrImageNeverPull
PullPolicy
设置为
NeverPullImage
,目标镜像没有本地存在。
ErrRegistryUnavailable
当尝试从 registry 检索镜像时,会出现 HTTP 错误。
ErrContainerNotFound
指定容器在声明的 pod 中不存在或未由 kubelet 管理。
ErrRunInitContainer
容器初始化失败。
ErrRunContainer
pod 的容器都没有成功启动。
ErrKillContainer
没有 pod 的容器被成功终止。
ErrCrashLoopBackOff
容器已终止。kubelet 将不会试图重启它。
ErrVerifyNonRoot
容器或镜像尝试使用 root 权限运行。
ErrCreatePodSandbox
Pod 沙盒创建没有成功。
ErrConfigPodSandbox
Pod 沙盒配置没有获得。
ErrKillPodSandbox
pod 沙箱没有成功停止。
ErrSetupNetwork
网络初始化失败。
ErrTeardownNetwork
网络终止失败。
|
您可以查询 pod 状态和错误状态。您还可以查询 pod 的相关部署配置,并查看基础镜像的可用性。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
已安装了
skopeo
。
切换到项目:
$ oc project <project_name>
列出在命名空间中运行的 pod,以及 pod 状态、错误状态、重启和年龄:
$ oc get pods
确定命名空间是否由部署配置管理:
$ oc status
如果命名空间由部署配置管理,输出包括部署配置名称和基础镜像引用。
检查以上命令输出中引用的基础镜像:
$ skopeo inspect docker://<image_reference>
如果基础镜像引用不正确,请更新部署配置中的引用:
$ oc edit deployment/my-deployment
当部署配置退出时,配置将自动重新部署。在部署过程中的 Watch pod 的状态,以确定这个问题是否已解决:
$ oc get pods -w
检查命名空间中的事件,以了解与 pod 失败相关的诊断信息:
$ oc get events
您可以检查 pod 和容器日志,以查看与显式 pod 失败相关的警告和错误消息。根据策略和退出代码,pod 和容器日志在 pod 终止后仍然可用。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
查询特定 pod 的日志:
$ oc logs <pod_name>
查询 pod 中特定容器的日志:
$ oc logs <pod_name> -c <container_name>
由前面的
oc logs
命令所获得的日志由发送到 pod 或容器中的 stdout 的信息组成。
检查 pod 中的
/var/log/
中包含的日志。
列出 pod 中
/var/log
中所含的日志文件和子目录:
$ oc exec <pod_name> ls -alh /var/log
查询 pod 中
/var/log
中所含的特定日志文件:
$ oc exec <pod_name> cat /var/log/<path_to_log>
列出特定容器内
/var/log
中含有的日志文件和子目录:
$ oc exec <pod_name> -c <container_name> ls /var/log
查询特定容器中的
/var/log
中所含的特定日志文件:
$ oc exec <pod_name> -c <container_name> cat /var/log/<path_to_log>
您可以通过在 pod 中打开 shell,或通过端口转发获取网络访问,来动态查看正在运行的 pod。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
切换到包含您要访问的 pod 的项目。这是必要的,因为
oc rsh
命令不支持使用
-n
选项指定命名空间:
$ oc project <namespace>
启动到 pod 的远程 shell:
$ oc rsh <pod_name> 1
-
1
-
如果 pod 有多个容器,除非使用
-c <container_name>
指定了一个容器,否则
oc rsh
会默认使用第一个容器。
启动至 pod 中的特定容器中的一个远程 shell :
$ oc rsh -c <container_name> pod/<pod_name>
创建一个端口转发会话到 pod 上的端口:
$ oc port-forward <pod_name> <host_port>:<pod_port> 1
7.7.5. 启动具有 root 访问权限的 debug pod
您可以基于一个有问题的 pod 部署或部署配置,启动具有根访问权限的 debug pod。pod 用户通常使用非 root 权限运行,但运行具有临时 root 特权的 pod 进行故障排除时在调查问题时很有用:
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
根据一个部署启动具有 root 访问权限的 debug pod。
获取项目部署名称:
$ oc get deployment -n <project_name>
根据部署启动带有 root 权限的 debug pod:
$ oc debug deployment/my-deployment --as-root -n <project_name>
根据部署配置启动具有 root 访问权限的 debug pod。
获取项目的部署配置名称:
$ oc get deploymentconfigs -n <project_name>
根据部署配置,使用 root 权限启动 debug pod:
$ oc debug deploymentconfig/my-deployment-configuration --as-root -n <project_name>
您可以将
-- <command>
附加到前面的
oc debug
命令中,以便在 debug pod 中运行单个命令,而不是运行交互式 shell。
7.7.6. 将文件复制到 pod 和容器,或从 pod 和容器中复制
您可以将文件复制到 pod 或从 pod 复制,以测试配置更改或收集诊断信息。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
将文件复制到 pod:
$ oc cp <local_path> <pod_name>:/<path> -c <container_name> 1
-
1
-
如果没有指定
-c
选项,则会选择 pod 中的第一个容器。
从 pod 复制文件:
$ oc cp <pod_name>:/<path> -c <container_name><local_path> 1
-
1
-
如果没有指定
-c
选项,则会选择 pod 中的第一个容器。
要使
oc cp
正常工作,容器内必须有
tar
。
7.8. 对 Source-to-Image 进行故障排除
7.8.1. Source-to-Image 故障排除策略
Source-to-Image (S2I) 是一种用于构建可重复生成的 Docker 格式容器镜像的工具。它通过将应用程序源代码注入容器镜像,并汇编新镜像来生成可随时运行的镜像。新镜像融合了基础镜像(构建器)和构建的源。
要确定 S2I 进程中的故障发生位置,您可以观察与以下 S2I 阶段相关的 pod 状态:
在构建配置阶段
,构建 pod 用于从基础镜像和应用程序源代码创建应用程序容器镜像。
在部署配置阶段
,部署 pod 用于从构建配置阶段构建的应用程序容器镜像中部署应用程序 pod。部署 pod 还会部署其他资源,如服务和路由。部署配置在构建配置成功后开始。
在部署 pod 启动应用程序 pod 后
,应用程序故障可能会在运行的应用程序 pod 中发生。例如,即使应用程序 pod 处于
Running
状态,应用程序的行为也可能不会如预期。在这种情况下,您可以访问正在运行的应用程序 pod,以调查 pod 中的应用程序故障。
当对 S2I 问题进行故障排除时,请按照这个策略操作:
监控构建、部署和应用程序 pod 状态
确定发生问题 S2I 进程阶段
查看与失败阶段对应的日志
7.8.2. 收集 Source-to-Image 诊断数据
S2I 工具按顺序运行构建 pod 和部署 pod。部署 pod 负责根据构建阶段创建的应用程序容器镜像部署应用程序 pod。观察构建、部署和应用程序 pod 状态,以确定 S2I 进程中的故障发生位置。然后,重点收集诊断数据。
您可以使用具有
cluster-admin
角色的用户访问集群。
API 服务仍然可以正常工作。
已安装 OpenShift CLI(
oc
)。
在整个 S2I 过程中监控 pod 状态,以确定在哪个阶段发生故障:
$ oc get pods -w 1
-
1
-
使用
-w
来监控 pod 是否有变化,直到您使用
Ctrl+C
退出命令。
检查 pod 失败的日志以找出错误。
如果构建 pod 失败
,请检查构建 pod 的日志:
$ oc logs -f pod/<application_name>-<build_number>-build
另外,您可以使用
oc logs -f bc/<application_name>
来查看构建配置的日志。构建配置的日志包括来自构建 pod 的日志。
如果部署 pod 失败
,请查看部署 pod 的日志:
$ oc logs -f pod/<application_name>-<build_number>-deploy
另外,您可以使用
oc logs -f bc/<application_name>
来查看部署配置的日志。此操作会从部署 pod 输出日志,直到部署 pod 成功完成为止。如果在部署 pod 完成后运行,命令会输出来自应用程序 pod 的日志。部署 pod 完成后,仍可通过运行
oc logs -f pod/<application_name>-<build_number>-deploy
来访问其日志。
如果应用程序 pod 失败,或者应用程序没有如预期在正在运行的应用程序 pod 中发生
,请查看应用程序 pod 的日志:
$ oc logs -f pod/<application_name>-<build_number>-<random_string>
7.8.3. 收集应用程序诊断数据以调查应用程序失败
应用程序故障可在运行的应用程序 pod 中发生。在这些情况下,您可以使用以下策略检索诊断信息:
检查与应用程序 pod 相关的事件。
查看应用程序 pod 的日志,包括不是由 OpenShift Logging 框架收集的特定应用程序日志文件。
以互动方式测试应用程序功能,并在应用程序容器中运行诊断工具。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
列出与特定应用程序 pod 相关的事件。以下示例检索名为
my-app-1-akdlg
的应用程序 pod 的事件:
$ oc describe pod/my-app-1-akdlg
检查应用程序 pod 的日志:
$ oc logs -f pod/my-app-1-akdlg
在正在运行的应用程序 pod 中查询特定日志。发送到 stdout 的日志由 OpenShift Logging 框架收集,并包含在上一命令的输出中。以下查询只适用于没有发送到 stdout 的日志。
如果应用程序日志可以在 pod 内不需要 root 权限的情况下就可以进行访问,则按如下方式处理日志文件:
$ oc exec my-app-1-akdlg -- cat /var/log/my-application.log
如果需要 root 访问权限才能查看应用程序日志,您可以启动具有 root 权限的 debug 容器,然后从容器内查看日志文件。从项目的
DeploymentConfig
对象启动 debug 容器。pod 用户通常使用非 root 权限运行,但运行具有临时 root 特权的 pod 进行故障排除时在调查问题时很有用:
$ oc debug dc/my-deployment-configuration --as-root -- cat /var/log/my-application.log
如果您运行不使用
-- <command>
的
oc debug dc/<deployment_configuration> --as-root
,则可以获得 debug pod 内带有 root 权限的一个互动式 shell 。
以互动方式测试应用程序功能,并在带有互动 shell 的应用程序容器中运行诊断工具。
在应用程序容器上启动一个交互式 shell:
$ oc exec -it my-app-1-akdlg /bin/bash
在 shell 中以互动方式测试应用程序功能。例如,您可以运行容器的入口点命令并观察结果。然后,在更新源代码并通过 S2I 进程重建应用程序容器前,直接从命令行测试更改。
运行容器中的诊断二进制文件。
运行一些诊断二进制文件需要 root 权限。在这些情况下,您可以通过运行
oc debug dc/<deployment_configuration> --as-root
,根据有问题的 pod 的
DeploymentConfig
对象启动一个带有 root 访问权限的 debug pod。然后,您可以从 debug pod 中以 root 用户身份运行诊断二进制文件。
如果容器中没有诊断二进制文件,您可以使用
nsenter
在容器的命名空间中运行主机的诊断二进制文件。以下实例在一个容器的命名空间中运行
ip ad
,使用主机的
ip
二进制代码。
在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug
的 debug pod:
$ oc debug node/my-cluster-node
将
/host
设为 debug shell 中的根目录。debug pod 在 pod 中的
/host
中挂载主机的 root 文件系统。将根目录改为
/host
,您可以运行主机可执行路径中包含的二进制文件:
# chroot /host
运行 Red Hat Enterprise Linux CoreOS(RHCOS)的 OpenShift Container Platform 4.8 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点,节点将会标记为
accessed
污点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc
操作将会受到影响。在这种情况下,可以使用
ssh core@<node>.<cluster_name>.<base_domain>
来访问节点。
确定目标容器 ID:
# crictl ps
确定容器的进程 ID。在本例中,目标容器 ID 是
7fe32346b120
:
# crictl inspect a7fe32346b120 --output yaml | grep 'pid:' | awk '{print $2}'
在容器命名空间中运行
ip ad
,使用主机的
ip
二进制代码。本例使用
31150
作为容器的进程 ID。
nsenter
命令输入目标进程的命名空间并在命名空间中运行命令。因为本例中的目标进程是一个容器的进程 ID,所以
ip ad
命令在主机的容器命名空间中运行:
# nsenter -n -t 31150 -- ip ad
只有在使用特权容器(如 debug 节点)时,才能在容器的命名空间中运行主机的诊断二进制代码。
当节点崩溃或立即关闭时,预期会从节点卸载附加的 ReadWriteOnce(RWO)卷,以便被调度到另一节点上的 pod 使用。
但是,不可能在新节点中挂载,因为失败的节点无法卸载附加的卷。
报告了一个 multi-attach 错误:
Unable to attach or mount volumes: unmounted volumes=[sso-mysql-pvol], unattached volumes=[sso-mysql-pvol default-token-x4rzc]: timed out waiting for the condition
Multi-Attach error for volume "pvc-8837384d-69d7-40b2-b2e6-5df86943eef9" Volume is already used by pod(s) sso-mysql-1-ns6b4
要解决 multi-attach 问题,请使用以下解决方案之一:
使用 RWX 卷启用多个附件。
对于大多数存储解决方案,您可以使用 ReadWriteMany(RWX)卷以防止多附加错误。
使用 RWO 卷时,恢复或删除故障节点。
对于不支持 RWX 的存储,如 VMware vSphere,必须改为使用 RWO 卷。但是, RWO 卷无法挂载到多个节点上。
如果您遇到带有 RWO 卷的多附件错误消息,请强制在关闭或崩溃的节点上删除 pod,以避免关键工作负载中的数据丢失,例如在附加动态持久性卷时。
$ oc delete pod <old_pod> --force=true --grace-period=0
该命令会在 6 分钟后删除处于关闭或崩溃的节点上的卷。
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
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
。
指定节点的内部 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 节点。
运行以下命令设定 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
OpenShift Container Platform 包括一个预配置、预安装和自我更新的监控堆栈,用于监控核心平台组件。在 OpenShift Container Platform 4.8 中,集群管理员可以选择性地为用户定义的项目启用监控。
如果您自己的指标不可用,或者 Prometheus 消耗了大量磁盘空间,则可按照以下步骤操作。
通过
ServiceMonitor
资源,您可以确定如何使用用户定义的项目中的服务公开的指标。如果您创建了
ServiceMonitor
资源,但无法在 Metrics UI 中看到任何对应的指标,请按该流程中所述的步骤操作。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
您已为用户定义的工作负载启用并配置了监控。
您已创建了
user-workload-monitoring-config
ConfigMap
对象。
您已创建了
ServiceMonitor
资源。
在服务和
ServiceMonitor
资源配置中
检查对应的标签是否匹配
。
获取服务中定义的标签。以下示例在
ns1
项目中查询
prometheus-example-app
服务:
$ oc -n ns1 get service prometheus-example-app -o yaml
7.11.2. 确定为什么 Prometheus 消耗大量磁盘空间
开发人员可以使用键值对的形式为指标定义属性。潜在的键值对数量与属性的可能值数量对应。具有无限数量可能值的属性被称为未绑定属性。例如,
customer_id
属性不绑定,因为它有无限多个可能的值。
每个分配的键值对都有唯一的时间序列。在标签中使用许多未绑定属性可导致所创建的时间序列数量出现指数增加。这可能会影响 Prometheus 性能,并消耗大量磁盘空间。
当 Prometheus 消耗大量磁盘时,您可以使用以下方法:
检查正在收集的提取示例数量
。
检查 Prometheus UI 中的时间序列数据库(TSDB)状态
以了解有关哪些标签创建最多时间序列的更多信息。这需要集群管理员特权。
要
减少创建的唯一时间序列数量
,您可以减少分配给用户定义的指标的未绑定属性数量。
使用绑定到一组有限可能值的属性可减少潜在的键-值对组合数量。
对可在用户定义的项目中提取的示例数量实施限制
。这需要集群管理员特权。
您可以使用具有
cluster-admin
角色的用户访问集群。
已安装 OpenShift CLI(
oc
)。
在
Administrator
视角中,导航到
Monitoring
→
Metrics
。
在
Expression
字段中运行以下 Prometheus Query Language (PromQL) 查询。这会返回具有最高提取示例数的十个指标:
topk(10,count by (job)({__name__=~".+"}))
如果指标的提取示例数大于预期,请检查分配给指标的未绑定标签值数量。
如果指标与用户定义的项目相关
,请查看分配给您的工作负载的指标键-值对。它们通过应用程序级别的 Prometheus 客户端库实施。尝试限制标签中引用的未绑定属性数量。
如果指标与 OpenShift Container Platform 核心项目相关
,请在
红帽客户门户网站
上创建一个红帽支持问题单。
检查 Prometheus UI 中的 TSDB 状态。
在
Administrator
视角中,导航至
Networking
→
Routes
。
选择
Project
列表中的
openshift-monitoring
项目。
选择
prometheus-k8s
行中的 URL 来打开 Prometheus UI 的登录页面。
选择
Log in with OpenShift
来使用您的 OpenShift Container Platform 凭证进行登录。
在 Prometheus UI 中,进入到
Status
→
TSDB Status
。
如需有关如何设置提取示例限制和创建相关警报规则的详细信息,请参阅
为用户定义的项目设置提取示例限制
7.12. 诊断 OpenShift CLI(
oc
)问题
7.12.1. 了解 OpenShift CLI(
oc
)日志级别
借助 OpenShift CLI(
oc
),您可以从终端创建应用程序并管理 OpenShift Container Platform 项目。
如果出现特定于
oc
命令的问题,将
oc
日志级别提高为输出 API 请求、API 响应以及命令生成的
curl
请求详情。这提供了特定的
oc
命令的底层操作信息,以帮助您了解故障的本质。
oc
日志级别范围从 1 到 10。下表提供了
oc
日志级别列表及其描述。
表 7.3. OpenShift CLI(oc)日志级别
日志级别
|
描述
|
1 到 5
没有额外的日志记录到 stderr。
为 stderr 记录 API 请求。
将 API 请求和标头记录到 stderr。
记录 API 请求、标头和正文,以及 API 响应标头和正文到 stderr。
记录日志 API 请求、标头和正文、API 响应标头和正文,以及
curl
请求到 stderr。
记录日志 API 请求、标头和正文、API 响应标头和正文,以及
curl
请求到 stderr。记录的信息会更详细。
|
7.12.2. 指定 OpenShift CLI(
oc
)日志级别
您可以通过提高命令的日志级别来调查 OpenShift CLI(
oc
)问题。
安装 OpenShift CLI (
oc
) 。
在运行
oc
命令时指定
oc
日志级别:
$ oc <options> --loglevel <log_level>
OpenShift Container Platform 用户的当前会话令牌通常包含在记录的
curl
请求中。您还可以手动获取当前用户的会话令牌,以便在测试
oc
命令的底层进程的各个方面时使用:
$ oc whoami -t
法律通告
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at
http://creativecommons.org/licenses/by-sa/3.0/
. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux
® is the registered trademark of Linus Torvalds in the United States and other countries.
Java
® is a registered trademark of Oracle and/or its affiliates.
XFS
® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL
® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js
® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
|
|