《Kubernetes权威指南》——网络原理
1 Kubernetes网络模型
基本原则:每个Pod都拥有一个独立IP,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中。
- 基于基本原则,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑容器端口映射到主机端口等问题
- 同一个Pod内部的所有容器共享一个网络堆栈即网络命名空间,Pod内的所有容器的端口是共享的
- Kubernetes对集群网络要求:
- 所有容器都可以在不用NAT的方式下同别的容器通信
- 所有节点都可以在不用NAT的方式下同所有容器通信,反之亦然
- 容器的地址和别人看到的地址是同一个
2 Docker的网络基础
2.1 网络命名空间
- Linux在网络栈中引入网络命名空间(Network Namespace)为了支持网络协议栈的多个实例,处于不同命名空间的网络栈是完全隔离的
- Linux的网络命名空间内可以有自己独立的路由表及独立的Iptables/Netfilter设置来提供转发、NAT及IP包过滤等功能
- 需要纳入命名空间的元素有进程、套接字、网络设备等
2.1.1 网络命名空间的实现
- linux实现网络命名空间的核心是让网络栈的全局变量变成一个Net Namespace变量的成员,然后协议栈的函数调用加入一个Namespace的参数
- 网络空间链表连接所有网络空间,所有网络栈变量都放入到网络空间
- 所有的网络设置都只能属于一个命名空间,通常物理设置只能关联到root这个命名空间
- 网络命名空间代表是一个独立的协议栈,所以他们之间是相互隔离的彼此无法通信协议栈内部看不到对方
2.1.2 网络命名空间的操作
使用iproute2系列配置工具中的ip命令操作
ip netns add <name> #创建一个命名空间
ip netns exec <name> <command> #在命名空间内执行命令
ip netns exec <name> bash #执行多个命令先进入sh
2.2 Veth设备对
Veth设备都是成对出现的,可以实现不同网络命名空间之间进行通信
- 在Veth设置的一端发送数据时它会将数据直接发送到另一端,并触发另一端的接收操作
2.2.1 Veth操作命令
ip link add veth0 type veth peer name veth1 #创建veth设备对
ip link show #查看所有网络接口
ip link set veth1 netns netns1 #将veth1挂载到netns1命名空间下
ip link set dev veth1 up #启动veth1设备
2.2.2 Veth设备对如何查看对端
使用ethtool工具查看
ip netns exec netns1 ethtool -S veth1 #查询netns1下的veth1的对端,看peer_ifindex
ip netns exec netns2 ip link #查看peer_ifindex对应的值
2.3 网桥
- 网桥是一个二层网络设备,可以解析收发报文,读取目标MAC地址信息和自己记录的MAC表结合,来决策报文转发端口
- Linux中多网卡可以通过网桥提供这些设备之间相互转发数据
- 网桥处理转发和丢弃报文外还可以将报文发送到上层(网络层)
2.3.1 Linux网桥的实现
- Linux内核通过一个虚拟网桥设备(Net Device)来实现桥接,其可以绑定若干个以太网接口设备,从而将它们桥接起来
- Net Device可以有一个IP
3 Docker的网络实现
docker的4类网络模式:
1. host
2. container
3. none
4. bridge,默认设置
只介绍bridge模式
- Docker Daemon第一次启动时将创建一个虚拟网桥默认名为docker0,同时给其分配一个子网
- 针对Docker中的容器都会创建一个Veth设备对,一端关联网桥一端使用Linux的网络命名空间映射到容器内的eth0设备,然后从网桥的地址段内给eth0分配一个IP
- 为了让容器跨主机通信就必须在主机的地址上分配端口,然后通过这个端口路由或代理到容器上
4 Kubernetes的网络实现
4.1 容器到容器的通信
- 同一个Pod内的容器共享同一个网络命名空间,直接使用localhost即可
4.2 Pod之间的通信
- 每个Pod都有一个真实的全局IP,每个Node内的不同Pod之间可以直接采用对方Pod的Ip通信
4.2.1 同一Node内Pod通信
- 同一Node内的Pod通过Veth设备对连接到同一个docker0网桥上,Pod的IP也都是该网桥分配的
- Pod内的默认路由都是docker0的地址,所有数据都通过docker0转发
4.2.2 不同Node的Pod通信
- Pod的地址是与docker0在同一个网段内,而docker0网段与宿主机网卡的IP网段完全不同,而通信只能走宿主机的网卡,因此通信必须通过宿主机IP来进行寻址和通信
- Kubernetes会记录所有正在运行Pod的IP分配信息,并将其写入etcd作为Service的Endpoint
- 支持不同Node之间Pod的通信条件:
- 整个Kubernetes集群中Pod的IP不能冲突
- 能将Pod的IP与Node的IP关联起来,通过这个关联实现相互访问
- 解决:
- Kubernetes部署时多docker0的IP地址进行规划保证每个Node上的docker0地址不冲突
- 通信时先找到Node的IP将数据发送到这个网卡上,然后让宿主机将相应数据转到具体docker0上
4.3 Pod到Service的通信
- k8s在创建服务时为服务分配一个虚拟IP,客户端通过该IP访问服务,服务则负责将请求转发到后端Pod上
- Service是通过kube-proxy服务进程实现,该进程在每个Node上均运行可以看作一个透明代理兼负载均衡器
- 对每个TCP类型Service,kube-proxy都会在本地Node上建立一个SocketServer来负责接受请求,然后均匀发送到后端Pod默认采用Round Robin负载均衡算法
- Service的Cluster IP与NodePort等概念是kube-proxy通过Iptables的NAT转换实现,kube-proxy进程动态创建与Service相关的Iptables规则
- kube-proxy通过查询和监听API Server中Service与Endpoints的变化来实现其主要功能,包括为新创建的Service打开一个本地代理对象,接收请求针对针对发生变化的Service列表,kube-proxy会逐个处理,处理流程:
- 如果该Service没设置ClusterIP,则不做处理,否则获取该Service的所有端口定义列表
- 逐个读取端口定义列表,根据端口名、Service名和Namespace对其进行修改
- 更新负载均衡组件中对应Service的转发Service的转发地址列表
- 对于已删除的Service则进行清理
5 开源的网络组件
- Kubernetes的网络模型假定所有Pod都在一个可以直接连通的扁平网络空间,因此需要对网络进行设置
- 目前常见的模型有Flunnel、Open vSwitch及直接路由的方式
《Kubernetes权威指南》——网络原理的更多相关文章
- Kubernetes(k8s)底层网络原理刨析
目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...
- 《Kubernetes权威指南》——组件原理
1 API Server 1.1 提供集群管理的API接口 API Server在kubernetes中的进程名为apiserver,运行在Master节点上 apiserver开放两个端口 本地端口 ...
- 《Kubernetes权威指南》——Kubelet运行机制与安全机制
1 Kubelet运行机制 Kubenetes集群中的每个Node节点都会启动一个Kubelet服务进程用于处理Master下发到该节点的任务,管理Pod及其中的容器 Kubelet进程在API Se ...
- 《Kubernetes权威指南》——入门
1 Hello World 1.1 概述 搭建一个Web留言板应用,采用PHP+Redis. Redis由一个master提供写和两个slave提供读. PHP构成的前端Web层由三个实例构成集群,访 ...
- Kubernetes权威指南学习笔记(一)
https://blog.csdn.net/keysilence1/article/details/70239717 概念 Kubernetes是谷歌严格保密十几年的秘密武器——Borg的一个开源版本 ...
- 《Kubernetes权威指南第2版》学习(二)一个简单的例子
1: 安装VirtualBox, 并下载CentOS-7-x86_64-DVD-1708.iso, 安装centOS7,具体过程可以百度. 2:开启centOS的SSH, 步骤如下: (1) yum ...
- 《Kubernetes权威指南第2版》学习(一) Kubernetes是什么
1.1 Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案.是谷歌的Borg(大规模集群管理系统)的一个开源版本. 其次,如果系统设计遵循了Kubernetes的设计思 ...
- Kubernetes权威指南 第一章:Kubernetes入门
Kubernetes是什么 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ Kubernetes是谷歌十几年大规模容器管理经验的成果 是 ...
- 《Kubernetes权威指南》01_Kubernetes入门——Kubernetes 是什么
01_Kubernetes入门 li {list-style-type:decimal;}.wiz-editor-body ol.wiz-list-level2 > li {list-style ...
随机推荐
- [leetcode]64. Minimum Path Sum最小路径和
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
0x00 前言 Solidity(http://solidity.readthedocs.io/en/v0.4.24/) 是一种用与编写以太坊智能合约的高级语言,语法类似于 JavaScript. S ...
- 3R - 单词数
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就 ...
- leveldb 源码编译 vs版本
为什么要windows版本? 因为方便调试跟进 VS的体验真的很不错. 搜索了一段时间才发现GITHUB有windows版本的leveldb 但是使用VS编译也有不少坑 可以下载网络上的其他朋友的版本 ...
- 【轻松前端之旅】CSS盒子模型
盒子模型,也叫框模型,在CSS里是很重要的概念. 每个元素都可以看做一个盒子.盒子包含四个部分:外边距(margin).边框(border).内边距(padding).元素内容(element con ...
- tensorflow学习之(五)构造简单神经网络 并展示拟合过程
# def 添加层 如何构造神经网络 并展示拟合过程 import tensorflow as tf import numpy as np import matplotlib.pyplot as pl ...
- HTML5 添加新的标签 input属性
<!-- 新增 有语意标签 --> <nav></nav> <!-- 导航标签 --> <seclion></seclion> ...
- hdu-1878(欧拉回路)
题目链接:传送门 思路:就是判断无向图的欧拉回路的两个条件:(1)连通性(2)点的度数是偶数 注意:两个条件一同时满足才行. #include<iostream> #include< ...
- jvm参数与GC
一.JVM的新生代.老年代.与永久代 JVM中的堆,一般分为三大部分:新生代.老年代.永久代: 1.新生代:主要是用来存放新生的对象,一般占据堆的1/3空间.由于频繁创建对象,所以新生代会频繁触发Mi ...
- UVa 11728 Alternate Task (枚举)
题意:给定一个 n,求一个最大正整数 N 使得 N 的所有正因数和等于 n. 析:对于任何数一个 n,它的所有正因子都是大于等于本身的,因为 n 本身就是自己的正因数,这样的就可以直接暴力了,答案肯定 ...