0%

KubeSphere本地开发调试指引(MAC)

本文主要在mac os环境中测试,windows未测试,原理应该相同。

一、安装go环境。

通过brew安装1.16.x版本即可。

1
2
3
~ go version

go version go1.16.8 darwin/amd64

二、安装minikube

通过brew安装即可

1
2
3
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:59:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"darwin/amd64"}

Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

三、安装kubesphere

参考kubesphere官方安装指导:https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.1/kubesphere-installer.yaml

kubectl get pod -A

NAMESPACE           NAME                                        READY   STATUS      RESTARTS   AGE
default             express-server-65cdc68ff-dpppj              1/1     Running     0          28h
kube-system         coredns-54d67798b7-v575p                    1/1     Running     2          29h
kube-system         etcd-minikube                               1/1     Running     2          29h
kube-system         ingress-nginx-admission-create-nlbbn        0/1     Completed   0          33h
kube-system         ingress-nginx-admission-patch-xkzbc         0/1     Completed   0          33h
kube-system         ingress-nginx-controller-745945f89d-b42bm   1/1     Running     0          28h
kube-system         kube-apiserver-minikube                     1/1     Running     2          29h
kube-system         kube-controller-manager-minikube            1/1     Running     2          29h
kube-system         kube-proxy-4jmsh                            1/1     Running     2          29h
kube-system         kube-scheduler-minikube                     1/1     Running     2          29h
kube-system         storage-provisioner                         1/1     Running     11         33h
kubesphere-system   ks-installer-54c6bcf76b-ntwq8               1/1     Running     0          99s
vela-system         kubevela-vela-core-58496dbc88-nkw5m         1/1     Running     3          28h

继续安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.1/cluster-configuration.yaml

kubesphere-controls-system default-http-backend-76d9fb4bb7-nrnsm 0/1 RunContainerError 1 5m34s
kubesphere-controls-system kubectl-admin-776b98f44f-7pdkh 1/1 Running 0 55s
kubesphere-monitoring-system alertmanager-main-0 2/2 Running 0 3m19s
kubesphere-monitoring-system kube-state-metrics-67588479db-crft5 3/3 Running 0 3m28s
kubesphere-monitoring-system node-exporter-t2twz 2/2 Running 0 3m29s
kubesphere-monitoring-system notification-manager-deployment-7bd887ffb4-rgndg 1/1 Running 0 107s
kubesphere-monitoring-system notification-manager-operator-78595d8666-pdfb6 2/2 Running 0 2m51s
kubesphere-monitoring-system prometheus-k8s-0 3/3 Running 1 3m21s
kubesphere-monitoring-system prometheus-operator-d7fdfccbf-xg224 2/2 Running 0 3m37s
kubesphere-system ks-apiserver-67ff4d578f-7wzwq 1/1 Running 0 2m18s
kubesphere-system ks-console-6d6d765964-z2l7f 1/1 Running 0 5m22s
kubesphere-system ks-controller-manager-d6c74c5d-45jsk 1/1 Running 0 2m17s
kubesphere-system ks-installer-54c6bcf76b-ntwq8 1/1 Running 0 9m48s

查看安装日志:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

#####################################################

Welcome to KubeSphere!

#####################################################

Console: http://192.168.64.3:30880
Account: admin
Password: P@88w0rd

NOTES:

1. After you log into the console, please check the
   monitoring status of service components in
   "Cluster Management". If any service is not
   ready, please wait patiently until all components 
   are up and running.
2. Please change the default password after login.

使用日志中提示的地址登录kubesphere:

1

kubesphere在minikube上安装成功。

四、安装telepresence

telepresence是一个可以使本地服务接入k8s集群调试的工具,官方文档见https://www.telepresence.io/
根据安装指引https://www.telepresence.io/docs/latest/install/ 进行安装,这里安装mac版

brew install datawire/blackbird/telepresence

1
🍺  /usr/local/Cellar/telepresence/2.4.2: 3 files, 67.3MB, built in 3 seconds

进入cmd/apiserver执行以下命令

