tnblog
首页
视频
资源
登录

K8s 网络(笔记)

7596人阅读 2020/7/14 17:13 总访问:3475894 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes

K8s 网络(笔记)


K8s 网络

  • Docker容器网络回顾
  • K8s CNI
  • Flannel 网络插件跨node的 pod to pod
  • Cluster Service是什么?
  • Kube Proxy起了什么作用

Docker 容器的网络模型

Docker 容器网络的原始模型主要有三种:Bridge(桥接)、Host(主机)以及Container(容器)。


Host(主机)

设置容器共享使用节点主机的网络命名空间。
(网络命名空间 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。)

Bridge(桥接)

Bridge 是借助于虚拟网桥设备建立的容器网络连接
(是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP,MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。)

Container(容器)

多个容器共享同一个网络名称空间,从而彼此之间能够以本地通信的方式建立连接


在Docker守护进程首次启动时,它会在当前节点上创建一个名为docker0的桥设备,并默认配置其使用 172.17.0.0/16 网络,该网络是 Bridge 模型的一种实现,也是创建 Docker 容器时默认使用的网络模型。

veth-pair (网络对)

veth-pair 一个设备收到协议栈的数据发送请求后,会将数据发送到另外一个设备上去。一端挂在docker()上,另一端挂在容器上。相当于电灯(主机)与插座(容器)之间的电线。

安装网桥管理工具

  1. yum install bridge-utils
  2. yum install tcpdump

动手实践网络命名空间

创建网络namespace

  1. ip netns add ns2

创建一对veth pair

  1. ip link add A type veth peer name B

添加到docker0 bridge

  1. brctl addif docker0 A

启用A veth

  1. ip link set A up

将B接口放到ns2

  1. ip link set B netns ns2

命名为eth0

  1. ip link exec ns2 ip link set dev B name eth0

开启接口2

  1. ip netns exec ns2 ip link set eth0 up

配置一个可用ip

  1. ip netns exec ns2 ip addr add 172.17.0.5/16 dev eth0

配置默认网关

  1. ip netns exec ns2 ip route add default via 172.17.0.1

在某个命名空间下执行命令

  1. ip netns exec ns2 ifconfig

在两个容器内分别查看他们的ifindex

  1. cat /sys/class/net/eth0/ifindex

对veth 进行网络抓包

  1. tcpdump -nnt -i veth645cee7

Netfilter & iptables

为了更好地理解K8S中的Service,需要理解Linux网络中的IpTables和 Netfilter


Netfilter-iptables由两部分组成,一部分是Netfilter的”钩子”,另一部分则是知道这些钩子函数如何工作的一套规则—这些规则存储在被称为iptables的数据结构之中。钩子函数通过访问iptables来判断应该返回什么值给Netfilter框架。


iptables命令 是netfilter项目的一部分。通过iptables命令配置,内核空间的netfilter来执行对网络的响应/处理/转发等处理。


Netfilter是在Linux内核中的一个软件框架,用于管理网络数据包。不仅具有网络地址转换的功能,也具备数据包内容修改、以及数据包过滤等防火墙功能。
iptables命令
https://wangchujiang.com/linux-command/c/iptables.html
iptables图文详解
https://www.ylkb.net/2017/intro-iptables.html
https://www.zsythink.net/archives/1199
深入理解netfilter and iptables
https://arthurchiao.github.io/blog/deep-dive-into-iptables-and-netfilter-arch-zh/

Kube-proxy(userspace)

kube-proxy会监控apiserver修改的Pod的IP变化,然后 kube-proxy 会把新的地址更新到应用中。所有访问 VIP 的网络在 iptables的影响下,直接路由到 kube-proxy,再由 kube-proxy 把请求转发到不同的 Pod 下进行处理。

Kube-proxy(iptables)

kube-proxy这里相当于异步了,起到监控 apiserver 修改的Pod的IP变化以及更新到 iptables 的作用。当客户端访问 vIP 时,iptables 可以检测到您的网络包,然后通过Service直接转发到随机的Pod下面进行处理。虽然通过各个node节点上的iptables规则来实现service的负载均衡,但是随着 service 数量的增大,iptables 模式由于线性查找匹配、全量更新等特点,其性能会显著下降。性能对比如下:

