首页 > 其他分享 >如何像 Sealos 一样在浏览器中打造一款 K8s 终端?

如何像 Sealos 一样在浏览器中打造一款 K8s 终端?

时间:2023-09-12 21:01:00浏览次数:43  
标签:ttyd 浏览器 https Kubernetes ## Terminal CRD Sealos K8s

在 Kubernetes 的世界中,命令行工具(如 kubectl 和 helm)是我们与集群交互的主要方式。然而,有时候,我们可能希望能够在 Web 页面中直接打开一个终端,执行这些命令,而不需要在本地环境中安装和配置这些工具。本文将深入探讨如何通过 Kubernetes 自定义资源定义(CRD)实现这个功能,并通过一个真实的示例展示其设计和实现过程。

file

[Sealos](Sealos: https://sealos.io)中的 App Launchpad 和 Database 等应用为我们屏蔽掉了 kubernetes 资源层面的逻辑,抽象为应用层,但是对应更为复杂的情况,可能需要我们更原生的操作 kubernetes。

如下所示,在 Terminal 中与 K8s API Server 交互:

查看 Pod 资源(kubernetes 最小调度单位,真正运行容器的资源):

$ kubectl get pod

file

查看存储 pvc 资源(容器挂载的存储资源,如 App Launchpad 中指定的存储):

$ kubectl get pvc

file

Terminal 高级用法

Terminal 还支持更为复杂的操作。

Terminal + App Launchpad 一键交互

可以直接通过终端 App 进入每个应用所在容器的终端。假设你在应用管理中部署了一个应用 Nginx,可以直接进入 Nginx 应用的详情页面,依次点击详情右侧的三个点,再点击「终端」,便进入了 Nginx 应用的终端。

file

file

Terminal + Database 一键直连

在终端中一键直连数据库 App中创建的数据库。

进入数据库详情页面,点击左侧的「一键连接」:

file

跳转到 Terminal 并直连数据库:

file

功能描述

这个功能的核心是一个名为 Terminal 的 Kubernetes CRD。用户可以在 Web 页面中创建一个新的 Terminal CRD,然后页面会打开一个新的 Terminal。这个 Terminal 具有指定 Kubernetes Namespace 的访问权限,可以执行 kubectl,helm 等命令。

下面是一个 Terminal CRD 的示例:

spec:
  apiServer: https://kubernetes.default.svc.cluster.local:443
  ingressType: nginx
  keepalived: 4h
  replicas: 1
  token: xxxxx
status:
  availableReplicas: 1
  domain: https://xxxxxx.cloud.sealos.io
	```
	
## CRD 字段说明
在 Terminal CRD 的 spec 部分,以下是各字段的说明:

* apiServer: Kubernetes API 服务器的地址。Terminal 使用这个地址与 Kubernetes API 服务器通信。
* ingressType: Ingress 控制器的类型,可以是 nginx 或 apisix。
* keepalived: Terminal 的生存时间。例如,4h 表示 Terminal 在被创建 4 小时后会被自动删除。
* replicas: Terminal 的副本数。目前只支持 1。
* token: Kubernetes API 服务器的访问令牌。Terminal 使用此令牌进行鉴权。
* 在 status 部分,以下是各字段的说明:

* availableReplicas: 可用副本数量。
* domain: 用于在 Web 中与 Terminal 交互的地址。
创建 Terminal CRD 后,Web 页面中就会打开一个新的 Terminal。用户可以在这个 Terminal 中执行 kubectl,helm 等命令。

## 设计与实现

Terminal 功能的设计与实现包括以下几个关键部分:

## Terminal Controller
Terminal Controller 是 Terminal 功能的核心部分。它负责监听 Terminal CRD 的创建、更新和删除事件,并响应这些事件。

## Terminal Pod
Terminal Pod 是实际运行的 Terminal。它运行一个特殊的 Docker 镜像,这个镜像包含了 kubectl,helm 等命令行工具,以及一个 Web 终端服务器(例如 [ttyd]( https://github.com/tsl0922/ttyd))。Pod 内的 Web 终端服务器监听 8080 端口,并提供 Web 终端服务。

## Service 和 Ingress
Terminal Controller 为每个 Terminal CRD 创建一个对应的 Kubernetes Service 和 Ingress。Service 将网络流量路由到 Terminal Pod,Ingress 将外部访问请求路由到 Service。

## Terminal Docker 镜像
Terminal Docker 镜像是 Terminal Pod 运行的镜像。它基于 Ubuntu 20.04,包含了 kubectl,helm 等命令行工具,以及一个 Web 终端服务器  [ttyd]( https://github.com/tsl0922/ttyd)。此外,该镜像还包含了 MySQL,MongoDB,Redis 的客户端,以便用户能够直接在 Terminal 中连接和操作这些数据库。

这个 Docker 镜像的构建过程如下:

1. 安装必要的软件包,包括 kubectl,helm,vim 等。

1. 将 Web 终端服务器 [ttyd]( https://github.com/tsl0922/ttyd) 和一个启动脚本 start-terminal.sh 添加到镜像中。
 
1. 设置 [ttyd]( https://github.com/tsl0922/ttyd) 服务器监听 8080 端口,并配置 [ttyd]( https://github.com/tsl0922/ttyd) 服务器的启动参数,包括 Kubernetes API 服务器的地址和访问令牌。

这个 Docker 镜像的 Dockerfile 如下:

FROM ubuntu:20.04 LABEL org.opencontainers.image.authors="labring"

USER root ENV HOME /root ARG kubeVersion=1.25.6 ARG ttydVersion=1.7.3 ARG helmVersion=3.12.0 ARG ARCH ARG DEBIAN_FRONTEND=noninteractive

WORKDIR /root COPY ./inline.html ./index.html COPY vim/ . COPY scripts/start-terminal.sh /usr/bin/ COPY scripts/ttyd-kubectl.sh /usr/bin/

RUN arch &&
apt-get update &&
apt-get install -y --no-install-recommends -o Acquire::http::No-Cache=True
ca-certificates curl wget bind9-utils git g++ gcc libc6-dev make pkg-config vim
ncurses-dev libtolua-dev exuberant-ctags gdb dnsutils iputils-ping net-tools postgresql-client &&
apt-get clean && rm -rf /var/lib/apt/lists/* &&
chmod a+x /usr/bin/ttyd-kubectl.sh &&
bash /usr/bin/ttyd-kubectl.sh &&
vim +PlugInstall +qall &&
chmod a+x /usr/bin/start-terminal.sh

ENV USER_TOKEN "" ENV APISERVER "https://apiserver.cluster.local:6443" ENV USER_NAME "admin" ENV NAMESPACE "default"

EXPOSE 8080

CMD ["sh","/usr/bin/start-terminal.sh"]


**❝
镜像 Dockerfile:https://github.com/labring-actions/cluster-image/blob/main/dockerimages/terminal/latest/Dockerfile

镜像托管 GitHub 自动化构建仓库:https://github.com/labring-actions/cluster-image
**

## Terminal 删除和生存时间
Terminal Controller 使用 Kubernetes 的 Finalizer 机制来处理 Terminal CRD 的删除事件。当 Terminal CRD 被删除时,Finalizer 会阻止 Kubernetes 立即删除 CRD,而是等待 Terminal Controller 清理与 Terminal CRD 相关的资源(如 Deployment,Service 和 Ingress)后再删除 CRD。

此外,Terminal Controller 还使用 Keepalive 机制来自动删除过期的 Terminal。Terminal 的生存时间由 keepalived 字段指定,当 Terminal 存在的时间超过 keepalived 指定的时间后,Terminal Controller 会自动删除 Terminal。

## 前后端交互流程
下面是用户从点击 Terminal 按钮到进入 Terminal 的具体流程:

![file](/i/li/?n=2&i=images/blog/202309/12203705_65005b710205798966.png)

1. 用户在 Web 页面中点击 Terminal 按钮,页面会发送一个请求到后端,请求中包含了 Terminal 的配置信息(如 Kubernetes Namespace 和生存时间)。

1. 后端接收到请求后,会创建一个新的 Terminal CRD,CRD 中包含了 Terminal 的配置信息。

1. Terminal Controller 监控到新的 Terminal CRD 被创建,会创建一个对应的 Terminal Pod,Pod 运行的 Docker 镜像包含了 kubectl,helm 等命令行工具,以及一个 Web 终端服务器。

1. Terminal Controller 还会创建一个对应的 Kubernetes Service 和 Ingress,Service 将网络流量路由到 Terminal Pod,Ingress 将外部访问请求路由到 Service。

1. 后端会从 Terminal CRD 的 status 字段中获取到 Terminal 的域名,并将这个域名返回给前端。
 
1. 前端接收到 Terminal 的域名后,会在新的标签页中打开这个域名,用户就可以看到一个新的 Terminal,并可以在这个 Terminal 中执行 kubectl,helm 等命令。

## 自定义配置

## 多种 Ingress 控制器支持
Terminal 支持多种 Ingress 控制器,包括 Nginx 和 Apisix。用户可以根据自己的实际情况选择合适的 Ingress 控制器。

## 生存时间设置
用户可以设置 Terminal 的生存时间。Terminal 在被创建一段时间后会被自动删除,这样可以防止 Terminal 长时间未使用而占用系统资源。

## 未来的改进
更多的命令行工具支持
在 Terminal Docker 镜像中添加更多的命令行工具,如 istioctl,kn 等,这样用户就可以在 Terminal 中执行更多的操作。

## 更多的 Ingress 控制器支持
支持更多的 Ingress 控制器,如 Traefik,HAProxy 等,用户可以根据自己的实际情况选择合适的 Ingress 控制器。

## 使用 WebSocket 通信
通过 Ingress 暴露 WebSocket 服务。用户可以在 Web 页面中打开一个终端,通过 WebSocket 与 Kubernetes 集群进行交互。相比于 HTTP 协议,WebSocket 提供了更高效、实时的双向通信能力,极大地提升了用户的使用体验。

## 权限控制
增加权限控制功能,后续增加企业协作功能,多用户共享 namespace,terminal 通过获取相应权限来获得对应用户空间的权限,如 manager, developer 等。

## 集成更多开发工具
除了 kubectl 和 helm 外,还可以在 Terminal 中集成更多的开发和调试工具,如 git,curl,jq 等。

## 个性化配置
用户可以根据自己的需要,配置 Terminal 的外观,如主题颜色,字体大小等。也可以配置 Terminal 的行为,如命令历史记录的长度,键盘快捷键等。

## 结论

通过 Kubernetes 的 CRD 功能,我们可以轻松地在 Web 页面中添加一个功能强大的 Terminal。用户可以在这个 Terminal 中执行各种命令,更好地与 Kubernetes 集群交互。这不仅提高了用户的工作效率,也极大地提升了用户的使用体验。

引用链接
[1]
Sealos: https://sealos.io

[2]
数据库 App: https://docs.sealos.io/zh-Hans/docs/platform-components/dbprovider/

[3]
ttyd: https://github.com/tsl0922/ttyd



**关于 Sealos
Sealos 是一款以 Kubernetes 为内核的云操作系统发行版。它以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,使企业能够像使用个人电脑一样简单地使用云。**

标签:ttyd,浏览器,https,Kubernetes,##,Terminal,CRD,Sealos,K8s
From: https://blog.51cto.com/u_16255648/7448472

相关文章

  • js 浏览器的5种observer 第五种 ReportingObserver 详解及使用方法
     在前端开发中,对于浏览器的报告信息,例如弃用的API使用、浏览器的干预、CSS特性使用情况等,我们常常需要一种机制来收集和处理。这时,ReportingObserverAPI就发挥了它的作用。什么是ReportingObserver?//ReportingObserver是一个浏览器API,它可以用来监听来自浏览器的各......
  • js 浏览器的5种observer 第三种 ResizeObserver 详解及使用方法
     ResizeObserver它允许开发者监听元素的尺寸变化。在前端开发中,元素尺寸的变化可能会受到许多因素的影响,例如窗口大小调整、设备方向变化、内部内容变化等。提供了一种高效的方法来响应这些变化,而不需要频繁使用事件监听器或轮询技术。1.使用方法constro=newResizeOb......
  • js 浏览器的5种observer 第一种 MutationObserver 详解及使用方法
     MutationObserver提供了监听DOM树变化的能力。从简单的UI变更追踪到复杂的SPA页面变化都有涉及。可以追踪DOM树的变化,包括节点的增加、删除、属性的修改等。它是异步的,这意味着它会将所有的DOM变化集合起来一次性报告,而不是在每一次变化后立刻报告。兼容性Mutat......
  • js 浏览器的5种observer 第二种 IntersectionObserver 详解及使用方法
     IntersectionObserver是一个现代的浏览器API,允许开发者在某个元素与其祖先元素或顶层文档视口发生交叉时得到通知。它非常适合实现图片懒加载、无限滚动、广告曝光率等功能。1.浏览器的兼容性IntersectionObserver目前在大多数现代浏览器中都得到了支持。但是在一些老版......
  • windows下浏览器调用原生app
    regist.regWindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\protocolName]@="protocolNameProtocol""URLProtocol"=""[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\protocolName\DefaultIcon]@="C:......
  • 浏览器端,怎么发一个 http2 的请求?
    在浏览器端发送一个HTTP/2请求,可以通过以下几种方式实现:使用原生的JavaScript:你可以使用XMLHttpRequest或fetchAPI发送HTTP请求。浏览器会根据支持的协议版本选择使用HTTP/2还是较旧的版本(如HTTP/1.1)。例如,使用fetchAPI发送一个HTTP/2请求:fetch('https://example......
  • 解决部署K8S无法拉取镜像问题,K8S拉取离线镜像
    #catpull-images.sh#阿里云镜像#!/bin/bashimages=(kube-apiserver:v1.18.0kube-controller-manager:v1.18.0kube-scheduler:v1.18.0kube-proxy:v1.18.0pause:3.2etcd:3.4.3-0coredns:1.6.7)forimageNamein${images[@]};dodo......
  • K8S集群常见问题总结 集群服务访问失败 集群服务访问失败 集群服务暴露失败 外网无法
    问题1:K8S集群服务访问失败?原因分析:证书不能被识别,其原因为:自定义证书,过期等。解决方法:更新证书即可。问题2:K8S集群服务访问失败?curl:(7)Failedconnectto10.103.22.158:3000;Connectionrefused原因分析:端口映射错误,服务正常工作,但不能提供服务。解决方法:删除svc,重新映射端口......
  • K8s kubectl管理工具使用技巧
    kubectl是K8s官方附带的命令行工具,可以方便的操作K8s集群.这篇文章主要介绍一些kubectl的别样用法,希望读者有基础的K8s使用经验.打印当前使用的API#kubectl的主要作用就是与ApiServer进行交互,而交互的过程,我们可以通过下面的方式来打印,#这个命令尤其适合调试自己的a......
  • 打开Chrome浏览器总是跳到其他浏览器导航??? 为你解决!!!
     用chrome浏览器把百度设为默认搜索引擎用起来很方便,但有时百度抽风,会自动跳转到百度首页,无限烦恼,发现了一个快速解决的办法,和大家共享我的解决方法:第一步:打开你桌面上谷歌的属性,打开文件所在位置 第二步:在文件夹所在的位置找到Chrome.exe,双击运行一下,如果如转到其他浏览器......