Swow今天支持多线程了吗?

没有。

如何使用kubectl 命令进入k8s节点内调试

没有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 命令进行调试。

发表评论

电子邮件地址不会被公开。 必填项已用*标注