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](https://img2022.cnblogs.com/blog/2222036/202206/2222036-20220613123523371-661658142.png)
检查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加载集群中的流量时使用此模式。