k8s
  • Initial page
  • 序言
  • 前言
    • 发展历史
    • CNCF - 云原生计算基金会简介
    • Kubernetes与云原生应用的概念
  • 概念与原理
    • 基本概念总结
    • 开放接口
      • CRI - Container Runtime Interface
      • CNI - Container Network Interface
      • CSI - Container Storage Interface
    • 核心概念与原理
      • Kubernetes简介
      • Kubernetes架构与原理
      • 核心组件
      • 设计理念
      • 核心组件原理
        • etcd概念与原理
          • Etcd基于RAFT的一致性
          • Etcd v2 与 v3存储
        • kube-apiserver
        • kube-scheduler
        • kube-Controller Manager
        • Kubelet
        • kubectl常用命令
      • kubectl
      • kube-proxy
      • IPVS负载均衡
      • kube-dns
      • Federation-集群联邦
      • kubeadm
    • 资源对象与基本概念解析
    • 资源对象
      • Pod
        • Pod概述
        • Pod解析
        • Pod 的生命周期
        • 探针
        • Init 容器
        • Pause容器
        • Pod 安全策略
        • Pod hook
        • Pod Preset
        • pod其他设置
        • Pod中断与PDB
    • Kubernetes中的网络
      • 图解Kubernetes网络(一)
      • 图解Kubernetes网络(二)
      • 图解Kubernetes网络(三)
      • calico
      • flannel
    • 转发K8S后端服务的四种方式
    • 集群资源对象
      • Node
      • Namespace
      • Label
      • Annotation
      • Taint和Toleration(污点和容忍
      • 垃圾收集
      • Autoscaling
      • Horizontal Pod Autoscaling
        • Metrics-Server
        • Heapster
      • ReplicationController和ReplicaSet
    • 控制器资源对象
      • CronJob
      • Job
      • DaemonSet
      • Deployment
      • StatefulSet
    • 服务发现-资源对象
      • DNS原理讲解
      • Ingress 选型
      • Service
      • Ingress
    • 存储对象
      • ConfigMap
      • Volume
      • Persistent Volume(持久化卷)
      • StorageClass
      • 本地持久化存储
      • Secret
    • 策略对象
      • Resource Quota
      • SecurityContext
    • 身份对象
      • 认证
      • Service Account
      • RBAC——基于角色的访问控制
      • 准入控制
      • Network Policy
    • 资源调度
      • QoS(服务质量等级)
  • 插件扩展
    • Kubernetes的CI/CD
    • Dashboard
    • CoreDNS
    • 监控
      • 概述
      • 第1章 采集
        • Probes
        • Docker Stats
        • cAdvisor
        • Heapster
          • HPA
        • metrics-server
        • custom metrics自定义指标
        • kube-state-metrics
        • node-exporter
        • Prometheus
          • go 自定义metric
          • 本地存储
          • Prometheus概述
          • Prometheus基本架构
          • Prometheus部署方案
          • Prometheus的配置与服务发现
          • PromQL查询解析
          • Prometheus数据可视化
          • Prometheus存储机制
        • Sysdig
        • Untitled
      • 自定义监控
      • Custom-Metrics及Prometheus监控系统
      • grafana各种类型监控-实用
    • 日志
    • 存储
      • Kubernetes Ceph 工作原理详解
    • Metrics
    • GPU
    • Cluster AutoScaler
    • CI/CD
      • 基于DOCKER的CI工具—DRONE
      • DRONE安装指南
      • 如何使用DRONE
      • Drone
      • Jenkins
        • jenkins 集成 keycloak 认证
    • 50个免费的Kubernetes工具盘点
      • Kube集群部署工具
      • 监控工具
      • 测试工具
      • 安全工具
      • 实用的CLI工具
      • 开发工具
      • 无服务器/函数工具
      • 原生服务发现
      • 原生可视化与控制
    • Untitled
  • 领域应用
    • Istio
      • Helm安装
      • 安装并试用Istio service mesh
      • 示例应用部署
      • Bookinfo 应用-
      • 配置请求的路由规则
      • 故障注入
      • 流量转移
      • Istio流量管理实现机制深度解析
      • istio:监控能力介绍
      • Istio 04:Istio性能及扩展性介绍
      • Untitled
  • 实践
    • 大规模集群
    • 高可用
  • k8s运维排查
    • 常用命令
    • Kubernetes之YAML文件
      • yaml文件例子--pod
      • yaml文件例子--rc
    • Kubernetes运维
      • 集群管理
      • 集群与应用监控
      • 日志收集与管理
      • 常见问题定位
      • 权限管理RBAC
    • 排错概览
    • 集群排错
      • kubernetes集群管理常用命令一
    • Pod 排错
    • 网络排错
      • 容器内抓包定位网络问题
    • PV 排错
    • Windows 排错
    • 云平台排错
    • 集群安装脚本
    • 排错工具
    • 常见问题
      • k8s故障解决干货文档链接
      • 记一次Docker/Kubernetes上无法解释的连接超时原因探寻之旅
      • service没有负载均衡
      • kubernetes集群etcd空间配额2G的坑优化
    • K8S--100问
      • 解决 Docker 日志文件太大的问题
      • Kubernetes集群里容器之间的通讯方式
      • k8s 优化
      • lxcfs 在容器内显示容器的 CPU、内存状态
      • kubectl 创建 Pod流程
      • k8s网络-iptables
      • k8s底层网络原理
      • 网络排查
      • kubectl top 和 cadvisor metric ,docker state不一致的问题
      • 容器挂载数据卷的几种情况
      • 容器的终止流程
      • Kubernetes 中如何保证优雅地停止 Pod
      • K8S的apiVersion
      • 如何在Pod中执行宿主机上的命令
      • 创建 Pod 流程
      • k8s主要组件说明
      • 节点网络规划
      • Deployment管理方式
      • pod的分配方式
  • 深入浅出k8s
    • 说明
    • k8s发布策略介绍
    • oom kill原理讲解
    • Kubernetes 的架构设计与实现原理
  • 附录
    • CKA认证
    • 生态圈
    • 资讯快报
      • 2018态势回顾与2019年前景展望
      • Untitled
    • 学习资源
    • 参考文档
    • Kubernetes版本更新日志
      • Kubernetes 1.14 更新日志
      • Kubernetes 1.13 更新日志
      • Kubernetes1.12更新日志
      • Kubernetes1.10更新日志
      • Kubernetes1.11更新日志
  • 思维导图
    • k8s
    • DEVOPS
  • DEVOPS
    • 开源仓库-nexus
      • 一,nexus的安装
      • 二,使用nexus3配置docker私有仓库
      • 三,使用nexus3配置maven私有仓库
      • 四,nexus-3.14.0升级到3.15.2
      • 五,nexus3搭建golang私服
    • vpn
      • openvpn
    • Tcpdump 示例教程
    • Ipsec VPN-centos7使用strangwang搭建vpn
    • yum安装redis及常用指令
    • 数据库
      • mysql表操作
      • mysql 库常用操作及备份还原
      • MySQL 优化实施方案
    • NSQ
      • nsq问题解答
      • 选型
      • docker-compose部署 简单nsq 集群
    • 部署Redis集群
    • zookeeper安装及使用
    • Etcd
      • Untitled
      • Etcd配置
  • k8s系统完整部署
    • CentOS7.5 使用二进制程序部署Kubernetes1.12.2
    • 二进制的方式部署 K8S-1.16 高可用集群
    • CoreOS部署Kubernetes集群
    • EFK
      • 日志-kafka
      • logstash的部署、整合ELK+Filebeat
      • 应用日志收集
      • ES搭建
      • es集群部署
      • ElasticSearch技术原理
      • Elasticsearch操作
      • kibana
      • kibana简单使用
      • 非K8S主机部署Filebat
    • 镜像仓库-Harbor
    • Harbor 2.6.2安装
    • cURL 命令获取本机外网 IP
    • Shell 解析 JSON
    • 制作 gitbook 文档镜像,运行在 K8S 上
    • Kubernetes 之 MySQL 持久存储和故障转移
    • 如何删除etcd上的旧数据
    • Git 实战教程
  • 生活
    • 信合.阳光城
Powered by GitBook
On this page
  • 网络模型
  • 官方插件
  • kubenet
  • CNI plugin
  • Flannel
  • Weave Net
  • Calico
  • OVS
  • OVN
  • Contiv
  • Romana
  • OpenContrail
  • Midonet
  • Host network
  • 其他
  1. 概念与原理

Kubernetes中的网络

PreviousPod中断与PDBNext图解Kubernetes网络(一)

Last updated 6 years ago

网络模型

  • IP-per-Pod,每个 Pod 都拥有一个独立 IP 地址,Pod 内所有容器共享一个网络命名空间

  • 集群内所有 Pod 都在一个直接连通的扁平网络中,可通过 IP 直接访问

    • 所有容器之间无需 NAT 就可以直接互相访问

    • 所有 Node 和所有容器之间无需 NAT 就可以直接互相访问

    • 容器自己看到的 IP 跟其他容器看到的一样

  • Service cluster IP 尽可在集群内部访问,外部请求需要通过 NodePort、LoadBalance 或者 Ingress 来访问

官方插件

目前,Kubernetes 支持以下两种插件:

  • kubenet:这是一个基于 CNI bridge 的网络插件(在 bridge 插件的基础上扩展了 port mapping 和 traffic shaping ),是目前推荐的默认插件

  • CNI:CNI 网络插件,需要用户将网络配置放到 /etc/cni/net.d 目录中,并将 CNI 插件的二进制文件放入 /opt/cni/bin

  • exec:通过第三方的可执行文件来为容器配置网络,已在 v1.6 中移除,见

kubenet

kubenet 是一个基于 CNI bridge 的网络插件,它为每个容器建立一对 veth pair 并连接到 cbr0 网桥上。kubenet 在 bridge 插件的基础上拓展了很多功能,包括

  • 使用 host-local IPAM 插件为容器分配 IP 地址, 并定期释放已分配但未使用的 IP 地址

  • 设置 sysctl net.bridge.bridge-nf-call-iptables = 1

  • 为 Pod IP 创建 SNAT 规则

    • -A POSTROUTING ! -d 10.0.0.0/8 -m comment --comment "kubenet: SNAT for outbound traffic from cluster" -m addrtype ! --dst-type LOCAL -j MASQUERADE

  • 开启网桥的 hairpin 和 promisc 模式,允许 Pod 访问它自己所在的 Service IP(即通过 NAT 后再访问 Pod 自己)

    -A OUTPUT -j KUBE-DEDUP
    -A KUBE-DEDUP -p IPv4 -s a:58:a:f4:2:1 -o veth+ --ip-src 10.244.2.1 -j ACCEPT
    -A KUBE-DEDUP -p IPv4 -s a:58:a:f4:2:1 -o veth+ --ip-src 10.244.2.0/24 -j DROP
  • HostPort 管理以及设置端口映射

  • Traffic shaping,支持通过 kubernetes.io/ingress-bandwidth 和 kubernetes.io/egress-bandwidth 等 Annotation 设置 Pod 网络带宽限制

CNI plugin

安装 CNI:

cat <<EOF> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubernetes-cni

配置 CNI brige 插件:

    mkdir -p /etc/cni/net.d
cat >/etc/cni/net.d/10-mynet.conf <<-EOF
{
    "cniVersion": "0.3.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.244.0.0/16",
        "routes": [
            {"dst": "0.0.0.0/0"}
        ]
    }
}
EOF
cat >/etc/cni/net.d/99-loopback.conf <<-EOF
{
    "cniVersion": "0.3.0",
    "type": "loopback"
}
EOF
kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel-rbac.yml
kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Weave Net 是一个多主机容器网络方案,支持去中心化的控制平面,各个 host 上的 wRouter 间通过建立 Full Mesh 的 TCP 链接,并通过 Gossip 来同步控制信息。这种方式省去了集中式的 K/V Store,能够在一定程度上减低部署的复杂性,Weave 将其称为 “data centric”,而非 RAFT 或者 Paxos 的 “algorithm centric”。

