Kubernetes

四、Kubernetes 网络模型

2020-03-29  本文已影响0人  Suny____

1、Network

接下来就要说到跟Kubernetes网络通信相关的内容,我们都知道K8S最小的操作单位是Pod,而我们在前面章节说过同一个Pod中多个容器通信是默认就已经支持了的。但是怎么支持的没去解释,下面就开始说明各种情况下的容器是如何通信的。

1.1 集群内部通信

1.1.1 同一个 Pod 中的容器通信

因为一个 Pod 是存在一台机器中的,不可能说 Pod 里的容器会存到不同机器的,而同一台机器中的Container想要通信肯定是很方便的。

在前面章节演示中,我们知道每一个Pod中都一定会有一个 Pause Container,这个Container就是同一个Pod中其他Container通信的桥梁,其他Container在创建完成之后都会与Pause Container建立连接,于是它们就有了共同的网段,从而实现了通信!

1.1.2 集群内 Pod 之间的通信

接下来就聊聊K8S最小的操作单元,Pod之间的通信,我们知道Pod会有独立的IP地址,这个IP地址是被Pod中所有的Container共享的,那多个Pod之间的通信能通过这个IP地址吗?

这里可能会想到需要分两个维度去验证:

但是我们无需分成两个维度去验证,因为在 K8S网络模型 中,集群内所有 Pod 默认都是可以直接通信的。因为有网络插件的存在,我们的案例中使用的插件是 Calico ,它已经帮我们完成了所有的准备。

1.1.3 集群内 Service-Cluster IP

对于上述的Pod虽然实现了集群内部互相通信,但是Pod是不稳定的,比如通过Deployment管理Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的。

能够有一个固定的IP,使得集群内能够访问。也就是之前在架构描述的时候所提到的,能够把相同或者具有关联的Pod,打上Label,组成 Service。而Service有固定的IP,不管Pod怎么创建和销毁,都可以通过Service的IP进行访问。

其实Service存在的意义就是为了Pod的不稳定性,而上述探讨的就是关于Service的一种类型Cluster IP,只能供集群内访问。

以Pod为中心,已经讨论了关于集群内的通信方式,接下来就是探讨集群中的Pod访问外部服务,以及外部服务访问集群中的Pod。

1.2 集群外与集群内通信

1.2.1 Pod访问外部服务

这个其实没啥可说的,因为外部的网络只要是可以与互联网联通的IP,Pod就可以直接访问了。

# 进入容器
[root@worker01-kubeadm-k8s ~]# docker exec -it 4895fc61ec69 bash

# 访问外部 ip
root@nginx-deployment-6dd86d77d-dxx67:/# ping www.baidu.com
PING www.baidu.com (180.101.49.12): 48 data bytes
56 bytes from 180.101.49.12: icmp_seq=0 ttl=50 time=15.508 ms
56 bytes from 180.101.49.12: icmp_seq=1 ttl=50 time=10.436 ms
^C--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 10.436/12.972/15.508/2.536 ms
1.2.2 外部服务访问集群中的Pod
1.2.2.1 Service-NodePort

NodePort 也是Service的一种类型,可以通过NodePort的方式访问。因为外部能够访问到集群的物理机器IP,所以就是在集群中 每台物理机器上暴露一个相同的IP,比如32008。

NodePort.png
> NodePort虽然能够实现外部访问Pod的需求,但是真的好吗?
>
> 其实不好,因为占用了各个物理主机上的端口。
1.2.2.1 Service-LoadBalance

通常需要第三方云提供商支持,有约束性。

Test.png HostPort.png

总结:如果以后想要使用Ingress网络,其实只要定义ingress,service 和 pod 即可,前提是要保证nginx ingress controller已经配置好了。

1.2.2.3 NodePort 与 HostPort 区别
上一篇下一篇

猜你喜欢

热点阅读