3.Kubernetes—pod通信网络原理

这篇具有很好参考价值的文章主要介绍了3.Kubernetes—pod通信网络原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个 service,二个IP,三个 port 

1、同一个 Pod 中 容器通信

2、同一个节点多个 Pod 之间通信

3、跨节点的pod通信

4、外部网络和 pod 之间通信

一个 service,3个IP,三个 port 

NodePort
nodeport是外部流量访问K8s的一种方式,即nodeIP:nodePort,是提供给外部流量访问K8s集群资源的一种方式。总的来说,我们可以通过在service中配置nodeport,从而使得我们可以通过集群外的机器进行访问我们的服务。

Port
port是K8s集群内部服务访问service的入口。是service暴露在Cluster上的端口,ClusterIP:Port。如下面的yaml配置文件所示,K8s集群内部节点可以通过30080端口访问Nginx服务,然而外部网络还是不能够访问到服务,因为nodePort参数没有配置。

targetPort
targetPort是容器的端口,也是最终底层的服务所提供的端口,所以说targetPod也就是Pod的端口。从port或者是nodePort进入的流量,经过路由转发之后,最终都会都通过targetPort进入到Pod中。

targetPort要与Dockerfile中暴露的端口一致。

apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: NodePort         // 配置为NodePort,外部可以访问
 ports:
 - port: 30080          // 容器间,服务调用的端口
   targetPort: 80       // 容器暴露的端口,与Dockerfile暴露端口保持一致
   nodePort: 30001      // NodePort,外部访问的端口,如果不显示指定,k8s会随机分配一个端口
 selector:
  name: nginx-pod
 

Kubernetes集群里有三种IP地址,分别如下:

Node IP:Node节点的IP地址,即物理网卡的IP地址。
Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
Cluster IP:Service的IP地址,此为虚拟IP地址。
Node IP
可以是物理机的IP(也可能是虚拟机IP)。每个Service都会在Node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名。

在kubernetes查询Node IP:
1.kubectl get nodes
2.kubectl describe node nodeName
3.显示出来的InternalIP就是NodeIP

Pod IP
Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。

同Service下的pod可以直接根据PodIP相互通信。

不同Service下的pod在集群间pod通信要借助于 cluster ip。

pod和集群外通信,要借助于node ip。

在kubernetes查询Pod IP:
1.kubectl get pods
2.kubectl describe pod podName

Cluster IP
Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

在kubernetes查询Cluster IP: kubectl -n 命名空间 get Service即可看到ClusterIP

Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点:

Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配iP地址

Cluster IP无法被ping,

Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。

在不同Service下的pod节点在集群间相互访问可以通过Cluster IP
 

1、同一个 Pod 中 容器通信

同一个pod内共享网络命名空间,容器之间通过访问 127.0.0.1:(端口)即可

pod通信,K8S,网络,kubernetes,docker

2、同一个节点多个 Pod 之间通信

pause 容器启动之前,会为容器创建虚拟一对 ethernet 接口,一个保留在宿主机 vethxxx(插在网桥上),一个保留在容器网络命名空间内,并重命名为eth0。两个虚拟接口的两端,从一端进入,另一端出来。任何 Pod 连接到该网桥的 Pod 都可以收发数据。

同节点不同 pod 之间通信:通过 linux 虚拟以太网设备或者是用两个虚拟接口组成的以太网接口对不同的网络命名空间连接起来通信

pod通信,K8S,网络,kubernetes,docker

3、跨节点的pod通信(CNI:容器网络接口)

CNI 是一种标准,它旨在为容器平台提供网络的标准化。不同的容器平台(比如目前的 kubernetes、mesos 和 rkt)能够通过相同的接口调用不同的网络组件。

目前kubernetes支持的CNI组件种类很多,例如:bridge calico calico-ipam dhcp flannel host-local ipvlan loopback macvlan portmap ptp sample tuning vlan。在docker中,主流的跨主机通信方案主要有一下几种:

