【K8S系列】深入解析k8s网络

本文涉及的产品
云解析 DNS,旗舰版 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【K8S系列】深入解析k8s网络

1 基本介绍

1.1 K8s网络是什么

Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构

在Kubernetes中,每个容器都有自己的IP地址,这些容器组成了Pod,Pod是Kubernetes调度的最小单元。

Kubernetes网络的设计目标是支持多种网络模型,并提供可插拔的网络插件,从而使Kubernetes能够在不同的云和物理环境中运行。

Kubernetes网络通常分为四个层次:

  • 容器网络接口(CNI)
  • Pod网络
  • Service网络
  • Ingress网络

容器网络接口(CNI)层

Kubernetes网络的底层是CNI层,它是一个独立的插件系统,用于为容器分配IP地址、创建网络接口和配置网络环境。

CNI插件可以在Kubernetes的各种云和物理环境中使用,例如AWS、GCP、Azure、OpenStack、Bare metal等。

这一层解决的是—Docker容器和Docker容器之间的网络


Pod是最小的可调度单元,通常包含一个或多个容器。Pod内的容器可以通过localhost(127.0.0.1)进行通信,这种通信方式不需要网络环境的支持,因此可以实现较低的延迟和较高的吞吐量


在Pod内部,容器之间可以通过共享网络命名空间进行通信。所有容器共享Pod的IP地址和网络命名空间,它们可以使用localhost或Pod的IP地址进行通信。可以通过在Pod的配置文件中指定容器之间的端口映射来定义容器之间的通信方式。


例如,在一个Pod中有两个容器A和B,A需要向B发送HTTP请求。可以在Pod的配置文件中为容器A和容器B分别指定端口号,然后在容器A中使用localhost和容器B的端口号进行通信。容器B在接收到请求后可以返回HTTP响应。


Pod网络层

Pod网络层是容器的网络层它为Pod提供了单独的IP地址和网络空间。Pod网络层可以使用多种网络模型,如host模式、overlay模式、macvlan模式等。

这一层解决的是—Pod与Pod之间的网络通讯


Pod间通信:

Pod是Kubernetes中最小的部署单元,每个Pod都有一个唯一的IP地址,Pod内的容器共享该IP地址和网络命名空间。

Pod间通信可以使用多种技术,如Kubernetes默认的CNI插件、Flannel、Calico、Weave Net等。


Service网络层

Service网络层是Kubernetes网络的中间层,它定义了Service之间的网络通信,为Service提供了一个虚拟IP地址,将请求路由到后端Pod的实际IP地址。

Service网络层可以使用ClusterIP、NodePort、LoadBalancer等多种类型。

这一层解决的是—Pod与Service之间的网络


Ingress网络层

Ingress网络层是Kubernetes网络的顶层,它允许外部流量进入Kubernetes集群,并将请求路由到不同的Service。

Ingress网络层可以使用多种Ingress控制器,如Nginx、Traefik、HAProxy等。

这一层解决的是—Internet与Service之间的网络


2 k8s网络模型

Kubernetes网络模型是一个为容器提供网络连接的框架,它允许容器在Kubernetes集群内和外部进行通信。

Kubernetes网络模型包括以下几个方面:

  1. Pod间通信Pod是Kubernetes中最小的部署单元,每个Pod都有一个唯一的IP地址,Pod内的容器共享该IP地址和网络命名空间。Pod间通信可以使用多种技术,如Kubernetes默认的CNI插件、Flannel、Calico、Weave Net等
  2. Pod与Service通信:Service是Kubernetes中用于访问Pod的一种抽象机制,它为一组Pod提供一个统一的访问入口,并分发请求到后端的Pod。Pod与Service之间的通信可以直接使用Service的IP地址或DNS名称,Kubernetes会自动将请求路由到后端的Pod。
  3. Pod与Node通信:Kubernetes中的Pod可以与它所在的节点进行通信,这种通信方式通常用于容器化应用需要访问宿主机上的资源,如宿主机上的文件、设备等。Pod与Node之间的通信可以通过节点IP地址或本地环回地址(127.0.0.1)进行。
  4. Service与外部网络通信:Kubernetes中的Service可以暴露给外部网络访问,这可以通过Ingress、NodePort或LoadBalancer等机制实现Ingress是一种Kubernetes中的资源对象用于将外部HTTP/HTTPS流量路由到Service中,它可以提供负载均衡、SSL终止等功能。NodePort是一种Service类型,它将Service的端口映射到每个节点的固定端口上,从而允许外部网络通过节点IP地址和该端口访问Service。LoadBalancer是一种Service类型,它使用云提供商的负载均衡器将外部网络流量路由到Service中。


