1. 概述

今天聊点啥呢,话说,你有没有想过怎样用 VS Code 连上 K8s 集群内的某个 Pod,然后直接更新 Pod 内的代码?

当我听到这个需求的时候,第一反应是在 Pod 内搞一个 sshd,然后 NodePort 方式暴露 Pod,接着用 VS Code 的某个远程调试插件。当然我没有具体用过 VS Code 远程开发的能力,不过我用过 Goland 里类似的功能,总之这些 IDE 一定有办法访问远程的文件系统,通过一些 FTP/SFTP 之类的协议完成文件传输/同步的过程。

再进一步,如果将这个功能做到产品里,那用 NodePort 就有点 low 了,毕竟暴露一堆的端口,很多场景下是不允许的,所以下一步自然就想到了 Ingress。

不过 Ingress 只能转发 http/https 或者 TCP/UDP 流量,你发现没有,这里其实不支持 ssh/ftp 这类协议……

行,今天就聊聊怎样在不暴露一堆 NodePort 的前提下,通过 VS Code 更新 Pod 内的代码。

2. NodePort 方式

NodePort 方式暴露 Pod 的 sshd 服务是最容易被想到的方案,这种方式在逻辑上没有啥问题,NodePort 将 Pod 的 `ip:pod`` 映射到 Nodes 的特定端口,从而实现 TCP 流量转发(SFTP 协议下面是 SSH,SSH 协议在传输层用的是 TCP)。

在这个方案下,每个用户最后会占用一个 Nodes 层面的端口。换言之,单用户,本地测试开发,没问题。但是作为一个产品,部署上线,那你要么做好和公司的运维、安全团队辩论的准备,要么另寻出路。

3. Ingress 方式

为了解决 NodePort 方式占用多端口的问题,其实很容易往 Ingress 方向考虑,尽管 Ingress 一般用在 http 负载的代理上。不过大家可能会进一步想到 Ingress 配置的时候,不是可以根据 host 路由嘛。那是不是在客户端 hosts 里配置一堆的 域名/IP 映射关系,然后在 Ingress 里根据 host 区分用户,从而实现不同用户的流量转发到不同 Pod 的目的?

再往前想一步,其实 host 是 http 流量转发的时候用到的规则,也就是在 http 请求头里的属性,这个不能用在非 http 流量上。

那么往 TCP 流量代理的方向去考虑呢?比如 Traefik 实现的 Ingress Control 中支持类似如下配置:

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: ssh-ingress-route
spec:
entryPoints:
- ssh
routes:
- match: HostSNI(`user1.example.com`)
services:
- name: ssh-service
port: 22
tls:
passthrough: true

是不是看起来挺和谐的?TCP 流量,根据 host 信息区分流量。

然而这个 SNI 信息是 SSL 协议里用到的,也就是用到 TLS 才能用这个特性,SSH 协议其实并不使用 TLS,换言之,这个字段配置不配置,对 SSH 流量来说,没啥用。

对于 TCP 包来说,包头有 IP 和 Port 信息,并没有 host,所以代理层是无法区分网络流量来自哪个用户的,自然也就不能相应转发到不同的 Pod 中去。

那么有没有支持 SSH 协议的 Ingress Control 实现呢?我瞟了下,没找到。如果你找到了,可以在评论区告诉我。

4. 救命稻草

Ingress 这条路走不通了,其实就是 TCP 没有 host 字段,回过头来我们还是要依赖 http 协议的 host 属性。不过文件传输协议里可不包含 http,用 http 协议转发“远程调试”这类流量,想想,应该没有人去这样实现。

除了 Ingress 这个口子外,和 K8s 交互的另外一个入口就是 apiserver 了,就像 kubectl 可以用 exec/logs 之类的子命令和 Pod 建立长连接一样,或许有人会做一些插件,通过和 apiserver 交互实现 Pod 内文件的操作呢?

OK,直接说答案:在 VS Code 里装上 KubernetesDev Containers 两个插件:

然后就能直接 Attach 进 Pod 了:

如上图,找到你放代码的 Pod,然后右键 - “Attach Visual Studio Code”,接着会弹出一个新的 VS Code:

然后你就可以像操作本地文件系统一样,在这个新的 VS Code 里点击 Open Folder 来打开你在 Pod 内的某个目录了。如下图,我这里在容器内放了一个 gopool 项目的代码,效果是这样的:

还不错吧,你可以开始愉快地开发了。

5. 其他

不好,中午吃多了,犯困了。就这样吧,留点东西下次再发。

我知道你还好奇这2个插件的工作原理;我也知道这套方案要落地还差了权限控制(RBAC 控制一个用户只能访问自己名下的 Pods);我也知道你要睡午觉了……

Anyway,关注公众号“胡说云原生”,咱“明天”见。

通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)的更多相关文章

  1. kubernetes pod内抓包,telnet检查网络连接的几种方式

    背景 在日常kubernetes的运维中,经常遇到pod的网络问题,如pod间网络不通,或者端口不通,更复杂的,需要在容器里面抓包分析才能定位.而kubertnets的场景,pod使用的镜像一般都是尽 ...

  2. Windows下Rancher复制Pod内文件到本地

    Rancher 未提供直接获取 Pod 内文件的工具(如果有请评论告知下,蟹蟹),但提供了 Rancher 的 CLI 客户端,通过 CLI 可以调用 k8s 的 CLI (kubectl) 命令来操 ...

  3. pod内执行kill -3 pid

    1.使用logs命令监控输出 kubectl logs iothub2-iop-dm-replicaset-0   -n iot  -f  >> yuanqianqian.txt 2.在p ...

  4. WPF内嵌代码和后台代码简单混合使用

    下面实例展示了WPF内嵌代码和后台代码混合使用,一个简单基础的实例: xaml文件: <Window x:Class="WPF内嵌代码和后台代码混合使用.MainWindow" ...

  5. &lt;%%&gt;创建内联代码块(表达)

    其实<%%>很早之前见过它,将一个小的功能仅.别人不理解.今天偶尔,我们看到它的真面目,今天,给大家分享. 语法 代码块呈现(<%%>)定义了当呈现页时运行的内联代码或内联表达 ...

  6. <%%>创建内联代码块(表达式)

    其实<%%>很早之前就见过了,只是会用一点功能,其它的不甚了解.今天偶尔见到了它的庐山真面目,现在共享给大家. 语法 代码块呈现(<%%>)定义了当呈现页时执行的内联代码或内联 ...

  7. 【转载】ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)

    ASP.NET 内联代码.内联表达式.数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号) 今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对 ...

  8. ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)

    今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对ASP.NET 内联代码.内联表达式.数据绑定表达式的概念进行罗列,详细概念以及基本的用法我就不在这里罗嗦了,请 ...

  9. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码) ASCII简介 ASCII(American Standard ...

  10. iOS开发 使用RMStore简化内购代码 + 内购买订单验证

    现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...

随机推荐

  1. Linux第四章(80X86保护模式及其编程)

    80X86保护模式及其编程 80X86基础知识 保护模式内存管理 各种保护措施 中断和异常处理 任务管理 保护模式编程的初始化 一个简单的多任务内核 4.1 80X86系统寄存器和系统指令 为了协助处 ...

  2. 【Java监控】使用SkyWalking监控Java服务

    你的Java服务是如何监控的呢? 1.Null:监控?什么监控?我一个写代码的服务挂了跟我有什么关系? 2.命令行:服务挂了?内存泄漏?jstat jmap jcmd,还好不是我写的 3.撸代码:Ja ...

  3. 《SQL与数据库基础》13. 视图

    目录 视图 简介 语法 检查选项 视图更新 视图作用 本文以 MySQL 为例 视图 简介 视图(View)是一种虚拟存在的表.视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的 ...

  4. 如何理解SpringBoot的Starter

    Starter是SpringBoot的四大核心功能特性之一,除此之外,SpringBoot还有自动装配,Actuator监控等特性 SpringBoot里面的这些特性,都是为了让开发者在开发基于Spr ...

  5. 创建第一个C语言文件

    创建第一个C语言文件 新建=>项目=>空项目 创建.c文件 我们学的是C语言,c++就不写了 调整字体 快捷键:Ctlr + 鼠标滚轮 通过工具调整 工具库与main()函数 打开一个工具 ...

  6. VMware Work Station使用ubuntu20.04挂载共享文件夹写入文件时出现输入/输出错误

    原因是默认的max_write为0x00020000即128k,超过此大小会报错,另外big_writes,umask等选项也要加上, sudo /usr/bin/vmhgfs-fuse .host: ...

  7. 树莓派3B/3B+的串口使用

    树莓派包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0).硬件串口由硬件实现,有单独的波特率时钟源,性能高.可靠.mini串口时钟源是由CPU ...

  8. 我们又组织了一次欧洲最大开源社区活动,Hugging Face 博客欢迎社区成员发帖、Hugging Chat 功能更新!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  9. 【XXE实战】——浅看两道CTF题

    [XXE实战]--浅看两道CTF题 上一条帖子[XXE漏洞]原理及实践演示对XXE的一些原理进行了浅析,于是写了两道CTF题巩固一下,顺便也记录一下第一次写出来CTF.两道题都是在BUU上找的:[NC ...

  10. 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表

    一.链表结构 1.单向链表节点结构 public class Node{ public int value; public Node next; public Node(int data){ valu ...