数据平面上,Weave 通过 UDP 封装实现 L2 Overlay,封装支持两种模式,一种是运行在 user space 的 sleeve mode,另一种是运行在 kernal space 的 fastpath mode。Sleeve mode 通过 pcap 设备在 Linux bridge 上截获数据包并由 wRouter 完成 UDP 封装,支持对 L2 traffic 进行加密,还支持 Partial Connection,但是性能损失明显。Fastpath mode 即通过 OVS 的 odp 封装 VxLAN 并完成转发,wRouter 不直接参与转发,而是通过下发 odp 流表的方式控制转发,这种方式可以明显地提升吞吐量,但是不支持加密等高级功能。

kubectl apply -f https://git.io/weave-kube

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息像整个 Calico 网络内传播——小规模部署可以直接互联,大规模下可通过指定的 BGP route reflector 来完成。 这样保证最终所有的 workload 之间的数据流量都是通过 IP 路由的方式完成互联的。Calico 节点组网可以直接利用数据中心的网络结构(无论是 L2 或者 L3),不需要额外的 NAT,隧道或者 Overlay Network。

此外,Calico 基于 iptables 还提供了丰富而灵活的网络 Policy,保证通过各个节点上的 ACLs 来提供 Workload 的多租户隔离、安全组以及其他可达性限制等功能。

