Preface

标准版的k8s安装部署难度比较大,本地开发环境一般都是用minukube、k3d之类的缩小版kubernetes。

本文介绍如何在本地开发环境搭建一个minikube(k8s的单机版),然后重点介绍如何进行开发调试。

环境准备

你应该准备以下两个环境:

  1. 本地开发环境——就是你本地windows(macos类似,供参考),安装要开发的IDE及语言环境,比如goland、vscode等;
  2. k8s试验环境——我在本机装了一个deepin虚拟机,用来模拟生产环境,安装了minikube(单机版k8s)。

我们一般都是在windows(Macos)上进行代码开发,最后代码的运行态是在Linux上。Macos这里不太清楚,关于开发环境对windows再补充下。

所以一般是开发环境与试验环境分开,当然了,你也可以两个环境一样的。比如windows10及以上版本,可以开启ubuntu on windows

minikube安装

Minikube也是google推荐的k8s试验环境,可看作是单机版的k8s。可安装到虚拟机上,供学习开发使用。

安装这里不是本文重点,所以请自行进行minikube安装,必要时,建议使用科学上网。

  1. 安装docker

    在你的虚拟机上安装docker,安装方式比较简单,直接参考官方安装方式:https://docs.docker.com/get-started

  2. 安装minikube

    官方的安装前提是需要能够科学上网(如何科学请自行百度)。

    还是建议阿里云给的安装方式:[Minikube - Kubernetes本地实验环境](Minikube - Kubernetes本地实验环境-阿里云开发者社区 (aliyun.com))。

  3. 其他

    一些必要的环境,比如git、go等安装,请自行安装。

连接远程k8s

复制配置文件到本地

在试验环境的用户目录(/root)下,我们可以找到两个文件夹.kube.minikube,把这两个文件夹下载下来。

.minikube这个目录里有一些缓存数据,体积比较大,可以先将缓存清理;或者只拷贝需要的文件,具体的哪些文件可以打开~/.kube/config这个文件看看。

将下载下来的.kube文件夹放在你本地开发环境的用户目录下(windows一般是C:\Users\你登录的用户名),.minikube文件夹位置可以任意放,然后打开.kube目录下的config文件,修改引用的.minikube文件实际路径。

或者,此时.kube目录就可以看作根目录,可以直接在.kube里创建root目录,把.minikube文件夹放在root目录下也可以,这样也不用去修改.kube/config文件。

在这里插入图片描述

添加ssh端口转发

上面我们可以看到clusters.cluster.server,当前是试验环境minikube运行的IP端口,你也可以在试验环境上用kubectl cluster-info命令进行验证。本地肯定是访问不了的,所以需要在本地试验环境添加远程主机的端口转发。

windows端口转发,打开windows的cmd,输入命令:

# 表示在本地启动18443端口,与远程主机root@192.168.80.130建议连接,端口转发到远程主机192.168.49.2:8443上去
C:\Users\MI> ssh -L 18443:192.168.49.2:8443 -N -f root@192.168.80.130
root@192.168.80.130'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):SimpleDeploymentAddressable。后面通过增删改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,进而可以直接你本地进行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)

Logo

开源、云原生的融合云平台

更多推荐