Kubernetes网络模型提供了一种灵活、可扩展、高可用、安全的网络解决方案,使得容器之间能够相互通信以及与外界进行通信,为容器化应用的部署和运行提供了强大的支持。


网络方案

Kubernetes网络模型是基于容器、Pod、Service和Ingress等抽象概念构建的,它提供了以下特性:

  1. 容器间通信容器可以直接通过Pod网络进行通信,无需进行端口映射或NAT
  2. Service发现:Service网络层为Service提供了一个虚拟IP地址,使得其他容器可以通过Service名称和端口号访问该服务。
  3. 负载均衡:Kubernetes支持多种负载均衡算法,如Round Robin、IP Hash、Least Connection等。
  4. 网络隔离:Kubernetes支持通过网络策略实现容器之间的网络隔离,从而保护容器的安全性。
  5. 外部流量管理:Ingress网络层提供了外部流量管理机制,允许外部请求进入Kubernetes集群,并将请求路由到不同的Service。


Kubernetes网络架构和网络模型提供了高度可扩展性、可插拔性和高可用性的网络解决方案,使得开发人员可以更加轻松地部署和管理容器化应用程序。

k8s网络插件

Kubernetes 是一个强大的容器编排平台,它提供了多种网络插件,用于在集群中实现容器之间和容器与外部网络的通信。以下是几种常用的 Kubernetes 网络插件:

  1. Kube-router
  2. Flannel
  3. Calico
  4. Weave Net
  5. Cilium

1 Kube-router

Kube-router 是一种基于 BGP 协议的容器网络方案它可以在集群中创建一个虚拟网络,并使用 BGP 协议来管理容器之间的通信。

具体来说,Kube-router 会为每个容器分配一个唯一的 IP 地址,并使用 BGP 协议将这些 IP 地址添加到路由表中。

Kube-router 还支持多种网络拓扑结构,包括扁平网络、网格网络和点对点网络等。

使用示例

以下是使用 Kube-router 网络插件的示例代码,

演示前提:已经安装了 Kubernetes 集群和 Kube-router 网络插件:

创建一个 Kubernetes Deployment

apiVersion: apps/v1
kind: Deployment #资源类型为Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

创建一个 Kubernetes Service

apiVersion: v1
kind: Service #资源类型为service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
  type: ClusterIP

创建一个 Kubernetes Pod,使用 Kube-router 网络插件

apiVersion: v1
kind: Pod  #资源类型为pod
metadata:
  name: kube-router-pod
spec:
  containers:
  - name: kube-router-container
    image: kube-router/kube-router:v1.3
    command:
    - kube-router
    - run
    args:
    - --run-router=false
    - --run-firewall=false
    - --run-service-proxy=false
    - --run-egress=false
    - --enable-cni=true
    - --cni-bin-dir=/opt/cni/bin
    - --cni-conf-dir=/etc/cni/net.d
    - --cni-network-config='{
        "cniVersion": "0.3.1",
        "name": "kube-router",
        "type": "kube-router"
      }'
    volumeMounts:
    - name: cni-bin
      mountPath: /opt/cni/bin
    - name: cni-conf
      mountPath: /etc/cni/net.d
  volumes:
  - name: cni-bin
    hostPath:
      path: /opt/cni/bin
  - name: cni-conf
    hostPath:
      path: /etc/cni/net.d

在该示例中,