Kube-proxy(ipvs)

kube-proxy 的用法是一种 0(n) 算法,其中的 n 随集群规模同步增长,这里的集群规模,更明确的说就是服务和后端 Pod 的数量。


IPVS 模式下, kube-proxy 使用 IPVS 负载均衡代替了 iptable。这种模式同样有效,IPVS 的设计就是用来为大量服务进行负载均衡的,它有一套优化过的 API,使用优化的查找算法,而不是简单的从列表中查找规则。 kube-proxyIPVS 模式下,其连接过程的复杂度为 0(1)。其中算法包括了:
1.轮询
2.最小连接数
3.源哈希
4.目标哈希
5.最小延迟
从下面来看,随着服务的数量越多,平均响应时间的就越来越突出,在到 10000 个服务数量的时候 IPVSiptables 相应时间上快了一半

Service DNS


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

K8s编写yaml文件的一些小问题

Yaml文件编写的小毛病kubenetes yaml 随在编写yaml文件中难免会出现一些磕磕碰碰的问题 建议大家去这个网站编写 yaml 文...

初探K8s

概念补充Deployment 是在 Pod 这个抽象上更为上层的一个抽象层,它可以定义一组 Pod 的副本数量,以及这个 Pod 的版本。一...

K8s 结合 Service 与 Deployment 部署容器

前言最近看到了学习k8s的网站,在文章末尾分享给大家,所以我最近的教程也会根据上面的课程来进行一些总结Service:暴露容...

K8s理论整理(持续更新)

整理一GOKubernetes 的工作节点负责运行应用程序 Pod 等工作负载;还可以运行网络或存储等扩展功能;每个节点上都运行了 ku...

K8s详解基本对象

k8s详解基本对象[TOC] 参考yaml代码如下apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo names...

.netcore 通过Flurl验证K8s内部访问与获取环境变量

.netcore验证k8s内部访问与获取环境变量[TOC] 创建k8s-name项目 项目结构如下 实验过程 st=>start: k8s-demo项...

.netcore 通过Flurl验证K8s内部访问与获取环境变量 (二)

.netcore验证k8s内部访问与获取环境变量 (二)[TOC] 修改k8s-name项目 NameController.cs [ApiController] ...

Mysql K8s部署Volume(hostPath)

Mysql K8s部署Volume[TOC] Mysql 与 Yaml 稍作修改这里提供的是官网的链接:https://kubernetes.io/docs/tasks/run-a...

K8s ConfigMap 配置中心

k8s ConfigMap 配置中心[TOC] ConfigMap 简介 ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用...

K8s Deployment中Rollout与Rollback使用与滚动更新

k8s Deployment中Rollout与Rollback使用[TOC] Rollout 简介 Deployment 的 rollout 当且仅当 Deployment 的 pod temp...

kubectl proxy 让外部网络访问K8s service的ClusterIP

kubectl proxy 让外部网络访问K8S service的ClusterIP[TOC] 使用kubectl proxy命令就可以使API server监听在本地的800...

Jenkins在K8s中的安装

Jenkins在k8s中的安装[TOC] k8s部署Jenkins.yaml--- apiVersion: apps/v1 kind: Deployment #设置资源的类型为Deploym...

Centos7安装K8s(基于kubeadm)

Centos7安装k8s(基于kubeadm)[TOC] 下载相关包 链接:https://pan.baidu.com/s/1H9MuZsf28f_3uyVHBUS8jQ提取码:w9tv ...

Docker和K8s的区别与介绍

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云计算技术服务。...

如何把阿里云的主机加入到腾讯云的K8s节点中,或者如何把外网的服务器用到自建的K8s节点

如何把阿里云的主机加入到腾讯云的k8s节点中 考虑使用iptables转换了下就好了
这一世以无限游戏为使命!
排名
2
文章
636
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术