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
先不配置启动参数试试
启动报错:
百度了下,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
看样子是成功了。telnet localhost 443,可以进去。应该是启动成功了,萌新可以继续k8s的源码之旅了。