DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

Pod IP

Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

每个Pod启动时,会自动创建一个镜像为gcr.io/google_containers/pause:0.8.0的容器,容器内部与外部的通信经由此容器代理,该容器的IP也可以称为Pod IP。

Service ClusterIP

Service是Kubernetes最核心的概念,通过创建Service,可以为一组具有相同功能的容器用用提供一个统一的入口地址,并且将请求进行负载分发到后端的各个容器应用上。

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但没有网络设备为Service Cluster IP负责。

它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。这个地址从我们启动API的service-cluster-ip-range参数(旧版本为portal_net参数)指定的地址池中分配,比如–service-cluster-ip-range=10.0.0.0/16。假设这个Service的端口是1234。集群内的所有kube-proxy都会注意到这个Service。当proxy发现一个新的service后,它会在本地节点打开一个任意端口,建相应的iptables规则,重定向服务的IP和port到这个新建的端口,开始接受到达这个服务的连接。

当一个客户端访问这个service时,这些iptable规则就开始起作用,客户端的流量被重定向到kube-proxy为这个service打开的端口上,kube-proxy随机选择一个后端pod来服务客户。这个流程如下图所示:

 

根据Kubernetes的网络模型,使用Service Cluster IP和Port访问Service的客户端可以坐落在任意代理节点上,只能Cluster内部访问。外部要访问Service,我们就需要给Service外部访问IP。

External IP

外部访问Service的方式有两种:

1)通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。

2)通过设置LoadBalancer映射到云服务上提供的LoadBalancer地址。这种用法仅用于公有云服务提供商的云平台设置Service的场景。对该Service的请求将会通过LoadBalancer转发到后端Pod上,负载分发的实现方式则依赖于云服务商提供的LoadBalancer的实现机制。

示例:

创建一个基于nginx的deployment

kubectl run nginx --image=nginx:maxline

ExternalIP方式提供外部Service服务(包含Cluster IP和External IP)

kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80

type的类型选择为LoadBalancer, --port指定的是80端口,意思是这个service对外界暴露出来的服务端口是80,--target-port=80,这个端口是pod内部的nginx docker容器提供服务的工作端口,默认为80。

kubectl get svc获取External IP和端口,通过External:port外部访问Service。

NodePort方式提供外部Service服务

kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80

kubectl get svc获取nodePort端口, 随便使用任意一个node的external IP地址+nodePort端口外部访问Service。

附:Pod的端口转发功能

有时我们出于测试的目的,需要一种简单的办法查看一个pod是否能正常提供服务。如果每次通过kubectl的方式创建service就太麻烦了。

这里介绍一种简单的办法:pod的端口转发功能(port forward)。

比如我们想测试下图get pods返回的第一个pod的功能,名称为nginx-6f754dd4b9-74jdn:

 

执行命令行 kubectl port-forward pod/nginx-6f754dd4b9-74jdn 8080:80

看到提示信息Forwarding from 127.0.0.1:8080 -> 80, 意思是把当前主机的8080端口映射到nginx pod的80工作端口:

 

最后,就能够通过localhost:8080直接访问nginx pod提供的服务了。

posted on   DoubleLi  阅读(2339)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-06-29 在Windows下搭建基于nginx的视频直播和点播系统
2017-06-29 Linux下视频流媒体直播服务器搭建详解
2017-06-29 四款好用的免费直播编码推流软件
2017-06-29 如何生成HLS协议的M3U8文件
2017-06-29 Web视频播放 之 【HTML5 Video标签】
2017-06-29 谷歌浏览器Chrome播放rtsp视频流解决方案
2016-06-29 linux 调试利器gdb, strace, pstack, pstree, lsof
点击右上角即可分享
微信分享提示