乐趣区

关于人工智能:如何像-Sealos-一样在浏览器中打造一个-Kubernetes-终端

作者:槐佳辉。Sealos maintainer

在 Kubernetes 的世界中,命令行工具(如 kubectlhelm)是咱们与集群交互的次要形式。然而,有时候,咱们可能心愿可能在 Web 页面中间接关上一个终端,执行这些命令,而不须要在本地环境中装置和配置这些工具。本文将深入探讨 如何通过 Kubernetes 自定义资源定义(CRD)实现这个性能,并通过一个实在的示例展现其设计和实现过程。

Sealos 中的 App Launchpad 和 Database 等利用为咱们屏蔽掉了 kubernetes 资源层面的逻辑,形象为应用层,然而对应更为简单的状况,可能须要咱们更原生的操作 kubernetes。

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

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

$ kubectl get pod

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

$ kubectl get pvc

Terminal 高级用法

Terminal 还反对更为简单的操作。

Terminal + App Launchpad 一键交互

能够间接通过终端 App 进入每个利用所在容器的终端。假如你在利用治理中部署了一个利用 Nginx,能够间接进入 Nginx 利用的详情页面,顺次点击详情右侧的三个点,再点击「终端」,便进入了 Nginx 利用的终端。

Terminal + Database 一键直连

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

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

跳转到 Terminal 并直连数据库:

性能形容

这个性能的外围是一个名为 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 的具体流程:

  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 集群交互。这不仅进步了用户的工作效率,也极大地晋升了用户的应用体验。

退出移动版