K8s -ip
四层服务发现讲的主要是 k8s 原生的 kube-proxy 方式。K8s关于服务的暴露主要是通过 NodePort 方式,通过绑定 minion 主机的某个端口,然后进行 pod 的请求转发和负载均衡,但这种方式有下面的缺陷:
- Service可能有很多个,如果每个都绑定一个node主机端口的话,主机需要开放外围的端口进行服务调用,管理混乱。
- 无法应用很多公司要求的防火墙规则。
理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如80,然后根据域名或者服务名向后面的Service ip转发,Nginx很好的解决了这个需求,但问题是如果有的心得服务加入,如何去修改Nginx的配置,并且加载这些配置?Kubernetes给出的方案就是Ingress。这是一个基于7层的方案。
集群外部至集群内部
IP类型 | 说明 |
---|---|
Proxy-IP | 代理层公网地址IP,外部访问应用的网关服务器。[实际IP] |
Service-IP | Service的固定虚拟IP,Service-IP是内部,外部无法寻址到。 |
Node-IP | 容器宿主机的主机IP。 |
Container-Bridge-IP | 容器网桥(docker 0)IP,容器的网络都需要通过容器网桥转发。 |
Pod-IP | Pod的IP,等效于Pod中网络容器的Container-IP。 |
Container-IP | 容器的IP,容器的网络是个隔离的网络空间。 |
主要三种IP
用户
—> Node IP
–> Service
–> Pod IP
k8s
中主要分为三种 Ip
地址:
Node IP
:Node节点的IP地址,即物理网卡的IP地址。Cluster IP
:Service 的 IP 地址,此为虚拟 IP 地址。Pod IP
:Pod的IP地址,即 Docker 容器的 IP 地址,此为虚拟 IP 地址。
Node IP
node ip
可以是物理机的 Ip
也可以是虚拟机 IP
, 每个 Service
都会在 Node
节点上开通一个端口
外部可以通过 Node IP:NodePort
,访问 Service
里的 Pod
,访问服务器部署的项目也可以 IP:端口/项目名
如下方式可以查询 K8s
中的Node IP
:
kubectl describe node
|grep -i InternalIP
Cluster IP
Service
的 IP
地址,此为虚拟 IP
地址。外部网络无法 ping 通,只有 k8s
集群内部访问使用。
如下方式可以查询 K8s
中的Node IP
:
kubectl get svc
Pod IP
Pod IP
是每个 Pod
的 IP
地址,是 Docker Engine
根据 Docker
网桥的 IP
地址段进行分配的,通常是一个虚拟的二层网络
同 Service
下的 pod
可以直接根据 Pod IP
相互通信
不同 Service
下的 pod
在集群间 pod
通信要借助于 cluster ip
pod
和集群外通信,要借助于 pod ip
如下方式可以查询 K8s
中的Node IP
:
kubectl describe pod
|grep -i ip