目录

cilium的调试模式

概述

测试 Cilium 的时候,经常会部署完 cilium-agent 的 DaemonSet 之后,手动修改 DaemonSet 里关于 cilium-agent 的启动命令,一般会改成 sleep inf 来避免容器直接启动 cilium-agent,这样可以方便后面的调试,比如修改一些环境变量或者直接修改源码重新编译 cilium-agent 的二进制,就可以不用重头到位构建新的 Cilium 的镜像。之前想过为了节省时间,可以修改一下 Cilium Helm Chart 提供一个选项来自动打开这个开关,但是后面细看了一下官方的 Helm Chart,发现官方其实已经提供了这样的选项。

调试参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# cilium-1.14.4/templates/cilium-agent/daemonset.yaml
containers:
- name: cilium-agent
  image: {{ include "cilium.image" .Values.image | quote }}
  imagePullPolicy: {{ .Values.image.pullPolicy }}
  {{- if .Values.sleepAfterInit }}
  command:
  - /bin/bash
  - -c
  - --
  args:
  - |
    while true; do
      sleep 30;
    done    
  livenessProbe:
    exec:
      command:
      - "true"
  readinessProbe:
    exec:
      command:
      - "true"
  {{- else }}

查看 cilium-agent 的 DaemonSet 的模板,可以在 helm install 的时候,加入配置 sleepAfterInit=true,这样 cilium-agent 启动的时候,还会将 livenessProbe 和 readinessProbe 探针置为 true,避免容器重启,如下。

1
helm install cilium . --set sleepAfterInit=true

需要注意的是,如果通过 sleepAfterInit 休眠了 cilium-agent 的容器,如果想在容器内执行 /usr/bin/cilium-agent -- --config-dir=/tmp/cilium/config-map,是会有一些问题的,最主要就是容器的被配置的 securityContext 是有限制的,但是 cilium-agent 启动的时候是需要去越权做些事情的,因此正常来说就算是 sleepAfterInit,在容器内都是无法正常启动 cilium-agent 的,所以靠 sleepAfterInit 没法直接意做一些 debug 的动作。

其他的Debug技巧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 在Node节点进入cilium-agent容器
nerdctl -n k8s.io exec -it `nerdctl -n k8s.io ps |grep -i cilium-agent|awk '{print $1}'` bash

# 安装一些常见工具
apt-get update -y
apt-get install -y curl net-tools zip unzip lrzsz procps inetutils-ping

# 下载工具
curl -LO 192.168.1.200/root/dlv
chmod +x dlv

# 下载重新编译的cilium-agent
curl -LO 192.168.1.13/cilium-agent
chmod +x cilium-agent

参考资料

  1. Cilium官方文档
警告
本文最后更新于 2023年11月12日,文中内容可能已过时,请谨慎参考。