k8s的网络详解

author author     2023-03-15     609

关键词:

参考技术A

其实操作到这里,有必要深入的了解K8s的网络运行机制和基本结构,否则当真的遇到问题的时候会比较郁闷。
首先,要理解K8s的用处其实是容器的编排和管理,最小组成其实不是容器,是pod,物理机或者虚拟机叫node,pod是基础单元,pod里可以有多个容器,也可以只有一个容器,同一个pod的容器彼此是共享网络和主机配置的,换句话说,彼此是可以直接localhost通信的,类似于同一台机器上进行通信,所以这里面是无所谓隔离和安全一说,对外而言就是一个环境,所以pod就是这个环境的业务实体。所以,第一个问题来了,同一个pod的不同容器可以位于不同的node上吗?当然不行,必须在同一个node上,因为共享主机和网络。那么怎么才能知道一个pod有多个容器?kubectl exec的时候是否可以指定需要运行的容器?当然可以,参考如下指令:

所以,这里可以忽略容器的概念,单单考虑pod,毕竟pod才是k8s最小的调度单元。那pod和pod是怎么通信的呢?

pod的通信离不开K8s的网络模型:

flannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通讯过程也是走flannel的网桥。
每个node上面都会创建一个flannel0虚拟网卡,用于跨node之间通讯。所以容器直接可以直接使用pod id进行通讯。
跨节点通讯时,发送端数据会从docker0路由到flannel0虚拟网卡,接收端数据会从flannel0路由到docker0。

如果Pod是一组应用容器的集合,那Service是不是就没有意义了,他的意义在于当应用服务需要做负载、需要做全生命周期的跟踪和管理时就体现出来了,所以Service是一个抽象的概念,它定义了Pod逻辑集合和访问这些Pod的策略。
一个非常常见的场景,当一个Pod因为某种原因停止运行了,kubelet根据deployment的需求重新启动一个新的Pod来提供之前Pod的功能,但是flannel会给这个新的Pod分配一个新的IP,这会带来很大的Effort,应用服务的很多配置项都需要调整,如果有了Service呢,这就不是问题,看下Service的运行原理。

这张图解释了Service的运行机制,当Service A创建的时候,Service Controller和EndPoints Controller就会被触发更新一些资源,例如基于Service中配置的Pod的selector给每一个Pod创建一个EndPoint资源并存入etcd,kube-proxy还会更新iptables的chain规则生成基于Service的Cluster IP链路到对应Pod的链路规则,接下来集群内的一个pod想访问某个服务,直接cluster ip:port即可基于iptables的链路将请求发送到对应的Pod,这一层有两种挑选pod的算法,轮询(Round Robin)和亲和度匹配(Session Affinity)。当然,除了这种 iptabels的模式 ,还有一种比较原始的方式就是 用户态的转发 ,Kube-Proxy 会为每个 Service 随机监听一个端口 (Proxy Port),并增加一条 IPtables 规则。从客户端到 ClusterIP:Port 的报文都会被重定向到 Proxy Port,Kube-Proxy 收到报文后,通过 Round Robin (轮询) 或者 Session Affinity(会话亲和力,即同一 Client IP 都走同一链路给同一 Pod 服务)分发给对应的 Pod。

当然,新版本的k8s开始基于 ipvs来替换iptables 了,但是形式和iptables是类似的。
概念图可以参看:

这是最原始的方式,参看下图:

IPVS是 LVS 项目的一部分,是一款运行在 Linux Kernel 当中的 4 层负载均衡器,性能异常优秀。使用调优后的内核,可以轻松处理每秒 10 万次以上的转发请求。目前在中大型互联网项目中,IPVS 被广泛的用于承接网站入口处的流量。

k8s的网络详解

参考技术A其实操作到这里,有必要深入的了解K8s的网络运行机制和基本结构,否则当真的遇到问题的时候会比较郁闷。首先,要理解K8s的用处其实是容器的编排和管理,最小组成其实不是容器,是pod,物理机或者虚拟机叫node,p... 查看详情

flannel详解

