在之前文章中我们介绍了基于iptable方式实现的k8s集群中cluster ip类型和node port类型service的负载均衡。 要实现基于ipvs的k8s网络负载均衡需要如下: Linux内核高于2.4.x,参考如下: https://en.wikipedia.org/wiki/IP_Virtual_Server ? 我们这里是介绍cluster ip类型的service,所以我们基于以前文章里安装的应用,显示k8s集群中的cluster ip: kubectl get service --all-namespaces 对于k8s集群的ipvs负载均衡来说,其核心工作就是在INPUT chain,采用NAT模式(http://www.linuxvirtualserver.org/VS-NAT.html,当然ipvs不仅仅只有 在host network namespace中创建网络设备kube-ipvs0,并且绑定所有cluster ip,这样从pod发出的数据包目标ip为cluster ip,有kube-ipvs0网络设备对应
: "1374279324" selfLink: /api/v1/namespaces/default/secrets/myregistrykey uid: 78f6a423-78b9-11e7-
一、背景介绍: 对于K8S里面容器之间的通讯基本上面可以分为三种类型: 1. POD里面不同容器之间的通讯: 因为同一个Pod里面的不同容器之间是共享同一个POD里面的网络资源,所以POD里容器之间的通讯基本上就是IPC之间的通讯方式,这个比较简单,不做详细介绍。 二、基础知识介绍: 网桥(Bridge): 在 Linux 中,能够起到虚拟交换机作用的网络设备,是一个工作在数据链路层(Data Link)的设备,主要功能是根据 MAC 地址学习来将数据包转发到网桥的不同端口 三、通讯过程介绍: 容器1的IP1访问容器2的IP2的交互过程如下所示: 1.在容器1中的路由规则里面查找IP2的地址,发现是是外部网络就会直接走容器1里面的eth0网卡(备注:走网卡的话,就是二层网路 从设备会被“剥夺”调用网络协议栈处理数据包的资格,从而“降级”成为网桥上的一个端口。
一、前言 k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求: 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信 二、容器和容器之间的网络 ? image.png 在k8s中每个Pod中管理着一组Docker容器,这些Docker容器共享同一个网络命名空间。 对于如何来配置网络,k8s在网络这块自身并没有实现网络规划的具体逻辑,而是制定了一套CNI(Container Network Interface)接口规范,开放给社区来实现。 5.2.3 第七层流量入口:Ingress Controller 这是一个与上面提到的两种方式完全不同的机制,通过一个公开的ip地址来公开多个服务,第7层网络流量入口是在网络堆栈的HTTP / HTTPS image.png 第7层负载均衡器的一个好处是它们具有HTTP感知能力,因此它们了解URL和路径。 这允许您按URL路径细分服务流量。
K8s网络模型 K8s术语 K8S 是一个用于容器集群的分布式系统架构。 K8s网络 K8s网络包括CNI、Service、Ingress、DNS 在K8s网络模型中,每个节点上的容器都有自己独立的IP段,节点之间的IP段不能重复,而节点也需要具备路由能力,使从本节点Pod里出来的流量可以根据目的 K8s主机内网络模型 K8s采用的是veth pair+bridge的模式,veth pair将容器与主机的网络协议栈连接起来,可以使pod之间通信。 kubectl get endpoints // 获取endpoints列表 1 7层负载均衡K8s Ingress 四层负载均衡主要是通过修改目的地址,在根据负载均衡设备选择后端服务器的规则之间与该服务器建立 K8s Ingress是指授权入站连接到集群内服务的规则集合,Ingress的作用是在边界路由处开个口子,是建立在service之上的7层访问入口,它支持通过URL的方式将service暴露到K8s集群外
Kubernetes; 网络想做统一管理,k8s集群运行在OpenStack VM下, 如何做到更深层面的网络打通,典型的原因有: 1、 VM防arp欺骗,默认OpenStack虚拟机端口都开启了此功能 k8s集群,又跑了一层overlay网络,网络开销又增大了; 可选方案 k8s网络使用underlay网络 对现有应用需大量改造,应用内部大量使用内部service机制来调用其它服务,不兼容旧模型,pod 使用的是underlay网络,性能卓越; k8s网络使用多种cni k8s node运行ipvlan或macvlan+ptp的cni, node节点同时加载两个cni插件,ptp cni的作用是创建一对 适用于OpenStack和k8s集群是独立的环境,相当于由OpenStack接管service和NetworkPolicy,OpenStack实现变复杂; 最终选择k8s网络使用多种cni方案,基于保留 post/6844903801057443853 · 完善cni的ipam方案: https://jeremyxu2010.github.io/2019/07/%E5%AE%8C%E5%96%84cni%E7%
完整系列k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装1k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装2k8s系列(2)-Servicek8s系列(3)-StatefulSet 的MongoDB实战k8s系列(4)-MongoDB数据持久化k8s系列(5)-Configmap和Secretk8s系列(6)-Helmk8s系列(7)-命名空间k8s系列(8)-Ingressk8s
centos/docker-ce.repo 3、安装docker sudo yum install -y docker-ce docker-ce-cli containerd.io #以下是在安装k8s \ --kubernetes-version v1.20.9 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=10.244.0.0/16 #所有网络范围不重叠 running the following as root: kubeadm join cluster-endpoint:6443 --token hums8f.vyx71prsg74ofce7 docker ps === kubectl get pods -A # 运行中的应用在docker里面叫容器,在k8s里面叫Pod kubectl get pods -A 3、根据提示继续 1、 sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf 2、安装网络组件
在上一篇文章中我们概括了k8s集群网络大致包含哪些方面,包括服务在网络中的负载均衡方式(iptable和ipvs),以及underlay和overlay的组网。 在这里我们介绍宿主内的容器网络,当然我们还是以docker环境为例,介绍docker宿主环境中的容器网络。 Linux Network Namespace: 一提到linux网络,本质上就是由一系列组件组成,从而共同协作完成网络功能,一般这些组件包括: linux网络设备:例如network interface 这些设备可以完成网络数据包的收发,以及提供额外的修改数据包等功能。 下图用来表述宿主环境中的容器网络: ?
内容来源:2018 年 1 月 10 日,灵雀云k8s首席专家刘梦馨在“云原生技术沙龙-北京站”进行《K8s高级网络实践》演讲分享。 阅读字数:2418 | 7分钟阅读 摘要 CNI 作为 CNCF 的项目提供了构建容器网络的接口和类库,可以方便 kubernetes 扩展使用不同的网络模型,这次会介绍一下 CNI 的工作方式以及如何进行开发 另外每台Pod的网络路由和DNS都可以自行设置。 DHCP的随机分配模式在生产环境中很少得到应用,和容器网络也很难结合起来;host-local会限定每台机器的固定网络范围,增减机器的时候重新分配IP很困难。 未来我们可能会做一些更灵活的网络,通过插件在容器的生命周期内改变网络配置,包括固定MAC、动态路由、dns。另外还想要和现有系统解耦以及支持更多的网络模式。 以上为今天的全部分享内容,谢谢大家!
基本介绍 在实际工作中,我们经常会遇到一些疑似网络方面的故障问题,从而需要对 Kubernetes 集群中的 Pod 进行网络调试。 但是由于最小化原则,Pod 的容器镜像中通常并不会安装 ping、curl、telnet、tcpdump 等调试工具,或者在 Pod 容器中可以临时安装工具、但是效率不高,都会给 Pod 网络调试带来困难 针对上述实际场景,笔者将在本文介绍一种 Pod 网络调试方法,以灵活应对网络调试需求。 Pod 网络调试 1、调试工具 nsenter 是 Linux 操作系统的一种命令行工具,允许用户进入指定进程的某个命名空间,并在该命名空间下灵活使用主机的命令行工具、执行特权操作等。 由此可见,我们可以通过 nsenter 进入 Pod 中容器(进程)的网络命名空间,利用 Node 节点已有的命令行工具实现对 Pod 进行网络调试。
一 Kubernetes网络实现 1.1 Kubernetes网络优势 在实际的业务场景中,业务组件之间的关系十分复杂,微服务的理念更是让应用部署的粒度更加细小和灵活。 二 Kubernetes网络通信 2.1 容器之间通信 同一个Pod内的容器(Pod内的容器是不会跨宿主机的)共享同一个网络命名空间,共享同一个Linux协议栈。 在Kubernetes使用如下方式利用Docker的网络模型: 如上图所示,在Node1上运行着一个Pod实例,且运行着容器1和容器2。 其实,这和传统的一组普通程序运行的环境是完全一样的,传统程序不需要针对网络做特别的修改就可以移植了,它们之间的互相访问只需要使用localhost就可以。 由于Kubernetes的网络对Pod的地址是平面的和直达的,所以这些Pod的IP规划也很重要,若需要在整个集群中进行寻址,必须保证IP不能有冲突。
1.2 网络策略配置 网络策略的设置主要用于对目标Pod的网络访问进行限制,在默认情况下对所有Pod都是允许访问的,在设置了指向Pod的Network Policy网络策略之后,访问Pod将会被限制。 kind: NetworkPolicy 3 metadata: 4 name: test-network-policy 5 namespace: default 6 spec: 7 v1 2 kind: NetworkPolicy 3 metadata: 4 name: default-deny 5 spec: 6 podSelector: {} 7 v1 2 kind: NetworkPolicy 3 metadata: 4 name: default-deny 5 spec: 6 podSelector: {} 7 v1 2 kind: NetworkPolicy 3 metadata: 4 name: default-deny 5 spec: 6 podSelector: {} 7
在这里我们主要介绍集群中的网络通讯,在以前文章中介绍过,对于容器之间的网络通讯基本分为两种,underlay方式和overlay方式。 我们在之前文章里采用的是基于flannel的underlay网络方式,所以这里主要介绍flannel underlay网络,以之前文章中安装的nginx-app为例: nginx-app的service 弦外之音,原始pod的host必须和目标pod的host在同一个二层网络里,因为只有这样才可以下一跳路由可达。 当然,这个也是flannel的underlay网络host gw方式的限制,既要求所有的k8s worker node节点都在同一个二层网络里(也可以认为是在同一个ip子网里)。 要求所有的worker node都在同一个二层网络里,来完成目标pod所在host的下一跳路由。
其实K8S确实是按照这个思路来玩的,不过这里引入了一个新概念Overlay Network(覆盖网络):通过软件构建一个覆盖在已有宿主机网络之上的、可以把所有容器连通在一起的虚拟网络。 二、通讯过程介绍 K8S解决容器间的网络通讯方案,采用的是CoreOS公司提供的Flannel项目,该项目的实现方式有下面三种,我们会一一介绍。 1. 设计思想是:在现有的三层网络之上,“覆盖”一层虚拟的、由内核 VXLAN 模块负责维护的二层网络,使得连接在这个 VXLAN 二层网络上的“主机”(虚拟机或者容器都可以)之间,可以像在同一个局域网(LAN 3.CNI插件 K8S里面的网络模型与2中介绍的原理基本一致,只不过用cni0网桥替代了docker0网桥,详细交互过程不在介绍,如下图所示: CNI 的设计思想:Kubernetes 在启动 Infra 容器之后,就可以直接调用 CNI 网络插件,为这个 Infra 容器的 Network Namespace,配置符合预期的网络栈。
今天在一台PC上安装了CentOS 7,当时选择了最小安装模式,安装完成后马上用ifconfig查看本机的ip地址(局域网已经有DHCP),发现报错,提示ifconfig命令没找到。 IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=enp2s0 UUID=5b0a7d76 IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=enp2s0 UUID=5b0a7d76 另外,如果以ifconfig eth0来设置或者是修改了网络接口后,就无法再以ifdown eth0的方式来关闭了。 因为ifdown会分析比较目前的网络参数与ifcfg-eth0是否相符,不符的话,就会放弃这次操作。
CentOS7下打通调试PC到K8s Pod之间网络的实践过程 以CentOS7服务器为例 1、快速安装包直接解压安装 tar -zxvf openvpn_install.tar.gz (图片可点击放大查看
在这里我们主要结合实际例子,来看一下宿主环境中的容器网络。 image),而k8s中这个基础image的container和我们应用程序的image的container是共用同一个network namespace的。 对于10.1.27.0/24网络地址空间的访问都是直连访问,不需要下一跳ip地址。 route -n ? 根据以上信息总结docker宿主中的网络: 宿主中容器的网络地址空间一般为x.x.x.0/24,每一个container属于一个独立的network namespace。 container到容器的网络地址空间(x.x.x.0/24)的访问方式为直连,不需要下一跳ip。
一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。 通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker正是利用了网络的命名空间特性,实现了不同容器之间的网络隔离。 # ip link set veth0 netns ns0 6 [root@k8smaster01 ~]# ip link set veth1 netns ns1 #veth移入命名空间 7 add tap4 type veth peer name tap4_peer 5 #创建veth pair 6 [root@k8smaster01 ~]# ip netns add ns1 7 提示:更多iptables知识参考:https://wiki.archlinux.org/index.php/Iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87
一 Kubernetes网络模型概述 1.1 Kubernetes网络模型 二 Docker网络基础 2.1 网络命名空间 2.2 一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。 veth0 netns ns0 6 [root@k8smaster01 ~]# ip link set veth1 netns ns1 #veth移入命名空间 7 type veth peer name tap4_pee 5 #创建veth pai 6 [root@k8smaster01 ~]# ip netns add ns1 7 提示:更多iptables知识参考:https://wiki.archlinux.org/index.php/Iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87