CloudTTY:下一代云原生开源 Cloud Shell

1:为什么会用它?

大部分上了私有容器云的企业,开发人员希望能有执行 kubectl 命令的能力,但出于运维安全性的考虑,他们不能随意 SSH 登陆集群节点来执行命令行,
这个矛盾怎么解决呢?
一个好办法是,通过在云平台上使用浏览器打开命令行窗口,用 kubectl 命令行工具去管理、运维集群。
CloudTTY (Cloud Teletypewriter) 正好提供了这些功能
Github:https://github.com/cloudtty/cloudtty

CloudTTY 是一个云原生开源项目, 基于 kubernetes 之上,解决了一系列集群之上的 “网页命令行” 权限控制下的功能需求。

这个功能在公有云上大多都有,常被称作 cloudshell。但是在私有云场景,目前暂时没有任何一个开源项目能做到 K8s 原生化的 cloudshell 能力

2:基本使用

CloudTTY 提供了 helm 的安装方式,目前最新版本是 v0.1.0,使用 helm 的安装命令:

helm repo add daocloud https://release.daocloud.io/chartrepo/cloudshell
helm install cloudtty --version 0.1.0 daocloud/cloudtty -n cloudtty-system --create-namespace

CloudTTY 提供了 cloudshell 的 crd,创建一个 cr 后,cloudTTY 的 operator 就会准备环境,当 cloudshell 状态为 Completed状态,就可以通过浏览器进行访问

在创建 cr 之前,需要提供访问集群的 kubeconfig 的 configmap 在 example 中提供了一些 cr 的示例

重要参数:
1:ConfigmapName:集群的 kubeconfig 文件,使用 configmap 挂载到 pod 中方式。如果是多集群,必须要保证网络的连通性 (如果是本机集群,可以不用提供 kubeconfig,此功能会在 v0.2.0 版本开放)
2:CommandAction:执行的初始化命令,也可以指定 kubectl exec 或者 kubectl logs 来进入容器和查看容器日志
3:TTL:cloud shell 的存活时间,时间过期会断开连接并销毁容器
4:Once:访问 cloudTTY 服务的有效连接数,默认为 false,如果设置为 true,将只能访问一次。如果想要窗口多开,必须将此参数设置为 false
5:ExposureMode:cloudTTY 服务的暴露方式,目前支持 ClusterIP、NodePort、Ingress、VirtualService 4 种模式,不同的模式将创建不同的资源提供路由的功能
6:Cleanup:TTL 超时后是否销毁 cloudshell 资源

# 创建kubeconfig的configmap
kubectl create configmap my-kubeconfig --from-file=/root/.kube/config

我们可以使用以下命令快速创建 cloudshell 的实例:

apiVersion: cloudshell.cloudtty.io/v1alpha1
kind: CloudShell
metadata:
  name: cloudshell
spec:
  configmapName: "kubeconfig"
  commandAction: "bash"
  ttl: 86400
  once: false
  exposureMode: "NodePort"
  cleanup: true
  
[root@kubernetes-master-1 ~]# kubectl apply -f cloudtty.yaml 
cloudshell.cloudshell.cloudtty.io/cloudshell created

[root@kubernetes-master-1 ~]# kubectl get cloudshells.cloudshell.cloudtty.io 
NAME         USER   COMMAND   TYPE       URL      PHASE   AGE
cloudshell          bash      NodePort   :31852   Ready   15s

# 查看SVC
[root@kubernetes-master-1 ~]# kubectl get svc
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
cloudshell-cloudshell   NodePort    200.1.139.104   <none>        7681:31852/TCP   34s

# 访问测试

image

检查Pod
[root@kubernetes-master-1 ~]# kubectl get pod
NAMESPACE         NAME                                           READY   STATUS    RESTARTS   AGE
default           cloudshell-cloudshell-5mkbm                    1/1     Running   0          4m39s

3:暴露方式

Cloudtty 提供了四种模式来暴露 cloudtty 服务:ClusterIP、NodePort、Ingress、VitualService以满足不同的使用场景:

ClusterIP:集群中创建Service ClusterIP类型的默认模式。适合第三方集成cloudtty服务器,用户可以选择更灵活的方式暴露自己的服务。
NodePort:暴露服务模式最简单的方法是在集群中创建一个NodePort类型的服务资源。您可以使用主节点IP地址和端口号访问cloudtty服务。
Ingress:在集群中创建一个ClusterIP类型的Service资源,根据路由规则创建一个入口资源来加载服务。这在Ingress Controller用于集群中的流量负载时有效。
VirtualService:在集群中创建ClusterIP Service资源并创建VirtaulService资源。当使用Istio加载集群中的流量时使用此模式。
posted @ 2022-06-13 12:47  Layzer  阅读(157)  评论(0编辑  收藏  举报