...主要工作是创建容器eth,并挂载cni0上,还可以设置容器网络空间的路由等功能,在flannel场景下,这些配置信息都来之flannelcni。flanneld和flannelcni的分工不同,一个负责node之间的通信,一个负责容器在node内的通信(包括容器间和... 查看详情

k8s系列deployment详解

...我们应用A四个Pod如果出现了一些宿主机故障,或者一些网络问题,如何能保证它可用的数量?如何为所有Pod更新镜像版本?我们是否要某一个Pod去重建新版本的Pod?然后在更新过程中,如何保证服务的可用性?以及更新过程中... 查看详情

k8s之pod详解(代码片段)

...使用方式pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。通常把Pod分为两类自主式Pod控制器管理的PodPod容器的分类1、基础容器(infrastructure.container)2、初始化容器(initcontainers)Init的容器作用3、应用容器(Maincontaine... 查看详情

k8s之pod详解(代码片段)

...使用方式pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。通常把Pod分为两类自主式Pod控制器管理的PodPod容器的分类1、基础容器(infrastructure.container)2、初始化容器(initcontainers)Init的容器作用3、应用容器(Maincontaine... 查看详情

k8s之pod详解(代码片段)

...使用方式pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。通常把Pod分为两类自主式Pod控制器管理的PodPod容器的分类1、基础容器(infrastructure.container)2、初始化容器(initcontainers)Init的容器作用3、应用容器(Maincontaine... 查看详情

k8s入门教程详解(代码片段)

...f08;Service)5.6Lable标签5.7Ingress5.8NameSpace命名空间6.K8S的网络通讯方式6.1同一个Pod内的多个容器之间通讯:localhost6.2各个Pod之间的通讯:OverlayNetwork6.3Pod与Service之间的通讯:各节点的Iptables(LVS转发)6.4通讯总结7.K 查看详情

k8s入门教程详解(代码片段)

...f08;Service)5.6Lable标签5.7Ingress5.8NameSpace命名空间6.K8S的网络通讯方式6.1同一个Pod内的多个容器之间通讯:localhost6.2各个Pod之间的通讯:OverlayNetwork6.3Pod与Service之间的通讯:各节点的Iptables(LVS转发)6.4通讯总结7.K 查看详情

k8s七pod详解(代码片段)

...,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被统一安排和调度,并运 查看详情

详解kubernetes(k8s)安装及常见坑

...此时的kubectlgetnodes的status都是NotNotReady:此时我们部署CNI网络,配置如下在此运行kubectlapply-fhttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml成功,如图此时运行kubectlgetnodes效果图如下->成功。(肯能并不一定会... 查看详情

k8s存储pv与pvc使用详解

...sistentVolume)pv俗称持久卷,是集群中由管理员配置的一段网络存储,它是集群的一部分资源和底层存储密切相关,对象包含存储实现的细节,即对接NFS、CIFS等存储系统;不同的PV会对应到不用的存储资源,这样在部署pod的时候直... 查看详情

k8s入门教程详解(代码片段)

文章目录Kubernetes入门教程详解(一)一、Kubernetes概述1.K8S发展历史由来2.K8S官网2.K8S是什么3.K8s优势及特点3.1K8S优势3.2K8S特点4.K8s集群架构与组件4.1K8s集群架构4.2K8s核心组件详细说明5.K8s核心概念5.1Master集群控制节点5.2Node工作负载节... 查看详情

k8s单节点集群二进制部署(步骤详细,图文详解)(代码片段)

...etcd集群master01node01node02所有node节点部署docker引擎2、flannel网络插件3、搭建master组件4、搭建node组件(1)node1节点(2)node2节点一、k8s集群搭建环境准备 查看详情

k8s单节点集群二进制部署(步骤详细,图文详解)(代码片段)

...etcd集群master01node01node02所有node节点部署docker引擎2、flannel网络插件3、搭建master组件4、搭建node组件(1)node1节点(2)node2节点一、k8s集群搭建环境准备 查看详情

k8s核心概念详解

kubernetes(通常简称为K8S),是一个用于管理在容器中运行的应用的容器编排工具。Kubernetes不仅有你所需要的用来支持复杂容器应用的所有东西,它还是市面上最方便开发和运维的框架。Kubernetes的工作原理是通过将容器分组来把... 查看详情

云原生存储详解:容器存储与k8s存储卷(代码片段)

作者|阚俊宝阿里云技术专家导读:云原生存储详解系列文章将从云原生存储服务的概念、特点、需求、原理、使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战。本文为该系列文章的第二篇,会对容器存储的... 查看详情

k8s创建podyaml文件详解

参考技术A以下参数的解释由于是分段的,所以具体所处的层级,对基础的必选参数了解后,进行分辨 在容器列表containers中的各项定义 健康检查有三种方式分别是通过脚本或命令、通过httpGet、通过tcp检测 查看详情

pod详解(代码片段)

...多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。比如你运行一个操作系统发行版... 查看详情