• OpenShift中SDN核心知识点总结 wang


    OpenShift的三种SDN实现:
    ovs-subnet:扁平网络,未实现租户之间的网络隔离,所有租户之间的pod都可以互访。使用ansible部署openshift默认模式。
    ovs-multitenant:基于OVS和VxLAN等技术实现了项目(project)之间的网络隔离。
    ovs-networkpolicy:默认和ovs-subnet一样,所有租户之间都没有网络隔离。但是管理员可以通过定义NetworkPolicy对象来精细地进行网络控制。

    主要网络设备:
    br0:OpenShift创建和管理的Open vSwitch网桥,它会使用OpenFlow规则来实现网络隔离和转发。
    vethXXXXX:veth对,它负责将pod的网络命名空间连接到br0网桥。
    tun0:一OVS内部端口,它会被分配本机的pod子网的网关IP地址,用于OpenShift pod以及Docker容器与集群外部的通信。iptables的NAT规则会作用于tun0。
    docker0:Docker管理和使用的linux bridge网桥,通过veth对将不受OpenShift管理的Docker容器的网络地址空间连接到docker0上。
    vovsbr/vlinuxbr:将docker0和br0连接起来的veth对,使得Docker容器能和OpenShift pod通信,以及通过tun0访问外部网络。
    vxlan0:一OVS VXLAN隧道端点,用于集群内部pod之间的网络通信。

    工作流程:
    OpenShift使用运行在每个节点上的kubelet来负责pod的创建和管理,其中就包括网络配置部分。
    kubelet调用docker client来创建容器,然后再调用docker api接口启动上一步中创建成功的容器。
    kubelet创建infra容器,配置好该容器的网络,然后创建业务容器,再把业务容器的网络加到infra容器的网络命名空间。
    kubelet使用CNI来创建和管理Pod网络(openshift在启动kubelet时传递的参数是--netowrk-plugin=cni)。
    OpenShift实现了CNI插件(由/etc/cni/net.d/80-openshift-network.conf文件指定),其二进制文件是/opt/cni/bin/openshift-sdn。
    因此,kubelet通过CNI接口来调用openshift sdn插件,然后具体做两部分事情:一是通过IPAM获取IP地址,二是设置OVS。
    (其中,一是通过调用ovs-vsctl将infra容器的主机端虚拟网卡加入br0,二是调用ovs-ofctl命令来设置规则)

    网络隔离(针对ovs-multitenant):
    所有通过OVS端口进入OVS br0网桥的来自pod的网络包都会被打上对口对应的VNID标签。
    OpenShfit默认的项目default的VNID(Virtual Network ID)为0,表明它是一个特权项目。
    特权项目(VNID为0)可以发网络包到其它所有项目,也能接受其它所有项目的pod发来的网络包。
    其它所有项目都会有一个非0的VNID。在OpenShift ovs-multitenant实现中,非0 VNID的项目之间的网络是不通的。
    OVS网桥中的OpenFlow规则会阻止带有与目标端口上的VNID不同的网络包的投递(VNID 0除外)。这就保证了项目之间的网络流量是互相隔离的。

    OVS中的OpenFlow流表根据网络包的目的地址将其分为四类来处理:
    到本地pod的,直接在br0中转发。
    到本集群pod的,经过br0后发到vxlan0,封装为vxlan udp包经物理网卡发到对方节点。
    到本地不受OpenShift SDN管理的docker容器的,还未具体研究。
    到集群外的,经过br0后发到tun0,经过iptables做SNAT,然后经物理网卡发出。

    常用命令:
    列出节点上的所有OVS网桥:ovs-vsctl list-br
    查看OVS网桥信息:ovs-vsctl show br0
    查看OVS网桥上的所有端口:ovs-vsctl list-ports br0
    查看OVS流表:ovs-ofctl -O OpenFlow13 dump-flows br0
    查看OVS端口详细信息(如端口标签):ovs-ofctl -O OpenFlow13 show br0
    查询容器的IP地址:nsenter -t <容器的PID> -n ip a
    查询容器对应的宿主机网卡:ip link | grep eth0@ifxxx
    查看集群中所有项目对应的VNID:oc get netnamespaces
    打通两个项目的网络(设置相同的VNID):oc adm pod-network join-projects --to=xxx xxx
    分离两个项目的网络(设置不同的VNID):oc adm pod-network isolate-projects xxx xxx

    关于OVS的流表解析:
    https://medoc.readthedocs.io/en/latest/docs/ovs/sharing/cloud_usage.html
    OpenShift网络之SDN:
    https://www.cnblogs.com/sammyliu/p/10064450.html

  • 相关阅读:
    JavaScript高级:JavaScript面向对象,JavaScript内置对象,JavaScript BOM,JavaScript封装
    JavaScript基础:javaScript基本语法,javaScript DOM,javaScript事件,javaScript综合案例
    Mybatis基础:Mybatis映射配置文件,Mybatis核心配置文件,Mybatis传统方式开发
    【笔记】Bagging和Pasting以及oob(Out-of-Bag)
    【笔记】集成学习入门之soft voting classifier和hard voting classifier
    8.23(day22)ATM+购物车系统
    Configure Dynamics 365 for Operations Virtual Machine/Virtual Hard Disk (VHD)
    Capture pictures to Power Platform
    How to convert HTML file to PDF using Power Automate
    Add B2B SSO to a Power Apps Portal
  • 原文地址:https://www.cnblogs.com/wang-hongwei/p/15636405.html
Copyright © 2020-2023  润新知