kubectl apply -f http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

OVS

  • 每台机器创建一个 Linux 网桥 kbr0,并配置 docker 使用该网桥(而不是默认的 docker0),其子网为 10.244.x.0/24

  • 每台机器创建一个 OVS 网桥 obr0,通过 veth pair 连接 kbr0 并通过 GRE 将所有机器互联

  • 开启 STP

  • 路由 10.244.0.0/16 到 OVS 隧道

OVN 为 Kubernetes 提供了两种网络方案:

  • Overaly: 通过 ovs overlay 连接容器

  • Underlay: 将 VM 内的容器连到 VM 所在的相同网络(开发中)

其中,容器网络的配置是通过 OVN 的 CNI 插件来实现。

Romana 是 Panic Networks 在 2016 年提出的开源项目,旨在借鉴 route aggregation 的思路来解决 Overlay 方案给网络带来的开销。

OpenContrail 是 Juniper 推出的开源网络虚拟化平台,其商业版本为 Contrail。其主要由控制器和 vRouter 组成:

  • 控制器提供虚拟网络的配置、控制和分析功能

  • vRouter 提供分布式路由,负责虚拟路由器、虚拟网络的建立以及数据转发

其中,vRouter 支持三种模式

  • Kernel vRouter:类似于 ovs 内核模块

  • DPDK vRouter:类似于 ovs-dpdk

  • Netronome Agilio Solution (商业产品):支持 DPDK, SR-IOV and Express Virtio (XVIO)

  • kube-network-manager 监听 kubernetes API,并根据 label 信息来配置网络策略

  • 从组件来看,Midonet 以 Zookeeper+Cassandra 构建分布式数据库存储 VPC 资源的状态——Network State DB Cluster,并将 controller 分布在转发设备(包括 vswitch 和 L3 Gateway)本地——Midolman(L3 Gateway 上还有 quagga bgpd),设备的转发则保留了 ovs kernel 作为 fast datapath。可以看到,Midonet 和 DragonFlow、OVN 一样,在架构的设计上都是沿着 OVS-Neutron-Agent 的思路,将 controller 分布到设备本地,并在 neutron plugin 和设备 agent 间嵌入自己的资源数据库作为 super controller。

  • 从接口来看,NSDB 与 Neutron 间是 REST API,Midolman 与 NSDB 间是 RPC,这俩没什么好说的。Controller 的南向方面,Midolman 并没有用 OpenFlow 和 OVSDB,它干掉了 user space 中的 vswitchd 和 ovsdb-server,直接通过 linux netlink 机制操作 kernel space 中的 ovs datapath。

