网站首页 > 博客文章 正文
这道面试题虽然简单,但却很少有人能回答出来,很多人认为kubectl 直接把流量转发到pod上面了,但其实完全不是这回事。所以我只在面试k8s 高级工程师的时候才会去问这个问题。关于port-forward 使用参见之前发的 k8s 实战里面的文章,下面直接进入正题。
当面执行kubectl port-forward,首先kubectl 会先启动一个本地监听,然后发送请求port-forward发到apiserver,这个其实很容易理解,kubectl 所有的请求都走apiserver 。
req := o.RESTClient.Post().
Resource("pods").
Namespace(o.Namespace).
Name(pod.Name).
SubResource("portforward")
apiserver 接收到请求后会将请求转发到 kubelet ,kubelet 启动的时候就注册了port-forward接口,这里多说一句,kubelet 除了注册port-forward 同时还注册了 exec 和 attach,他们原理都是类似的。
s.addMetricsBucketMatcher("portForward")
ws = new(restful.WebService)
ws.
Path("/portForward")
ws.Route(ws.GET("/{podNamespace}/{podID}").
To(s.getPortForward).
Operation("getPortForward"))
. . .
s.restfulCont.Add(ws)
他们后端都是调用了 getPortForward接口,这个方法里面判断是否走redirect ,如果是redirect,那么则返回一个url 给 apiserver,让apiserver重新和CRI 建立连接,如下所示 exec 请求链路,它和port-forward 完全一样,如果不是redirect 则直接返回数据流。
真正实现 port-forward 能力的是在CRI server里面 cri/pkg/server/sandbox_portforward_unix.go里面。
err = netNSDo(func(_ ns.NetNS) error {
// 代码中删除部分无关逻辑
conn, err := net.Dial("tcp4", fmt.Sprintf("localhost:%d", port))
go func() {
_, err := io.Copy(stream, conn)
errCh <- err
}()
go func() {
_, err := io.Copy(conn, stream)
errCh <- err
}()
通过直接在容器的namespace 里面直接dail 端口,然后建立一个双向管道,来回拷贝数据。
总结一下整个 port-forward 的整个链路: kubectl --> apiserver --> kubelet --> CRI server。
猜你喜欢
- 2024-10-12 K8s核心技术-Pod(k8s内核要求)
- 2024-10-12 什么是k8s kube-proxy ?(什么是电池pack结构)
- 2024-10-12 快速玩转Kubernetes-k8s(快速玩转手机)
- 2024-10-12 k8s不同网络插件cni简单对比(k8s不同网络插件cni简单对比分析)
- 2024-10-12 Kubernetes 网络模型综合指南(kubernetes模块)
- 2024-10-12 高可用 kubernetes 集群部署实践(高可用集群搭建详细步骤)
- 2024-10-12 k8s-服务网格实战-配置 Mesh(灰度发布)
- 2024-10-12 如何快速理解K8S的核心概念(k8s的主要功能)
- 2024-10-12 K8s中Pod网络的简单介绍(k8s pod ip会变吗)
- 2024-10-12 K8s攻击威胁面面观(k8s admission webhook)
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)