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

这篇具有很好参考价值的文章主要介绍了如何像 Sealos 一样在浏览器中打造一个 Kubernetes 终端?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:槐佳辉。Sealos maintainer

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

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

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

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

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

$ kubectl get pod

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

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

$ kubectl get pvc

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

Terminal 高级用法

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

Terminal + App Launchpad 一键交互

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

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

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

Terminal + Database 一键直连

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

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

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

跳转到 Terminal 并直连数据库:

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

功能描述

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

下面是一个 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 控制器的类型,可以是 nginxapisix
  • keepalived: Terminal 的生存时间。例如,4h 表示 Terminal 在被创建 4 小时后会被自动删除。
  • replicas: Terminal 的副本数。目前只支持 1
  • token: Kubernetes API 服务器的访问令牌。Terminal 使用此令牌进行鉴权。

status 部分,以下是各字段的说明:

  • availableReplicas: 可用副本数量。
  • domain: 用于在 Web 中与 Terminal 交互的地址。

创建 Terminal CRD 后,Web 页面中就会打开一个新的 Terminal。用户可以在这个 Terminal 中执行 kubectlhelm 等命令。

设计与实现

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

Terminal Controller

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

Terminal Pod

Terminal Pod 是实际运行的 Terminal。它运行一个特殊的 Docker 镜像,这个镜像包含了 kubectlhelm 等命令行工具,以及一个 Web 终端服务器(例如 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,包含了 kubectlhelm 等命令行工具,以及一个 Web 终端服务器 ttyd。此外,该镜像还包含了 MySQL,MongoDB,Redis 的客户端,以便用户能够直接在 Terminal 中连接和操作这些数据库。

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

  1. 安装必要的软件包,包括 kubectlhelmvim 等。

  2. 将 Web 终端服务器 ttyd 和一个启动脚本 start-terminal.sh 添加到镜像中。

  3. 设置 ttyd 服务器监听 8080 端口,并配置 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 机制来自动删除过期的 TerminalTerminal 的生存时间由 keepalived 字段指定,当 Terminal 存在的时间超过 keepalived 指定的时间后,Terminal Controller 会自动删除 Terminal

前后端交互流程

下面是用户从点击 Terminal 按钮到进入 Terminal 的具体流程:

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

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

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

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

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

  5. 后端会从 Terminal CRD 的 status 字段中获取到 Terminal 的域名,并将这个域名返回给前端。

  6. 前端接收到 Terminal 的域名后,会在新的标签页中打开这个域名,用户就可以看到一个新的 Terminal,并可以在这个 Terminal 中执行 kubectlhelm 等命令。

自定义配置

多种 Ingress 控制器支持

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

生存时间设置

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

未来的改进

更多的命令行工具支持

Terminal Docker 镜像中添加更多的命令行工具,如 istioctlkn 等,这样用户就可以在 Terminal 中执行更多的操作。

更多的 Ingress 控制器支持

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

使用 WebSocket 通信

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

权限控制

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

集成更多开发工具

除了 kubectlhelm 外,还可以在 Terminal 中集成更多的开发和调试工具,如 gitcurljq 等。

个性化配置

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

结论

通过 Kubernetes 的 CRD 功能,我们可以轻松地在 Web 页面中添加一个功能强大的 Terminal。用户可以在这个 Terminal 中执行各种命令,更好地与 Kubernetes 集群交互。这不仅提高了用户的工作效率,也极大地提升了用户的使用体验。文章来源地址https://www.toymoban.com/news/detail-707771.html

到了这里,关于如何像 Sealos 一样在浏览器中打造一个 Kubernetes 终端?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络安全-信息收集- 谷歌浏览器插件收集信息,谷歌hacking搜索语法-带你玩不一样的搜索引擎

    推荐一个cloudss 可以购买国外的服务器做代理 代理文章发不出来因为违反规定 谷歌浏览器有个插件叫做switchsharp,可以自行搜索如何安装与使用,支持一件切换的 比如切换代理,方便某些功能的使用,也可以用来收集信息的哦~ wappalyzer 谷歌商店里面即可找到,就不出教程了

    2023年04月25日
    浏览(78)
  • Kubernetes详解(五十九)——Kubernetes Dashboard无法用浏览器访问解决

    今天继续给大家介绍Linux运维相关知识,本文主要内容是Kubernetes Dashboard配置后无法用浏览器访问解决。 在前文中,Kubernetes详解(五十六)——Dashboard安装与部署中,我们配置安装了Kubernetes集群的Dashboard,但是在最后的浏览器访问时,我们却有时无法用浏览器访问,反而会出

    2024年02月08日
    浏览(39)
  • 浏览器打开一个网页的全流程

    互联网日常生活中最为常见的行为便是在浏览器输入一个网址, 然后浏览网页内容, 这样一个简单的行为背后有哪些技术细节呢, 本文将做一些介绍. 全流程可拆分为4个主要步骤 将域名解析为IP地址 与目标主机建立TCP连接 (三次握手) 发送与接受数据 与目标主机断开TCP连接 (四

    2024年02月08日
    浏览(42)
  • 推荐一个Edge浏览器中的一个好用问答插件。

       ChatGPT 是一个基于语言模型 GPT-3.5 的聊天机器人, ChatGPT 模型是Instruct GPT的姊妹模型(siblingmodel),使用强化学习和人类反馈来更好地使语言模型与人类指令保持一致。    ChatGPT 是一种基于GPT(Generative Pre-train Transformer)模型的大型语言模型,由OpenAI公司开发。它是目

    2024年02月08日
    浏览(47)
  • 一个免费AI智能浏览器插件:Echo

    Chat GPT chrome extension 助手,类似 monica,基于 GPT-3.5 API,免费使用。 开源地址:GitHub - hzvwsrexw15/echo: Chat GPT chrome extension Copilot 目前有以下功能: 一键处理选中文本:支持在页面中选择文本,并对文本进行快捷处理,如翻译、摘要、解释等   自定义快捷处理:在默认选项基础上

    2024年02月08日
    浏览(38)
  • 浏览器输入一个URL之后发生了什么?

    URL解析 DNS解析 TCP连接 TSL连接 HTTP请求 TCP挥手 接收并解析响应 主要分为: 协议,eg http,https 域名或者ip地址,eg www.baidu.com 域名相对于ip地址来说,更方便人们记忆,但是实际的网络传输中使用的是ip地址 端口号,不同的协议对应不同的端口号,一般可以不写,eg http是80,h

    2024年02月11日
    浏览(34)
  • 一个极好用的浏览器标签页插件

    这是我登录后,并且上传了个人壁纸的页面 这里可以注册一个属于自己的账号,会保存自己的个性化配置 也可以使用注册的账号登录 a.在这个界面我们可以使用百度搜索,还默认给了我们一些小组件和app b.鼠标在主体中间,可以滚动切换页面哦,也可以点击左侧页面图标

    2024年02月06日
    浏览(41)
  • 怎么用Python写一个浏览器集群框架

    框架用途 在采集大量新闻网站时,不可避免的遇到动态加载的网站,这给配模版的人增加了很大难度。本来配静态网站只需要两个技能点:xpath和正则,如果是动态网站的还得抓包,遇到加密的还得js逆向。 所以就需要用浏览器渲染这些动态网站,来减少了配模板的工作难度

    2024年02月08日
    浏览(24)
  • selenium在浏览器定位到下一个窗口

    定位到新打开的页面(窗口): 这里的操作时: 打开拉勾网→定位到地址“北京→搜索框输入“python”进行查找→进入查找结果的第一个连接→定位到新的页面 →关闭新的页面→回到第一个页面

    2024年02月11日
    浏览(27)
  • Microsoft Edge浏览器主页被篡改的解决办法(Microsoft Edge浏览器每次打开都是同一个页面)

    Microsoft Edge每次打开都是同一个页面,在设置- - 处修改也没用,这种情况一般是Microsoft Edge浏览器主页被篡改,解决办法如下: 1.桌面右键单击 Microsoft Edge ,选择 属性 ,然后选择 快捷方式, 把 目标 后打开Microsoft Edge后每次出现的页面的网址删除,把这个网址删除并保存即

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包