返回顶部
首页 > 资讯 > 精选 >如何理解Kubernets网络
  • 592
分享到

如何理解Kubernets网络

2023-06-19 10:06:34 592人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关如何理解Kubernets网络,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。不同宿主机上运行的容器并不能通过 IP 相互访问,那么 kubernetes 是如何实现不同节

这期内容当中小编将会给大家带来有关如何理解Kubernets网络,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

不同宿主机上运行的容器并不能通过 IP 相互访问,那么 kubernetes 是如何实现不同节点上 Pod 的互通?Pod 有生命周期,它的 IP 会随着动态的创建和销毁而动态变化,Kubernetes 又是怎样对外提供稳定的服务?今天就为大家一一解答这些疑问。

Docker 网络

先来看一下 Docker 中的网络。在启动 Docker 服务后,默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值,这些值都可以在服务启动的时候进行配置。

root@ubuntu:/root# ifconfig...docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0        ether 02:42:d2:00:10:6c  txqueuelen 0  (Ethernet)...root@ubuntu:/root# docker inspect busybox···"IPAddress": "172.17.0.2",···

为了实现上述功能,Docker 主要用到了 linuxBridgeNetwork NamespaceVETH

  • Bridge相当于是一个虚拟网桥,工作在第二层网络。也可以为它配置IP,工作在三层网络。docker0网关就是通过Bridge实现的。

  • Network Namespace是网络命名空间,通过Network Namespace可以建立一些完全隔离的网络栈。比如通过docker network create xxx就是在建立一个Network Namespace

  • VETH是虚拟网卡的接口对,可以把两端分别接在两个不同的Network Namespace中,实现两个原本隔离的Network Namespace的通信。

所以总结起来就是:Network Namespace做了容器和宿主机的网络隔离,Bridge分别在容器和宿主机建立一个网关,然后再用VETH将容器和宿主机两个网络空间连接起来。但这都是在同一个主机上的网络实现,如果想要在多台主机上进行网络就得看看下面介绍的 Kubernetes 网络。

Kubernetes 网络

Kubernetes 为了解决容器的“跨主通信”问题,提出了很多解决方案。常见思路有两种:

  • 直接在宿主机上建立不同宿主机上子网的路由规则;

  • 通过特殊的网络设备封装二层数据帧,根据目标 IP 地址匹配到对应的子网找到对应的宿主机 IP 地址,最后将转发 IP 包,目的宿主机上同样的特殊网络设备完成解封并根据本机路由表转发。

Flannel

大家所熟知的 Flannel 项目是 CoreOS 公司推出的容器网络解决方案。它本身只是一个框架,为开发者提供容器网络功能的是 Flannel 的后端实现。目前有如下三种具体实现:

  • UDP

  • VXLAN

  • host-gw

下面的三层网络指的是七层网络模型中的底部的三层:网络层、数据链路层和物理层。

UDP 模式是最早支持,性能最差,但最容易理解和实现的容器跨主网络方案。Flannel UDP 模式提供的是一个三层的覆盖网络:首先对发出端的IP包进行 UDP 封装,然后在接受端进行解封拿到原始的IP包,进而把这个包转发给目标容器。它相当于在两个容器之间打通一条“隧道”,使得两个容器可以直接使用 IP 通信,而不关心容器和宿主机的分布情况。

如何理解Kubernets网络

因为 Flannel 进行 UDP 封装和解封都是在用户态完成,而在 Linux 系统中上下文切换和用户态操作的代价非常大,这就是它性能不好的主要原因。

VXLAN 即 Virtual Extensible LAN(虚拟可扩展局域网),是 Linux 内核本身就支持的一种网络虚拟化技术。VXLAN 在内核态就完成了上面的封装和解封工作,通过与 UDP 模式类似的“隧道”机制,构建出覆盖网络(Overlay Network),使得连接在这个 VXLAN 二层网络的“主机”可以像在局域网自由通信。

如何理解Kubernets网络

host-gw 模式的工作原理是将每一个 Flannel 子网的下一跳设置为该子网对应的宿主机 IP 地址。

