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. Pytest+Jenkins 学习笔记

    Pytest+Jenkins 学习笔记 在软件测试工作中,单元测试通常是由开发人员执行的.针对最小单元粒度的组件测试,在完成了单元粒度的测试任务之后,通常就需要交由专职的测试人员将这些单元级的组件放到 ...

  2. 《Linux基础》03. 运行级别 · 实用指令

    @ 目录 1:运行级别 2:帮助指令 2.1:man 2.2:help 3:文件目录指令 3.1:pwd 3.2:ls 3.3:cd 3.4:mkdir 3.5:rmdir 3.6:touch 3.7 ...

  3. jmeter 二次开发详解

    背景: JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求.通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求.例如,可能需要添加自定义的 测试元件.报 ...

  4. Hadoop NameNode启动后自动关闭解决方法

    Hadoop NameNode启动后过一会自动关闭了,查看日志文件报内存溢出异常: tail -100 /bigdata/logs/hadoop/hadoop-root-namenode-node1. ...

  5. VMware上安装Centos7

    一.下载Centos镜像 国内镜像网站: 清华大学:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 阿里云:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 ( ...

  6. Vue vs React:你需要知道的一切

    Vue 和 React 是创建 JavaScript 网络应用程序最常用的两种工具.但我们该如何在两者之间做出选择呢?在本篇 Vue 与 React 的对比中,我们将尝试找出答案.我们将回顾每种工具的 ...

  7. Dami 本地过程调用框架(主打解耦),v0.24 发布

    Dami,专为本地多模块之间通讯解耦而设计(尤其是未知模块.隔离模块.领域模块).零依赖,特适合 DDD. 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作异步响应. 支持事务 ...

  8. ModbusTCP 转 Profinet 主站网关控制汇川伺服驱动器配置案例

    ModbusTCP 转 Profinet 主站网关控制汇川伺服驱动器配置案例 ModbusTCP Client 通过 ModbusTCP 控制 Profinet 接口设备,Profinet 接口设备接 ...

  9. 国庆微信头像DIY:轻松打造个性化头像

    前言 国庆节马上要到了,今天就教你如何从0到1使用canvas生成国庆风微信头像. 本文包含以下内容: vue3项目搭建,需求分析 canvas合成图片原理 github自动化部署 开发过程遇到的问题 ...

  10. Makefile 入门教程

    Makefile 是一个非常强大的构建自动化工具,用于管理项目的编译.链接和其他构建任务.以下是一个详细的 Makefile 使用文档,包括基本概念.语法.示例和常见任务. 1. 基本概念 目标 (T ...