1)基于隧道的overlay网络:按隧道类型来说,不同的公司或者组织有不同的实现方案。docker原生的overlay网络就是基于vxlan隧道实现的。ovn则需要通过geneve或者stt隧道来实现的。flannel最新版本也开始默认基于vxlan实现overlay网络。

2)基于包封装的overlay网络:基于UDP封装等数据包包装方式,在docker集群上实现跨主机网络。典型实现方案有weave、flannel的早期版本。

3)基于三层实现SDN网络:基于三层协议和路由,直接在三层上实现跨主机网络,并且通过iptables实现网络的安全隔离。典型的方案为Project Calico。同时对不支持三层路由的环境,Project Calico还提供了基于IPIP封装的跨主机网络实现

通信方式

pod通信,K8S,网络,kubernetes,docker

4、外部访问集群

从集群外访问集群有多种方式,比如loadbalancer,Ingress,nodeport,nodeport和loadbalancer是service的两个基本类型,是将service直接对外暴露的方式,ingress则是提供了七层负载均衡,其基本原理将外部流量转发到内部的service,再转发到后端endpoints,在平时的使用中,我们可以依据具体的业务需求选用不同的方式。这里主要介绍nodeport和ingress方式。

Nodeport

通过将 Service 的类型设置为 NodePort,就可以在 Cluster 中的主机上通过一个指定端口暴露服务。注意通过 Cluster 中每台主机上的该指定端口都可以访问到该服务,发送到该主机端口的请求会被 Kubernetes 路由到提供服务的 Pod 上。采用这种服务类型,可以在 Kubernetes cluster 网络外通过主机 IP:端口的方式访问到服务。

pod通信,K8S,网络,kubernetes,docker

 influxdb 例子:


kind: Service
apiVersion: v1
metadata:
 name: influxdb
spec:
 type: NodePort
 ports:
 - port: 8086
 nodePort: 31112
 selector:
 name: influxdb

Ingress(重点)

pod通信,K8S,网络,kubernetes,docker

Ingress 是推荐在生产环境使用的方式,它起到了七层负载均衡器和 Http 方向代理的作用,可以根据不同的 url 把入口流量分发到不同的后端Service。外部客户端只看到 http://foo.bar.com 这个服务器,屏蔽了内部多个 Service 的实现方式。采用这种方式,简化了客户端的访问,并增加了后端实现和部署的灵活性,可以在不影响客户端的情况下对后端的服务部署进行调整。

其部署的 yaml 可以参考如下模板:

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: test annotations: ingress.kubernetes.io/rewrite-target: /spec: rules: - host: test.name.com http: paths: - path: /test backend: serviceName: service-1 servicePort: 8118 - path: /name backend: serviceName: service-2 servicePort: 8228

ingress模板,定义通过 http://test.name.com 来访问服务,在虚拟主机http://test.name.com下面定义了两个Path,其中/test被分发到后端服务s1,/name被分发到后端服务s2。 

集群中可以定义多个ingress,来完成不同服务的转发,这里需要一个ingress controller来管理集群中的Ingress规则。Ingress Contronler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service文章来源地址https://www.toymoban.com/news/detail-727636.html

