4

使用 .net + blazor 做一个 kubernetes 开源文件系统 - 编程玩家

 2 years ago
source link: https://www.cnblogs.com/Erik_Xu/p/16183765.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 .net + blazor 做一个 kubernetes 开源文件系统

据我所知,目前 kubernetes 本身或者其它第三方社区都没提供 kubernetes 的文件系统。也就是说要从 kubernetes 的容器中下载或上传文件,需要先进入容器查看目录结构,然后再通过 kubectl cp 指令把文件拷贝进或出容器。虽然说不太麻烦,但也不太方便。当时正好推出 .net 5 + blazor,就趁着这个机会使用 .net 5 + blazor 做一个 kubernetes 的开源文件系统。

创建集群其实就是上传需要接管的 kubernetes 的 kubeconfig,并给集群取个帮助区分的名字:

浏览、上传、下载文件

创建完集群后,就可以方便地选择集群 -> 命名空间 -> Pod -> 容器,然后浏览容器目录,上传文件到容器,或者下载文件到本地:

  1. 克隆代码,https://github.com/ErikXu/kubernetes-filesystem
  2. 安装 docker
  3. 执行 bash build.sh 指令
  4. 执行 bash pack.sh 指令
  5. 下载 kubectl 并保存到 /usr/local/bin/kubectl
  6. 执行 bash run.sh 指令
├── build.sh                                  # 构建脚本
├── docker                                    # docker 目录
│   └── Dockerfile                            # Dockerfile
├── pack.sh                                   # 打包脚本
├── publish.sh                                # 发布脚本
├── README_CN.md                              # 项目说明(中文)
├── README.md                                 # 项目说明
├── run.sh                                    # 运行脚本
└── src                                       # 源码目录
├── Kubernetes.Filesystem.sln             # 解决方案
├── Web                                   # Web 项目
│   ├── App.razor                         # 入口 APP
│   ├── _Imports.razor                    # 引用文件
│   ├── Pages
│   │   ├── Cluster.razor                 # 集群管理页面
│   │   └── File.razor                    # 文件管理页面
│   ├── Shared
│   │   ├── MainLayout.razor              # 布局文件
│   │   ├── MainLayout.razor.css          # 布局样式文件
│   │   ├── NavMenu.razor                 # 导航文件
│   │   ├── NavMenu.razor.css             # 导航样式文件
│   │   └── SurveyPrompt.razor            # 调查弹出框
│   ├── Web.csproj                        # Web 项目文件
│   └── wwwroot
│       ├── css                           # 样式文件夹
│       ├── favicon.ico                   # icon 文件
│       └── index.html                    # html 入口页
└── WebApi                                # WebApi 项目
├── appsettings.Development.json      # 开发环境配置文件
├── appsettings.json                  # 配置文件
├── Controllers                       # 控制器目录
│   ├── ClustersController.cs         # 集群控制器
│   ├── ContainersController.cs       # 容器控制器
│   ├── FilesController.cs            # 文件控制器
│   ├── NamespacesController.cs       # 命名空间控制器
│   └── PodsController.cs             # Pod 控制器
├── Startup.cs                        # Startup 文件
└── WebApi.csproj                     # WebApi 项目文件

ClustersController

ClustersController 主要对集群进行管理,集群信息使用 json 文件存储,路径为:/root/k8s-config。

ContractedBlock.gifExpandedBlockStart.gif

View Code

构造函数主要创建 cluster json 文件及目录,并把 json 内容反序列化成 cluster list。

ContractedBlock.gifExpandedBlockStart.gif

View Code

获取集群列表,直接返回 cluster json list。

ContractedBlock.gifExpandedBlockStart.gif

View Code

获取指定集群的详情信息,并读取 kubernetes 证书信息进行展示。

ContractedBlock.gifExpandedBlockStart.gif

View Code

获取指定集群的版本信息,主要使用 .net process + kubernetes 的证书执行 kubectl version --short 指令获取版本信息。