Host network

最简单的网络模型就是让容器共享 Host 的 network namespace,使用宿主机的网络协议栈。这样,不需要额外的配置,容器就可以共享宿主的各种网络资源。

优点

  • 简单,不需要任何额外配置

  • 高效,没有 NAT 等额外的开销

缺点

  • 没有任何的网络隔离

  • 容器和 Host 的端口号容易冲突

  • 容器内任何网络配置都会影响整个宿主机

注意:HostNetwork 是在 Pod 配置文件中设置的,kubelet 在启动时还是需要配置使用 CNI 或者 kubenet 插件(默认 kubenet)。

其他

Kubernetes v1.8 已经支持 ipvs 负载均衡模式(alpha 版)。

  • Layer2:自动为每个 Node 配置路由

  • Vxlan:为主机配置 vxlan 连接,并建立主机和 Pod 的连接(通过 vxlan interface 和 ARP entry)

  • ipsec:加密链接

部署 Kube-router:

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml

部署 Kube-router 并替换 kube-proxy(这个功能其实不需要了,kube-proxy 已经内置了 ipvs 模式的支持):

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter-all-features.yaml
# Remove kube-proxy
kubectl -n kube-system delete ds kube-proxy
docker run --privileged --net=host gcr.io/google_containers/kube-proxy-amd64:v1.7.3 kube-proxy --cleanup-iptables

