Chapter 3. Editing kubelet log level verbosity and gathering logs
To troubleshoot some issues with nodes, establish the kubelet’s log level verbosity depending on the issue to be tracked.
3.1. Modifying the kubelet as a one-time scenario
To modify the kubelet in a one-time scenario without rebooting the node due to the change of machine-config(spec":{"paused":false}})
, allowing you to modify the kubelet without affecting the service, follow this procedure.
Procedure
Connect to the node in debug mode:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc debug node/<node>
$ oc debug node/<node>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chroot /host
$ chroot /host
Alternatively, it is possible to SSH to the node and become root.
After access is established, check the default log level:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl cat kubelet
$ systemctl cat kubelet
Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/systemd/system/kubelet.service.d/20-logging.conf
# /etc/systemd/system/kubelet.service.d/20-logging.conf [Service] Environment="KUBELET_LOG_LEVEL=2"
Define the new verbosity required in a new
/etc/systemd/system/kubelet.service.d/30-logging.conf
file, which overrides/etc/systemd/system/kubelet.service.d/20-logging.conf
. In this example, the verbosity is changed from2
to8
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow echo -e "[Service]\nEnvironment=\"KUBELET_LOG_LEVEL=8\"" > /etc/systemd/system/kubelet.service.d/30-logging.conf
$ echo -e "[Service]\nEnvironment=\"KUBELET_LOG_LEVEL=8\"" > /etc/systemd/system/kubelet.service.d/30-logging.conf
Reload systemd and restart the service:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl daemon-reload
$ systemctl daemon-reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart kubelet
$ systemctl restart kubelet
Gather the logs, and then revert the log level increase:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rm -f /etc/systemd/system/kubelet.service.d/30-logging.conf
$ rm -f /etc/systemd/system/kubelet.service.d/30-logging.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl daemon-reload
$ systemctl daemon-reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart kubelet
$ systemctl restart kubelet
3.2. Persistent kubelet log level configuration
Procedure
Use the following
MachineConfig
object for persistent kubelet log level configuration:Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 99-master-kubelet-loglevel spec: config: ignition: version: 3.2.0 systemd: units: - name: kubelet.service enabled: true dropins: - name: 30-logging.conf contents: | [Service] Environment="KUBELET_LOG_LEVEL=2"
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 99-master-kubelet-loglevel spec: config: ignition: version: 3.2.0 systemd: units: - name: kubelet.service enabled: true dropins: - name: 30-logging.conf contents: | [Service] Environment="KUBELET_LOG_LEVEL=2"
Generally, it is recommended to apply
0-4
as debug-level logs and5-8
as trace-level logs.
3.3. Log verbosity descriptions
Log verbosity | Description |
---|---|
| Always visible to an Operator. |
| A reasonable default log level if you do not want verbosity. |
| Useful steady state information about the service and important log messages that might correlate to significant changes in the system. This is the recommended default log level. |
| Extended information about changes. |
| Debug level verbosity. |
| Display requested resources. |
| Display HTTP request headers. |
| Display HTTP request contents. |
3.4. Gathering kubelet logs
Procedure
After the kubelet’s log level verbosity is configured properly, you can gather logs by running the following commands:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm node-logs --role master -u kubelet
$ oc adm node-logs --role master -u kubelet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm node-logs --role worker -u kubelet
$ oc adm node-logs --role worker -u kubelet
Alternatively, inside the node, run the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow journalctl -b -f -u kubelet.service
$ journalctl -b -f -u kubelet.service
To collect master container logs, run the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sudo tail -f /var/log/containers/*
$ sudo tail -f /var/log/containers/*
To directly gather the logs of all nodes, run the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - for n in $(oc get node --no-headers | awk '{print $1}'); do oc adm node-logs $n | gzip > $n.log.gz; done
- for n in $(oc get node --no-headers | awk '{print $1}'); do oc adm node-logs $n | gzip > $n.log.gz; done