ContractedBlock.gifExpandedBlockStart.gif

View Code

创建集群,主要是上传集群证书,并把集群信息序列化成 json,并保存到文件。

ContractedBlock.gifExpandedBlockStart.gif

View Code

更新集群,主要是更新集群证书及集群信息。

ContractedBlock.gifExpandedBlockStart.gif

View Code

删除集群,主要是删除集群信息,并清理集群证书。

ContractedBlock.gifExpandedBlockStart.gif

View Code

使用 .net process 执行 linux 指令的辅助函数。

ContractedBlock.gifExpandedBlockStart.gif

View Code

NamespacesController

NamespacesController 比较简单,主要是使用 kubernetes 证书 + kubernetes api 获取集群的命名空间列表。

ContractedBlock.gifExpandedBlockStart.gif

View Code

PodsController

PodsController 也比较简单,主要是获取指定命名空间下的 pod 列表,用于级联下拉菜单。

ContractedBlock.gifExpandedBlockStart.gif

View Code

ContainersController

ContainersController 也比较简单,主要是获取指定 pod 里的容器列表,用于级联下拉菜单。

ContractedBlock.gifExpandedBlockStart.gif

View Code

FilesController

FilesController 是最重要,同时也是稍微有点复杂的一个控制器。

获取容器指定路径的文件列表,主要是调用 kubernetes api 的 exec 方法,执行指令 "ls -Alh --time-style long-iso {dir}" 获得文件内容信息。

由于 exec 是交互式的,所以方法使用的是 web socket:

ContractedBlock.gifExpandedBlockStart.gif

View Code

再看一下指令 "ls -Alh --time-style long-iso {dir}" 的一个例子:

~ ls -Alh --time-style long-iso /usr/bin
total 107M
lrwxrwxrwx.     1 root root        8    2019-02-21 10:47 ypdomainname -> hostname
-rwxr-xr-x.     1 root root        62K  2018-10-30 17:55 ar
drwxr-xr-x      8 root root        4.0K 2022-04-01 09:37 scripts

第一行 total 开头的信息不太重要可以忽略,从第二行可以看出,每一行的格式是固定的。

第 0 列:权限,l 开头表示是链接,- 开头表示是文件,d 开头表示是文件夹

第 1 列:link 数量

第 2 列:用户

第 3 例:组

第 4 列:文件(夹)大小

第 5 列:日期

第 6 列:时间

第 7 列:文件(夹)名称

如果记录类型为 l,则文件名称为 7,8,9 列合成。

因此,解析代码如下:

ContractedBlock.gifExpandedBlockStart.gif

View Code

上传文件主要是把文件上传到服务器,再使用 kubectl cp 指令把文件拷贝到指定容器中:

ContractedBlock.gifExpandedBlockStart.gif

View Code

下载文件主要是使用 kubectl cp 指令把文件从容器拷贝到服务器,再把文件读取下载:

ContractedBlock.gifExpandedBlockStart.gif

View Code

一个小插曲

有个哥们提了一个 issue 提到 kubernetes 在 1.20 引入了一个新指令 "kubectl debug",目的是为了解决容器中未安装 bash 或者 sh 的问题。因此在新版本获取文件列表的方法中,我也实现了该指令:

ContractedBlock.gifExpandedBlockStart.gif

View Code

但意料之外的是,kubectl debug 里获取到的文件列表和容器的文件列表不一致,因此,如果想使用旧版本的方式,请使用 d293e34 版本的代码。

Cluster.razor 和 File.razor

界面部分相对比较简单,基本就是 Bootstrap 和一些 http client 的调用,请大家自行去查阅即可,有问题可以留言讨论。

https://github.com/ErikXu/kubernetes-filesystem

欢迎大家 star,提 pr,提 issue,在文章留言交流,或者在公众号 - 跬步之巅留言交流。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK