k8s之PodIP、ClusterIP和ExternalIP

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

k8s之PodIP、ClusterIP和ExternalIP
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提供的服务了。

参考:
1.
2.。

相关文档
最新文档