编译kubesphere apiserver
遇到的问题:
- 找不到依赖问题
kubesphere使用vendor管理依赖。
需要执行
1 | go mod tidy |
将依赖拷贝到vendor目录下,否则会找不到
无执行权限问题
1
chomd +x hack/*.sh
Dockerfile配置goproxy
1
ENV GOPROXY https://goproxy.cn
build镜像时需要传参
以确定下载的helm的安装包
TARGETARCH : amd64
TARGETOS : linux
加速Docker build
有一些去远程下载的文件,换成本地
helm是从远程下载的,提前下好,放在本地
1
COPY helm-${HELM_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz /tmp
提供的获取token的接口,必须是post
并且Content-Type是application/x-www-form-urlencoded

编译打包apiserver
1 | make ks-apiserver |
编译成功,会在bin/cmd目录下生成可执行文件

获取kubesphere.yaml
在之前已部署好的ks环境执行
1 | kubectl -n kubesphere-system get cm kubesphere-config -o yaml > kubesphere.yaml |
然后改一改
1 | kubernetes: |
kubesphere会读取这个配置文件,先从启动的当前目录下找,找不到去/etc/kubesphere/下找
所以,我们现在把kubesphere.yaml放在代码目录的/bin/cmd下
启动
1 | ./ks-apiserver |

启动成功,在9090端口启动监听。
测试
我们之前写的测试接口

构建镜像
在代码的根目录执行
1 | docker build -f build/ks-apiserver/Dockerfile -t harbor-test.xxx.net/kubesphere/ks-apiserver:1.3.0 --build-arg TARGETOS=linux --build-arg TARGETARCH=amd64 . |
然后再push到我们自己的harbor上
部署到集群中
1 | kubectl -n kubesphere-system edit deploy ks-apiserver |
原来的镜像是
1 | image: kubesphere/ks-apiserver:v3.1.1 |
替换为我们自己的
验证

从ks-console的端口访问我们自定义的接口,成功
修改ks-installer
1 | kubectl -n kubesphere-system edit cc ks-installer |
1 | spec: |
要说的是这个redirectURL。就写这个地址,是ks-console的接口地址。最后的xxx是provider的name
查看日志
1 | kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f |

- 调用authURL 获取一个code
- 调用tokenURL 获取token。 这里需要上一步返回的code作为入参
- 拿着这个token 再去调userInfoURL 获取用户信息
- redirectURL 是完成后跳转的地址,写 http://1x.xxx.151.208:30880/oauth/redirect/xxx

“users.iam.kubesphere.io is forbidden: User "system:pre-registration" cannot create resource "users" in API group "iam.kubesphere.io" at the cluster scope

globalroles.iam.kubesphere.io pre-registration 是有create user的权限的

看globalrolebindings.iam.kubesphere.io 是把pre-registration 这个role和名为pre-registration的group绑定了

查看过clusterroles.rbac.authorization.k8s.io 并没有pre-registration的相关信息
既然报错说system:pre-registration这个用户没有权限,那就给他加上
1 | kubectl edit globalrolebindings.iam.kubesphere.io pre-registration |
1 | - apiGroup: iam.kubesphere.io/v1alpha2 |

成功

第二天,不知道为啥又坏了,报错

这个报错只能看出是代码出错了,没有其他有用的信息
只能看源码
pkg/kapis/oauth/register.go 是rest请求的路由注册代码
通过反向追踪代码,找到这个源码入口
pkg/kapis/oauth/handler.go:342

通过log

发现
1 | requestInfo, _ := request.RequestInfoFrom(req.Request.Context()) |
这个requestInfo很奇怪,怎么去调用github了
怀疑是今天网不通了,昨天通。所以昨天好的,今天忽然不好了。

1 | message: 'workspaces.tenant.kubesphere.io is forbidden: User "system:pre-registration" cannot list resource "workspaces" in API group "tenant.kubesphere.io" at the cluster scope', |
3.1版本的console解析的result

和3.3版本的apiserver返回的结构对的上


apiserver返回的是 access_token bearer refresh_token
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTExMTc5NTIsImlhdCI6MTY5MTExNDM1MiwiaXNzIjoia3ViZXNwaGVyZSIsInN1YiI6InN5c3RlbTpwcmUtcmVnaXN0cmF0aW9uIiwidG9rZW5fdHlwZSI6ImFjY2Vzc190b2tlbiIsInVzZXJuYW1lIjoic3lzdGVtOnByZS1yZWdpc3RyYXRpb24iLCJleHRyYSI6eyJlbWFpbCI6WyJ5YW5neXVuc2hlbmcuaXRAaGFpZXIuY29tIl0sImlkcCI6WyJoYWllciJdLCJ1aWQiOlsiMDE0NzEwNzYiXSwidXNlcm5hbWUiOlsi5p2o5LqR6IOcIl19fQ.Q64FGW2986-jmbLvy-IX8hF6p12LEZnX1dFzUtxeTlY Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTExMTk3NTIsImlhdCI6MTY5MTExNDM1MiwiaXNzIjoia3ViZXNwaGVyZSIsInN1YiI6InN5c3RlbTpwcmUtcmVnaXN0cmF0aW9uIiwidG9rZW5fdHlwZSI6InJlZnJlc2hfdG9rZW4iLCJ1c2VybmFtZSI6InN5c3RlbTpwcmUtcmVnaXN0cmF0aW9uIiwiZXh0cmEiOnsiZW1haWwiOlsieWFuZ3l1bnNoZW5nLml0QGhhaWVyLmNvbSJdLCJpZHAiOlsiaGFpZXIiXSwidWlkIjpbIjAxNDcxMDc2Il0sInVzZXJuYW1lIjpbIuadqOS6keiDnCJdfX0.YqlZpYeL0wGvZDg32tpW5RmJq44LXWmwckMxSEoVONg 3600 |
看起来也没有问题
进到ks-console的容器里

直接访问了一下api-server的callback接口
返回没有问题
我们使用的是3.1版本的ks-console

最后定位出来原因了
username不能是中文
3.3版本的console做了优化

所以3.3版本可能能使用中文名来登录,不确定。没试。