创建了一个 Pod,并使用 Kube-router 网络插件来管理容器的网络配置。

具体来说,是在容器中启动了 Kube-router 进程,并通过命令行参数来配置插件的运行模式和网络配置。

还使用了 hostPath 卷来挂载 CNI 插件所需的文件和配置。


需要注意的是,在使用 Kube-router 网络插件时,需要根据不同的网络需求和环境来配置参数和选项。具体的配置方法可以参考 Kube-router 的官方文档和示例代码。

2 Flannel

Flannel 是一种基于 VXLAN 或者 UDP 的虚拟网络方案,它通过在每个节点上创建一个虚拟网络来实现容器之间的通信。

具体来说,Flannel 会为每个节点分配一个唯一的 IP 地址段,并将每个容器的 IP 地址映射到这个 IP 地址段中。

Flannel 需要依赖 etcd 或者其他分布式键值存储系统来存储网络配置信息

使用示例

以下是使用 Flannel 网络插件的示例代码,

演示前提:已经安装了 Kubernetes 集群和 Flannel 网络插件:

创建一个 Kubernetes Deployment

apiVersion: apps/v1
kind: Deployment #资源类型
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

创建一个 Kubernetes Service

apiVersion: v1
kind: Service #资源类型
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
  type: ClusterIP

创建一个 Kubernetes Pod,使用 Flannel 网络插件

apiVersion: v1
kind: Pod #资源类型
metadata:
  name: flannel-pod
spec:
  containers:
  - name: flannel-container
    image: quay.io/coreos/flannel:v0.14.0
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=eth0
    securityContext:
      privileged: true
    volumeMounts:
    - name: flannel-cfg
      mountPath: /etc/kube-flannel/
  volumes:
  - name: flannel-cfg
    configMap:
      name: kube-flannel-cfg #挂载

在该示例中,创建了一个 Pod,并使用 Flannel 网络插件来管理容器的网络配置。另外,在容器中启动了 Flannel 进程,并通过命令行参数来配置插件的运行模式和网络配置。

还使用了 configMap 卷来挂载 Flannel 的配置文件。

需要注意的是,在使用 Flannel 网络插件时,需要根据不同的网络需求和环境来配置参数和选项

具体的配置方法可以参考 Flannel 的官方文档和示例代码。


3 Calico

Calico 是一种基于 BGP 协议的容器网络方案,它使用 IP 路由表来管理容器之间的通信。具体来说,Calico 会为每个容器分配一个唯一的 IP 地址,并使用 BGP 协议将这些 IP 地址添加到路由表中。Calico 还提供了强大的网络安全机制,可以保护容器网络的安全性。


4 Weave Net

Weave Net 是一种基于 VXLAN 或者 UDP 的虚拟网络方案,它可以在集群中创建一个虚拟网络,从而实现容器之间的通信。具体来说,Weave Net 会为每个容器分配一个唯一的 IP 地址,并使用 VXLAN 或者 UDP 来在不同节点之间传输数据。Weave Net 还支持多种网络拓扑结构,包括扁平网络、网格网络和点对点网络等。


5 Cilium

Cilium 是一种基于 eBPF 技术的容器网络方案,它可以在内核层面拦截和管理容器之间的通信。具体来说,Cilium 会在每个节点上创建一个 eBPF 过滤器,用于监控和管理容器之间的数据流。Cilium 还支持多种网络层协议和应用层协议,并提供了强大的网络安全机制,可以保护容器网络的安全性。

总结

Kubernetes 提供了多种网络插件,可以根据不同的网络需求和环境来选择适合的网络方案。需要注意的是,在进行网络插件的选择和部署时,需要考虑网络的可靠性、性能和安全性等因素。

今天就到这里了,后面详细介绍:

K8s网络问题解决方案

  • 网络故障排除
  • 网络性能优化
  • 网络安全
  • 实战案例

投票

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
16天前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
174 89
|
4天前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
21 11
|
23天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
96 11
|
2月前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
2月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
77 2
|
2月前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
121 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析