美文网首页
Kubernetes kube-apiserver 服务远程调试

Kubernetes kube-apiserver 服务远程调试

作者: 河码匠 | 来源:发表于2024-01-10 13:59 被阅读0次

    kubernetes 开发环境搭建

    IED 使用的 goland

    一、配置 GOPATH

    这里需要注意一下。GOPATH本地和远程的需要一样
    我这里 local 叫 remote-k8s
    远程叫 go

    image.png

    二、配置 goland 远程开发环境

    1. 拉取远程代码到本地

    Tools -> Deployment -> configuration 如下图。

    • SFTP 远程源码地址配置

      SFTP 远程源码地址配置
    • 配置本地代码存放位置

    这里存放从 src 开始本地和远程是一样的

    配置本地代码存放位置

    2. 配置不拉取的目录或文件

    Tools -> Deployment -> Options
    这里主要 _output 这玩意比较大

    配置不拉取的目录或文件

    3. 开启自动上传代码

    开启自动上传代码

    三、配置远程 debug

    1. 安装 go-Delve

    go install github.com/go-delve/delve/cmd/dlv@latest
    

    2. 配置 goland 远程调试

    Run -> Edit Configuration 点加号选择 Go Remote

    配置远程调试

    四、执行 dlv

    1. 执行 dlv
    • 方法一、侵入式执行

    需要修改更高的权限 echo 0 > /proc/sys/kernel/yama/ptrace_scope

    # ps -A | grep kube-apiserver
    248451 pts/0    00:00:10 kube-apiserver
    
    # dlv --listen=:2345 --headless=true --api-version=2 attach 248451
    2024-01-11T06:45:36Z warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)
    
    • 方法二、定义端口执行命令

    这个执行的命令可以启动一个 apiserver 然后查看进程详情获取

    dlv --listen=:2345 --headless=true --api-version=2 exec /root/go/src/k8s.io/kubernetes/_output/bin/kube-apiserver -- --authorization-mode=Node,RBAC --authorization-webhook-config-file= --authentication-token-webhook-config-file= --cloud-provider= --cloud-config= --v=3 --vmodule= --audit-policy-file=/tmp/local-up-cluster.sh.and47O/kube-audit-policy-file --audit-log-path=/tmp/kube-apiserver-audit.log --cert-dir=/var/run/kubernetes --egress-selector-config-file=/tmp/local-up-cluster.sh.and47O/kube_egress_selector_configuration.yaml --client-ca-file=/var/run/kubernetes/client-ca.crt --kubelet-client-certificate=/var/run/kubernetes/client-kube-apiserver.crt --kubelet-client-key=/var/run/kubernetes/client-kube-apiserver.key --service-account-key-file=/tmp/local-up-cluster.sh.and47O/kube-serviceaccount.key --service-account-lookup=true --service-account-issuer=https://kubernetes.default.svc --service-account-jwks-uri=https://kubernetes.default.svc/openid/v1/jwks --service-account-signing-key-file=/tmp/local-up-cluster.sh.and47O/kube-serviceaccount.key --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,Priority,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction --disable-admission-plugins= --admission-control-config-file= --bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/var/run/kubernetes/serving-kube-apiserver.crt --tls-private-key-file=/var/run/kubernetes/serving-kube-apiserver.key --storage-backend=etcd3 --storage-media-type=application/vnd.kubernetes.protobuf --etcd-servers=http://127.0.0.1:2379 --service-cluster-ip-range=10.0.0.0/24 --feature-gates=AllAlpha=false --external-hostname=localhost --requestheader-username-headers=X-Remote-User --requestheader-group-headers=X-Remote-Group --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-client-ca-file=/var/run/kubernetes/request-header-ca.crt --requestheader-allowed-names=system:auth-proxy --proxy-client-cert-file=/var/run/kubernetes/client-auth-proxy.crt --proxy-client-key-file=/var/run/kubernetes/client-auth-proxy.key
    

    方便获取下面是一个获取这个命令的脚本
    /tmp/local-up-cluster.sh 这里面是存放 key 的

    #!/bin/bash
    
    # 在 /tmp 目录中查找最新的以 local-up-cluster.sh 开头的文件
    latest_file=$(find /tmp -name "local-up-cluster.sh*" -printf '%T+ %p\n' | sort -r | head -n 1 | cut -d' ' -f2-)
    
    # 检查是否找到了文件
    if [ -z "$latest_file" ]; then
        echo "没有找到以 local-up-cluster.sh 开头的文件"
        exit 1
    fi
    
    
    # 将文件名插入到指定的字符串中
    result_string="dlv --listen=:2345 --headless=true --api-version=2 exec /root/go/src/k8s.io/kubernetes/_output/local/bin/linux/arm64/kube-apiserver -- --authorization-mode=Node,RBAC --authorization-webhook-config-file= --authentication-token-webhook-config-file= --cloud-provider= --cloud-config= --v=3 --vmodule= --audit-policy-file=${latest_file}/kube-audit-policy-file --audit-log-path=/tmp/kube-apiserver-audit.log --cert-dir=/var/run/kubernetes --egress-selector-config-file=${latest_file}/kube_egress_selector_configuration.yaml --client-ca-file=/var/run/kubernetes/client-ca.crt --kubelet-client-certificate=/var/run/kubernetes/client-kube-apiserver.crt --kubelet-client-key=/var/run/kubernetes/client-kube-apiserver.key --service-account-key-file=${latest_file}/kube-serviceaccount.key --service-account-lookup=true --service-account-issuer=https://kubernetes.default.svc --service-account-jwks-uri=https://kubernetes.default.svc/openid/v1/jwks --service-account-signing-key-file=${latest_file}/kube-serviceaccount.key --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,Priority,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction --disable-admission-plugins= --admission-control-config-file= --bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/var/run/kubernetes/serving-kube-apiserver.crt --tls-private-key-file=/var/run/kubernetes/serving-kube-apiserver.key --storage-backend=etcd3 --storage-media-type=application/vnd.kubernetes.protobuf --etcd-servers=http://127.0.0.1:2379 --service-cluster-ip-range=10.0.0.0/24 --feature-gates=AllAlpha=false --external-hostname=localhost --requestheader-username-headers=X-Remote-User --requestheader-group-headers=X-Remote-Group --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-client-ca-file=/var/run/kubernetes/request-header-ca.crt --requestheader-allowed-names=system:auth-proxy --proxy-client-cert-file=/var/run/kubernetes/client-auth-proxy.crt --proxy-client-key-file=/var/run/kubernetes/client-auth-proxy.key"
    echo $result_string
    # 输出结果
    eval $result_string
    
    2. goland 启动 debug 测试

    启动打断点就可以一步一步运行了
    这里有一个问题,你要想在远程命令行上面停止 dlv 需要 kill 掉进程。
    要不然就只能在 goland 里面点停止

    image.png image.png
    3. 添加日志输出

    想要这个执行下面的日志打印需要重新编译远程代码

    klog.Infof("xxx")
    

    相关文章

      网友评论

          本文标题:Kubernetes kube-apiserver 服务远程调试

          本文链接:https://www.haomeiwen.com/subject/vtrzndtx.html