wsl2
# 1.安装wsl


注意
1.wsl --set-default-version 2
2.需要开启Hyper-V,wsl2以来该功能,如果没有Hyper-V选项管理员运行以下脚本
pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i" del hyper-v.txt Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL1
2
3
4
5
# 2.安装Ubuntu
--- Windows store安装 搜索windows subsystem linux安装,该方式默认安装在C盘,不推荐 --- 切换其他盘安装(E盘) 创建文件夹,此处使用Linux 下载Ubuntu,具体的Linux发行版可切换1
2
3
4
5
6Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 -OutFile Ubuntu.appx -UseBasicParsing
# 3.激活Ubuntu
Rename-Item .\Ubuntu20.04.appx Ubuntu.zip Expand-Archive .\Ubuntu.zip -Verbose cd .\Ubuntu\ .\ubuntu2004.exe1
2
3
4
# 4.关闭系统
wsl --shutdown #关闭子系统 net stop LxssManager(子系统名字) #关闭子系统 net start LxssManager(子系统名字) #启动子系统1
2
3
4
# 5.卸载系统
--- 卸载系统 wslconfig /l wslconfig /u <DistroName> #<DistroName>替换为想卸载的名字 --- 导出系统 wsl --export <DistroName> <PathToTarArchive> wsl --export Ubuntu-18.04 E:\WSL\Ubuntu-18.04-WSL2\ubuntu.tar --- 删除系统 wsl --unregister <DistroName> wsl --unregister Ubuntu-18.04 --- 指定系统到新位置 wsl --import <DistroName> <PathToDistroNewDirectory> <PathToTarArchive> wsl --import Ubuntu-18.04 E:\WSL\Ubuntu-WSL2 E:\WSL\Ubuntu-18.04-WSL2\ubuntu.tar --- 换源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vi /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse --- 更新系统 sudo apt-get -y update && sudo apt-get -y upgrade --- 配置默认登陆用户 ubuntu config --default-user root --- 设置hostName vim /etc/wsl.conf [network] hostname=master generateHosts=false --- 配置ssh服务 sudo service ssh stop sudo /usr/sbin/sshd -d # 如果找不到key则安装openssh-server sudo apt purge openssh-server sudo apt install openssh-server --- 配置ssh信息 Port 22 # 这两行允许了 root 账户和密码登录 PermitRootLogin yes PasswordAuthentication yes --- 重启SSH服务 sudo service ssh restart sudo service ssh status --- 设置root密码 sudo passwd root --- 中文配置 # 设置中文 export LC_ALL="zh_CN.UTF-8" locale-gen zh_CN.UTF-8 # 安装中文字体--空格乱码问题 sudo apt-get install fonts-droid-fallback ttf-wqy-zenhei ttf-wqy-microhei fonts-arphic-ukai fonts-arphic-uming --- 限制wsl2内存使用(用户目录下创建一个.wslconfig文件来限制wsl使用的内存总量) [wsl2] processors=6 memory=8GB swap=8GB [experimental] autoMemoryReclaim=gradual # 启用空闲内存缓慢释放模式 networkingMode=mirrored # 启用网络镜像模式,wsl2的linux和windows共享本地网络,可通过localhost直接连接内部应用 dnsTunneling=true firewall=true autoProxy=true1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80注意
如果启用镜像网络模式后GoLand无法调试wsl2中的程序,镜像模式下必须采用的是127.0.0.1地址访问wsl2中的应用,但IDE自带的dlv工具采用的是0.0.0.0,体现为报错 waring layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)。
--- dlv源码获取
git clone https://github.com/go-delve/delve -b 1.21
--- 修改delve\cmd\dlv\cmds\commands.go的execute函数,替换全局调试地址
func execute(attachPid int, processArgs []string, conf *config.Config, coreFile string, kind debugger.ExecuteKind, dlvArgs []string, buildFlags string) int {
addr = strings.ReplaceAll(addr, "0.0.0.0:", "127.0.0.1:")
...
}
--- 打包编译后替换GoLand下plugins\go-plugin\lib\dlv\linux下的dlv可执行文件
CGO_ENABLED=0 GOOS=linux go build -o dlv cmd/dlv/main.go
# 6.Kind搭建集群
--- 下载Kind curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64 chmod +x ./kind sudo mv ./kind /usr/local/bin/kind --- 创建集群 kind create cluster --name=k8sdbg --- 验证集群状态 kubectl cluster-info --context k8sdbg1
2
3
4
5
6
7
8
9
10
# 7.环境搭建
--- 克隆go-delve git clone https://github.com/go-delve/delve cd delve go install github.com/go-delve/delve/cmd/dlv --- 安装go-delve go install github.com/go-delve/delve/cmd/dlv@v1.7.3 --- 验证dlv安装 dlv --- 克隆K8S源码 mkdir -p $GOPATH/src/k8s.io cd $GOPATH/src/k8s.io git clone https://github.com/kubernetes/kubernetes.git git checkout -b v1.25 remotes/origin/release-1.25 --- 编译 make clean && KUBE_BUILD_PLATFORMS=linux/amd64 make all DBG=1 --- 验证编译文件是否支持debug(输出带符号表) objdump --syms _output/bin/kubelet file _output/bin/kubelet1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 8.调试
--- 以api server为例 sudo make WHAT="cmd/kube-apiserver" GOGCFLAGS="-N -l" GOLDFLAGS="" --- 查找kube-apiserver配置信息 ps -ef | grep kube-apiserver --- 组装dlv debug命令 dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec 编译生成的组件 -- 组件配置参数 # 示例 dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec /go/src/github.com/kubernetes/kubernetes/_output/local/bin/linux/amd64/kube-apiserver -- --advertise-address=10.0.35.187 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/etcd/pki/ca.pem --etcd-certfile=/etc/etcd/pki/client.pem --etcd-keyfile=/etc/etcd/pki/client-key.pem --etcd-servers=https://10.0.35.187:2379 --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key --- 停止kube-apiserver的static pod # 只需要把manifest目录下的配置文件移动到别的地方即可,kubelet会直接停止不在manifest目录下的static pod mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/ --- dlv 启动kube-apiserver dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec /go/src/github.com/kubernetes/kubernetes/_output/local/bin/linux/amd64/kube-apiserver -- --advertise-address=10.0.35.187 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/etcd/pki/ca.pem --etcd-certfile=/etc/etcd/pki/client.pem --etcd-keyfile=/etc/etcd/pki/client-key.pem --etcd-servers=https://10.0.35.187:2379 --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key --- goland设置go远程调试模式,配置上述Host及Port1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19