到了这里,关于3.Kubernetes—pod通信网络原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Kubernetes】K8s 查看 Pod 的状态

    NAME :Pod 的名称。 READY :代表 Pod 里面有几个容器,前面是启动的,后面是总数, 1 / 1 1/1 1/1 。 STATUS :就是当前 Pod 状态,最常见的就是 Running 正在运行,最期望的状态,只要不是 Running 的就说明有问题,就算是 Running 的就不一定没有问题。 状态 说明 Pending 挂起 在执行创建

    2024年01月15日
    浏览(58)
  • kubernetes(k8s) pod(资源限制、基础概念)

    kubernetes(k8s) pod(资源限制、基础概念)

    目录  一、资源限制 1、概念 1.2、Pod和容器的资源请求和限制 1.3、CPU资源单位 1.4、内存资源单位 1.5、CPU和内存的Requests和Limits的特点 1.6、案例 二、pod 的两种使用方式 三、pod 资源共享 四、底层容器Pause 1、pause 共享资源 1.1、网络 1.2、存储 1.3、小结 2、Pause主要功能 3、Pod

    2024年02月05日
    浏览(46)
  • Kubernetes(k8s)核心资源解析:Pod详解

    Kubernetes(k8s)核心资源解析:Pod详解

    💖The Begin💖点点关注,收藏不迷路💖 Pod是Kubernetes中最小的调度单元,它可以包含一个或多个容器。Pod中的所有容器共享网络和存储卷,它们一起运行在同一个节点上。Pod提供了一种抽象层,使得容器可以作为一个逻辑单元来管理。 Pod中的容器共享IP地址、端口空间和存储

    2024年04月11日
    浏览(54)
  • Kubernetes(k8s)容器编排Pod介绍和使用

    Kubernetes(k8s)容器编排Pod介绍和使用

    Pod是kubernetes中你可以创建和部署的最小也是最简的单位,一个Pod代表着集群中运行的一个进程。 Pod有两个必须知道的特点 通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下 3.1.1 参数描述 下面简要分析一下上面的

    2024年02月08日
    浏览(51)
  • Kubernetes(k8s):精通 Pod 操作的关键命令

    Kubernetes(k8s):精通 Pod 操作的关键命令

    💖The Begin💖点点关注,收藏不迷路💖 Kubernetes 是一个强大的容器编排平台,其中的核心概念之一就是 Pod。Pod 是 Kubernetes 中最小的可部署单元,它由一个或多个容器组成,共享网络和存储资源。 在本篇博客中,我们将深入探讨 Kubernetes 集群中与 Pod 相关的一些重要命令,帮

    2024年04月14日
    浏览(553)
  • K8S第四讲 Kubernetes删除pod阻塞问题

    在Kubernetes中,当您尝试删除一个Pod时,可能会遇到Pod一直阻塞的情况。这通常是由于Pod正在运行或被其他资源(例如ReplicaSet或Deployment)控制而导致的。以下是一些可能的解决方案: 1: 确认Pod是否正在运行:在执行删除Pod命令之前,请先检查Pod的状态,确保它没有在运行中

    2024年02月05日
    浏览(46)
  • 【Kubernetes】 从基础认识 k8s核心pod相关概念

    【Kubernetes】 从基础认识 k8s核心pod相关概念

    提示:此篇帮助朋友们,养成从0到1不断延伸知识的一种方法 最简单的创建pod入手 访问官方文档,直接使用案例,进行修改即可! 官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/ 删除不需要的部分,根据规则添加需要的参数即可得到需要的,代码如

    2024年01月25日
    浏览(70)
  • K8s(Kubernetes)学习(三):pod概念及相关操作

    K8s(Kubernetes)学习(三):pod概念及相关操作

    摘取官网: https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#working-with-pods 1.1 简介 Pod 是可以在 Kubernetes 中 创建和管理的、最小的可部署的计算单元 。 Pod (就像在鲸鱼荚或者豌豆荚中) 是一组(一个或多个)容器 ; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 P

    2024年02月13日
    浏览(45)
  • Kubernetes(k8s):Pod 的 Node Selector详解

    Kubernetes(k8s):Pod 的 Node Selector详解

    💖The Begin💖点点关注,收藏不迷路💖 Node Selector是Kubernetes中一个用于指定Pod部署位置的重要概念。通过Node Selector,用户可以将Pod调度到具有特定标签的节点上。 这种标签通常用于区分节点的硬件配置、地理位置、网络特性等。通过合理地设置Node Selector,用户可以优化应用

    2024年04月08日
    浏览(50)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包