为什么kubectl exec要加-it?
最近才开始接触k8s,看早先其他同事写的文档里写如何使用pod的bash。
kubectl exec -it pod-name -n namespace bash
通过看kubectl exec -h 原命令的格式是这样
kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]
其中的Options
-c, --container='': Container name. If omitted, the first container in the pod will be chosen --pod-running-timeout=1m0s: The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod is running -i, --stdin=false: Pass stdin to the container -t, --tty=false: Stdin is a TTY
其中两项参数比较好理解,-c设置了执行命令的容器名字,以及命令超时时间,-i也说得比较明确,加了会将标准输入传到容器中去。但是-t我就不太懂。
什么是TTY?
在终端中执行tty就会发现,该命令显示了tty的文件位置,Linux很多文章和书中都提到了linux中一切都是文件。
$ tty /dev/tty0
终端表现的就像是一个文件,可以读也可以写
如果这么操作还有更神奇的表现
$ date > /dev/tty0 Tue Mar 1 10:30:53 CST 2022
tty是全局的文件系统,如果你这个时候又开了一个终端输入echo “Hello, Can you see me?”,那么这句话就会在第一个终端中出现。
如果不加-t会怎么样?
kubectl exec -i <podname> -n <namespace> bash 就会变成交互状态,就像进入了无GUI的窗口
$ kubectl exec -i test-675d4b584f-7nv4p -n emoxale-aat bash date Tue Mar 1 01:44:33 UTC 2022 pwd /home
只有加了-t才会进入pod的终端。
只是浅层的现象
我只写了浅层的现象以及查了一下tty是什么东西,我看了很多大神他们看了k8s的源码,分析了exec底层如何实现的,文章超长,但我现在还停留在简单应用层面。以后也会分享k8s源码理解的。
Reference
what is tty?: https://jameshfisher.com/2017/12/09/what-is-a-tty/