telepresence --namespace kubesphere-system --swap-deployment ks-apiserver --run go run apiserver.go Legacy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Telepresence command used
Command roughly translates to the following in Telepresence:
telepresence intercept ks-apiserver --namespace kubesphere-system -- go run apiserver.go
running...
Launching Telepresence Root Daemon
Launching Telepresence User Daemon
Connected to context minikube (https://192.168.64.3:8443)
Using Deployment ks-apiserver
intercepted
Intercept name : ks-apiserver-kubesphere-system
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:8080
Volume Mount Error: sshfs is not installed on your local machine
Intercepting : all TCP connections
fatal error: unexpected signal during runtime execution

Volume mount报错需要安装sshfs来挂载远程服务器目录
尝试了用brew安装各种问题,放弃,直接上
https://osxfuse.github.io/ 下载macfuse/sshfs安装才行。能不能上github.io,就和GW搏斗吧。

装上后执行
telepresence intercept ks-apiserver --namespace kubesphere-system -- go run apiserver.go

1
2
3
4
5
6
7
8
9
Connected to context minikube (https://192.168.64.3:8443)
Using Deployment ks-apiserver
intercepted
Intercept name : ks-apiserver-kubesphere-system
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:8080
Volume Mount Error: macFUSE 4.0.5 or higher is required on your local machine
Intercepting : all TCP connections

还是会失败
后来在telepresence的issue中找到解药:https://github.com/telepresenceio/telepresence/issues/1654

  1. Remove old sshfs, macfuse, osxfuse using brew uninstall

  2. brew install –cask macfuse

  3. brew install gromgit/fuse/sshfs-mac

  4. brew link –overwrite sshfs-mac

    telepresence intercept ks-apiserver --namespace kubesphere-system -- go run apiserver.go

1
2
3
4
5
6
7
8
9
10
11
Launching Telepresence Root Daemon
Launching Telepresence User Daemon
Connected to context minikube (https://192.168.64.3:8443)
Using Deployment ks-apiserver
intercepted
Intercept name : ks-apiserver-kubesphere-system
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:8080
Volume Mount Point: /var/folders/nl/9z20glxd6fz0zdwjjwm4k1w00000gn/T/telfs-715153785
Intercepting : all TCP connections

至此,telepresence安装完成。

五、本地调试kubesphere的APIServer

kubectl -n kubesphere-system get cm kubesphere-config -o yaml

或者进入kubesphere console查询configmap配置

kubesphere-2

在kubesphere项目的根目录下创建kubesphere.yaml文件,把配置数据拷贝到该文件中。在goland中以debug模式启动apiserver

1
2
3
4
5
6
I0921 23:45:30.921934   16657 interface.go:61] start helm repo informer
I0921 23:45:30.934712 16657 apiserver.go:370] Start cache objects
W0921 23:45:31.004036 16657 warnings.go:70] extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
W0921 23:45:31.008488 16657 warnings.go:70] extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
I0921 23:45:31.676771 16657 apiserver.go:576] Finished caching objects
I0921 23:45:31.676794 16657 apiserver.go:289] Start listening on :9090

apiserver正常启动

接下来通过telepresence 把minikube中的kubesphere 的ks- apiserver这个service的网络流量接管后,转到本机的apiserver。
telepresence intercept --port 9090 ks-apiserver --namespace kubesphere-system

1
2
3
4
5
6
7
8
9
10
11
12
13
Launching Telepresence Root Daemon
Need root privileges to run: /usr/local/bin/telepresence daemon-foreground /Users/linweining/Library/Logs/telepresence '/Users/linweining/Library/Application Support/telepresence' ''
Password:
Launching Telepresence User Daemon
Connected to context minikube (https://192.168.64.3:8443)
Using Deployment ks-apiserver
intercepted
Intercept name : ks-apiserver-kubesphere-system
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:9090
Volume Mount Point: /var/folders/nl/9z20glxd6fz0zdwjjwm4k1w00000gn/T/telfs-717186406
Intercepting : all TCP connections

表明接管拦截成功

测试一下在装在minikube集群中的kubesphere的apiserver请求是否发送到本地的apiserver.

在kubesphere的首页,通过chrome的调试窗口network找到一个ks的的后端api:

http://192.168.64.3:30880/kapis/resources.kubesphere.io/v1alpha2/components

再找出这个API对接的代码在pkg/kapis/resources/v1alpha2/handler.go,并设置断点

kubesphere-3

然后登录kubesphere,进入集群管理,可以看到组件卡片信息在等待后端返回。

kubesphere-4

然后可以看到,goland上debug启动的apiserver进入了调试模式:

kubesphere-5

六、开发一个kubesphere-api

1.创建一个API目录

cd kubesphere && mkdir -p pkg/kapis/hellokubesphere/v1alpha1 && cd pkg/kapis/hellokubesphere/v1alpha1

2.在当前目录创建一个API处理函数,放在handler.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import "github.com/emicklei/go-restful"

type handler struct {}

func newHandler() handler{
return handler{}
}

func (h handler) HelloKubeSphere (req *restful.Request, resp *restful.Response) {
resp.WriteAsJson(HelloResponse{
Message: "hello kubesphere",
})
}

type HelloResponse struct {
Message string `json:"message"`
}

3.注册API

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
package hellokubesphere

import (
"net/http"

"github.com/emicklei/go-restful"
"k8s.io/apimachinery/pkg/runtime/schema"

"kubesphere.io/kubesphere/pkg/api"
"kubesphere.io/kubesphere/pkg/apiserver/runtime"
)

const (
GroupName = "example.kubesphere.io"
)

var GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"}

func AddToContainer(container *restful.Container) error {
webservice := runtime.NewWebService(GroupVersion)
handler := newHandler()

webservice.Route(webservice.GET("/hello-kubesphere").
Reads("").
To(handler.HelloKubeSphere).
Returns(http.StatusOK, api.StatusOK, HelloResponse{})).
Doc("Api for hello-kubesphere")

container.Add(webservice)

return nil
}

4.修改pkg/apiserver/apiserver.go,添加url

1
urlruntime.Must(hellokubesphere.AddToContainer(s.container))

5.启动API,用curl测试

1
2
3
4
5
6
7
 vinin@vinindeMacBook-Pro ks-apiserver % curl -u admin:P@ssw0rd localhost:9090/kapis/example.kubesphere.io/v1alpha1/hello-kubesphere

{

"message": "Hello Kubesphere"

}**%**

参考:

https://github.com/kubesphere/community/blob/master/developer-guide/development/quickstart.md

upload successful