也就是说,这台“主机”(host)会充当这条容器通信路径里的“网关”(Getway)。Flannel host-gw 模式必须要求集群宿主机之间是二层连通的

如何理解Kubernets网络

Calico

Calico 项目提供的网络解决方案与 Flannel Host-gw 模式同理。但是不同于 Flannel 通过 Etcd 和宿主机的 flanneld 来维护路由信息得做法,Calio 项目使用BGP(边界网关协议) 来自动的在整个集群中分发路由消息。它由三部分组成:

Calico 的 CNI 插件:这是 Calico 与 Kubernetes 对接的部分。 Felix:它是一个 DaemonSet,负责在宿主机插入路由规则,以及维护Calico所需的网络设备等。 BIRD:它是 BGP 的客户端,负责在集群里分发路由规则信息。

除了对路由信息的维护方式之外,Calico 项目和 Flannel 的 host-gw 另一个不同是它不会在宿主机上创建任何网桥设备。

如何理解Kubernets网络

CNI(容器网络接口)

CNI)是CNCF旗下的一个项目,由一组用于配置Linux容器的网络接口的规范和库组成,同时还包含了一些插件。CNI仅关心容器创建时的网络分配,和当容器被删除时释放网络资源。其基本思想为: Kubernetes 在启动 Infra 容器之后,就可以直接调用 CNI 网络插件,为这个 Infra 容器的 Network Namespace 配置符合预期的网络栈。

Kubernetes 使用 CNI 接口,维护一个单独的网桥来代替 docker0。这个网桥就叫做 CNI 网桥,它在宿主机上的默认名称是:cni0。以 Flannel 的 VXLAN 模式为例,在 Kubernetes 环境里,它的工作方式没有变化,只是 docker0 网桥替换成了 CNI 网桥。CNI 网桥只是接管所有 CNI 插件负责的,即 Kuberntes 创建的容器(Pod)。

如何理解Kubernets网络

Service

Kubernetes 中 Pod 有生命周期,它的 IP 会随着动态的创建和销毁而动态变化,不能稳定的提供服务。Kubernetes Service 定义这样一种抽象:一个 Pod 的逻辑分组,一种可以访问它们的策略。开发者可以通过一个 Service 的入口地址访问其背后的一组 Pod。一旦 Service 被创建,Kubernetes 就会自动为它分配一个可用的 Cluster IP,在 Service 的整个生命周期中它的 Cluster IP 都不会发生改变。这样就解决了分布式集群的服务发现。

一个典型的 Service 定义如下:

apiVersion: v1kind: Servicemetadata:  name: Nginxspec:  selector:    app: nginx  ports:  - nmae: dafault    protocol: tcp    port: 8000    targetPort: 80

在这个 Service 例子中,笔者使用 selector 字段声明这个 Service 只代理 app=nginx 标签的 pod。这个 Service 的 8000 端口代理 Pod 的 80 端口。

然后定义应用 Delpoyment 如下:

apiVersion: v1kind: Delpoymentmetadata:  name: nginxspec:  selector:    matchLabels:      app: nginx  replicas: 3  template:    meatdata:    lalels:      app: nginx    spec:    containers:    - name: nginx      image: nginx      ports:      - containers: 80        protocol: TCP

被 selector 选中的 Pod,就被称为 Serivce 的 Endpoints,你可以使用 kubectl get ep 查看它们,如下所示:

$ kubectl get endpoints nginxNAME    ENDPOINTS                                      AGEnginx   172.20.1.16:80,172.20.2.22:80,172.20.2.23:80   1m

通过该 Service 的 VIP 10.68.57.93 地址,就可以访问到它所代理的 Pod:

$ kubectl get svc nginxNAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGEnginx   ClusterIP   10.68.57.93   <none>        80/TCP    1m$ curl 10.68.57.93<!DOCTYPE html><html><head><title>Welcome to nginx!</title>......<h2>Welcome to nginx!</h2>......</html>

这个 VIP 地址是 Kubernetes 自动为 Service 分配的。访问 Service 的 VIP 地址和代理的 80 端口,它就为我们返回了默认的 nginx 页面,这种方式称为:Cluster IP 模式的 Service。

