没有SYS_PTRACE如何调试?在线急,等
起因
阳光明媚,几米内无云的一天,一个部署于k8s的服务突然被打爆,由于该服务没有接入链路追踪,因此需要一个可以在线性能分析的工具进行手工检测。
此时,我们可以使用命令行工具perf进行检测,但是perf需要一些特权(指CAP_PTRACE特权和ptrace(2)
的seccomp要求),在不重启容器的情况下赋予容器特权不太可行。
因此想到了进入节点进行调试的想法。
然而节点无法直接ssh进行登录,于是乎有了通过k8s部署特权容器进入节点的想法。
解决方案
此时首先想到了 kubectl debug
进入宿主机,但是这个命令并没有赋予chroot所需要的权限
下面的yaml文件Deploy提供了一个可以进入宿主机的Pod(当然可以直接部署Pod,但是某权限管理器是基于Deploy的lable的,因此此处使用了Deploy进行部署)
需要注意:<nodename>
需要替换为k8s节点的名字,这个可以通过kubectl get node
拿到
kind: Deployment
apiVersion: apps/v1
metadata:
name: privileged-debug
labels:
app.kubernetes.io/instance: privileged-debug-01
app.kubernetes.io/name: privileged-debug
spec:
selector:
matchLabels:
app.kubernetes.io/instance: privileged-debug-01
app.kubernetes.io/name: privileged-debug
template:
metadata:
labels:
app.kubernetes.io/instance: privileged-debug-01
app.kubernetes.io/name: privileged-debug
spec:
containers:
- name: privileged-debug
image: alpine
imagePullPolicy: Always
#stdin: true
#tty: true
command: [ "sleep", "infinity" ]
securityContext:
# 这是临时测试用的,加上这个好像也没啥大问题
# 如果你比我勤快点,请自己配置好seccomp和capabilities
privileged: true
volumeMounts:
- mountPath: /host
name: host-root
enableServiceLinks: true
hostIPC: true
hostNetwork: true
hostPID: true
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /
type: ""
name: host-root
nodeSelector:
kubernetes.io/hostname: <nodename>
这样就可以通过 kubectl exec -it privileged-debug-<xxxxxxxxx>-<xxxxx> -- sh
进入容器,然后 chroot /host
进入宿主机了。
后记
这个仅是仅限于非常情况下的非常做法,非常不推荐这么做。
如果只是想进行一些简单的宿主机调试,可以尝试使用 kubectl debug
命令进行调试。