0%

[kubernetes] windows源码本地IDE编译调试apiserver

golang/k8s学习,记录windows下通过GoLand IDE配置k8s源码编译启动apiserver的过程

环境:
OS windows10
IDE: GoLand

一、安装Go/GoLand

没啥写的,略。

二、下载代码

从github上git clone由于墙了很慢,从gitee 码云上clone kubernetes镜像会很快
新建一个$GOPATH/src/k8s.io/目录,把代码下载到这个目录下
git clone https://gitee.com/mirrors/kubernetes.git

三、导入代码

配置Project的GOPATH,把staging目录下的代码拷由到vendor下。这里GoLand的setting配置中,这里不要使用go mod,使用vendor机制吧。

四、安装Etcd

这个比较简单,下个windows版本安装后启动即可

五、配置启动

GoLand启动配置中增加go build配置,启动文件使用kubernetes/cmd/kube-apiserver/apiserver.go

先不配置启动参数试试

k8s-1-1

启动报错:

k8s-1-2

百度了下,pkg/generated/openapi下缺少文件zz_generated.openapi.go,需要在linux下编译生成。坑爹。

看来只能拿出我跑Blog的屌丝阿里云ECS了。ECS的OS是centos 7,需要安装GOVERSION=”go1.16.2”以上,不然会报版本不够。

用yum安装后,版本不够,需要从golang网下载1.16解压后,然后直接在goroot下替换吧。最终go env的配置

1
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
[root@iZ8vbdv0cqgprqpnlegzi9Z openapi]# go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/root/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/lib/golang"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.2"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/root/go/src/k8s.io/kubernetes/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1714270662=/tmp/go-build -gno-record-gcc-switches"

在GOAPTH:/root/go下创建目录src/k8s.io
git clone https://gitee.com/mirrors/kubernetes.git
下载完成后,不要切换release分支编译,切换分支会有一些go mod 等一些问题,暂不明原因。
开始编译,进入kubernetes目录
make
我的阿里ECS太屌丝了,1U1G,报了个内存错误,内存不够。郁闷了,花了100多大洋升成2U2G,就是这么任性。

继续make,折腾了很久,终于不报错了。编译时间很长,先到pkg/generated/openapi目录下看看生成zz_generated.openapi.go了没有。
生成了可以通过ftp或直接在Workbench远程连接视图中找到zz_generated.openapi.go,打开,ctrl v,到GoLand对应的目录下新建一个zz_generated.openapi.go,把内容ctrl c进去即可。
make过程输出

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZ8vbdv0cqgprqpnlegzi9Z kubernetes]# make
+++ [0326 20:05:00] Building go targets for linux/amd64:
./vendor/k8s.io/code-generator/cmd/prerelease-lifecycle-gen
Generating prerelease lifecycle code for 27 targets
+++ [0326 20:05:06] Building go targets for linux/amd64:
./vendor/k8s.io/code-generator/cmd/deepcopy-gen
Generating deepcopy code for 227 targets
+++ [0326 20:05:17] Building go targets for linux/amd64:
./vendor/k8s.io/code-generator/cmd/defaulter-gen
Generating defaulter code for 89 targets
+++ [0326 20:05:30] Building go targets for linux/amd64:
./vendor/k8s.io/code-generator/cmd/conversion-gen

可以看到,在生成各种目标对象代码。

继续在GoLand启动apiserver,继续报错:

1
Error: [service-account-issuer is a required flag, --service-account-signing-key-file and --service-account-issuer are required flags]

看来是涉及安全证书方面,需要生成证书:

下载openssl,http://slproweb.com/products/Win32OpenSSL.html
生成根证书:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 生成密钥
openssl genrsa -out ca.key 2048
\# 生成根证书
openssl req -x509 -nodes -key ca.key -subj "/CN=yourcomany.com" -days 5000 -out ca.crt

\#生成server证书:

openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=`localhost`" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000

生成client证书:
openssl genrsa -out client.key 2048
openssl req -new -key client.key -subj "/CN=`localhost`" -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAcreateserial -out client.crt -days 5000

到k8s的文档https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/ 对apiserver的参数进行了一下了解,在GoLand配置启动参数

1
2
3
4
5
6
7
8
9
--secure-port=443
--client-ca-file=C:\Users\L00564199\ca.crt
--tls-private-key-file=C:\Users\L00564199\server.key
--tls-cert-file=C:\Users\L00564199\server.crt
--service-account-issuer=xx
--service-account-key-file=C:\Users\L00564199\server.key
--service-account-signing-key-file=C:\Users\L00564199\server.key
--api-audiences=xx
--etcd-servers=http://127.0.0.1:2379

这里配置先不太在意一些细节:)

继续启动
没报错了,出现一堆日志,先不管啥意思,找到433端口是否启动成功

1
I0327 15:13:08.779715 17388 secure_serving.go:197] Serving securely on [::]:443

k8s-1-3png

看样子是成功了。telnet localhost 443,可以进去。应该是启动成功了,萌新可以继续k8s的源码之旅了。