标准版的k8s安装部署难度比较大,本地开发环境一般都是用minukube、k3d之类的缩小版kubernetes。
本文介绍如何在本地开发环境搭建一个minikube(k8s的单机版),然后重点介绍如何进行开发调试。
你应该准备以下两个环境:
我们一般都是在windows(Macos)上进行代码开发,最后代码的运行态是在Linux上。Macos这里不太清楚,关于开发环境对windows再补充下。
所以一般是开发环境与试验环境分开,当然了,你也可以两个环境一样的。比如windows10及以上版本,可以开启ubuntu on windows。
Minikube也是google推荐的k8s试验环境,可看作是单机版的k8s。可安装到虚拟机上,供学习开发使用。
安装这里不是本文重点,所以请自行进行minikube安装,必要时,建议使用科学上网。
安装docker
在你的虚拟机上安装docker,安装方式比较简单,直接参考官方安装方式:https://docs.docker.com/get-started
安装minikube
官方的安装前提是需要能够科学上网(如何科学请自行百度)。
还是建议阿里云给的安装方式:[Minikube - Kubernetes本地实验环境](Minikube - Kubernetes本地实验环境-阿里云开发者社区 (aliyun.com))。
其他
一些必要的环境,比如git、go等安装,请自行安装。
在试验环境的用户目录(/root)下,我们可以找到两个文件夹.kube
、.minikube
,把这两个文件夹下载下来。
.minikube这个目录里有一些缓存数据,体积比较大,可以先将缓存清理;或者只拷贝需要的文件,具体的哪些文件可以打开
~/.kube/config
这个文件看看。
将下载下来的.kube
文件夹放在你本地开发环境的用户目录下(windows一般是C:\Users\你登录的用户名
),.minikube
文件夹位置可以任意放,然后打开.kube
目录下的config文件,修改引用的.minikube
文件实际路径。
或者,此时
.kube
目录就可以看作根目录,可以直接在.kube
里创建root
目录,把.minikube
文件夹放在root
目录下也可以,这样也不用去修改.kube/config
文件。
上面我们可以看到clusters.cluster.server,当前是试验环境minikube运行的IP端口,你也可以在试验环境上用kubectl cluster-info
命令进行验证。本地肯定是访问不了的,所以需要在本地试验环境添加远程主机的端口转发。
windows端口转发,打开windows的cmd,输入命令:
# 表示在本地启动18443端口,与远程主机[email protected]建议连接,端口转发到远程主机192.168.49.2:8443上去
C:\Users\MI> ssh -L 18443:192.168.49.2:8443 -N -f [email protected]
[email protected]'s password:
linux主机默认root用户是不可以远程登录的,试验环境倒无所谓,只需要修改ssh一个配置即可。
打开
/etc/ssh/sshd_config
,设置PermitRootLogin yes
,最后再用命令service sshd restart
重启ssh。
此时可以在本地开发环境通过curl进行简单验证:
> curl https://127.0.0.1:18443
# 只要不是` Connection refused` 那么可以认为连接成功了。
如果要进行k8s的controller、operator的开发,最重要的一个问题就是如何在本地IDE上进行debug。
这里以通过knative开发controller代码为例,代码位置:knative-sample-controller。也可以使用官方提供的controller模板:knative-sanbox/sample-controller。
该代码逻辑示例两个自定义资源(CRD):SimpleDeployment
、Addressable
。后面通过增删改SimpleDeployment
资源来debug我们的代码。
代码主要目录结构如下:(本文不对代码展开,后面我会单独开一帖讲代码)
sample-controller
├── cmd
│ ├── controller
│ │ └── main.go # controller 的启动入口文件
│ ├── schema
│ └── webhook
├── config # controller 和webhook 的部署文件(deploy role clusterrole 等等,此处省略)
├── example-addressable-service.yaml # CR 资源的示例yaml
├── example-simple-deployment.yaml # CR 资源的示例yaml
├── hack # 生成代码的脚本目录
├── pkg # controller核心代码逻辑编写
│ ├── apis # CRD 资源的定义
│ ├── client # 执行 hack/update-codegen.sh 后自动生成的文件
│ └── reconciler # 此处是控制器的主要逻辑,示例中实现了两个控制器,每个控制器包含主控制器入口(controller.go) 和对应的 reconcile 逻辑
│ ├── addressableservice
│ │ ├── addressableservice.go
│ │ └── controller.go
│ └── simpledeployment # 核心逻辑
│ ├── controller.go
│ └── simpledeployment.go
在实验环境上创建crd,执行命令:
k apply -f config/
注:k是kubectl 的alias,下同。
我本地使用的ide是goland
,直接用debug方式启动cmd/controller/main.go
。
没有报错,此时可认为启动成功。
然后在核心逻辑的go文件上标记断点,开始准备debug。
修改example-simple-deployment.yaml
文件,内容如下:
apiVersion: samples.knative.dev/v1alpha1
kind: SimpleDeployment
metadata:
name: example-simple-deployment
spec:
image: abreaking/helloworld-java # 镜像文件
replicas: 2
执行命令创建crd:
k apply -f example-simple-deployment.yaml
此时idea上断点已生效:
放行后,可以通过如下命令看到创建的pod:
$ k get pods
NAME READY STATUS RESTARTS AGE
example-simple-deployment-6cwvp 1/1 Running 0 113s
example-simple-deployment-6grdf 1/1 Running 0 113s
pod数是两个,正好与我们之前yaml里配置的replicas
字段相同。
同样的,其他的操作,如手动删除其中一个pod同样也可以在ide上捕获倒断点,此时可以尽情调试了。
在你的本机开发环境,添加远程主机端口转发,安装kubectl,进而可以直接你本地进行kubectl远程操作。
我本地开发环境是windows,但是我打开了ubuntu on windows,因此
kubectl
也是装在本机ubuntu上的。主要原因是我本地执行生成代码脚本时,windows与linux有换行符的差异,所以我不得不启用ubuntu on windows,需要用到unix2dos
方式来消除该问题。当然也有windows的安装方式,你也可以直接安装在windows上。
本地kubectl安装,安装比较简单,可以直接参考官方的安装方式:Install Tools | Kubernetes
这里简单说下linux的安装:
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x kubectl
$ mv kubectl /usr/local/bin/
简化下命令(可选):
$ alias k=kubectl
验证:如果前面你已经添加了端口转发,那么通过如下命令可查看当前节点信息:
$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
可以看见,当前k8s运行的ip port是:192.168.49.2:8443
,并且还是单机版的。
远程访问minikube — Cloud Atlas 0.1 文档 (cloud-atlas.readthedocs.io)
How to write Kubernetes custom controllers in Go | by Anartz Nuin | Speechmatics | Medium (knative.club)