IED 使用的 goland
一、配置 GOPATH
这里需要注意一下。GOPATH本地和远程的需要一样
我这里 local 叫remote-k8s
远程叫go
![](https://img.haomeiwen.com/i11480804/ac339a1d214b7d58.png)
二、配置 goland 远程开发环境
1. 拉取远程代码到本地
Tools -> Deployment -> configuration 如下图。
-
SFTP 远程源码地址配置
SFTP 远程源码地址配置
-
配置本地代码存放位置
这里存放从
src
开始本地和远程是一样的
![](https://img.haomeiwen.com/i11480804/78562d49e1ee9683.png)
2. 配置不拉取的目录或文件
Tools -> Deployment -> Options
这里主要_output
这玩意比较大
![](https://img.haomeiwen.com/i11480804/f2054af14cef97dd.png)
3. 开启自动上传代码
![](https://img.haomeiwen.com/i11480804/6d17529717c371fb.png)
三、配置远程 debug
1. 安装 go-Delve
go install github.com/go-delve/delve/cmd/dlv@latest
2. 配置 goland 远程调试
Run -> Edit Configuration
点加号选择Go Remote
![](https://img.haomeiwen.com/i11480804/39647d8dbfce3cda.png)
四、执行 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 里面点停止
![](https://img.haomeiwen.com/i11480804/c49635d52a1427a7.png)
![](https://img.haomeiwen.com/i11480804/9fbf263c6579360d.png)
3. 添加日志输出
想要这个执行下面的日志打印需要重新编译远程代码
klog.Infof("xxx")
网友评论