集群外访问 Service

Servcie 的访问信息在 kubernates 集群外无效,因为所谓的 Service 的访问接口,实际上是每台宿主机上由 kube-proxy 生成的 iptables 规则,以及 kube-dns 生成的 DNS 记录。

解决外部访问 Kubernetes 集群里创建的 servcie有以下几种方法:

  • nodePort

  • LoadBalancer

NodePort 方法

下面是 NodePort 的例子:

apiVersion: v1kind: Servicemetadata:  name: my-nginx  labels:    run: my-nginxspec:  type: NodePort  ports:  - name: Http    nodePort: 30080    port: 8080    targetPort: 80    protocol: TCP

在这个 Service 定义中,声明它的类型为 type=NodePort。此时在 ports 字段中声明了 Service 的 8080 端口代理 Pod的80端口。

如果你不显示声明 nodePort 字段,Kubernetes 会为你随机分配可用端口来设置代理,这个端口的范围默认为:30000-32767。这里设置为 30080。

这里就可以如此访问这个 service:

<任何一台宿主机 IP 地址>:30080

LoadBalancer

这种方法适用于公有云上的 Kubernetes 服务,通过指定一个 LoadBalancer 类型的 Service 实现。

apiVersion: v1kind: Servicemetadata:  name: example-servicespec:  ports:  - port: 8765    targetPort: 9379  selector:    app: example  type: LoadBalancer

创建 Service 时,你可以选择自动创建云网络负载均衡器。这提供了一个外部可访问的IP地址,只要您的群集在受支持的云环境中运行,就可以将流量发送到群集节点上的正确端口。

Ingress

为代理不同后端 Service 而设置的路由规则集合就是 Kubernetes 里的 Ingress。

举一个例子,这里有一个订阅系统,它的域名是:https://wwww.example.com 。其中 http://www.example.com/book 是订书系统,https://www.example.com/food 是订餐系统。这两个系统分别由 book 和 food 两个 Deployment 来提供服务。

apiVersion: v1kind: IngreSSMetadata:  name: example-ingressspec:  tls:  - hosts:    - www.example.com    secretName: example-secret  rules:  - host: www.example.com    http:      paths:      - path: book        backend:          serviceName: book-svc          servicePort: 80      - path: /food        backend:          serviceName: food-svc          servicePort: 80

这个 yaml 文件值得关注的 rules 字段,它叫作:IngressRules。

IngressRule 的 Key 就是 host,它必须是一个标准域名格式的字符串,不能是 IP 地址。

host 字段定义的值就是 Ingress 的入口,也就是说当用户访问 www.example.com 的时候,实际上访问到的是这个 Ingress 对象。Kubernetes就能根据 IngressRule 进行下一步转发,这里定义两个 path,它们分别对应 book 和 food 这个两个 Deployment 的 Service。

由此不难看出,Ingress 对象其实就是 Kubernetes 项目对“反向代理”的一种抽象。

上述就是小编为大家分享的如何理解Kubernets网络了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何理解Kubernets网络

