作者:槐佳辉。Sealos maintainer
在 Kubernetes 的世界中,命令行工具(如 kubectl
和 helm
)是咱们与集群交互的次要形式。然而,有时候,咱们可能心愿可能在 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 的拜访权限,能够执行 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)。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。此外,该镜像还蕴含了 MySQL,MongoDB,Redis 的客户端,以便用户可能间接在 Terminal 中连贯和操作这些数据库。
这个 Docker 镜像的构建过程如下:
- 装置必要的软件包,包含
kubectl
,helm
,vim
等。 - 将 Web 终端服务器
ttyd
和一个启动脚本start-terminal.sh
增加到镜像中。 - 设置
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 机制来主动删除过期的 Terminal
。Terminal
的生存工夫由 keepalived
字段指定,当 Terminal
存在的工夫超过 keepalived
指定的工夫后,Terminal
Controller 会主动删除 Terminal
。
前后端交互流程
上面是用户从点击 Terminal 按钮到进入 Terminal 的具体流程:
- 用户在 Web 页面中点击 Terminal 按钮,页面会发送一个申请到后端,申请中蕴含了 Terminal 的配置信息(如 Kubernetes Namespace 和生存工夫)。
- 后端接管到申请后,会创立一个新的
Terminal
CRD,CRD 中蕴含了 Terminal 的配置信息。 Terminal
Controller 监控到新的Terminal
CRD 被创立,会创立一个对应的Terminal
Pod,Pod 运行的 Docker 镜像蕴含了kubectl
,helm
等命令行工具,以及一个 Web 终端服务器。Terminal
Controller 还会创立一个对应的 Kubernetes Service 和 Ingress,Service 将网络流量路由到Terminal
Pod,Ingress 将内部拜访申请路由到 Service。- 后端会从
Terminal
CRD 的status
字段中获取到 Terminal 的域名,并将这个域名返回给前端。 - 前端接管到 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 集群交互。这不仅进步了用户的工作效率,也极大地晋升了用户的应用体验。