本文基于 OpenShift 4版本
为了处理一些节点上发生的故障, 建议通过设置 kubelet log 等级去减少日志冗余
在 OpenShift 安装好之后,一般 logs 可以用以下命令得到
oc adm node-logs --role master -u kubelet
oc adm node-logs --role worker -u kubelet
或者在 node 内部运行这个
journalctl -b -f -u kubelet.service
也可以通过以下命令来收集 master 节点日志
sudo tail -f /var/log/containers/*
也可以用以下命令直接收集所有的节点
- for n in $(oc get node --no-headers | awk '{print $1}'); do oc adm node-logs $n | gzip > $n.log.gz; done
临时设置 Kubelet , 有效性仅为当前一次,不会影响之后的配置
如果你不想更改 machine-config设置(spec":{“paused”:false}}) 只想临时改变 kubelet, 而不会影响service, 可以用以下这种方法
oc debug node/<nodename>
chroot /host
命令行类似这样的时候,输入命令
systemctl cat kubelet
# /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Wants=rpc-statd.service crio.service
After=crio.service
[Service]
Type=notify
ExecStartPre=/bin/mkdir --parents /etc/kubernetes/manifests
ExecStartPre=/bin/rm -f /var/lib/kubelet/cpu_manager_state
EnvironmentFile=/etc/os-release
EnvironmentFile=-/etc/kubernetes/kubelet-workaround
EnvironmentFile=-/etc/kubernetes/kubelet-env
ExecStart=/usr/bin/hyperkube \
kubelet \
--config=/etc/kubernetes/kubelet.conf \
--bootstrap-kubeconfig=/etc/kubernetes/kubeconfig \
--rotate-certificates \
--kubeconfig=/var/lib/kubelet/kubeconfig \
--container-runtime=remote \
--container-runtime-endpoint=/var/run/crio/crio.sock \
--allow-privileged \
--node-labels=node-role.kubernetes.io/master,node.openshift.io/os_id=${ID} \
--minimum-container-ttl-duration=6m0s \
--client-ca-file=/etc/kubernetes/ca.crt \
--cloud-provider= \
--volume-plugin-dir=/etc/kubernetes/kubelet-plugins/volume/exec \
\
--anonymous-auth=false \
--v=1 \
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/kubelet.service.d/10-default-env.conf
定义新的冗余标准在 /etc/systemd/system/kubelet.service 并且重启 service. 在下面的例子,将 v=1 变成 v=8
sed -i -e 's/--v=1/--v=8/g' /etc/systemd/system/kubelet.service
systemctl daemon-reload
systemctl restart kubelet
设置完成之后,收集完 logs 日志再把数值改到原先的值, 否则, 你可能会看到以下错误
E0514 12:47:17.998892 2281 daemon.go:1350] content mismatch for file /etc/systemd/system/kubelet.service: [Unit]
为 OpenShift4.4 和 OpenShift 4.5 永久配置kubelet log level
按照以下步骤,创建一个新的MachineConfig,并等待machineconfigo操作符将更改卷展到每个节点。您需要为每个角色创建一个machineconfighmachineconfiguration.openshift.io/role:
将要更改 < role >
警示: 这里会被警告, 节点会一个个被重启
如果你想将 kubelet level 变成 2 , 可以按照以下步骤
- 后却 base 64 string code 为变量
$ cat << EOF | base64
KUBELET_LOG_LEVEL=2
EOF
S1VCRUxFVF9MT0dfTEVWRUw9Mgo=
创建一个新的 MachineConfig CustomeResource 并且添加前面的 base 64的值
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: worker
name: 02-worker-kubelet-env-config
spec:
config:
ignition:
config: {}
security:
tls: {}
timeouts: {}
version: 2.2.0
networkd: {}
passwd: {}
storage:
files:
- contents:
source: data:text/plain;charset=utf-8;base64,S1VCRUxFVF9MT0dfTEVWRUw9NAo= # <<<<<< Here, after the coma (,)
verification: {}
filesystem: root
mode: 420
path: /etc/kubernetes/kubelet-env
osImageURL: ""
适用新的 MachineConfig
oc create -f 02-worker-kubelet-env-config
等待这个变量在所有节点上生效, 你可以在 machine-config-operator 监控日志
oc -n openshift-machine-config-operator logs -f $(oc get pods -l k8s-app=machine-config-operator -o name -n openshift-machine-config-operator)
之后你可以进入节点 oc debug node/nodename 并且确定 kubelet 进程运行新的冗余等级
永久配置 OpenShift 4.6 和之后版本的kubelet log level
在 OCP 4.5 版本里, 目录 /etc/kubernetes 标记为 etc_t 然而在新的 OCP 4.6会被标记为 kubernetes_file_t.
这导致SElinux不匹配,导致kubelet env不能被kubelet加载。对于OCP 4.6及更高版本,请使用以下MachineConfig:
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
labels:
machineconfiguration.openshift.io/role: master
name: 99-master-kubelet-loglevel
spec:
config:
ignition:
config: {}
security:
tls: {}
timeouts: {}
version: 2.2.0
systemd:
units:
- name: kubelet.service
enable: true
dropins:
- name: 10-kubelet-loglevel.conf
contents: |
[Service]
Environment=
Environment="KUBELET_LOG_LEVEL=2"
根据一般用例,建议使用 0-4 作为调试日志 5-8作为跟踪日志
冗余等级 | 描述 |
---|---|
v=0 | 通常很有用,Operator总是可以看到它 |
v=1 | 一个合理的默认日志级别, 如果你不想冗余 |
v=2 | 有关服务的有用稳态信息以及可能与系统中的重大更改相关的重要日志消息。这是建议的默认日志级别 |
v=3 | 更新的扩展信息 |
v=4 | 调试等级的冗余 |
v=5 | 显示默认的痕迹请求 |
v=6 | 显示请求的资源 |
v=7 | 显示 http请求的header |
v=8 | 显示 http请求的内容 |
此文章原始作者为David Hernandez Fernandez. 经过他的同意+ 我的个人理解 完成这篇文章