未来 kubenet 插件会迁移到标准的 CNI 插件(如 ptp),具体计划见 。

更多 CNI 网络插件的说明请参考 。

是一个为 Kubernetes 提供 overlay network 的网络插件,它基于 Linux TUN/TAP,使用 UDP 封装 IP 包来创建 overlay 网络,并借助 etcd 维护网络的分配情况。

是一个基于 BGP 的纯三层的数据中心网络方案(不需要 Overlay),并且与 OpenStack、Kubernetes、AWS、GCE 等 IaaS 和容器平台都有良好的集成。

提供了一种简单的基于 OVS 的网络配置方法:

是 OVS 提供的原生虚拟化网络方案,旨在解决传统 SDN 架构(比如 Neutron DVR)的性能问题。

是思科开源的容器网络方案,主要提供基于 Policy 的网络管理,并与主流容器编排系统集成。Contiv 最主要的优势是直接提供了多租户网络,并支持 L2(VLAN), L3(BGP), Overlay (VXLAN) 以及思科自家的 ACI。

提供了 Kubernetes 的集成,包括两部分:

kubelet network plugin 基于 kubernetes v1.6 已经删除的

是 Midokura 公司开源的 OpenStack 网络虚拟化方案。

是 Flannel 和 Calico 联合发布的一个统一网络插件,提供 CNI 网络插件,并支持 network policy。

是 OpenStack 推出的集成 Neutron 网络插件,主要包括 Controller 和 CNI 插件两部分,并且也提供基于 Neutron LBaaS 的 Service 集成。

是一个基于 eBPF 和 XDP 的高性能容器网络方案,提供了 CNI 和 CNM 插件。

项目主页为 。

是一个旨在简化 Kubernetes 网络配置的项目,支持三种模式:

项目主页为 。

是一个基于 BGP 的网络插件,并提供了可选的 ipvs 服务发现(替代 kube-proxy)以及网络策略功能。

原文链接:

kubernetes#39254
这里
CNI 网络插件
Flannel
Flannel
Weave Net
Calico
Calico
https://kubernetes.io/docs/admin/ovs-networking/
OVN
OVN (Open Virtual Network)
Contiv
Contiv
Romana
OpenContrail
Juniper/contrail-kubernetes
exec network plugin
Midonet
Midonet
ipvs
Canal
Canal
kuryr-kubernetes
kuryr-kubernetes
Cilium
Cilium
https://github.com/cilium/cilium
kope
kope
https://github.com/kopeio/kope-routing
Kube-router
Kube-router
网络插件