(5)Kubernetes的网络知识

目录

1、Pod内容器之间的通信

2、Pod之间的通信

2.1、同一个Node内的Pod之间的通信

2.2、不同Node上的Pod之间的通信

集群网络部署图

哪里设置呢


三个网络

  • Node network:

Kubectl get nodes –o wide
  • Service network:

Kubectl get services
  • Pod network(Flannel network):
Kubectl get pods –o wide

Kubernetes的网络通信主要分为以下几种情况

  1. Pod内容器之间的通信
  2. Pod到Pod之间的通信
  3. Pod到Service之间的通信
  4. 集群外部与内部组件之间的通信

1、Pod内容器之间的通信

一个 Pod 内部的所有容器共享一个网络堆栈(实际上就是一个网络命名空间,包括它们的 IP 地址、网络设备、配置等都是共享的),所以,在同一个Pod内的容器(Pod内的容器是不会跨宿主机的)之间对于网络的各类操作,就和它们在同一台机器上一样,它们甚至可以用localhost地址访问彼此的端口。

 

2、Pod之间的通信

每个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对方Pod的IP地址通信,而且不需要使用其他发现机制,例如DNS、Consul或者etcd。

两个Pod既有可能运行在同一个Node上,也有可能运行在不同的Node上。所以,我们可以把Pod间通信分为两类:

2.1、同一个Node内的Pod之间的通信

可以看到,Pod1和Pod2都是通信veth pair连接到同一个docker0网桥上,它们的IP地址IP1、IP2都是从docker0网段上动态获取的,它们和网桥本身的IP3是同一个网段的。
       由于Pod1和Pod2处于同一局域网内,它们之间可以通过docker0作为路由量进行通信。

2.2、不同Node上的Pod之间的通信

Pod之间假设是通过访问对方的Pod IP进行通信的,而不同Node之间的通信只能通过Node的物理网卡进行,Pod的IP地址是由各Node上的docker0网桥动态分配的。我们想要实现跨Node的Pod之间的通信,至少需要满足下面三个条件:

  1. 我们需要知道Pod IP 和Node IP之间的映射关系,通过Node IP转发到Pod IP;
  2. 在整个Kubernetes集群中对Pod的IP分配不能出现冲突;
  3. 从Pod中发出的数据包不应该进行NAT地址转换。

根据条件1的要求:

Kubernetes会记录所有正在运行的Pod的IP分配信息,并将这些信息保存到etcd中(作为Service的Endpoint),这样我们就可以知道Pod IP和Node IP之间的映射关系。

根据条件2的要求:

以Flannel为例,Flannel实现的容器的跨主机通信通过如下过程实现:

  1. 每个主机上安装并运行etcd和flannel;
  2. 在etcd中规划配置所有主机的docker0子网范围;
  3. 每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
  4. 当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
  5. 将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
  6. 由于目的IP是宿主机IP,因此路由是可达的;
  7. VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

所以,Kubernetes不同Node上的Pod之间通信的网络拓扑如下图所示:


集群网络部署图

哪里设置呢

参考:kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义

在用kubadm安装k8s时出现一个疑问,service-cidr和pod-network-cidr这个地址如何配置

--apiserver-advertise-address=192.168.181.131    这个参数就是master主机的IP地址,例如我的Master主机的IP是:192.168.181.131

--image-repository=registry.aliyuncs.com/google_containers  这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers

--kubernetes-version=v1.17.4   这个参数是下载的k8s软件版本号

--service-cidr=10.96.0.0/12       这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改

--pod-network-cidr=10.244.0.0/16       k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值