关于在Windows中使用Terminal连接SSH登录远程机器中的docker容器中使用kubectl管理集群的那些事

不知道为什么我的Windows 10安装了wsl2后,会莫名其妙的失踪,各种检查都没问题,我怀疑可能处在软raid的问题上,但是不的又不影响。但是这又影响到了我日常的工作,所以我就想,在nas上用docker部署一个kubectl,然后通过远程访问,这样不用在本地安装任何东西了。

经过将近一天的实验,终于搞定了,用Windows Terminal作为终端,远程通过ssh连接到nas运行docker exec进入容器的终端,中间经历了如何安装bash-completion的过程,最后几乎完美。

镜像选用https://hub.docker.com/_/bash,13.6MB十分小巧。

kubectl直接https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/下载到nas的一个路径中例如我放在了/nas/opt/kubectl/下面。

docker-compose.yaml的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
version: "3.3"
services:
kubectltest:
image: bash:5.1.4
container_name: kubectltest
user: 0:0
environment:
- KUBECONFIG=/.kube/config
command: ["bash", "-c", "apk add bash-completion && echo 'source /usr/share/bash-completion/bash_completion'> ~/.bashrc && mkdir /etc/bash_completion.d && kubectl completion bash >/etc/bash_completion.d/kubectl && tail -f /dev/null"]
volumes:
- /nas/opt/kubectl/config/test:/.kube
- /nas/opt/kubectl/kubectl:/usr/local/bin/kubectl
restart: always
deploy:
resources:
limits:
cpus: '0.1'
memory: 32M
kubectlpre:
image: bash:5.1.4
container_name: kubectlpre
user: 0:0
environment:
- KUBECONFIG=/.kube/config
command: ["bash", "-c", "apk add bash-completion && echo 'source /usr/share/bash-completion/bash_completion'> ~/.bashrc && mkdir /etc/bash_completion.d && kubectl completion bash >/etc/bash_completion.d/kubectl && tail -f /dev/null"]
volumes:
- /nas/opt/kubectl/config/pre:/.kube
- /nas/opt/kubectl/kubectl:/usr/local/bin/kubectl
restart: always
deploy:
resources:
limits:
cpus: '0.1'
memory: 32M

bash的镜像里竟然直接带了apk的包管理器这是我没想到的,真的小巧灵活好用,上面command里:

  1. 装bash-completion
  2. 把source /usr/share/bash-completion/bash_completion写入到 ~/.bashrc,每次登陆后就可以直接使用kubectl自动提示
  3. 创建目录 mkdir /etc/bash_completion.d 用来存放自动提示文件
  4. kubectl completion bash >/etc/bash_completion.d/kubectl 写入自动提示
  5. tail -f /dev/null 保持容器运行

/nas/opt/kubectl/config/pre存放的是config文件,我平时要管理多个集群,所以我这里又多个目录。

Windows Terminal 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"guid": "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2534}",
"hidden": false,
"name": "测试环境",
"commandline": "ssh -t root@192.168.0.250 \"/bin/docker exec -it kubectltest bash\"",
"icon": "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png",
"colorScheme": "Vintage"
},
{
"guid": "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2535}",
"hidden": false,
"name": "预发布环境",
"commandline": "ssh -t root@192.168.0.250 \"/bin/docker exec -it kubectlpre bash\"",
"icon": "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png",
"colorScheme": "One Half Light"
},

重点在哪个ssh -t,不然会进不去,这样就完成了一个在本地打开终端直接进入到nas里的docker容器中进行kubectl管理集群的套娃操作。

最后总结

  1. 远程连接的时候ssh-t参数是tty的意思,不加这个参数后面的docker exec -it会报the input device is not a TTY错,进不去的。
  2. docker-compose.yml中的command节点中多条命令用&&分隔,如果是&分隔,或造成命令并行执行,前一个还没结束,后一个就执行完了。

遗憾

如果能用webshell直接使用docker exec就更好了,即节省了本地空间,又可以给组内的人一起使用。找到了一个docker-exec-web-control项目,是3年前的了,跑起来后并不能用。


关于在Windows中使用Terminal连接SSH登录远程机器中的docker容器中使用kubectl管理集群的那些事
https://oujun.work/2021/01/13/在docker中使用kubectl.html
作者
欧俊
发布于
2021年1月13日
许可协议