本文链接: https://lsjlt.com/news/295253.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Kubernets网络
    这期内容当中小编将会给大家带来有关如何理解Kubernets网络,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。不同宿主机上运行的容器并不能通过 IP 相互访问,那么 Kubernetes 是如何实现不同节...
    99+
    2023-06-19
  • 如何理解Kubernetes 网络模型进阶
    本篇文章为大家展示了如何理解Kubernetes 网络模型进阶,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Kubernetes 网络模型来龙去脉容器网络发端于 Docker 的网络。Docker ...
    99+
    2023-06-04
  • 如何理解Python LeNet网络及pytorch实现
    如何理解Python LeNet网络及pytorch实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.LeNet介绍LeNet神经网络由深度学习三巨头之一的Yan...
    99+
    2023-06-21
  • 深入理解Linux网络——内核是如何接收到网络包的
    文章目录 一、相关实际问题二、数据是如何从网卡到协议栈的1、Linux网络收包总览2、Linux启动1)创建ksotfirqd内核线程2)网络子系统初始化3)协议栈注册4)网卡驱动初始化5)网...
    99+
    2023-09-06
    网络 linux tcp/ip 网卡 网络协议
  • win10网络重置没有网络如何解决
    本篇内容主要讲解“win10网络重置没有网络如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win10网络重置没有网络如何解决”吧!win10网络重置没有网络解决方法:按下“Win+X”点...
    99+
    2023-07-01
  • 如何在virtualBox搭建一个本地kubernets集群
    这篇文章给大家分享的是有关如何在virtualBox搭建一个本地kubernets集群的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 虚拟机准备工作1.1 下载centos7的镜像注意centos8不支持ku...
    99+
    2023-06-26
  • 如何理解网络数据包分析工具tcpdump
    如何理解网络数据包分析工具tcpdump,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言      &nb...
    99+
    2024-04-02
  • 如何理解Go语言基础之网络编程
    本篇内容主要讲解“如何理解Go语言基础之网络编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Go语言基础之网络编程”吧!socker编程我们所学的TC...
    99+
    2024-04-02
  • 如何理解NFS网络文件系统服务器
    今天就跟大家聊聊有关如何理解NFS网络文件系统服务器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。NFS网络文件服务器NFS是网络文件系统的简称,主要用在linux与linux之间的...
    99+
    2023-06-13
  • 如何理解网络Fedora gcc编译中的问题
    如何理解网络Fedora gcc编译中的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。全面介绍Fedora gcc编译, 这里我发表一下个人理解,这里将介绍Fedora...
    99+
    2023-06-16
  • 如何理解Socket的低层次Java网络编程
    这篇文章将为大家详细讲解有关如何理解Socket的低层次Java网络编程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Socket的低层次Java网络编程1 Socket通讯网络上的两个程序...
    99+
    2023-06-02
  • win10网络限速如何解除
    要解除Windows 10的网络限速,可以尝试以下方法:1. 检查网络驱动程序更新:打开设备管理器,找到“网络适配器”,展开并右击你...
    99+
    2023-09-01
    win10
  • win7网络受限如何解决
    这篇文章主要介绍了win7网络受限如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7网络受限如何解决文章都会有所收获,下面我们一起来看看吧。win7网络受限解除方法:方法一: 右键点击“我的电脑”,...
    99+
    2023-07-01
  • win11没有网络如何解决
    这篇文章主要介绍“win11没有网络如何解决”,在日常操作中,相信很多人在win11没有网络如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win11没有网络如何解决”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-01
  • win11网络限速如何解除
    本篇内容主要讲解“win11网络限速如何解除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11网络限速如何解除”吧!第一步,按下键盘“Win+R”组合键打开运行。第二步,在其中输入“gpe...
    99+
    2023-07-02
  • C++ 函数在网络编程中如何处理网络协议?
    c++++ 标准库提供以下函数处理网络协议:socket(): 创建新的网络套接字描述符。connect(): 将套接字连接到远程地址和端口。send()/recv(): 发送或接收数据...
    99+
    2024-04-27
    c++ 网络编程 标准库
  • C++ 函数在网络编程中如何处理网络事件?
    c++++ 中使用 select() 函数处理网络事件的方法如下:使用 fd_set 声明文件描述符集合,并初始化它们设置超时时间使用 select() 函数监控文件描述符的事件检查 s...
    99+
    2024-04-27
    c++ 网络编程
  • win10网络重置没有网络适配器如何解决
    这篇文章主要介绍“win10网络重置没有网络适配器如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10网络重置没有网络适配器如何解决”文章能帮助大家解决问题。解决方法:方法一、 使用36...
    99+
    2023-07-01
  • 如何理解Kubernetes以及其网络方案和对比
    如何理解Kubernetes以及其网络方案和对比,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Kubernetes无疑是当前最火热的容器编排工具,网络是kubernetes中非...
    99+
    2023-06-04
  • 如何理解NTP网络时间协议工作过程
    这篇文章给大家介绍如何理解NTP网络时间协议工作过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。网络时间协议(NTP)是RFC 1305定义的时间同步协议。它用于在分布式时间服务器和客户端之间同步时间。 NTP基于U...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作