日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面经 - OpenStack(Docker、Django、K8S、SDN)知识点

發(fā)布時(shí)間:2023/12/20 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面经 - OpenStack(Docker、Django、K8S、SDN)知识点 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 概述
    • OpenStack
      • 虛擬化
        • kvm
          • 網(wǎng)絡(luò)虛擬化
      • 基本技術(shù)
        • Memcached
        • Etcd
        • 消息隊(duì)列
          • 概念
          • 交換機(jī)類型
          • 缺點(diǎn)
          • 重復(fù)投遞問(wèn)題
          • 順序投遞問(wèn)題
        • restful api
      • Horizon
      • Nova
        • nova-api
        • nova-scheduler
          • 過(guò)濾器類型
        • nova-compute
        • 基本操作
      • Keystone
      • Glance
      • Neutron
        • 一些虛擬的網(wǎng)絡(luò)設(shè)備
        • 架構(gòu)
          • Neutron Server
          • ML2 Plugin
        • Linux Bridge實(shí)現(xiàn)
          • local network
          • flat network
          • vlan network
          • vxlan
        • DHCP服務(wù)
        • NameSpace
        • Routing
          • 底層實(shí)現(xiàn)
          • router連接外網(wǎng)
          • floating IP
        • Fwaas
        • OpenvSwitch
          • local network
          • flat network
          • VLAN 網(wǎng)絡(luò)
          • Roting
          • VxLAN
      • Cinder
      • Swift
      • Zun
      • Kuryr-libnetwork
    • SDN
      • OpenFlow
        • OF 1.0
        • OF 1.3
    • Django
      • 概述
        • MVC和MTV
      • 和Flask Tornado的區(qū)別
      • Django請(qǐng)求生命周期
      • 常見的web應(yīng)用程序
        • 框架組件
        • RestFramework
        • 緩存機(jī)制
        • WSGI,uwsgi,uWSGI
        • 請(qǐng)求的生命周期
        • 中間件的作用和應(yīng)用場(chǎng)景
        • 默認(rèn)的中間件
        • django中的csrf實(shí)現(xiàn)機(jī)制
          • 基于django的ajax發(fā)送請(qǐng)求給后端如何攜帶token
          • ajax請(qǐng)求的csrf解決方法
        • 為什么不使用django的runserver部署(runserver和uWSGI的區(qū)別)
    • Kubernetes
        • Pod
          • Pod控制器
    • Docker
        • NameSpace
        • Cgroups
        • 驅(qū)動(dòng)
          • 啟動(dòng)一個(gè)容器的步驟
        • 基礎(chǔ)
          • 什么是Docker
          • Docker與虛擬機(jī)的不同
          • Docker和普通進(jìn)程的區(qū)別
        • 鏡像
          • 什么是Docker鏡像和Docker容器
          • Docker鏡像分層
          • bootfs
          • 容器分層、寫時(shí)復(fù)制(copy-on-write)
          • DockerFile常見指令
          • build
          • Dockerfile的COPY和ADD
          • Docker容器的狀態(tài)
        • 網(wǎng)絡(luò)
          • Docker的網(wǎng)絡(luò)類型
          • docker常用命令
    • 面經(jīng)
      • OpenStack
          • 一些命令行
          • OpenStack中計(jì)算節(jié)點(diǎn)上虛擬機(jī)默認(rèn)保存路徑在哪?
          • OpenStack中Glance鏡像的默認(rèn)保存路徑在哪?
          • OpenStack中計(jì)算節(jié)點(diǎn)的集成橋(br-int)的作用是什么?
          • OpenStack中計(jì)算節(jié)點(diǎn)的隧道橋(br-tun)的作用是什么?
          • OpenStack中外部OVS橋(br-ex)的作用是什么?
          • OpenStack和Docker區(qū)別
          • OpenStack和kvm的區(qū)別
          • kvm和xen區(qū)別
        • Neutron
          • vlan和vxlan的區(qū)別
      • Docker
          • 命名空間

概述

云計(jì)算是一種采用按量付費(fèi)的模式,基于虛擬化技術(shù),將相應(yīng)計(jì)算資源(如網(wǎng)絡(luò)、存儲(chǔ)等)池化后,提供便捷的、高可用的、高擴(kuò)展性的、按需的服務(wù)(如計(jì)算、存儲(chǔ)、應(yīng)用程序和其他 IT 資源)。
云計(jì)算基本特征:

  • 自主服務(wù):可按需的獲取云端的相應(yīng)資源(主要指公有云);
  • 網(wǎng)路訪問(wèn):可隨時(shí)隨地使用任何聯(lián)網(wǎng)終端設(shè)備接入云端從而使用相應(yīng)資源。
  • 資源池化:
  • 快速?gòu)椥?#xff1a;可方便、快捷地按需獲取和釋放計(jì)算資源。
  • 按量計(jì)費(fèi):

常見的部署模式

  • 公有云
  • 私有云
  • 社區(qū)云
  • 混合云

三種服務(wù)模式

  • IaaS:云服務(wù)商將IT系統(tǒng)的基礎(chǔ)設(shè)施(如計(jì)算資源、存儲(chǔ)資源、網(wǎng)絡(luò)資源)池化后作為服務(wù)進(jìn)行售賣;
  • PaaS:云服務(wù)商將IT系統(tǒng)的平臺(tái)軟件層(數(shù)據(jù)庫(kù)、OS、中間件、運(yùn)行庫(kù))作為服務(wù)進(jìn)行售賣;
  • SaaS:云服務(wù)商將IT系統(tǒng)的應(yīng)用軟件層作為服務(wù)進(jìn)行售賣。

云計(jì)算和虛擬化
云計(jì)算:IT能力服務(wù)化,按需使用,按量計(jì)費(fèi),多租戶隔離,是一個(gè)系統(tǒng)的輕量級(jí)管理控制面。
虛擬化:環(huán)境隔離,資源復(fù)用,降低隔離損耗,提升運(yùn)行性能,提供高級(jí)虛擬化特性。
虛擬化是實(shí)現(xiàn)云計(jì)算的技術(shù)支撐之一,但并非云計(jì)算的核心關(guān)注點(diǎn)。

IT架構(gòu)的三個(gè)發(fā)展階段

  • 物理機(jī)架構(gòu):如果需要部署一個(gè)系統(tǒng),需要使用多個(gè)物理機(jī)組成一個(gè)集群,所有節(jié)點(diǎn)都使用物理機(jī),資源利用率都非常低,可能就20%
  • 虛擬化架構(gòu):在物理機(jī)上運(yùn)行多個(gè)虛擬機(jī),將系統(tǒng)的各個(gè)服務(wù)部署在虛擬機(jī)上,可以極大的提高物理機(jī)資源的利用效率,降低成本
  • 云計(jì)算架構(gòu):虛擬化提高了單機(jī)的資源使用率,如何對(duì)環(huán)境中的所有虛擬機(jī)進(jìn)行統(tǒng)一管理,就要使用到云計(jì)算了。云計(jì)算將計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)等資源虛擬化為資源池,當(dāng)需要?jiǎng)?chuàng)建虛擬機(jī)的時(shí)候,平臺(tái)只需要按照規(guī)格需求自動(dòng)分配相應(yīng)的資源創(chuàng)建虛擬機(jī),完成網(wǎng)絡(luò)IP的配置等功能。用戶不需要關(guān)心虛擬機(jī)是在哪里運(yùn)行的、存儲(chǔ)空間在哪里、IP地址怎么分配的,只需要關(guān)心如何部署具體的業(yè)務(wù)就好了。
  • OpenStack

    一個(gè)開源云操作系統(tǒng)內(nèi)核,用于構(gòu)建云平臺(tái),主要實(shí)現(xiàn)以下五個(gè)主要特點(diǎn):

    • 資源抽象:OpenStack將各類硬件資源,通過(guò)虛擬化與軟件定義的形式,抽象成虛擬的資源池;
    • 資源調(diào)度:OpenStack根據(jù)管理員/用戶的需求,將資源池中的資源分配給不同的用戶,承載不同的應(yīng)用;
    • 應(yīng)用生命周期管理:OpenStack可以提供初步的應(yīng)用部署/撤銷、自動(dòng)規(guī)模調(diào)整等功能;
    • 系統(tǒng)運(yùn)維:OpenStack可以提供一定的系統(tǒng)監(jiān)控能力;
    • 人機(jī)交互:OpenStack提供人機(jī)接口,外界可通過(guò)API、CLI或圖形界面的方式與OpenStack進(jìn)行交互。

    組件間交互是消息隊(duì)列,組件內(nèi)部交互是restful api。

    虛擬化

    Ⅰ型虛擬化是:hypervisor直接安裝在物理機(jī),就像是vmware的EXSi,底下是基于硬件層的
    Ⅱ型虛擬化是:在物理機(jī)的正常操作系統(tǒng),hypersivor作為一個(gè)程序模塊運(yùn)行管理虛擬機(jī),如kvm,virtual box,vmware woerkstation。對(duì)硬件虛擬化特別優(yōu)化,性能好,靈活性高。

    kvm

    基于linux內(nèi)核實(shí)現(xiàn)的。有一個(gè)kvm.so,只需好管理虛擬cpu和內(nèi)存等;IO外設(shè)交給linux內(nèi)核和Qemu。
    Libvirt是一個(gè)kvm管理工具,除了能管理kvm還可以xen,virtualBox,openstack底層也是libvirt。
    libvirt:

    • libvirtd:守護(hù)進(jìn)程:接受處理API請(qǐng)求
    • API庫(kù):提供API調(diào)用,然后開發(fā)一些高級(jí)工具,比如virt-manager,可視化管理工具
    • virsh:命令行工具

    kvm虛擬機(jī)是需要CPU硬件支持的,一個(gè)kvm虛擬機(jī)實(shí)質(zhì)上就是一個(gè)qemu-kvm進(jìn)程,一個(gè)vcpu對(duì)應(yīng)一個(gè)進(jìn)程里的一個(gè)線程。一個(gè)cpu可以調(diào)度進(jìn)程里的多個(gè)線程,也就是cvpu數(shù)量實(shí)際上可以超過(guò)cpu,叫CPU超配。可以充分利用宿主機(jī)的資源。
    通過(guò)內(nèi)存虛擬化共享物理系統(tǒng)內(nèi)存,動(dòng)態(tài)分配給虛擬機(jī)。實(shí)現(xiàn)虛擬內(nèi)存->物理內(nèi)存->機(jī)器內(nèi)存的映射。虛擬機(jī)系統(tǒng)只能實(shí)現(xiàn)虛擬內(nèi)存到物理內(nèi)存,最后一步無(wú)法真正訪問(wèn)機(jī)器內(nèi)存,因此需要kvm進(jìn)行一個(gè)映射。
    存儲(chǔ)虛擬化通過(guò)存儲(chǔ)池和卷實(shí)現(xiàn)的,卷在虛擬機(jī)里就是一塊硬盤。

    網(wǎng)絡(luò)虛擬化

    Linex Bridge是Linux上的TCP/IP二層協(xié)議交換設(shè)備,二層交換機(jī),多個(gè)網(wǎng)絡(luò)設(shè)備連接到同一個(gè)bridge時(shí),有數(shù)據(jù)包傳來(lái)beidge會(huì)轉(zhuǎn)發(fā)給其他設(shè)備。
    br-ctl show查看當(dāng)前網(wǎng)橋配置。
    比如在eth0網(wǎng)卡上配置一個(gè)網(wǎng)橋br0,然后虛擬機(jī)的網(wǎng)卡可以選擇br0,啟動(dòng)以后,br0底下會(huì)掛載一個(gè)inet0的設(shè)備,這就是虛擬機(jī)的虛擬網(wǎng)卡,但是在虛擬機(jī)內(nèi)部來(lái)說(shuō)虛擬網(wǎng)卡時(shí)eth0,inet0是在宿主機(jī)的時(shí)候標(biāo)識(shí)的名稱。

    virbr0是kvm默認(rèn)創(chuàng)建的一個(gè)Bridge,作用是給連接的虛擬網(wǎng)卡提供NAT訪問(wèn)外網(wǎng)的功能,默認(rèn)192.168.122.1,如果網(wǎng)絡(luò)選擇默認(rèn),就會(huì)掛載在這個(gè)上面。
    virbr和br的區(qū)別:

    • virbr會(huì)NAT,發(fā)出去的數(shù)據(jù)包的源IP會(huì)被替換為宿主機(jī)的IP,只能發(fā)不能收
    • br直接使用自己的IP通信,可收可發(fā),不用NAT

    VLAN
    LAN是本地局域網(wǎng),通產(chǎn)使用hub或者switch連接其中的主機(jī)。一個(gè)LAN是一個(gè)廣播域,所有成員都能收到其他成員的廣播包。
    VLAN是Virtual LAN,一個(gè)帶有VLAN功能的switch可以將端口劃分出很多個(gè)LAN。可以將一個(gè)交換機(jī)劃分為多個(gè)交換機(jī),在二層進(jìn)行隔離,隔離到不同VLAN中。
    一般交換機(jī)端口有兩種配置方式

    • Access:端口被打上VLAN標(biāo)簽,表明該端口是屬于哪個(gè)VLAN的,不同VLAN通過(guò)VLANID區(qū)分,范圍是1~4096.Access口是直接和網(wǎng)卡相連接的。Access口只能屬于一個(gè)VLAN,網(wǎng)卡流出的數(shù)據(jù)包經(jīng)過(guò)這個(gè)端口后直接打上一個(gè)VLAN標(biāo)簽
    • Trunk:一個(gè)端口可以同時(shí)傳輸轉(zhuǎn)發(fā)多個(gè)VLAN標(biāo)簽的數(shù)據(jù)包,在傳輸?shù)倪^(guò)程中數(shù)據(jù)包始終攜帶VLAN ID

    總結(jié):

  • 物理交換機(jī)有多個(gè)VLAN,每個(gè)VLAN可以有多個(gè)端口。有交換和隔離兩個(gè)二層功能,同一VLAN相互交換轉(zhuǎn)發(fā),不同VLAN相互隔離
  • Linux的VLAN只能實(shí)現(xiàn)隔離,不能實(shí)現(xiàn)交換,因?yàn)楸热缫粋€(gè)VLAN母設(shè)備,比如物理機(jī)的網(wǎng)卡eth0,他不允許連接兩個(gè)相同的ID的VLAN子設(shè)備,不存在同意VLAN交換轉(zhuǎn)發(fā)的情況
  • LinuxBridge,將同一VLAN的子設(shè)備掛載到一個(gè)Bridge上,就可以實(shí)現(xiàn)交換轉(zhuǎn)發(fā)了。LinuxBridge+VLAN可以模擬現(xiàn)實(shí)世界的二層交換機(jī)
  • 基本技術(shù)

    Memcached

    是一個(gè)高性能分布式內(nèi)存對(duì)象緩存系統(tǒng),在OpenStack中用于緩存認(rèn)證系統(tǒng)的令牌,減少高并發(fā)下對(duì)于數(shù)據(jù)庫(kù)的訪問(wèn)壓力,提高訪問(wèn)速度。
    將需要存取的數(shù)據(jù)或?qū)ο缶彺嬖趦?nèi)存中,內(nèi)存中緩存數(shù)據(jù)可以通過(guò)API進(jìn)行操作,數(shù)據(jù)經(jīng)過(guò)Hash操作以后存在一個(gè)Hash表中,是K-V形式存儲(chǔ)。
    memcached沒(méi)有訪問(wèn)控制和安全管理,因此需要使用防火墻等安全功能進(jìn)行相應(yīng)防護(hù)
    使用最近最少使用算法LRU對(duì)最近不活躍的數(shù)據(jù)進(jìn)行清理,從而得到新的內(nèi)存空間。
    對(duì)于大規(guī)模數(shù)據(jù)緩存有著較為明顯的優(yōu)勢(shì)而且通過(guò)開放API多種語(yǔ)言可以直接操作memcached。OpenStack的keystone就是用memcached緩存租戶的身份等信息、從而在租戶登錄驗(yàn)證的時(shí)候無(wú)需重復(fù)訪問(wèn)數(shù)據(jù)庫(kù)即可查詢得到相應(yīng)數(shù)據(jù)。Horizon和Swift也用到了這個(gè)來(lái)進(jìn)行數(shù)據(jù)的緩存以提高客戶端的訪問(wèn)請(qǐng)求速率。
    操作的過(guò)程

    • 檢查數(shù)據(jù)是否存在memcached,如果有直接返回
    • 如果數(shù)據(jù)不存在memcached,去數(shù)據(jù)庫(kù)查詢,同時(shí)將數(shù)據(jù)庫(kù)緩存到memcached
    • 每次更新數(shù)據(jù)庫(kù)的時(shí)候同步更新memcached的數(shù)據(jù)保證一致性
    • 如果分配的內(nèi)存空間滿了,使用LRU算法對(duì)失效的數(shù)據(jù)進(jìn)行處理

    功能特點(diǎn)

    • 協(xié)議簡(jiǎn)單:基于文本行進(jìn)行操作
    • 基于libevent事件處理:將epoll等事件處理封裝成一個(gè)接口,保證服務(wù)器端的連接數(shù),使用這個(gè)庫(kù)進(jìn)行異步事件處理
    • 內(nèi)置的內(nèi)存管理方式:有自己特有的一套內(nèi)存管理方式,很高效;但是不考慮容災(zāi),重啟數(shù)據(jù)丟失
    • 節(jié)點(diǎn)之間相互獨(dú)立:各個(gè)服務(wù)器之間互不通信,獨(dú)立存取數(shù)據(jù)不共享,通過(guò)客戶端實(shí)現(xiàn)其分布式,支持海量緩存和大規(guī)模應(yīng)用

    缺點(diǎn)

    • 單點(diǎn)故障:因?yàn)槊總€(gè)節(jié)點(diǎn)是獨(dú)立存取數(shù)據(jù)的,服務(wù)器之間沒(méi)有通信,即不會(huì)進(jìn)行數(shù)據(jù)的同步和備份,如果一個(gè)節(jié)點(diǎn)down了,節(jié)點(diǎn)的數(shù)據(jù)全部丟失且無(wú)法恢復(fù)
    • 存儲(chǔ)空間限制:會(huì)受到尋址空間大小限制,32位系統(tǒng)可緩存2G,64位可緩存無(wú)限,只要物理內(nèi)存足夠大
    • 存儲(chǔ)單元限制:K-V的key最大250字節(jié),value最大1MB
    • 數(shù)據(jù)碎片:內(nèi)存存儲(chǔ)單元按照Chunk分配的,會(huì)造成內(nèi)存碎片,因?yàn)椴豢赡芩写鎯?chǔ)的value大小都是一個(gè)Chunk大小
    • 不安全

    Etcd

    是一個(gè)go語(yǔ)言開發(fā)的開源的高可用的K-V存儲(chǔ)系統(tǒng),用于配置共享和服務(wù)的注冊(cè)和發(fā)現(xiàn)。
    集群部署一般使用奇數(shù)個(gè)服務(wù)器配置,因?yàn)镽aft決策時(shí)候需要多節(jié)點(diǎn)投票。
    有幾個(gè)特點(diǎn):

    • 高可用:避免因?yàn)閱吸c(diǎn)故障或者網(wǎng)絡(luò)故障造成服務(wù)down
    • 一致性:每次讀取都會(huì)返回跨多個(gè)主機(jī)的最新寫入
    • 完全復(fù)制:每個(gè)節(jié)點(diǎn)都可以使用完整數(shù)據(jù)歸檔
    • 安全:提供一個(gè)帶有可選的客戶端證書身份驗(yàn)證的自動(dòng)化TLS
    • 快速:每秒一萬(wàn)次寫入的基準(zhǔn)速度
    • 可靠:使用Raft算法實(shí)現(xiàn)強(qiáng)一致、高可用的服務(wù)存儲(chǔ)目錄

    應(yīng)用場(chǎng)景

    • 服務(wù)發(fā)現(xiàn):同一個(gè)分布式集群中找到是否有進(jìn)程在監(jiān)聽端口
    • 配置中心:講一些數(shù)據(jù)放在Etcd集中管理,比如在啟動(dòng)的時(shí)候主動(dòng)從etcd獲取配置信息,并且設(shè)置一個(gè)Watcher,有更新的時(shí)候etcd會(huì)主動(dòng)通知訂閱者獲取最新配置信息
    • 分布式鎖:使用Raft實(shí)現(xiàn)數(shù)據(jù)的強(qiáng)一致性,某次操作存儲(chǔ)必須是全局一致性的。有兩種:保持獨(dú)占(始終只有一個(gè)用戶可以獲得,實(shí)現(xiàn)了一套分布式原子操作CAS的API)、控制時(shí)序(所有想獲得鎖的用戶都會(huì)被安排執(zhí)行,獲得鎖的順序也是全局唯一,決定了執(zhí)行的順序)

    相比榮譽(yù)zookeeper和doozer,有如下特點(diǎn):

    • 簡(jiǎn)單:基于HTTP+JSON,提供API便于調(diào)用
    • 安全:使用SSL客戶認(rèn)證機(jī)制
    • 快速:實(shí)例每秒支持一萬(wàn)次寫操作
    • 可信:Raft算法實(shí)現(xiàn)分部署

    消息隊(duì)列

    rabbitmq屬于AMQP(高級(jí)消息隊(duì)列協(xié)議)的一種實(shí)現(xiàn),應(yīng)用層的一個(gè)開放標(biāo)準(zhǔn)。
    特點(diǎn):

    • 較高的靈活性
    • 高可擴(kuò)展性,多個(gè)rabbitmq可以組成集群
    • 支持常見的編程語(yǔ)言
    • 提供可視化界面便于管理
    • 支持多種協(xié)議,不只是AMQP
    • 提供了多種插件

    AMQP的三大組件:

    • Exchange交換機(jī):把消息路由到隊(duì)列
    • Queue隊(duì)列:存儲(chǔ)消息等待消費(fèi),多個(gè)消費(fèi)者可以訂閱同一個(gè)隊(duì)列
    • Binding綁定:將交換機(jī)和隊(duì)列進(jìn)行綁定,告知交換機(jī)應(yīng)該投遞到哪個(gè)隊(duì)列

    優(yōu)點(diǎn):

    • 異步:如果阻塞式的話,A給B發(fā)請(qǐng)求,B如果處理需要很長(zhǎng)時(shí)間,那么A也需要等待很久,顯然是不合理的,還會(huì)資源浪費(fèi),可以通過(guò)消息隊(duì)列先發(fā)送一個(gè)請(qǐng)求命令給B ,然后A直接進(jìn)行下一步,當(dāng)B有結(jié)果時(shí)會(huì)通知A
    • 解耦:如果每一個(gè)組件之間通過(guò)直接通信的話,都需要維護(hù)一套比如接口代碼,會(huì)有很多重復(fù)冗余的代碼,,而且還需要考慮比如對(duì)方是否接到消息,消息是否丟失之類的。使用消息隊(duì)列就不需要考慮這些了,把消息投遞進(jìn)入就好了,剩下的消息隊(duì)列做
    • 削鋒:如果短時(shí)間內(nèi)有大量請(qǐng)求直接到服務(wù)器,可能會(huì)造成擁塞甚至崩潰。放入消息隊(duì)列里,消費(fèi)者可以依次取出消息進(jìn)行消費(fèi),相當(dāng)于一個(gè)緩沖,雖然會(huì)慢一點(diǎn),但是會(huì)很高效穩(wěn)定
    概念

    有幾個(gè)概念關(guān)鍵詞

    • Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列
    • Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列,多個(gè)消費(fèi)者可以訂閱同一個(gè)隊(duì)列
    • Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來(lái)
    • Routing Key:路由關(guān)鍵字, exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞
    • producer:消息生產(chǎn)者,就是投遞消息的程序
    • consumer:消息消費(fèi)者,就是接受消息的程序
    • channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。
    交換機(jī)類型
    • Direct Exchange(直連交換機(jī)):交換機(jī)和隊(duì)列一對(duì)一匹配
    • Fanout Exchange(扇型交換機(jī)):消息會(huì)被發(fā)送至所有與該交換機(jī)綁定的隊(duì)列,不會(huì)按照指定的路由鍵進(jìn)行投遞,類似廣播
    • Topic Exchange(主題交換機(jī)):交換機(jī)會(huì)將消息的路由鍵和綁定到自身的隊(duì)列進(jìn)行匹配,將消息投遞到匹配上的隊(duì)列中去。比如如果寫成這樣log.#,那么可以匹配log.開頭的routingkey
    • Headers Exchange:類似主題交換機(jī),但是是使用消息頭部的屬性進(jìn)行分發(fā),而不是routingkey
    缺點(diǎn)

    系統(tǒng)可用性降低,rabbitmq掛了以后系統(tǒng)就崩了。
    如何解決消息重復(fù)投遞或者丟失的問(wèn)題
    如何解決消息按順序發(fā)送的問(wèn)題

    重復(fù)投遞問(wèn)題

    給每一個(gè)消息設(shè)置一個(gè)類似唯一標(biāo)識(shí)的一個(gè)ID,接收者去除消息以后先在數(shù)據(jù)庫(kù)中對(duì)比一下是否存在,如果不存在,就正常消費(fèi)。

    順序投遞問(wèn)題

    還是使用一個(gè)ID,一般這個(gè)會(huì)出現(xiàn)在比如說(shuō)訂單的場(chǎng)景,生成訂單,制作訂單,訂單號(hào)都是一樣的,把這些消息投遞到一個(gè)訂單隊(duì)列里面,取出的時(shí)候就是順序的了。

    restful api

    restful api是一種軟件架構(gòu)設(shè)計(jì)的風(fēng)格,不是標(biāo)準(zhǔn),提供了一組設(shè)計(jì)的原則和約束條件,是一套編寫接口的協(xié)議,協(xié)議規(guī)定如何編寫,返回值和狀態(tài)碼等,主要用于客戶端和服務(wù)器端的交互。
    最顯著的特點(diǎn)就是一個(gè)url可以通過(guò)不同的HTTP方法實(shí)現(xiàn)不同的功能,而no rest則需要使用多個(gè)url分別實(shí)現(xiàn)多個(gè)功能。

    • 還可以使用https
    • 不同版本可以有不同接口
    • 可以根據(jù)不同http方法執(zhí)行不同操作
    • 返回格式應(yīng)該統(tǒng)一為json,還有狀態(tài)碼

    django中的erest框架叫django rest framework
    能夠生成符合restful規(guī)范的api

    • 在開發(fā)restful api的時(shí)候,雖然具體業(yè)務(wù)流程不一樣,但是基本增刪改查操作差不多,這部分代碼可以簡(jiǎn)寫復(fù)用
    • 序列化和反序列化的時(shí)候代碼流程也差不多,,也可以簡(jiǎn)寫

    傳統(tǒng)的URL需要在鏈接里加上操作的動(dòng)作等;
    而restful api則用URI統(tǒng)一資源標(biāo)識(shí)符唯一標(biāo)識(shí)服務(wù)器的一個(gè)資源,并且使用HTTP方法對(duì)其進(jìn)行操作

    Horizon

    提供一個(gè)Web前端控制臺(tái),從而實(shí)現(xiàn)通過(guò)web管理云平臺(tái),建云主機(jī),分配網(wǎng)絡(luò),配安全組等。
    Region(區(qū)域):地理上的概念可以理解為是兩個(gè)不同區(qū)域的數(shù)據(jù)中心,是完全隔離的,但是可以共享同一套keystone和horizon了用戶可以選擇距離自己更近的域使用服務(wù)

    Nova

    端口

    • nova-api:通過(guò)接口對(duì)外提供服務(wù),接受請(qǐng)求處理操作調(diào)度資源等。接收傳來(lái)的HTTP請(qǐng)求校驗(yàn)參數(shù),然后調(diào)用其他子服務(wù)實(shí)現(xiàn)請(qǐng)求操作,之后處理結(jié)果返回
    • nova-compute:Nova的核心服務(wù),,負(fù)責(zé)管理虛擬機(jī)的整個(gè)生命周期如創(chuàng)建相應(yīng)銷毀等,通過(guò)調(diào)用Hypervisor API
    • nova-scheduler:虛擬機(jī)調(diào)度服務(wù),決定虛擬機(jī)應(yīng)該創(chuàng)建在哪個(gè)節(jié)點(diǎn)。通過(guò)過(guò)濾器選擇合適的計(jì)算節(jié)點(diǎn),然后計(jì)算節(jié)點(diǎn)權(quán)重,選擇最優(yōu)的節(jié)點(diǎn)(默認(rèn)權(quán)值是計(jì)算空閑內(nèi)存量,內(nèi)存越大權(quán)值越大)
    • nova-conductor:負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)控制,避免compute直接訪問(wèn)數(shù)據(jù)庫(kù)。避免計(jì)算節(jié)點(diǎn)出現(xiàn)故障導(dǎo)致數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題,可以擴(kuò)展配置多個(gè)conductor更好的應(yīng)對(duì)更多計(jì)算節(jié)點(diǎn)對(duì)于數(shù)據(jù)庫(kù)的訪問(wèn)

    創(chuàng)建一個(gè)虛擬機(jī)大概的流程:

  • 發(fā)送http請(qǐng)求,nova-api接受請(qǐng)求后,進(jìn)行參數(shù)和身份校驗(yàn)
  • 發(fā)送消息給nova-schedule調(diào)度計(jì)算節(jié)點(diǎn)
  • 發(fā)送消息給nova-compute創(chuàng)建實(shí)例
  • 在整個(gè)過(guò)程中通過(guò)nova-conductor與數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)交互
  • 這里的消息發(fā)送全部都是通過(guò)消息隊(duì)列實(shí)現(xiàn)的,進(jìn)行異步調(diào)用,不會(huì)阻塞服務(wù);解耦各個(gè)子模塊功能;提高可擴(kuò)展性;提高性能,可以處理多個(gè)請(qǐng)求,提高吞吐量
    使用API的好處:

    • 對(duì)外提供了一個(gè)統(tǒng)一的調(diào)用方法,隱藏實(shí)現(xiàn)細(xì)節(jié)
    • 提供了restful風(fēng)格的服務(wù),便于和第三方集成
    • 通過(guò)運(yùn)行多個(gè)api進(jìn)程實(shí)現(xiàn)高可用

    OpenStack的開放性,一個(gè)重要方面就是基于Driver的框架。比如說(shuō)nov-acompute中為hypervisor定義了統(tǒng)一的接口,支持多種Hypervisor,如Xen、VirtualBox、Hyper-V、Docker等

    nova-api

    對(duì)外暴露若干個(gè)Restful API,用戶可以發(fā)送請(qǐng)求到指定Endpoint

    • 收到HTTP請(qǐng)求后,會(huì)先進(jìn)行參數(shù)校驗(yàn)
    • 調(diào)用nova其他子服務(wù)開始執(zhí)行相應(yīng)操作
    • 再返回執(zhí)行的結(jié)果

    和虛擬機(jī)生命周期的指定請(qǐng)求nova-api都可以收到并處理。

    nova-scheduler

    在創(chuàng)建虛擬機(jī)的時(shí)候需要指定一個(gè)flavor也就是規(guī)格,其中規(guī)定了vcpu、ram、disk等參數(shù),隨后將falvor信息傳入到noca-scheduler中,會(huì)根據(jù)flavor選擇一個(gè)合適的節(jié)點(diǎn)創(chuàng)建虛擬機(jī)。
    Filer scheduler是默認(rèn)調(diào)度器,過(guò)程分為兩步,第一是通過(guò)過(guò)濾器計(jì)算出滿足條件的計(jì)算節(jié)點(diǎn),通過(guò)權(quán)重計(jì)算,在權(quán)重最大(最優(yōu))的節(jié)點(diǎn)創(chuàng)建虛擬機(jī)。
    同樣可以使用第三方的scheduler,只需要配置一個(gè)scheduler_driver即可,再次體現(xiàn)出OpenStack開放性。

    過(guò)濾器類型

    nova可以配置默認(rèn)使用全部過(guò)濾器acheduler_availiable_filters,但是真正使用到的是這個(gè)參數(shù)scheduler_default_filters

    • RetryFilter:如果AB節(jié)點(diǎn)通過(guò)了第一步過(guò)濾,然后A權(quán)重最大,但是在A創(chuàng)建失敗了,那么下一次調(diào)度的時(shí)候,就會(huì)在第一步將A刷掉,避免再次失敗
    • AvailabilityZoneFilter:為了提高容災(zāi)和隔離,將計(jì)算節(jié)點(diǎn)可以劃分到不同的AvailablittZone中,每個(gè)AZ都可能有著各自獨(dú)立的電力系統(tǒng)、獨(dú)立的網(wǎng)絡(luò)和機(jī)柜等,為了應(yīng)對(duì)故障的發(fā)生,一個(gè)Region可以有多個(gè)AZ,默認(rèn)是nova。這里會(huì)判斷將不屬于指定AZ的計(jì)算節(jié)點(diǎn)刪除
    • RamFilter:將不滿足flavor中內(nèi)存規(guī)格的計(jì)算節(jié)點(diǎn)除去。OpenStack允許overcommit,可以在nova里面改這個(gè)參數(shù)ram_allocation_ratio=1.5,如果某個(gè)計(jì)算節(jié)點(diǎn)有10G內(nèi)存,OpenStack會(huì)認(rèn)為其有15G內(nèi)存
    • DiskFilter:同上,同樣允許overcommit,默認(rèn)參數(shù)值為1
    • CPUFilter:同上,允許overcommit,默認(rèn)參數(shù)值為16.也就是如果一個(gè)計(jì)算節(jié)點(diǎn)有8vcpu,那么OpenStack會(huì)默認(rèn)其有128vcpu。默認(rèn)過(guò)濾器是不包含這個(gè)過(guò)濾器,需要手動(dòng)添加
    • ComputeFilter:保證工作正常的計(jì)算節(jié)點(diǎn)才會(huì)被篩選出來(lái),是必須的一個(gè)過(guò)濾器
    • ComputeCapabilitiesFilter:根據(jù)計(jì)算節(jié)點(diǎn)的特性篩選,如計(jì)算節(jié)點(diǎn)有x86_64和ARM架構(gòu),如果指定ARM架構(gòu),就需要這個(gè)過(guò)濾器,這個(gè)需要在flavor的Metadata中指定
    • ImagePropertiesFilter:image同樣具有metadata,根據(jù)這個(gè)元數(shù)據(jù)篩選出匹配的計(jì)算節(jié)點(diǎn)。比如可以選擇hypervisor_type=kvm,那么使用這個(gè)鏡像過(guò)濾就只能篩選出kvm的節(jié)點(diǎn)
    • ServerGroupAntiAffinityFilter:盡可能將實(shí)例分散到不同的節(jié)點(diǎn)上。需要?jiǎng)?chuàng)建一份server group,把實(shí)例添加進(jìn)來(lái)才有用
    • ServerGroupAffinityFilter:盡可能創(chuàng)建實(shí)例在一個(gè)計(jì)算節(jié)點(diǎn)上。

    nova-compute

    compute和hypervisor一起共同管理虛擬機(jī)生命周期。
    定義了很多統(tǒng)一的接口,hypervisor實(shí)現(xiàn)這些接口就可以在openstack里面了。
    一個(gè)計(jì)算節(jié)點(diǎn)只能指定一種虛擬類型。
    主要有兩種功能:

    • 報(bào)告計(jì)算節(jié)點(diǎn)狀態(tài)
    • 實(shí)現(xiàn)虛擬機(jī)生命周期管理

    需要實(shí)時(shí)報(bào)告計(jì)算節(jié)點(diǎn)可用內(nèi)存、vcpu等數(shù)量,scheduler才可有進(jìn)行過(guò)濾調(diào)度的依據(jù),通過(guò)hypervisor api獲取虛虛擬機(jī)的資源信息。
    管理生命周期包括如下:

    • 為實(shí)例準(zhǔn)備資源
    • 創(chuàng)建實(shí)例鏡像文件
    • 創(chuàng)建實(shí)例的.xml定定義文件
    • 創(chuàng)建網(wǎng)絡(luò)并啟動(dòng)實(shí)例

    在下載鏡像的時(shí)候,如果存在就直接使用,會(huì)很快,不存在會(huì)先下載。比如是qcow2格式的鏡像,由qemu-img轉(zhuǎn)為raw格式然后進(jìn)行backing file,這個(gè)不能是qcow2格式。

    基本操作

    • 軟硬重啟其實(shí)就分別是reboot重啟和關(guān)機(jī)再開機(jī)
    • Pause/Resume:可以暫停虛擬機(jī),并將狀態(tài)保存到內(nèi)存中,需要的時(shí)候再resume讀取內(nèi)存恢復(fù)虛擬機(jī)
    • Suspend和Pause:前者可以暫停虛擬機(jī)并將狀態(tài)保存在磁盤上,后者保存到內(nèi)存中,相對(duì)較快;前者狀態(tài)會(huì)變成shutdown,后者是paused;前者對(duì)應(yīng)的恢復(fù)操作叫resume,后者其實(shí)是unpaused
    • rescure/Unrecure:救援。當(dāng)因?yàn)閿嚯娀蛘哒`操作導(dǎo)致操作系統(tǒng)出現(xiàn)故障不能啟動(dòng)實(shí)例了,一般會(huì)使用一張引導(dǎo)盤進(jìn)入系統(tǒng),然后試圖恢復(fù)系統(tǒng),比如忘記密碼或者刪除了某個(gè)文件。rescure可以將某個(gè)image作為啟動(dòng)盤,然就將原系統(tǒng)盤掛載到這個(gè)操作系統(tǒng)上,fdisk可以看到,新的image是vda,原系統(tǒng)盤就是vdb,修好以后unrescure恢復(fù)引導(dǎo)盤
    • snapshot:快照的原理就是對(duì)實(shí)例的鏡像文件進(jìn)行全量備份,保存到glance。
    • rebuild:當(dāng)損壞嚴(yán)重的時(shí)候,可以使用快照恢復(fù)。rebuild會(huì)使用快照替換當(dāng)前實(shí)例的系統(tǒng)盤,并且保持實(shí)例原有的網(wǎng)絡(luò)、資源等信息

    Keystone

    常用的5000端口,以及沒(méi)怎么用過(guò)的35357端口
    為OpenStack其他服務(wù)提供身份驗(yàn)證、服務(wù)規(guī)則和服務(wù)令牌的功能,管理Domains、Projects、Users、Groups、Roles。

    • User:代指任何使用gopenstack的實(shí)體,可以是真正的用戶,也可以是一個(gè)系統(tǒng)服務(wù),在訪問(wèn)openstack的時(shí)候,keystone會(huì)對(duì)User進(jìn)行身份認(rèn)證
    • Credentials:User用來(lái)表明自己身份的憑證,可以是用戶名密碼、token或者API Key等
    • Authentication:是keystone驗(yàn)證User身份的一個(gè)過(guò)程,User訪問(wèn)openstack的時(shí)候向keystone發(fā)送用戶名密碼等信息,keystone驗(yàn)證成功后返回一個(gè)token,作為用戶的Credentials
    • Token:是一串?dāng)?shù)字和字母組成的字符串,用戶在keystone驗(yàn)證身份后會(huì)得到,在訪問(wèn)其他服務(wù)的時(shí)候會(huì)被用來(lái)驗(yàn)證身份有效性,一般默認(rèn)24小時(shí)。
    • Project:用于將OpenStack的資源進(jìn)行分組和隔離,可以是一個(gè)客戶或者部門。一個(gè)用戶需要掛載到Project后才能訪問(wèn)其中的資源
    • Service:Nova、Glance等就是OpenStack的服務(wù),每個(gè)Service會(huì)提供若干個(gè)Endpoints供用戶去訪問(wèn)資源和執(zhí)行操作
    • Endpoint:是一個(gè)可以訪問(wèn)的地址,通過(guò)Endpoint暴露自己的API,keystone維護(hù)
    • Role:對(duì)用戶進(jìn)行鑒權(quán),每個(gè)User會(huì)被分配一個(gè)或多個(gè)Role,該用戶擁有Role指定的權(quán)限。如果修改權(quán)限需要修改/etc{service_name}/policy.json

    Glance

    監(jiān)聽端口:

    • glance-api:9292
    • glance-registry:9191

    傳統(tǒng)的安裝一個(gè)系統(tǒng)可能需要從CD或者ghost工具進(jìn)行安裝,非常繁瑣。二運(yùn)計(jì)算環(huán)境中有一個(gè)更高效地解決方案,就是Image。
    每個(gè)Image中裝有操作系統(tǒng)以及相應(yīng)的配套軟件環(huán)境,用戶可以直接使用安裝即可快速創(chuàng)建一個(gè)虛擬機(jī)。
    比如云計(jì)算中可以有這么一個(gè)場(chǎng)景:當(dāng)我們需要有一個(gè)新的系統(tǒng)需求的時(shí)候,我們可以先手動(dòng)創(chuàng)建一個(gè)虛擬機(jī)然后安裝好相應(yīng)的操作系統(tǒng)和需要的軟件環(huán)境,然后創(chuàng)建一個(gè)snapshot保存在云中,后續(xù)如果有用戶需要使用可以直接使用這個(gè)snapshot快速創(chuàng)建虛擬機(jī),這都是可以自動(dòng)完成了。

    為云主機(jī)提供不同系統(tǒng)鏡像,支持多種虛擬機(jī)鏡像格式(AKI、AMI、ARI、ISO、QCOW2、Raw、VDI、VHD、VMDK),有創(chuàng)建上傳鏡像、刪除鏡像、編輯鏡像基本信息的功能。

    glance-api對(duì)外提供restful api接口調(diào)用,當(dāng)有請(qǐng)求來(lái)以后,api不會(huì)自己主動(dòng)處理,而是會(huì)調(diào)用glance-registry處理有關(guān)元數(shù)據(jù)的操作,調(diào)用store backend處理有關(guān)鏡像的操作。
    Image默認(rèn)存儲(chǔ)在/var/lib/glance/images。
    glance-registry負(fù)責(zé)處理有關(guān)metadata的操作,如存取。比如image的大小或者類型,支持多種格式:QCOW2、RAW、vmdk、ISO等,元數(shù)據(jù)默認(rèn)保存到mysql
    store-backend:glance自己不保存鏡像,而是使用backend存儲(chǔ),glance支持多種backend,如默認(rèn)的local filesystem本地文件系統(tǒng)、ceph、swift、cinder、EXSI等

    Neutron

    端口9292
    提供云計(jì)算的網(wǎng)絡(luò)虛擬化技術(shù),為OpenStack其他服務(wù)提供網(wǎng)絡(luò)連接服務(wù)。為用戶提供接口,可以定義Network、Subnet、Router,配置DHCP、DNS、負(fù)載均衡、L3服務(wù),網(wǎng)絡(luò)支持GRE、VLAN。插件架構(gòu)支持許多主流的網(wǎng)絡(luò)廠家和技術(shù),如OpenvSwitch。
    根據(jù)網(wǎng)絡(luò)類型的不同有以下幾種網(wǎng)絡(luò):

    • Flat network:基于不使用 VLAN 的物理網(wǎng)絡(luò)實(shí)現(xiàn)的虛擬網(wǎng)絡(luò)。每個(gè)物理網(wǎng)絡(luò)最多只能實(shí)現(xiàn)一個(gè)虛擬網(wǎng)絡(luò)。
    • local network(本地網(wǎng)絡(luò)):一個(gè)只允許在本服務(wù)器內(nèi)通信的虛擬網(wǎng)絡(luò),不進(jìn)行跨服務(wù)器的通信。主要用于單節(jié)點(diǎn)上測(cè)試。
    • VLAN network(虛擬局域網(wǎng)) :基于物理 VLAN 網(wǎng)絡(luò)實(shí)現(xiàn)的虛擬網(wǎng)絡(luò)。共享同一個(gè)物理網(wǎng)絡(luò)的多個(gè) VLAN 網(wǎng)絡(luò)是相互隔離的,甚至可以使用重疊的 IP 地址空間。每個(gè)支持 VLAN network 的物理網(wǎng)絡(luò)可以被視為一個(gè)分離的 VLAN trunk,它使用一組獨(dú)占的 VLAN ID。有效的 VLAN ID 范圍是 1 到 4094。
    • GRE network (通用路由封裝網(wǎng)絡(luò)):一個(gè)使用 GRE 封裝網(wǎng)絡(luò)包的虛擬網(wǎng)絡(luò)。GRE 封裝的數(shù)據(jù)包基于 IP 路由表來(lái)進(jìn)行路由,因此 GRE network 不和具體的物理網(wǎng)絡(luò)綁定。
    • VXLAN network(虛擬可擴(kuò)展網(wǎng)絡(luò)):基于 VXLAN 實(shí)現(xiàn)的虛擬網(wǎng)絡(luò)。同 GRE network 一樣, VXLAN network 中 IP 包的路由也基于 IP 路由表,也不和具體的物理網(wǎng)絡(luò)綁定。

    網(wǎng)絡(luò)轉(zhuǎn)發(fā)
    一般架構(gòu)是控制節(jié)點(diǎn)、計(jì)算節(jié)點(diǎn)和網(wǎng)絡(luò)節(jié)點(diǎn)。
    網(wǎng)絡(luò)節(jié)點(diǎn)就dhcp服務(wù)之類的,計(jì)算節(jié)點(diǎn)是各種agent,控制節(jié)點(diǎn)是neutron-server一個(gè)組件。
    然后如果跨子網(wǎng)通信的話,流量需要從計(jì)算節(jié)點(diǎn)到網(wǎng)絡(luò)節(jié)點(diǎn),通過(guò)router路由一下,轉(zhuǎn)發(fā)到對(duì)應(yīng)的計(jì)算節(jié)點(diǎn)的實(shí)例上。而如果需要配置NAT的話是需要在router上面配置的,也就是網(wǎng)路節(jié)點(diǎn),如果有需要流量轉(zhuǎn)發(fā)出去的話,都需要通過(guò)網(wǎng)絡(luò)節(jié)點(diǎn)。
    但是這樣的話網(wǎng)絡(luò)節(jié)點(diǎn)的壓力就比較大,一旦網(wǎng)絡(luò)節(jié)點(diǎn)崩潰了,整個(gè)網(wǎng)絡(luò)就崩了;還有一個(gè)就是即便兩個(gè)實(shí)例在同一個(gè)計(jì)算節(jié)點(diǎn)上,如果不在一個(gè)網(wǎng)絡(luò)中,還需要經(jīng)過(guò)網(wǎng)絡(luò)節(jié)點(diǎn)路由一下才能回來(lái),很麻煩。
    那么就有一個(gè)東西DVR(Distributed Virtual Routing),部署在計(jì)算節(jié)點(diǎn),可以直接使用浮動(dòng)IP訪問(wèn)外網(wǎng),不需要經(jīng)過(guò)網(wǎng)絡(luò)節(jié)點(diǎn)了。是通過(guò)openflow規(guī)則進(jìn)行判斷的。
    Neutron功能

    • 二層交換:實(shí)例通過(guò)虛擬交換機(jī)連接到虛擬二層網(wǎng)絡(luò),Nova支持多種交換機(jī),Linux Bridge和OpenvSwitch(開源虛擬交換機(jī))
    • 三層路由:給實(shí)例配置不同網(wǎng)段的IP,router(虛擬路由器)可以實(shí)現(xiàn)跨網(wǎng)段通信,使用IP forwarding、iptables等實(shí)現(xiàn)路由和NAT
    • 負(fù)載均衡
    • 防火墻:一個(gè)是security group使用的iptables、另一個(gè)是firewall-as-a-service,也是基于iptables的

    一些概念

    • network:二層廣播域,支持多種類型網(wǎng)絡(luò):local、flat、vlan、vxlan、gre
      • local:這個(gè)網(wǎng)絡(luò)與其他網(wǎng)絡(luò)節(jié)點(diǎn)隔離,只能和同一節(jié)點(diǎn)的同一網(wǎng)絡(luò)實(shí)例通信
      • flat:沒(méi)有vlan tag的網(wǎng)絡(luò),網(wǎng)絡(luò)中的實(shí)例可以和其他實(shí)例通信
      • vlan:802.1q標(biāo)簽的網(wǎng)絡(luò),一個(gè)二層廣播域,同一個(gè)vlan中的實(shí)例可以相互通信,不同vlan只能通過(guò)router通信。vlan可以跨界點(diǎn),標(biāo)簽數(shù)為1-4096
      • vxlan:基于隧道技術(shù)的overlay網(wǎng)絡(luò),VxLAN網(wǎng)絡(luò)使用唯一的段ID與其他VxLAN進(jìn)行隔離。會(huì)通過(guò)VNI封裝為UDP數(shù)據(jù)包傳輸,二層包通過(guò)封裝可以在三層傳輸,因此克服了物理網(wǎng)絡(luò)基礎(chǔ)設(shè)施的限制
      • gre:是和VxLAN類似的overlay網(wǎng)絡(luò),區(qū)別在于使用IP包封裝而不是UDP

    一些虛擬的網(wǎng)絡(luò)設(shè)備

    Veth pair
    Veth是linux系統(tǒng)虛擬出來(lái)的一個(gè)網(wǎng)絡(luò)設(shè)備,總是成對(duì)出現(xiàn)的,功能類似虛擬網(wǎng)線的功能,在創(chuàng)建兩個(gè)Veth設(shè)備,假設(shè)放在兩個(gè)namespace里面,那么通過(guò)這個(gè)Veth設(shè)備可以實(shí)現(xiàn)相互通信,默認(rèn)情況下是不通的。
    通常鏈接網(wǎng)絡(luò)的namespace,也鏈接linuxbridge,一般用于連接兩個(gè)linuxbridge或者一個(gè)linuxbridge和ovs,兩個(gè)ovs一般不太用這個(gè),一般用patch連接兩個(gè)ovs bridge,效率更好。
    實(shí)際操作
    在這里創(chuàng)建一個(gè)新的namespace,然后創(chuàng)建一對(duì)Veth pair試一下,單純記錄,我沒(méi)有操作過(guò)。

    #創(chuàng)建namespace ip netns add tns(tempnamespace) #創(chuàng)建Veth設(shè)備 ip link add tns-0 type veth peer name tns-1 #生效網(wǎng)卡 ipconfig tns-0 up或者ip link setet tns-0 up ipconfig tns-1 up #將一段veth pair 1放入namespace,并重命名為eth0,添加新的網(wǎng)絡(luò)網(wǎng)卡接口 ip linhk set tns-1 netns tns ip netns exec tns-1 name eth0 #生效一下網(wǎng)卡ip netns exec tns ip link set eth0 upip netns exec tns ip link set lo up#設(shè)置一下新的Veth網(wǎng)卡設(shè)備的IP地址,隨便寫吧ip netns tns ip addt add 10.254.1.1/24 dev eth0ip addr add 10.254.1.2/24 dev tns-0#現(xiàn)在可以驗(yàn)證連通性了驗(yàn)證ip netns exec tns ping 10.254.1.1

    TUN、TAP
    Veth是兩端都一樣的虛擬網(wǎng)線,而這個(gè)就是兩端都不一樣的虛擬網(wǎng)先,相當(dāng)于一邊是水晶頭,另一端是USB接口,是用戶空間和內(nèi)核空間傳輸報(bào)文使用到的“網(wǎng)線”,一邊是普通的網(wǎng)卡比如eth0,另一端是文件描述符,用戶空間使用的。
    實(shí)例的本質(zhì)是qemu進(jìn)程,因此TUN、TAP網(wǎng)線一般是給VM用的,所以這個(gè)文件描述符一般是VM,另一端則是虛擬出來(lái)的TAP設(shè)備,這也就是為什么Neutron幾種網(wǎng)絡(luò)模型里面的VM或者linuxbridge連接router的時(shí)候都是通過(guò)TAP設(shè)備的
    Bridge
    是一種虛擬集線器的實(shí)現(xiàn)方式,多個(gè)網(wǎng)卡連接到這個(gè)上面,一個(gè)發(fā)送報(bào)文其他都能接收到。
    把TUN/TAP或者Veth pair放在Bridge上面,就可以實(shí)現(xiàn)相互通信。Docker就是用linuxbridge將所有的容器連接在一起,bridge模式,就是docekr0網(wǎng)卡

    架構(gòu)

    Neutron主要有以下幾個(gè)部分:

    • Neutron Server:對(duì)外提供API,接收請(qǐng)求,調(diào)用Plugins處理請(qǐng)求
    • Plugin:處理來(lái)自Server的請(qǐng)求,并且轉(zhuǎn)發(fā)調(diào)用Agent處理請(qǐng)求
    • Agent:處理來(lái)自Plugin的請(qǐng)求,并且在network provider上具體實(shí)現(xiàn)每個(gè)網(wǎng)絡(luò)功能
    • network provider:提供網(wǎng)絡(luò)服務(wù)的虛擬網(wǎng)絡(luò)設(shè)備或物理網(wǎng)絡(luò)設(shè)備,比如Linux Bridge或者OpenvSwitch或者其他支持Neutron的物理交換機(jī)
    • Queue:組件之間交互的消息隊(duì)列
    • Database:存放網(wǎng)絡(luò)狀態(tài)信息

    架構(gòu)這么多層次有兩個(gè)原因

    • 為了支持現(xiàn)有或者未來(lái)出現(xiàn)的網(wǎng)絡(luò)技術(shù)
    • 為了支持分布式的靈活擴(kuò)展性

    plugin有一個(gè)功能時(shí)需要維護(hù)數(shù)據(jù)庫(kù)中的網(wǎng)絡(luò)狀態(tài)信息,如果有多個(gè)插件的話,每一個(gè)provider的plugin都要寫一套類似的數(shù)據(jù)庫(kù)操作代碼,會(huì)很繁瑣,因此現(xiàn)有版本使用了ML2 plugin,對(duì)plugin進(jìn)行了抽象。只需要實(shí)現(xiàn)響應(yīng)driver就行了,不需要具體實(shí)現(xiàn)plugin了。
    plugin主要分為兩種(均有對(duì)應(yīng)的agent):

    • core plugin:比如linux bridge或者openvswitch
    • service plugin:比如routing、firewall、load balance等

    物理架構(gòu)
    有兩種。
    第一種:控制節(jié)點(diǎn)+計(jì)算節(jié)點(diǎn)
    控制節(jié)點(diǎn)配置neutron server、core plugin、service plugin和兩個(gè)對(duì)應(yīng)的agent
    計(jì)算節(jié)點(diǎn)配置core plugin的agrnt,負(fù)責(zé)二層網(wǎng)絡(luò)功能。
    通過(guò)agent實(shí)現(xiàn)控制節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)之間的二層網(wǎng)絡(luò)通信,可以部署多個(gè)控制節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)
    第二種:控制節(jié)點(diǎn)+網(wǎng)絡(luò)節(jié)點(diǎn)+計(jì)算節(jié)點(diǎn)
    控制節(jié)點(diǎn)配置neutron server
    網(wǎng)絡(luò)節(jié)點(diǎn)配置core plugin、service plugin和對(duì)應(yīng)的agent
    計(jì)算節(jié)點(diǎn)配置core plugin,負(fù)責(zé)二層網(wǎng)絡(luò)功能

    • 將agent從控制節(jié)點(diǎn)分離出來(lái),控制節(jié)點(diǎn)只通過(guò)neutron server處理分發(fā)api請(qǐng)求
    • 可以通過(guò)增加網(wǎng)絡(luò)節(jié)點(diǎn)的個(gè)數(shù)提高負(fù)載
    • 使用獨(dú)立的節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)交換,并且可以配置路由、負(fù)載均衡等高級(jí)功能
    • 適合大規(guī)模環(huán)境
    Neutron Server

    由上而下分別是

    • Core API:對(duì)內(nèi)提供restful api,如管理子網(wǎng)網(wǎng)絡(luò)端口等
    • Extension API:對(duì)外提供restful api,如管理router、firewall-as-a-service、負(fù)載均衡等
    • Common Service:認(rèn)證校驗(yàn)API
    • Core Plugin API:定義個(gè)Core Plugin抽象功能,通過(guò)API調(diào)用對(duì)應(yīng)plugin
    • Neutron Core:Neutron的核心處理程序,調(diào)用相應(yīng)Plugin處理
    • Extension Plugin API:定義。。。
    • Service Plugin:維護(hù)管理router、負(fù)載均衡等資源狀態(tài)信息,調(diào)用agent在network privider上實(shí)現(xiàn)相應(yīng)功能

    但是提出了兩個(gè)問(wèn)題

  • 只能使用一種core plugin,多個(gè)無(wú)法共存
  • 不同plugin之間復(fù)用的代碼太多了,維護(hù)工作量大
  • ML2 Plugin

    主要解決上面說(shuō)的兩個(gè)問(wèn)題
    允許網(wǎng)絡(luò)中使用多種二層網(wǎng)絡(luò)技術(shù),不同節(jié)點(diǎn)直接按可以使用不同的網(wǎng)絡(luò)實(shí)現(xiàn)機(jī)制。
    可以在不同節(jié)點(diǎn)上使用不同的agent了,而且不用重新開發(fā)core plugin,實(shí)現(xiàn)mechanism driver就可以了。
    ML2對(duì)二層網(wǎng)絡(luò)進(jìn)行了抽象解耦,type driver和mechanism driver使得其具有非常好的彈性,能夠靈活支持多種agent(type或者mechanism)
    每一種網(wǎng)絡(luò)都有這么兩種driver
    Type Driver
    負(fù)責(zé)管理網(wǎng)絡(luò)狀態(tài)、創(chuàng)建網(wǎng)絡(luò)等。
    有這么集中網(wǎng)絡(luò)類型:local、flat、vlan、vxlan、gre
    mechanism driver
    獲取由type維護(hù)的網(wǎng)絡(luò)狀態(tài),并且確保其在物理或者虛擬設(shè)備上的實(shí)現(xiàn)
    比如創(chuàng)建一個(gè)VLAN100,VLAN的type driver負(fù)責(zé)將數(shù)據(jù)保存在數(shù)據(jù)庫(kù)里,然后linux bridge的mechanism driver負(fù)責(zé)在各個(gè)節(jié)點(diǎn)上調(diào)用agent創(chuàng)建相應(yīng)的vlan設(shè)備和bridge。
    Mechanism Driver有三種:

    • Agent-based:就是基于agent的,比如linux bridge和openvswitch
    • Controller-based:基于控制器的,如opendaylight,就是sdn
    • 基于物理交換機(jī):如思科的設(shè)備

    Linux Bridge實(shí)現(xiàn)

    local network

    local網(wǎng)絡(luò)不會(huì)和任何物理網(wǎng)卡連接,也不會(huì)有VLAN ID。
    對(duì)于每一個(gè)local網(wǎng)絡(luò)都會(huì)創(chuàng)建一個(gè)網(wǎng)橋,將實(shí)例的tap設(shè)備綁定到網(wǎng)橋上。
    同一網(wǎng)橋上的實(shí)例可以相互通信。每個(gè)local網(wǎng)絡(luò)都有自己的網(wǎng)橋,互不影響,因此同一個(gè)節(jié)點(diǎn)上不同往前的實(shí)例不能通信。
    其實(shí)只有admin創(chuàng)建網(wǎng)絡(luò)可以選擇type driver,普通用戶在自己租戶里創(chuàng)建網(wǎng)絡(luò)的時(shí)候默認(rèn)使用/etc/neutron/plugins/mk2/ml2_conf.ini里面的一個(gè)參數(shù)tenant_networks_type=local,默認(rèn)是local,需要修改一下,可以指定多個(gè),如vxlan,local,會(huì)從左到右按照順序依次創(chuàng)建,如果vxlan的id用完了,就會(huì)創(chuàng)建local。
    命名
    brqxxxxxx對(duì)應(yīng)的是網(wǎng)絡(luò),表明這是網(wǎng)絡(luò)id為xxxxx創(chuàng)建的一個(gè)網(wǎng)橋
    tapyyyyy,其實(shí)就是虛擬機(jī)的一個(gè)虛擬網(wǎng)卡,對(duì)應(yīng)的是port,說(shuō)明這是id為yyyy的port的tap接口設(shè)備,tap將連接到brq上

    在創(chuàng)建實(shí)例的時(shí)候,neutron-linubgridge-agent根據(jù)port信息創(chuàng)建一個(gè)tap設(shè)備,連接到local網(wǎng)絡(luò)所在的bridge網(wǎng)橋上。這個(gè)tap設(shè)備就會(huì)映射為實(shí)例的虛擬網(wǎng)卡。

    flat network

    不帶tag的,要求和物理網(wǎng)卡連接,所以需要在ml2的配置文件里寫physical_interface_mappings=default:thh0,前面式一個(gè)label,用來(lái)標(biāo)識(shí)flat,可以是任意字符粗漢,就是表明和物理網(wǎng)卡的對(duì)應(yīng)關(guān)系,因?yàn)榭赡苊總€(gè)節(jié)點(diǎn)使用的物理網(wǎng)卡不一樣,因此這里的default就映射為配置好的物理網(wǎng)卡。
    如果不同節(jié)點(diǎn)的實(shí)例連接到同一個(gè)網(wǎng)絡(luò),他們所處的網(wǎng)橋名稱一致,通過(guò)provider network通信。

    vlan network

    vlan是帶tag的網(wǎng)絡(luò)。
    如下所示,多個(gè)tap連接到brq網(wǎng)橋上。eth1網(wǎng)卡上創(chuàng)建了一個(gè)eth1.100的vlan interface接口,可以連接到這個(gè)brq上,然后通過(guò)eth1.100到eth1的數(shù)據(jù)包就會(huì)被標(biāo)記一個(gè)100的vlan tag。
    如果有多個(gè)eth1.xxx接口連載eth1網(wǎng)卡上,就可以通過(guò)這個(gè)tag標(biāo)簽相互隔離不同的vlan。

    如果需要這么設(shè)置的話,物理機(jī)連接的交換機(jī)端口需要設(shè)置為trunk,不能是access,因?yàn)樾枰鬟^(guò)多個(gè)tag數(shù)據(jù)包

    vxlan

    OpenStack支持VxLAN和GRE這兩種overlay網(wǎng)絡(luò),overlay網(wǎng)絡(luò)指建立在其他網(wǎng)絡(luò)之上的網(wǎng)絡(luò)。
    linuxbridge只支持vxlan,ovs兩個(gè)都支持。
    優(yōu)點(diǎn)

    • VLAN使用12bit標(biāo)記tag,最多4096個(gè),而VxLAN支持24bit,最多16777216個(gè)二層網(wǎng)段
    • 能夠很好利用已有路徑,封裝UDP通過(guò)三層傳輸和轉(zhuǎn)發(fā),可以使用所有路徑。(VLAN用了Spanning Tree Protocol避免環(huán)路,有一半路徑用不成)
    • 避免物理交換機(jī)MAC表耗盡,因?yàn)橛昧怂淼兰夹g(shù),不需要再M(fèi)AC表里記錄虛擬機(jī)信息

    缺點(diǎn)
    其實(shí)也是有一些缺點(diǎn)的

    • 比如強(qiáng)制在三層傳輸數(shù)據(jù)包可能路徑不是最優(yōu)傳輸速度慢
    • 雖然避免了物理交換機(jī)記錄大量的虛擬機(jī)MAC,但是可能會(huì)造成路由器的ARP表有較多的記錄,影響正常的性能
    • 而且標(biāo)準(zhǔn)規(guī)定VxLAN不能分片,要求物理鏈路層的MTU足夠大才行

    VxLAN是將二層建立在三層上的網(wǎng)絡(luò),把二層數(shù)據(jù)封裝在UDP數(shù)據(jù)包里擴(kuò)展二層網(wǎng)絡(luò)。IP+UDP

    DHCP服務(wù)

    通過(guò)DHCP agent實(shí)現(xiàn)DHCP服務(wù)。運(yùn)行在網(wǎng)絡(luò)節(jié)點(diǎn),dnsmasq
    當(dāng) 創(chuàng)建一個(gè)網(wǎng)絡(luò)的子網(wǎng)開啟dhcp功能后,agent會(huì)啟動(dòng)一個(gè)dnsmasq進(jìn)程提供服務(wù),其實(shí)dnsmasq和network是對(duì)應(yīng)的,一個(gè)進(jìn)程可以給所有的子網(wǎng)提供dhcp服務(wù)。

    通過(guò)dnsmasq獲取IP信息。
    在創(chuàng)建實(shí)例的時(shí)候,實(shí)例會(huì)綁定一個(gè)port,有MAC和IP信息,dnsmasq會(huì)把這個(gè)記錄在一個(gè)host文件里。
    實(shí)例啟動(dòng)以后,會(huì)發(fā)送DHCPDISCOVER廣播,然后廣播消息會(huì)在flat網(wǎng)絡(luò)里傳播,通過(guò)veth paur到達(dá)另一個(gè)namesapce里面,dhsmasq監(jiān)聽到了,然后返回對(duì)應(yīng)的IP信息,DHCPOFFER,包含IP地址、租期時(shí)間等給實(shí)例
    最后實(shí)例返回一個(gè)DHCPREQUEST消息接收DNSOFFER。

    NameSpace

    二層網(wǎng)絡(luò)上可以通過(guò)VLAN將物理交換機(jī)分割為多個(gè)虛擬交換機(jī)。
    而namespace可以將物理的三層網(wǎng)絡(luò)劃分為多個(gè)隔離的虛擬三層網(wǎng)絡(luò),有這幾個(gè)字的網(wǎng)絡(luò)棧、防火墻規(guī)則、路由表等。
    Neutron就是通過(guò)namespace為每個(gè)network提供DHCP服務(wù)和路由,讓租戶之間的網(wǎng)絡(luò)可以重疊不沖突,提高了靈活性。
    每個(gè)namesapce里有各自的dnsmasq,ip nets list可以查看。
    管理員可以將brq或者tap添加到某個(gè)namesapce里面。

    如何讓兩個(gè)namespace相互通信呢
    默認(rèn)是不能通信的,Neutron里面使用了 veth pair,相當(dāng)于虛擬網(wǎng)線,連接兩個(gè)namespace,這邊輸入另一邊接收。

    Routing

    路由提供了跨子網(wǎng)的通信。這里有兩個(gè)實(shí)例
    vm1 - 172.16.100.3 - vlan100
    vm3 - 172.16.101.3 - vlan101
    這兩個(gè)實(shí)例是兩個(gè)不同vlan的,他們之間不能通過(guò)二層交換進(jìn)行通信,必須借助router。
    虛擬router由L3 Agent在控制節(jié)點(diǎn)或者網(wǎng)絡(luò)節(jié)點(diǎn)運(yùn)行。

    底層實(shí)現(xiàn)

    通過(guò)配置一個(gè)router,vm1和vm3就可以進(jìn)行通信了。
    首先vlan101的bridge網(wǎng)橋上多了一個(gè)tap設(shè)備,這個(gè)設(shè)備就是路由器的interface接口
    同樣vlan100所在的網(wǎng)橋也有這么個(gè)接口設(shè)備。
    L3 Agent會(huì)給每個(gè)router配置一個(gè)namespace,使用veth pair和tap設(shè)備連起來(lái)。對(duì)應(yīng)的gateway ip在namesapce內(nèi)的veth interface上。叫qr-…
    其中namespace里的qr-xxxx和tap-xxxx組成veth pair進(jìn)行通信。

    如下圖所示

    引入namespace而不直接使用網(wǎng)關(guān)的作用
    為了使得租戶之間的網(wǎng)絡(luò)可以重疊提高靈活性。
    不然如果A和B都有相同子網(wǎng),只用網(wǎng)關(guān)的話需要在控制節(jié)點(diǎn)的路由表上加兩項(xiàng),而且目的IP可能一致,無(wú)法區(qū)分了。

    router連接外網(wǎng)

    給router配置好一個(gè)外部網(wǎng)絡(luò)(一般是flat或者vlan類型)的網(wǎng)關(guān)以后,router多一個(gè)接口,通過(guò)這個(gè)接口可以連接到外網(wǎng),ip比如是10.10.10.2。
    然后連接外部網(wǎng)絡(luò)的bridge的tap-xxxx設(shè)備,通過(guò)veth pair和路由器namesapce內(nèi)的qg-xxxx接口連接
    冷知識(shí),router的內(nèi)部網(wǎng)絡(luò)的接口叫qr-xxxxx,外部網(wǎng)絡(luò)叫qg-yyyyy
    此時(shí)看ip nets exec qrouter-xxxx route,會(huì)看到10.10.10.1有一個(gè)qg的接口。說(shuō)明如果是外網(wǎng)流量的話,router會(huì)通過(guò)這個(gè)接口將流量轉(zhuǎn)發(fā)到這個(gè)網(wǎng)關(guān),然后到linuxbrige的brq網(wǎng)橋上轉(zhuǎn)發(fā)到網(wǎng)卡上。。
    從qg-xxxxx出去的話會(huì)進(jìn)行一個(gè)SNAT的轉(zhuǎn)換,將源IP修改為router的源IP 10.10.10.2,以便回來(lái)的時(shí)候可以找到路由器

    floating IP

    SNAT可以讓實(shí)例訪問(wèn)外網(wǎng),但是還不能讓外網(wǎng)訪問(wèn)實(shí)例,使用浮動(dòng)IP可以解決這個(gè)。
    floating ip可以提供一個(gè)一對(duì)一映射的靜態(tài)NAT。
    創(chuàng)建好一個(gè)floating ip以后,會(huì)配置到router的外網(wǎng)的qg接口,然后iptables會(huì)添加兩個(gè)規(guī)則

    • 如果是內(nèi)網(wǎng)IP到達(dá)路由器,轉(zhuǎn)換為對(duì)應(yīng)的floating ip發(fā)送出去
    • 如果是floating ip對(duì)應(yīng)的數(shù)據(jù)包到達(dá)路由器,會(huì)修改為對(duì)應(yīng)的內(nèi)網(wǎng)IP

    Fwaas

    讓用戶可以創(chuàng)建和管理防火墻,在子網(wǎng)的邊界進(jìn)行流量過(guò)濾。傳統(tǒng)的防火墻是在網(wǎng)關(guān)上的,隔離子網(wǎng),而這個(gè)是在router上配置的,控制租戶網(wǎng)絡(luò)進(jìn)出的流量。
    分為:

    • Firewall:必須關(guān)聯(lián)某個(gè)Policy
    • Firewall Policy:是Rule的集合,會(huì)按照Policy中的順序依次過(guò)濾
    • Firewall Rule:訪問(wèn)控制規(guī)則,包括源IP和端口、目的IP和端口,協(xié)議類型以及操作

    安全組的對(duì)象是虛擬網(wǎng)卡,L2 Agent實(shí)現(xiàn),對(duì)通過(guò)iptables實(shí)現(xiàn)對(duì)實(shí)例虛擬網(wǎng)卡流量的過(guò)濾。而fwaas是配置在虛擬路由器上的,在到達(dá)安全組之前可以先過(guò)濾一下,但是同一個(gè)subnet內(nèi)部的虛擬網(wǎng)卡間不會(huì)過(guò)濾,因?yàn)椴煌ㄟ^(guò)router。

    fwaas沒(méi)有單獨(dú)的agent,是在L3 Agent中配置的,driver為IP tables,要在service plugins啟用fwaas。
    FWaaS v2
    上面說(shuō)的是v1,Stein版本以后,v1廢棄了,是v2了。
    Firewall概念變?yōu)镕irewall Group了,而且不像v1是唯一綁定一個(gè)路由器,v2需要指定路由器的某個(gè)接口。
    可以同時(shí)管理ingress和egress進(jìn)口和出口兩種流量。v1則不區(qū)分,對(duì)雙向流量進(jìn)行過(guò)濾,安全組區(qū)分流量。

    OpenvSwitch

    ovs是除了linuxbridge外的另一種虛擬化交換機(jī)技術(shù)。
    安裝ovs agent,修改ml2的mechanism_drivers。
    初始狀態(tài)有三個(gè)網(wǎng)橋:

    • br-int:連接所有虛擬機(jī)的虛擬網(wǎng)卡或和其他虛擬網(wǎng)絡(luò)設(shè)備
    • br-ex:連接外部網(wǎng)絡(luò)的網(wǎng)橋
    • br-tun:隧道技術(shù)用這個(gè),比如VxLAN或者GRE

    計(jì)算節(jié)點(diǎn)沒(méi)有br-ex,因?yàn)橛?jì)算節(jié)點(diǎn)的外網(wǎng)流量是通過(guò)網(wǎng)絡(luò)節(jié)點(diǎn)的虛擬路由器轉(zhuǎn)發(fā)的,所以br-ex在網(wǎng)絡(luò)節(jié)點(diǎn)上。

    local network

    同樣的local網(wǎng)絡(luò)不會(huì)和網(wǎng)卡連接,流量被限制在宿主機(jī)內(nèi),只有同一個(gè)網(wǎng)橋上的才可以通信。
    創(chuàng)建了一個(gè)local網(wǎng)絡(luò)以后,br-int網(wǎng)橋上有一個(gè)tap設(shè)備,是dhcp的接口,tap設(shè)備是在這個(gè)命名空間里的。

    創(chuàng)建一個(gè)實(shí)例以后,Neutron在子網(wǎng)subnet中創(chuàng)建一個(gè)port,分配IP和MAC,綁定在實(shí)例上,會(huì)創(chuàng)建一個(gè)tap-xxxx設(shè)備作為實(shí)例的虛擬網(wǎng)卡。
    然后在linuxbridge上創(chuàng)建一個(gè)qbr-xxxx網(wǎng)橋,和tap設(shè)備相連。
    然后通過(guò)veth pair連接到br-int,即qvb-xxxx與qvo-xxxx。
    為什么需要使用一個(gè)linuxbridge中轉(zhuǎn)不能直接使用tap設(shè)備連接到br-int呢
    因?yàn)閛vs不支持將iptables規(guī)則放在與其相連的tap設(shè)備上,因此為了實(shí)現(xiàn)security group安全組的功能,需要引入linuxbridge作為一個(gè)中轉(zhuǎn)
    如下圖所示
    一個(gè)實(shí)例的網(wǎng)絡(luò)設(shè)備連接情況如下(以次連接):

    • tap-xxxx:虛擬網(wǎng)卡
    • qbr-xxxx:tap連接到linuxbridge的qbr,為了使用security group功能
    • qbr通過(guò)一對(duì)veth pair(qvb-xxxx和qvo-xxxx)連接到br-int網(wǎng)橋

      <font color="red>如果此時(shí)創(chuàng)建第二個(gè)local 網(wǎng)絡(luò),然后創(chuàng)建一個(gè)虛擬機(jī),其虛擬網(wǎng)卡同樣會(huì)連接到br-int上,那么可以通信嗎。
      不可以。
      ovs會(huì)將每個(gè)網(wǎng)橋看成一個(gè)虛擬機(jī),然后可以支持vlan,每個(gè)local網(wǎng)絡(luò)的djcp和虛擬網(wǎng)卡都有一個(gè)tag,這個(gè)tag就是VLAN ID,相互之間隔離。僅用于隔離網(wǎng)橋中的port。
    flat network

    flat網(wǎng)絡(luò)的話是不帶tag的,而且一個(gè)flat網(wǎng)路需要和一個(gè)物理網(wǎng)卡相連。
    這里在修改配置文件的bridge_mappings的時(shí)候,不是標(biāo)簽:物理網(wǎng)卡了,而是標(biāo)簽:連接網(wǎng)卡的網(wǎng)橋名。
    因此需要先創(chuàng)建一個(gè)br-eth1網(wǎng)橋,連接到物理網(wǎng)卡eth1。
    此時(shí)在br-int和br-eth1會(huì)分別多出一個(gè)接口int-br-eth1和phy-br-eth1,是patch類型的,用來(lái)連接br-int和br-eth1,可以訪問(wèn)外網(wǎng)。
    如下所示

    在linuxbridge里面用veth pair連接br-int和linuxbridge,而這里使用patch連接br-int和br-eth1。
    veth pair 和 patch
    兩者都可以作為一個(gè)類似虛擬網(wǎng)線的功能連接網(wǎng)橋。

    • patch port是連接兩個(gè)ovs bridge的專屬,而且性能更好
    • veth pair只能用于連接兩個(gè)linuxbridge或者linuxbridge與ovs連接

    底層實(shí)現(xiàn)
    創(chuàng)建一個(gè)flat網(wǎng)絡(luò)與后,會(huì)創(chuàng)建一個(gè)dhcp的接口,tap-xxxx連接到br-int網(wǎng)橋。
    創(chuàng)建一個(gè)虛擬機(jī)后,同樣的,先創(chuàng)建一個(gè)tap設(shè)備作為虛擬機(jī)的虛擬網(wǎng)卡,然后連接到linuxbridge的qbr網(wǎng)橋上,然后qbr通過(guò)一對(duì)veth pair連接到br-int網(wǎng)橋。

    VLAN 網(wǎng)絡(luò)

    ovs中是所有虛擬網(wǎng)卡都連接到br-int網(wǎng)橋,而linuxbridge里面則是不同VLAN連接到不同網(wǎng)卡的VLAN網(wǎng)橋。因此物理交換機(jī)連接eth1的口也要設(shè)置為trunk。
    ovs通過(guò)flow rule對(duì)流過(guò)br-int的數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā)處理,比如打上tag或者去掉tag等。
    ovs-ofctl dump-flow查看流規(guī)則。
    比如br-eth1網(wǎng)橋的流規(guī)則如下,這里的in_port編號(hào)可以在ovs-ofctl show 查看到。
    這里就是說(shuō)從br-eth1網(wǎng)橋的phy-br-eth1(port=2)端口進(jìn)來(lái)的vlan為1的數(shù)據(jù)包,修改vlan id為100然后發(fā)送出去

    br-int網(wǎng)橋的規(guī)則同理
    這里的tag和VLAN其實(shí)是不一樣的,tag是ovs內(nèi)部進(jìn)行網(wǎng)絡(luò)隔離使用的,在接收到數(shù)據(jù)包的時(shí)候,需要進(jìn)行vlan的一個(gè)映射,Neutron維護(hù)VLAN ID的映射關(guān)系。

    Roting

    兩個(gè)子網(wǎng)之間的實(shí)例通信需要使用路由器進(jìn)行通信。
    創(chuàng)建一個(gè)路由器以后,將 子網(wǎng)可以添加到路由器的接口上,接口的IP分別為子網(wǎng)的網(wǎng)關(guān)。
    br-int網(wǎng)橋上多了兩個(gè)接口port,叫qr-xxxx。router也是運(yùn)行在自己的namesapce里面。
    如果路由器需要連接外網(wǎng),需要綁定一個(gè)外部網(wǎng)關(guān),然后router就多了一個(gè)接口10.10.10.2,用于連接外網(wǎng)。也就是路由器的qg-xxxx接口。

    VxLAN

    可以設(shè)置VxLAN 的vni也就是tag,需要在配置文件的[ovs]配置tunnel_bridge。
    br-int和br-tun是通過(guò)patch port連接的,其中patch-tun在br-int上,patch-int在br-tun上。
    底層實(shí)現(xiàn)
    創(chuàng)建網(wǎng)絡(luò)以后,dhcp也會(huì)通過(guò)tap設(shè)備連接到br-int上。
    實(shí)例的虛擬網(wǎng)卡tap設(shè)備還是連接到linuxbridge的網(wǎng)橋qbr上,通過(guò)veth pair(qvb和qvo)連接到br-int上。
    而br-tun上則多了一個(gè)vxlan-xxxx的東西,比如用于連接控制節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)的,制定了VTEP的IP。
    此時(shí)br-int充當(dāng)了一個(gè)二層交換機(jī),查看flow rule以后可以看到是通過(guò)vlan和mac轉(zhuǎn)發(fā)數(shù)據(jù)包的。
    而br-tun的flow-rule才是進(jìn)行真正轉(zhuǎn)發(fā)數(shù)據(jù)包的。

    Cinder

    為運(yùn)行實(shí)例提供穩(wěn)定持久化的數(shù)據(jù)塊存儲(chǔ)服務(wù),如創(chuàng)建卷、刪除卷,在實(shí)例上掛載和卸載卷。
    cinder-api:接收http請(qǐng)求調(diào)用cinder-volume
    cinder-volume:管理volume服務(wù),管理卷的生命周期
    cinder-schedule:通過(guò)算法為卷調(diào)度一個(gè)合適的節(jié)點(diǎn)

    Swift

    Zun

    openstack租戶管理_OpenStack容器服務(wù)Zun初探與原理分析
    Keystone、Neutron以及Kuryr-libnetwork是運(yùn)行Zun必備的服務(wù)。分別提供了身份認(rèn)證以及網(wǎng)絡(luò)的功能支持。
    zun-api負(fù)責(zé)接收api請(qǐng)求進(jìn)行處理。
    zun-compute服務(wù)調(diào)用container driver進(jìn)行docker的創(chuàng)建,目前只實(shí)現(xiàn)了Docker Driver。
    流程步驟
    zun/api/controllers/v1/containers.py
    進(jìn)行參數(shù)校驗(yàn),如用戶是否具有policy權(quán)限,網(wǎng)絡(luò)、安全組、配額等是否符合。
    zun/compute/api.py
    先schedule調(diào)度一個(gè)合適的計(jì)算節(jié)點(diǎn),返回host對(duì)象,這個(gè)功能集成在zun-api里面了。
    檢查鏡像是否存在,遠(yuǎn)程調(diào)用zun-compute的image search方法,其實(shí)就是調(diào)用了docker search,為了實(shí)現(xiàn)快速失敗,避免到計(jì)算節(jié)點(diǎn)才發(fā)現(xiàn)錯(cuò)誤。
    然后遠(yuǎn)程調(diào)用zun-compute進(jìn)行后續(xù)工作
    zun/compute/manager.py
    創(chuàng)建卷或者掛載硬盤,然后下載鏡像,創(chuàng)建端口,調(diào)用docker啟動(dòng)容器。
    其中調(diào)用docker啟動(dòng)容器的操作的代碼位于zun/container/docker/driver.py,這個(gè)部分其實(shí)就是對(duì)于Docker SDK for python的一個(gè)封裝。
    如import docker

    Kuryr-libnetwork

    這個(gè)項(xiàng)目的目的是將容器網(wǎng)絡(luò)與neutron進(jìn)行融合,提供接口南向連接neutron,北向連接容器網(wǎng)絡(luò)。
    開始目的是為了提供Docker與Neutron的連接。將Neutron的網(wǎng)絡(luò)服務(wù)帶給Docker。隨著容器的發(fā)展,容器網(wǎng)絡(luò)的發(fā)展也出現(xiàn)了分歧。主要分為兩派,一個(gè)是Docker原生的CNM(Container Network Model),另一個(gè)是兼容性更好的CNI(Container Network Interface)。Kuryr相應(yīng)的也出現(xiàn)了兩個(gè)分支,一個(gè)是kuryr-libnetwork(CNM),另一個(gè)是kuryr-kubernetes(CNI)。

    kuryr-libnetwork是運(yùn)行在Libnetwork框架下的一個(gè)plugin,替換了原有的docker engine,成為一個(gè)kuryr就是libnetwork的一個(gè)remote-driver,現(xiàn)在是docker的推薦remote-driver。
    其實(shí)實(shí)際上kuryr起了一個(gè)http服務(wù),23750端口,提供了libnetwork的所有接口,docker找到以后通過(guò)這個(gè)與kuryr通信。
    kuryr借用了neutron的subnetpool,保證了子網(wǎng)間ip的不重復(fù)
    實(shí)現(xiàn)原理
    在上面zun調(diào)用docker模塊創(chuàng)建容器的時(shí)候,也會(huì)進(jìn)行網(wǎng)絡(luò)的配置,就在這里。
    先檢查docker網(wǎng)絡(luò)是否存在,不存在就創(chuàng)建,創(chuàng)建的docker網(wǎng)絡(luò)name就是neutron的uuid,會(huì)調(diào)用neutron創(chuàng)建一個(gè)port,即容器的port是zun創(chuàng)建的,不是kuryr創(chuàng)建的
    然后對(duì)于虛擬網(wǎng)卡,會(huì)虛擬出一個(gè)tap設(shè)備,其中容器內(nèi)部命名空間有一個(gè)t_cxxxx的設(shè)備,兩個(gè)通過(guò)veth pair連接起來(lái)。然后tap設(shè)備會(huì)連接到qbr的linuxbridge網(wǎng)橋,隨后網(wǎng)橋通過(guò)qvb和qvo的veth連接到br-int集成網(wǎng)橋。
    其實(shí)哦在那個(gè)接一下kuryr的作用就是把neutron的port綁定在容器上。

    SDN

    軟件定義網(wǎng)絡(luò),是網(wǎng)絡(luò)虛擬化的一種實(shí)現(xiàn)方式。
    主要體現(xiàn)在如下三個(gè)方面:

    • 轉(zhuǎn)發(fā)與控制分離:SDN具有轉(zhuǎn)發(fā)與控制分離的特點(diǎn),采用SDN控制器實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)涞氖占⒙酚傻挠?jì)算、流表的生成及下發(fā)、網(wǎng)絡(luò)的管理與控制等功能;而網(wǎng)絡(luò)層設(shè)備僅負(fù)責(zé)流量的轉(zhuǎn)發(fā)及策略的執(zhí)行。通過(guò)這種方式可使得網(wǎng)絡(luò)系統(tǒng)的轉(zhuǎn)發(fā)面和控制面獨(dú)立發(fā)展,轉(zhuǎn)發(fā)面向通用化、簡(jiǎn)單化發(fā)展,成本可逐步降低;控制面可向集中化、統(tǒng)一化發(fā)展,具有更強(qiáng)的性能和容量。
    • 控制邏輯集中:轉(zhuǎn)發(fā)與控制分離之后,使得控制面向集中化發(fā)展。控制面的集中化,使得SDN控制器擁有網(wǎng)絡(luò)的全局靜態(tài)拓?fù)?#xff0c;全網(wǎng)的動(dòng)態(tài)轉(zhuǎn)發(fā)表信息,全網(wǎng)絡(luò)的資源利用率,故障狀態(tài)等。因此,SDN控制器可實(shí)現(xiàn)基于網(wǎng)絡(luò)級(jí)別的統(tǒng)一管理、控制和優(yōu)化,更可依托全局的拓?fù)涞膭?dòng)態(tài)轉(zhuǎn)發(fā)信息幫助實(shí)現(xiàn)快速的故障定位和排除,提高運(yùn)營(yíng)效率。
    • 網(wǎng)絡(luò)能力開放化:SDN還有一個(gè)重要特征是支持網(wǎng)絡(luò)能力開放化。通過(guò)集中的SDN控制器實(shí)現(xiàn)網(wǎng)絡(luò)資源的統(tǒng)一管理、整合以及虛擬化后,采用規(guī)范化的北向接口為上層應(yīng)用提供按需分配的網(wǎng)絡(luò)資源及服務(wù),進(jìn)而實(shí)現(xiàn)網(wǎng)絡(luò)能力開放。這樣的方式打破了現(xiàn)有網(wǎng)絡(luò)對(duì)業(yè)務(wù)封閉的問(wèn)題,是一種突破性的創(chuàng)新。

    OpenFlow

    OpenFlow是一種網(wǎng)上通信協(xié)議,屬于數(shù)據(jù)鏈路層,允許控制器直接訪問(wèn)和操作網(wǎng)絡(luò)設(shè)備的轉(zhuǎn)發(fā)平面,借此改變數(shù)據(jù)包的走向。這些設(shè)備可以是物理設(shè)備也可以是虛擬交換機(jī)。
    轉(zhuǎn)發(fā)平面基于流的方式轉(zhuǎn)發(fā)。
    網(wǎng)絡(luò)設(shè)備會(huì)維護(hù)若干個(gè)流表,數(shù)據(jù)流只按照流表進(jìn)行轉(zhuǎn)發(fā),而流表的生成與維護(hù)都是控制器做的事。
    這里的流表不僅僅是IP五元組,而是還有這一些關(guān)鍵詞和執(zhí)行動(dòng)作等。在實(shí)際使用中可以根據(jù)需要的粒度進(jìn)行一個(gè)限制,比如如果想要粗粒度,只需要設(shè)置IP就好了,不需要設(shè)置其他的參數(shù)比如端口之類的。

    OF 1.0

    一個(gè)流表包含一個(gè)流表項(xiàng)的集合(包頭域)、活動(dòng)計(jì)數(shù)器以及一個(gè)操作集。
    所有流過(guò)交換機(jī)的數(shù)據(jù)包都需要進(jìn)行流表的匹配,如果匹配成功,執(zhí)行相應(yīng)的操作,如果沒(méi)有匹配上,將其轉(zhuǎn)發(fā)到控制器,由控制器決定如何處理這個(gè)數(shù)據(jù)包。
    這個(gè)包頭域會(huì)根據(jù)數(shù)據(jù)包的信息進(jìn)行相應(yīng)的匹配,使用的是12元組

    • 入口:交換機(jī)端口
    • 以太網(wǎng)源端口
    • 以太網(wǎng)源IP
    • 以太網(wǎng)類型:VLAN是0x8100,ARP是0x0806、IP是0x0800
    • VLAN ID
    • VLAN優(yōu)先級(jí)
    • 源IP
    • 目的IP
    • IP協(xié)議:TCP6、UDP7、ICMP1
    • IP ToS位
    • 源端口
    • 目的端口

    活動(dòng)計(jì)數(shù)器包含有多個(gè)計(jì)數(shù)器,會(huì)根據(jù)匹配的數(shù)據(jù)包進(jìn)行一個(gè)更新。

    • 流表:流表的匹配數(shù)據(jù)包數(shù)
    • 流表項(xiàng)flow:每一項(xiàng)接收的數(shù)據(jù)包字節(jié)數(shù)、數(shù)據(jù)包個(gè)數(shù)、延遲等
    • 端口:每個(gè)端口接收到的數(shù)據(jù)包數(shù)、字節(jié)數(shù)、轉(zhuǎn)發(fā)的數(shù)據(jù)包數(shù)、字節(jié)數(shù)等
    • 隊(duì)列:轉(zhuǎn)發(fā)的數(shù)據(jù)包數(shù)

    操作集規(guī)定了對(duì)匹配成功數(shù)據(jù)包進(jìn)行什么操作,可以有0到多個(gè)操作,如果沒(méi)有相應(yīng)操作,丟棄數(shù)據(jù)包。
    一些基本的操作有:

    • ALL:給除了入口的所有接口發(fā)出數(shù)據(jù)包
    • Controller:發(fā)給控制器
    • INN PORT:往入口發(fā)送數(shù)據(jù)包
    • DROP:丟棄

    還有一些可選的

    • NORMAL:傳統(tǒng)交換機(jī)的正常轉(zhuǎn)發(fā)
    • FLOOD:泛洪至除了入口以外的所有出口
    • 修改域:這個(gè)功能比較厲害,它可以對(duì)數(shù)據(jù)包里面的信息進(jìn)行修改隨后轉(zhuǎn)發(fā),比如可以修改VLAN ID、VLAN優(yōu)先級(jí)、源IP和目的IP、源端口和目的端口等信息

    OF 1.3

    主要添加了多級(jí)流表(流水線),增加了一些多控制器的支持,增加了對(duì)數(shù)據(jù)包處理的動(dòng)作
    一個(gè)流表項(xiàng)的組成

    • 匹配域
    • 優(yōu)先級(jí)
    • 計(jì)數(shù)器
    • 超時(shí)時(shí)間
    • 指令
    • cookie

    將原來(lái)的動(dòng)作變更為指令,然后允許數(shù)據(jù)包在流表之間跳轉(zhuǎn)。
    不同于1.0的十二元組,這里其實(shí)有四十多個(gè)字段,但是一般大多數(shù)用不到,主要也就是那么些。
    有一個(gè)指令是go-to-table:轉(zhuǎn)向另一個(gè)流表
    如果沒(méi)有這個(gè),會(huì)有以下幾個(gè)動(dòng)作

    • output:指定端口轉(zhuǎn)發(fā)出去
    • drop:丟棄
    • push-tag或者pop-tag:對(duì)VLAN等ID進(jìn)行處理
    • setField:識(shí)別匹配的字段,并且可以修改
    • change-TTL:修改數(shù)據(jù)包的TTL值

    同時(shí) 還需要支持table-miss,就是說(shuō)如果沒(méi)有匹配成功,進(jìn)行什么樣的動(dòng)作,轉(zhuǎn)給控制器還是丟棄。

    Django

    概述

    Django是一個(gè)開放源代碼的web應(yīng)用框架,使用python寫成。本身是基于MVC模型的,實(shí)際采用了MTV的框架模式,即模型(Model)、模(Templates)板和視圖(Views)。其中:

    • 模型:數(shù)據(jù)存取曾,處理所有與數(shù)據(jù)有關(guān)的事務(wù),比如如何存取數(shù)據(jù)、驗(yàn)證有效性等
    • 模板:表現(xiàn)層,比如如何在頁(yè)面或者其他類型文檔中顯示
    • 視圖:業(yè)務(wù)邏輯層,處理數(shù)據(jù)存儲(chǔ)以及調(diào)用模板的邏輯

    簡(jiǎn)單流程:
    用戶通過(guò)瀏覽器向我們的服務(wù)器發(fā)起一個(gè)請(qǐng)求(request),這個(gè)請(qǐng)求會(huì)去訪問(wèn)視圖函數(shù):
    a.如果不涉及到數(shù)據(jù)調(diào)用,那么這個(gè)時(shí)候視圖函數(shù)直接返回一個(gè)模板也就是一個(gè)網(wǎng)頁(yè)給用戶。
    b.如果涉及到數(shù)據(jù)調(diào)用,那么視圖函數(shù)調(diào)用模型,模型去數(shù)據(jù)庫(kù)查找數(shù)據(jù),然后逐級(jí)返回。
    視圖函數(shù)把返回的數(shù)據(jù)填充到模板中空格中,最后返回網(wǎng)頁(yè)給用戶。

    Django的主要目的是簡(jiǎn)單快捷的開發(fā)數(shù)據(jù)驅(qū)動(dòng)的網(wǎng)站,強(qiáng)調(diào)代碼復(fù)用,多個(gè)組件可以很方便的以插件形式服務(wù)與整個(gè)框架。
    有以下幾個(gè)特點(diǎn):

  • 對(duì)象關(guān)系映射(ORM):通過(guò)定義映射類構(gòu)建數(shù)據(jù)結(jié)構(gòu),并且將模型與數(shù)據(jù)庫(kù)連接起來(lái),使用ORM框架內(nèi)置的接口即可方便快捷操作數(shù)據(jù)庫(kù)
  • URL設(shè)計(jì):可以設(shè)計(jì)匹配任意地URL.(支持正則表達(dá)式)
  • 模板系統(tǒng):提供可擴(kuò)展的模板,模板還可以繼承
  • Auth認(rèn)真那個(gè)系統(tǒng),提供有一個(gè)后臺(tái)管理界面,可以進(jìn)行用戶認(rèn)證以權(quán)限認(rèn)證
  • 國(guó)際化:內(nèi)置國(guó)際化,開發(fā)出多語(yǔ)言的網(wǎng)站
  • Cache系統(tǒng):完善的緩存系統(tǒng):支持多種緩存方式
  • 表單處理:生成各種表單,還可以對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證
  • MVC和MTV

    MVC:
    核心思想是解耦

    • model:對(duì)數(shù)據(jù)庫(kù)的底層封裝
    • view:向用戶展示結(jié)果
    • controller:核心,處理請(qǐng)求、獲取數(shù)據(jù)、返回結(jié)果


    MVT:

    • model:與數(shù)據(jù)庫(kù)進(jìn)行交互
    • views:核心,接受請(qǐng)求,獲取處理數(shù)據(jù),返回結(jié)果
    • template:呈現(xiàn)內(nèi)容到瀏覽器上

    views里處理業(yè)務(wù)邏輯比如登錄驗(yàn)證、數(shù)據(jù)處理等
    model里面不需要編寫一句sql,ORM會(huì)自動(dòng)轉(zhuǎn)為sql去執(zhí)行。
    數(shù)據(jù)庫(kù)里每一行數(shù)據(jù)就是一個(gè)對(duì)象,每一個(gè)表是一個(gè)集合,python用列表表示這個(gè)集合
    template呈現(xiàn)頁(yè)面,用css和js渲染html等
    還需要一個(gè) URL 分發(fā)器,它的作用是將一個(gè)個(gè) URL 的頁(yè)面請(qǐng)求分發(fā)給不同的 View 處理,View 再調(diào)用相應(yīng)的 Model 和 Template,MTV 的響應(yīng)模式如下所示

    和Flask Tornado的區(qū)別

    Django提供了更多的組件支持,讓開發(fā)變得更加方便。
    比如

    • ORM對(duì)象關(guān)系映射,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,不需要編寫sql語(yǔ)句
    • Admin管理后臺(tái)
    • 模板
    • 表單
    • 認(rèn)證權(quán)限
    • 緩存
    • session機(jī)制

    Flask輕量級(jí)輕在它本身是一個(gè)內(nèi)核,其他功能都需要擴(kuò)展實(shí)現(xiàn)。比如可以引入其他模塊實(shí)現(xiàn)ORM,也沒(méi)有默認(rèn)數(shù)據(jù)庫(kù),但是可以自行配置使用mysq或者nosql,性能比Django好。依賴于Werkzurg WSGI路由模塊和jinja2模板。
    對(duì)于路由的匹配

    • Django使用過(guò)urls.py種對(duì)路由進(jìn)行字符串的匹配,選擇匹配的views.py函數(shù)進(jìn)行業(yè)務(wù)處理
    • Flask則是使用裝飾器給一個(gè)函數(shù)配置一個(gè)路由,然后進(jìn)行處理

    Tornado
    功能少而精,非阻塞式異步設(shè)計(jì)方式。

    • iostream:對(duì)非阻塞式socket進(jìn)行封裝
    • ioloop:對(duì)IO多路復(fù)用進(jìn)行封裝,實(shí)現(xiàn)單例

    Tornado是一個(gè)使用python開發(fā)的全棧式的web框架和一部網(wǎng)絡(luò)庫(kù),使用非阻塞式IO,可以處理數(shù)以萬(wàn)計(jì)的開放鏈接,常用于long polling、web sockets和其他需要維護(hù)長(zhǎng)連接應(yīng)用的選擇。
    主要分為四個(gè)部分

    • Web框架(RequestHandler,用于創(chuàng)建Web的基類支持各種類)
    • 實(shí)現(xiàn)HTTP的客戶端和服務(wù)器端(HTTPServer、AsyncHTTPClient)
    • 異步網(wǎng)絡(luò)庫(kù)(IOLoop、IOStream)
    • 協(xié)程庫(kù)(tornado.gen),使得異步調(diào)用代碼可以更好編寫

    tornado的性能比django和flask好就是因?yàn)槠涞讓觟o處理機(jī)制是根本不同。

    • tornado、gevent、syncio、aiohttp:事件循環(huán)+協(xié)程
    • django、flask:

    Django請(qǐng)求生命周期

    瀏覽器輸入網(wǎng)址,發(fā)送請(qǐng)求到服務(wù)器
    匹配路由
    url經(jīng)過(guò)uWSGI->WSGI,然后經(jīng)過(guò)中間件的處理,在urls.py路由映射中找到一個(gè)匹配的路由,從上到下依次匹配,匹配一個(gè)就可以停了
    視圖處理
    匹配到url以后,跳轉(zhuǎn)到對(duì)應(yīng)的視圖函數(shù)進(jìn)行相應(yīng)的業(yè)務(wù)處理,比如操作數(shù)據(jù)庫(kù)等
    返回響應(yīng)
    先經(jīng)過(guò)中間件對(duì)返回的數(shù)據(jù)再進(jìn)行處理,然后返回相應(yīng)的頁(yè)面文件,由瀏覽器渲染以后顯示給用戶,同時(shí)將模板內(nèi)容填充到html空白處。

    一些額外的
    在匹配路由的時(shí)候,有兩種方式,是CBV、FBV

    • FBV(function base views):一個(gè)url對(duì)應(yīng)一個(gè)視圖函數(shù)
    • CBV(class base views):一個(gè)url對(duì)應(yīng)一個(gè)類,會(huì)根據(jù)請(qǐng)求的方法調(diào)用對(duì)應(yīng)的函數(shù)

    CBV,url匹配成功后會(huì)自動(dòng)去找dispatch方法,然后Django會(huì)通過(guò)dispatch反射的方式找到類中對(duì)應(yīng)的方法并執(zhí)行,類方法執(zhí)行完成以后,返回的結(jié)果回傳給dispatch()
    對(duì)應(yīng)類的話如下所示

    #urls.py urlpatterns = [url(r'^fbv/',views.fbv),url(r'^cbv/',views.CBV.as_view()), ]#views.py form django.views import Views class CBV(Views):def get(self,request):return render(request,'cbv/xx/html',context)def post(self,request):return HttpResponse('...')

    常見的web應(yīng)用程序

    框架組件

  • 序列化組件:進(jìn)行序列化并且對(duì)數(shù)據(jù)格式進(jìn)行驗(yàn)證
  • 路由組件:對(duì)請(qǐng)求進(jìn)行路由分發(fā)
  • 視圖組件:對(duì)請(qǐng)求進(jìn)行業(yè)務(wù)處理
  • 認(rèn)證組件:寫一個(gè)類并注冊(cè)到認(rèn)證類(authentication_classes),在類的的authticate方法中編寫認(rèn)證邏
  • 權(quán)限組件:寫一個(gè)類并注冊(cè)到權(quán)限類(permission_classes),在類的的has_permission方法中編寫認(rèn)證邏輯。
  • 頻率:寫一個(gè)類并注冊(cè)到頻率類(throttle_classes),在類的的allow_request/wait 方法中編寫認(rèn)證邏輯
  • 解釋器:選擇對(duì)數(shù)據(jù)解析的類,在解析器類中注冊(cè)(parser_classes)
  • 渲染器:定義數(shù)據(jù)如何渲染到到頁(yè)面上,在渲染器類中注冊(cè)(renderer_classes)
  • 分頁(yè):對(duì)獲取到的數(shù)據(jù)進(jìn)行分頁(yè)處理, pagination_class
  • 版本:用來(lái)控制不同版本客戶端的不同行為
  • RestFramework

    面向資源是REST最明顯的特征,資源是一種看待服務(wù)器的方式,將服務(wù)器看作是由很多離散的資源組成。每個(gè)資源是服務(wù)器上一個(gè)可命名的抽象概念。因?yàn)橘Y源是一個(gè)抽象的概念,所以它不僅僅能代表服務(wù)器文件系統(tǒng)中的一個(gè)文件、數(shù)據(jù)庫(kù)中的一張表等等具體的東西,可以將資源設(shè)計(jì)的要多抽象有多抽象,只要想象力允許而且客戶端應(yīng)用開發(fā)者能夠理解。
    可以使用URI統(tǒng)一資源標(biāo)識(shí)符標(biāo)記一個(gè)服務(wù)器的資源,通過(guò)不同的http方法對(duì)資源進(jìn)行相應(yīng)的操作。這里的資源可以是一個(gè)文本文件、視頻、圖片等。
    符合REST架構(gòu)設(shè)計(jì)的API就是restful api。

    繼承APIView
    @api_view([‘POST’],[‘GET’])
    在這個(gè)類中,傳入的參數(shù)是rest framework的request實(shí)例,不是django的httprequest。
    可以返回rest framework的resonse,而不是HttpResponse。
    傳入的請(qǐng)求可以進(jìn)行一些認(rèn)證
    可以指定解析器Parser對(duì)傳入的數(shù)據(jù)進(jìn)行解析,如JSON、Form等解析。

    一些功能模塊
    認(rèn)證、權(quán)限和頻率
    dispatch()方法中進(jìn)行一個(gè)判定。
    認(rèn)證和權(quán)限需要檢查request.user和request.auth是否合法,是否允許請(qǐng)求。

    緩存機(jī)制

    網(wǎng)站訪問(wèn)量過(guò)大的時(shí)候,響應(yīng)速度可能會(huì)大大降低,出現(xiàn)卡死的狀況,可以使用緩存解決這類問(wèn)題。
    緩存是將一個(gè)請(qǐng)求的響應(yīng)內(nèi)容保存到內(nèi)存、數(shù)據(jù)庫(kù)、文件或者高速緩存系統(tǒng)(memcached),如果接下來(lái)一段時(shí)間再次來(lái)同一個(gè)請(qǐng)求,就不需要執(zhí)行相應(yīng)過(guò)程,只需要讀取內(nèi)存或者高速緩存系統(tǒng)就可以了。
    Django提供5種緩存方式:

    • Memcached:一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)網(wǎng)站,減輕數(shù)據(jù)庫(kù)負(fù)載。適合在內(nèi)存中緩存數(shù)據(jù)和對(duì)象減少讀取數(shù)據(jù)庫(kù)的次數(shù),適合超大型網(wǎng)站
    • 數(shù)據(jù)庫(kù)緩存:將緩存的信息存儲(chǔ)在網(wǎng)站數(shù)據(jù)庫(kù)的緩存表中,適合中型網(wǎng)站
    • 文件系統(tǒng)緩存:緩存的信息以文本文件的格式保存下來(lái),適合中小型網(wǎng)站
    • 本地內(nèi)存緩存:默認(rèn)保存緩存的方式,緩存存放于內(nèi)存中,僅用于測(cè)試
    • 虛擬緩存:Django內(nèi)置的虛擬緩存,實(shí)際上只是提供一個(gè)接口,不實(shí)際緩存數(shù)據(jù),用于測(cè)試

    WSGI,uwsgi,uWSGI

    WSGI
    是python定義實(shí)現(xiàn)的一個(gè)web服務(wù)器和web應(yīng)用程序之間交互的一個(gè)接口,是一種規(guī)范,描述定義了服務(wù)器和應(yīng)用程序之間通信的規(guī)范。
    WSGI包括server和applicatioon兩部分。
    其中server負(fù)責(zé)接收客戶端請(qǐng)求,把request轉(zhuǎn)發(fā)給application,接收application的response返回給客戶端。
    WSGI其實(shí)是一種server和application解耦的規(guī)范,有多個(gè)實(shí)現(xiàn)server的服務(wù)器,也有多個(gè)可以實(shí)現(xiàn)WSGI application的框架,可以自由組合。比如uWSGI、Gunicorn就是實(shí)現(xiàn)了WSGI server,而Django和Flask則實(shí)現(xiàn)了WSGI application的框架,可以自由組合,比如uWSGI+Django。

    WSGI除了監(jiān)聽端口進(jìn)行解析http,還有流量轉(zhuǎn)發(fā)和管理application進(jìn)程。一般WSGI內(nèi)置的WSGI server都是單進(jìn)程,一次只能處理一個(gè)請(qǐng)求,而通用的比如gunicorn或者uwsgi都是pre fork模型,會(huì)有一個(gè)master進(jìn)行監(jiān)聽,啟動(dòng)多個(gè)slave(一個(gè)slave就是一個(gè)WSGI application)處理請(qǐng)求。

    uwsgi
    也是一種協(xié)議,用于定義傳輸信息的類型,可以和nginx等代理服務(wù)器通信
    uWSGI
    是一個(gè)web服務(wù)器,實(shí)現(xiàn)了WSGI協(xié)議、uwsgi和HTTP協(xié)議,把接收到的HTTP協(xié)議轉(zhuǎn)為支持的網(wǎng)絡(luò)協(xié)議,比如可以轉(zhuǎn)為WSGI協(xié)議,然后python可以直接使用。

    比如可以使用nginx處理靜態(tài)內(nèi)容,使用uWSGI處理動(dòng)態(tài)內(nèi)容。
    對(duì)于Django和Flask其實(shí)自己本身帶有一個(gè)簡(jiǎn)單的WSGI server,一般用于服務(wù)器調(diào)試,生產(chǎn)環(huán)境下建議使用其他的,比如manage.py runserver就是啟動(dòng)一個(gè)WSGI,只用于本地開發(fā),生產(chǎn)環(huán)境建議nginx+uwsgi+django

    請(qǐng)求的生命周期

  • wsgi接收請(qǐng)求:發(fā)給后端框架(flask或者django等)
  • 中間件處理:對(duì)請(qǐng)求進(jìn)行校驗(yàn)或者進(jìn)一步處理(如csrf、request.session)
  • 路由匹配:根據(jù)用戶請(qǐng)求的url匹配不同的視圖函數(shù)
  • 視圖函數(shù):在views.py里面處理業(yè)務(wù)邏輯
  • 中間件:對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行處理
  • wsgi:返回響應(yīng)給瀏覽器
  • 中間件的作用和應(yīng)用場(chǎng)景

    介于request和response中間對(duì)數(shù)據(jù)處理的一個(gè)流程,用于全局范圍改變django的輸入和輸出,中間件就是在視圖函數(shù)執(zhí)行之前或者之后可以執(zhí)行額外的操作。
    比如

  • csrf保護(hù),默認(rèn)開啟,會(huì)檢查請(qǐng)求的csrf token是否匹配
  • 通過(guò)中間件可以判斷用戶請(qǐng)求是否登陸等,進(jìn)行身份驗(yàn)證功能
  • 可以檢查用戶是否處于請(qǐng)求白名單或者黑名單等
  • 中間件的五個(gè)方法:

    • process_request:請(qǐng)求進(jìn)來(lái),進(jìn)行認(rèn)證等
    • process_view:路由匹配后得到視圖函數(shù)
    • process_exception:異常的時(shí)候執(zhí)行
    • process_template_responseprocess:渲染模板的時(shí)候執(zhí)行
    • process_response:請(qǐng)求有響應(yīng)的時(shí)候執(zhí)行

    這五個(gè)方法分別大概以下功能
    中間件

    • process_request(request):收到request以后,按照settings.py文件中的中間件順序依次執(zhí)行,如果返回None,則繼續(xù),如果返回HttpResponse,就返回不繼續(xù)了,也就是報(bào)錯(cuò)了
    • process_view(request, view_func, view_args, view_kwargs):執(zhí)行完上一步的方法以后,在url里面找到對(duì)應(yīng)的視圖函數(shù),然后獲取到相應(yīng)參數(shù),在執(zhí)行視圖函數(shù)之前執(zhí)行這一步。如果返回為None,則繼續(xù)執(zhí)行這個(gè)方法剩下的操作,如果返回HttpResponse,不執(zhí)行這個(gè)方法和視圖函數(shù),繼續(xù)后面的函數(shù)
    • process_exception(request, exception):如果執(zhí)行視圖函數(shù)出錯(cuò),按照settings.py中的中間件順序,倒序執(zhí)行這個(gè)方法,如果返回None,就繼續(xù)上一個(gè)方法的process_exception方法,如果返回HttpResponse,則不會(huì)被調(diào)用。也就是說(shuō),如果沒(méi)有響應(yīng),就說(shuō)明報(bào)錯(cuò),倒序一級(jí)一級(jí)報(bào)錯(cuò),如果有返回值說(shuō)明還是正常的,就繼續(xù)往下執(zhí)行后面兩個(gè)函數(shù)
    • process_template_response(request, response):response是視圖或者某一中間件的返回,只有response實(shí)現(xiàn)了render才能執(zhí)行,所有中間件的這個(gè)函數(shù)執(zhí)行完了,調(diào)用render()方法
    • process_response(request, response):在視圖函數(shù)執(zhí)行完以后執(zhí)行,必須有響應(yīng)HttpResponse

    默認(rèn)的中間件

    有幾個(gè)默認(rèn)配置的中間件,主要功能如下

    • django.middleware.security.SecurityMiddleware:防止xss腳本過(guò)濾的安全改進(jìn)
    • django.contrib.sessions.middleware.SessionMiddleware:開始session會(huì)話支持,可以使用session,不開啟就不能session保存數(shù)據(jù)
    • django.contrib.messages.middleware.MessageMiddleware:提供cookie的功能支持
    • django.middleware.common.CommonMiddleware:用來(lái)重寫URL。如果APPEND_SLASH為True,那么URL末尾沒(méi)有斜杠或者沒(méi)有找到對(duì)應(yīng)匹配的時(shí)候,會(huì)自動(dòng)添加末尾斜杠;PREPEND_WWW為True則會(huì)將沒(méi)有www.開頭的URL重定向到同樣的www.開頭的URL路由
    • django.middleware.csrf.CsrfViewMiddleware:跨站請(qǐng)求偽造就不說(shuō)了
    • django.contrib.auth.middleware.AuthenticationMiddleware:收到request后,可以對(duì)user對(duì)象添加相應(yīng)的HttpRequest屬性,表示當(dāng)前用戶身份呢

    django中的csrf實(shí)現(xiàn)機(jī)制

  • django第一次接收到客戶端的請(qǐng)求時(shí),隨機(jī)生成一個(gè)隨機(jī)數(shù),保存在session中,同時(shí)放在cookie里面返回給客戶端
  • 在前端需要發(fā)送請(qǐng)求到后端時(shí),需要將token加入到請(qǐng)求數(shù)據(jù)或者頭部數(shù)據(jù)中
  • 后端會(huì)校驗(yàn)傳來(lái)的token和session里面的token是否一致
  • 基于django的ajax發(fā)送請(qǐng)求給后端如何攜帶token

    CSRF跨站請(qǐng)求偽造,是一種對(duì)網(wǎng)站的惡意利用、竊取網(wǎng)站用戶信息制造惡意請(qǐng)求。
    為了防護(hù)這類攻擊,在用戶提交表單的時(shí)候,表單中會(huì)自動(dòng)加入一個(gè)叫csrfmiddlewaretoken的隱藏控件,后臺(tái)也保存有這個(gè)控件的值,當(dāng)請(qǐng)求到達(dá)后端時(shí),服務(wù)器會(huì)檢查這個(gè)值,如果匹配則進(jìn)行后續(xù)處理,否則不處理。
    原理:

  • 用戶訪問(wèn)網(wǎng)頁(yè)的時(shí)候,django會(huì)在表單中添加一個(gè)叫csrfmiddlewaretoken的隱藏控件,并設(shè)置一個(gè)值,然后同時(shí)保存在后臺(tái),這是一個(gè)隨機(jī)生成的
  • 當(dāng)用戶提交表單的時(shí)候,服務(wù)器會(huì)對(duì)比用戶表單里的這個(gè)token和自己的token,判斷是否合法
  • 如果請(qǐng)求是從其他地方發(fā)過(guò)來(lái)的,那他不會(huì)知道這個(gè)token,因此后臺(tái)會(huì)校驗(yàn)失敗,請(qǐng)求就不會(huì)被處理
  • 但是XSRF防護(hù)一般只適用于POST請(qǐng)求,不能防護(hù)GET,因?yàn)镚ET一般是制度性是訪問(wèn)網(wǎng)頁(yè)資源,不會(huì)涉及資源的更新和修改等操作。
    在前端的form表單中添加{% csrf_token %}即可

  • 使用模板填充
  • data:{csrfmiddlewaretoken:'{{csrf_token}}' }
  • 在form中設(shè)置一個(gè)隱藏控件,如標(biāo)簽,填充內(nèi)容為token,然后獲取控件的值
  • 從cookie中獲取token,放入頭部。headers:{ “X-CSRFtoken”😒.cookie(“csrftoken”)}
  • 如果不想使用csrf防護(hù),前端取消這個(gè)模板語(yǔ)法,后端在對(duì)應(yīng)視圖函數(shù)簽名添加一個(gè)裝飾器@csrf_execpt即可。如果只刪除前者不修改后者,訪問(wèn)會(huì)報(bào)錯(cuò)403未授權(quán)。
    如果需要對(duì)整個(gè)網(wǎng)站取消CSRF,settings.py里面刪除這個(gè)中間件即可。

    ajax請(qǐng)求的csrf解決方法

    在POST請(qǐng)求中設(shè)置請(qǐng)求參數(shù)csrfmiddlewaretoken,否則會(huì)認(rèn)為是惡意請(qǐng)求,需要獲取這個(gè)控件的值。
    如下

    function submitForm(){var csrf=$('input[name="csrfmiddlewaretoken"]').val();...$.ajax({...data:{'csrfmiddlewaretoken':csrf,...}...}) }

    為什么不使用django的runserver部署(runserver和uWSGI的區(qū)別)

  • runserver方法是調(diào)試 Django 時(shí)經(jīng)常用到的運(yùn)行方式,它使用Django自帶的
    WSGI Server 運(yùn)行,主要在測(cè)試和開發(fā)中使用,并且 runserver 開啟的方式也是單進(jìn)程 。
  • uWSGI是一個(gè)Web服務(wù)器,它實(shí)現(xiàn)了WSGI協(xié)議、uwsgi、http 等協(xié)議。注意uwsgi是一種通信協(xié)議,而uWSGI是實(shí)現(xiàn)uwsgi協(xié)議和WSGI協(xié)議的 Web 服務(wù)器。uWSGI具有超快的性能、低內(nèi)存占用和多app管理等優(yōu)點(diǎn),并且搭配著Nginx就是一個(gè)生產(chǎn)環(huán)境了,能夠?qū)⒂脩粼L問(wèn)請(qǐng)求與應(yīng)用 app 隔離開,實(shí)現(xiàn)真正的部署 。相比來(lái)講,支持的并發(fā)量更高,方便管理多進(jìn)程,發(fā)揮多核的優(yōu)勢(shì),提升性能。
  • Kubernetes

    k8s是為容器而生的一個(gè)可以指容器的編排管理工具,主要應(yīng)用于云原生領(lǐng)域。
    主要提供了以下幾種功能:

    • 服務(wù)發(fā)現(xiàn)與調(diào)度
    • 負(fù)載均衡
    • 服務(wù)自愈
    • 服務(wù)彈性擴(kuò)容
    • 橫向擴(kuò)容
    • 存儲(chǔ)卷掛載

    集群主要由Master節(jié)點(diǎn)和Node節(jié)點(diǎn)組成。
    Master節(jié)點(diǎn)是集群控制節(jié)點(diǎn),接收控制命令進(jìn)行具體執(zhí)行,主要包括kube-controller-manager和kube-scheduler和etcd,前者負(fù)責(zé)管理所有資源對(duì)象、維護(hù)集群狀態(tài)(故障檢測(cè)和自動(dòng)擴(kuò)展等);后者負(fù)責(zé)資源調(diào)度,按照相應(yīng)策略將Pod調(diào)度到對(duì)應(yīng)的機(jī)器上,主要包括kube-proxy代理pod網(wǎng)絡(luò)定期從etcd獲取service信息相應(yīng)執(zhí)行、kubelet作為agent接受分配pods任務(wù)和管理容器定期獲取容器數(shù)據(jù)傳給kube-apiserver;etcd則負(fù)責(zé)保存整個(gè)集群的狀態(tài)。
    是自動(dòng)化容器操作的開源平臺(tái),主要包括:部署、調(diào)度和節(jié)點(diǎn)集群間擴(kuò)展
    具體功能:

    • 自動(dòng)化容器部署和復(fù)制
    • 實(shí)時(shí)彈性收縮容器規(guī)模
    • 容器編排成組并提供負(fù)載均衡
    • 調(diào)度,決定容器在哪個(gè)節(jié)點(diǎn)運(yùn)行

    什么是容器編排
    可以使用某種工具配置完成一組容器以及相應(yīng)的資源如網(wǎng)絡(luò)、CPU等資源的定義、配置、創(chuàng)建、刪除等管理工作。

    服務(wù)配置
    Master節(jié)點(diǎn)部署

    • controller manager:負(fù)責(zé)容器編排,可以通過(guò)restful api給api server發(fā)起請(qǐng)求,獲取集群內(nèi)所有對(duì)象的信息,當(dāng)檢測(cè)到一些故障的時(shí)候可以進(jìn)行相應(yīng)的干預(yù)。Controller一般包括:Namespace Controller、Node Controller、Service Controller、Token Controller等
    • api server:對(duì)外提供api,接受請(qǐng)求
    • scheduler:接收來(lái)自api-server發(fā)來(lái)的請(qǐng)求,準(zhǔn)備床創(chuàng)建Pod任務(wù),之后會(huì)檢索出符合這個(gè)Pod的Node節(jié)點(diǎn),中選擇一個(gè)合適的進(jìn)行調(diào)度創(chuàng)建
    • etcd:k8s沒(méi)有使用單獨(dú)的數(shù)據(jù)庫(kù),而是使用etcd作為數(shù)據(jù)存儲(chǔ)。因?yàn)閗8s中數(shù)據(jù)是隨時(shí)會(huì)變化的,比如用戶提交了一個(gè)任務(wù)、創(chuàng)建新Node、節(jié)點(diǎn)宕機(jī)等都需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,然后同時(shí)新的變化也需要讓各個(gè)服務(wù)能夠感知到。etcd的其中一個(gè)特性就是可以調(diào)用api監(jiān)聽到相應(yīng)的數(shù)據(jù)i需改情況,有修改etcd會(huì)自動(dòng)推送到客戶端,有什么通知scheduler和controller manager只需要把消息放在etcd里面就行了不需要挨個(gè)通知

    Node節(jié)點(diǎn)部署

    • kubelet:相當(dāng)于agent,負(fù)責(zé)維護(hù)容器的生命周期、卷和網(wǎng)絡(luò)的管理。通過(guò)api-server監(jiān)聽scheduler是否有pod綁定事件,有的話就從etcd獲取相應(yīng)信息創(chuàng)建Pod。同時(shí)進(jìn)行Pod的監(jiān)視,定期將狀態(tài)或發(fā)生的事件告知給其他各個(gè)組件
    • kube-proxy:負(fù)責(zé)微Service提供集群內(nèi)的服務(wù)發(fā)現(xiàn)和負(fù)載均衡。是一個(gè)守護(hù)進(jìn)程,以Watcher的方式不斷監(jiān)控Pod,如果有什么變動(dòng)比如IP變了,就會(huì)修改相應(yīng)的規(guī)則策略,比如IP變了會(huì)修改相應(yīng)的iptables。之后負(fù)載均衡的時(shí)候就會(huì)根據(jù)proxy制定下發(fā)的策略進(jìn)行實(shí)現(xiàn)了。
    • Networking
    • Volume Plugin
    • Container Runtime:負(fù)責(zé)運(yùn)行容器的軟件,支持多個(gè)Docker、Container等任何實(shí)現(xiàn)接口的

    Pod

    Pod是k8s最基本的操作單元,包含一個(gè)或多個(gè)相關(guān)的容器,是最小部署單元,其實(shí)代表一個(gè)集群中運(yùn)行的一個(gè)進(jìn)程。
    一個(gè)Pod可以被一個(gè)容器化的環(huán)境看成應(yīng)用層的邏輯宿主機(jī),一個(gè)Pod內(nèi)的多個(gè)容器通常緊密耦合,在Node上被創(chuàng)建、啟動(dòng)或者銷毀,每個(gè)Pod還運(yùn)行一個(gè)特殊的Volume掛載卷,使得容器間數(shù)據(jù)通信比較方便。
    同一個(gè)Pod的使用localhost就可以通信,共享一下五種資源:

    • 進(jìn)程號(hào)命名空間:Pod中不同應(yīng)用程序可以看到其他應(yīng)用程序的進(jìn)程ID
    • 網(wǎng)絡(luò)命名空間:多個(gè)容器訪問(wèn)同一個(gè)IP和端口范圍,每個(gè)Pod共享一個(gè)IP
    • UTS命名空間:共享一個(gè)主機(jī)名。使用Pod名作為主機(jī)名
    • 進(jìn)程間通信命名空間:可以使用SystemV IC和POSIX消息隊(duì)列通信
    • Volume:共享存儲(chǔ)卷,各個(gè)容器可以訪問(wèn)
    Pod控制器

    kubernetes的控制器
    稱為工作負(fù)載,用于實(shí)現(xiàn)管理Pod的中間層,確保Pod的運(yùn)行時(shí)符合預(yù)期的,以及出現(xiàn)故障后應(yīng)該采取什么策略措施,比如重啟或者重建。
    Controller在集群上運(yùn)行和管理各個(gè)Pod
    Pod控制器實(shí)現(xiàn)Pod的運(yùn)維,伸縮等
    控制器類型

    • ReplicaSet(RS):保證一定數(shù)量的Pod運(yùn)行,并且監(jiān)控Pod的狀態(tài),當(dāng)出現(xiàn)故障的時(shí)候,會(huì)進(jìn)行重啟,如果重啟失敗則會(huì)重新創(chuàng)建。(也就是自愈機(jī)制)
    • Deployment:工作在ReplicaSet之上,管理無(wú)狀態(tài)應(yīng)用,是最好用的控制器,提供有滾動(dòng)更新和回滾的功
    • DaemonSet:確保集群中的每一個(gè)節(jié)點(diǎn)只運(yùn)行特定的Pod副本,常用于實(shí)現(xiàn)系統(tǒng)級(jí)后臺(tái)任務(wù);服務(wù)是無(wú)特性的,必須要守護(hù)進(jìn)程
    • StatefulSet:管理有應(yīng)用
    • Job:一旦完成任務(wù)就會(huì)立刻退出,不需要重啟或者中間(一次性)
    • CronJob:周期任務(wù),不需要手動(dòng)執(zhí)行,自動(dòng)定期運(yùn)行

    Replica Set和Replica Controller的區(qū)別
    功能都差不多,都是保證一定數(shù)量的Pod的運(yùn)行,不同之處在于兩者對(duì)于Pods的復(fù)制策略不同。
    前者使用基于集合的選擇器,后者使用基于權(quán)限的選擇器。
    后者允許通過(guò)標(biāo)簽鍵值進(jìn)行選擇。
    Set是更好的,可以對(duì)多個(gè)標(biāo)簽進(jìn)行選擇匹配

    云控制器的理解
    最初目的是使得云服務(wù)商的代碼和k8s的核心代碼獨(dú)立解耦,使得云控制器可以和k8s的組件(controller manager或者api等)一起使用,也可以作為插件在k8s中使用。其設(shè)計(jì)是基于插件機(jī)制的,所以很容易和k8s集成

    • 節(jié)點(diǎn)控制器:從云服務(wù)提供商獲取到集群中運(yùn)行的節(jié)點(diǎn)信息,并且對(duì)節(jié)點(diǎn)初始化。
      • 以云服務(wù)特定區(qū)域/低于標(biāo)簽初始化
      • 以云服務(wù)特定的實(shí)例詳細(xì)信息(如類型和規(guī)格等)初始化
      • 獲取節(jié)點(diǎn)的網(wǎng)絡(luò)地址和hostname
      • 檢查狀態(tài),看節(jié)點(diǎn)是否還存在于云服務(wù)中,如果不存在在k8s中也將其刪除
    • 卷控制器:在創(chuàng)建卷比如AWS的卷的時(shí)候,添加相應(yīng)的標(biāo)簽,用戶不需要手動(dòng)添加標(biāo)簽了。因?yàn)橹挥刑幱谕粋€(gè)區(qū)域地區(qū)才有用,用標(biāo)簽保證吧
    • 路由控制器:負(fù)責(zé)在云服務(wù)中配置相應(yīng)的路由,使得k8s中的容器可以相互之間進(jìn)行通信,只適用于谷歌計(jì)算引擎集群
    • 服務(wù)控制器:監(jiān)聽服務(wù)的創(chuàng)建、刪除和修改事件。比如說(shuō)基于當(dāng)前的k8s狀態(tài)配置云負(fù)載均衡服務(wù),可以保證服務(wù)后端始終是最新狀態(tài)

    支持四種服務(wù)類型

    • Cluster IP(集群IP):啟動(dòng)多個(gè)集群內(nèi)的Pod通信服務(wù),相當(dāng)于是一個(gè)內(nèi)部通信,可以進(jìn)行內(nèi)部調(diào)試之類的
    • Node Port(節(jié)點(diǎn)端口):將主機(jī)上的隨機(jī)端口流量準(zhǔn)發(fā)到路由器的隨機(jī)端口去。有些缺點(diǎn):外部不能用locahhost、每次Pod啟動(dòng)IP都會(huì)變,無(wú)法設(shè)置DNS
    • LoadBalancer(負(fù)載均衡):
    • Ingress:是一個(gè)規(guī)則集合,作為集群的入口點(diǎn),主要負(fù)責(zé)將入站鏈接配置為可達(dá)的URL,負(fù)載平衡流量以及基于名稱的對(duì)外提供虛擬服務(wù)器功能。其實(shí)像一個(gè)API服務(wù),對(duì)外提供API進(jìn)行調(diào)用

    什么是Headless Service
    又叫無(wú)頭服務(wù),是一種特殊的服務(wù)類型。
    ClusterIP是None,運(yùn)行時(shí)不會(huì)給分配IP,可以通過(guò)查詢Server的DNS獲得所有Server和Pod的地址信息,可以根據(jù)自己的需求決定使用哪個(gè)Server
    一般結(jié)合StatefulSet來(lái)部署有狀態(tài)的應(yīng)用,比如kafka集群,mysql集群,zk集群等
    服務(wù)發(fā)現(xiàn)
    k8s使用兩種方式進(jìn)行服務(wù)發(fā)現(xiàn):

    • 環(huán)境變量:創(chuàng)建一個(gè)Pod以后,kubelet會(huì)在Pod中注入集群內(nèi)所有Service相關(guān)環(huán)境變量,要求Service先于Pod創(chuàng)建
    • DNS:通過(guò)claster add-on方式創(chuàng)建kubeDNS對(duì)集群Service進(jìn)行服務(wù)發(fā)現(xiàn)

    CNI
    Container Network Interface,容器網(wǎng)絡(luò)接口式Linux容器網(wǎng)絡(luò)配置的一組標(biāo)準(zhǔn)和庫(kù),可以根據(jù)這些開發(fā)自己的容器網(wǎng)絡(luò)插件。只專注于容器網(wǎng)絡(luò)連接和容器銷毀時(shí)的資源釋放,支持大量不同的網(wǎng)絡(luò)模式。
    kuryr-libnetwork
    四層、七層負(fù)載均衡

    • 二層負(fù)載均衡:基于MAC地址
    • 三層負(fù)載均衡:基于IP地址
    • 四層負(fù)載均衡:基于IP+端口號(hào)
    • 七層負(fù)載均衡:基于URL等應(yīng)用層信息

    網(wǎng)絡(luò)模型
    每個(gè)Pod都有一個(gè)獨(dú)立IP,不管是否運(yùn)行在一個(gè)Node上的容器都可以通過(guò)IP直接訪問(wèn)
    由docker0實(shí)際分配IP;內(nèi)部看到的IP與端口和外部一致;同一個(gè)Pod內(nèi)不同容器共享網(wǎng)絡(luò)可以通過(guò)localhost通信,相當(dāng)于一個(gè)虛擬機(jī)中的多個(gè)進(jìn)程。

    Docker

    一些參考
    Docker 核心技術(shù)與實(shí)現(xiàn)原理
    Docker進(jìn)階之Cgroup介紹
    CSDN的云原生入門技能樹/容器(docker)/安裝docker

    NameSpace

    這個(gè)在linux知識(shí)點(diǎn)章節(jié)有
    當(dāng)一個(gè)容器運(yùn)行時(shí),會(huì)創(chuàng)建一系列namespace,使用命名空間將容器間進(jìn)行隔離。

    • IPC命名空間(進(jìn)程間通信):將消息隊(duì)列分離出來(lái)
    • 進(jìn)程命名空間:命名空間內(nèi)的虛擬PID可能會(huì)和外面的pid重復(fù),會(huì)映射到哇面的另一個(gè)pid
    • 網(wǎng)絡(luò)命名空間:用來(lái)隔離網(wǎng)絡(luò)資源,可以虛擬出網(wǎng)卡,而且后臺(tái)進(jìn)程可以運(yùn)行在不同的命名空間的相同端口
    • 掛載命名空間:可以將掛載點(diǎn)與系統(tǒng)分離
    • UTS命名空間:獨(dú)立出主機(jī)名和網(wǎng)絡(luò)信息服務(wù)
    • 用戶命名空間:不同空間可以存在相同ID的用戶

    命名空間的缺點(diǎn):
    隔離不徹底,因?yàn)檫€是共享宿主機(jī)的操作系統(tǒng)和內(nèi)核,有可能通過(guò)容器的某些操作可以直接影響到宿主機(jī)(給應(yīng)用暴露的攻擊面太大)
    有的資源沒(méi)法進(jìn)行命名空間隔離,比如修改容器的時(shí)間宿主機(jī)的時(shí)間也會(huì)修改。

    Cgroups

    可以對(duì)程序使用的資源進(jìn)行限制。可以限制CPU、內(nèi)存、磁盤讀寫速率、網(wǎng)絡(luò)帶寬等系統(tǒng)資源。Linux使用文件系統(tǒng)來(lái)實(shí)現(xiàn)Cgroups,cgroup是內(nèi)核提供的分組化管理的功能和接口。
    有如下幾個(gè)特點(diǎn):

    • API以偽文件系統(tǒng)的方式實(shí)現(xiàn),用戶態(tài)程序可以通過(guò)操作文件實(shí)現(xiàn)Cgroups的組織管理
    • 單元細(xì)粒度可以精確到線程級(jí)別,可以創(chuàng)建銷毀Cgroup,實(shí)現(xiàn)資源再分配和管理
    • 所有的資源管理以子系統(tǒng)的方式實(shí)現(xiàn),接口統(tǒng)一
    • 子任務(wù)剛創(chuàng)建的時(shí)候和父任務(wù)的Cgroups一致

    cgroups是內(nèi)核附加在程序上的一系列鉤子,通過(guò)程序運(yùn)行時(shí)對(duì)資源的調(diào)度觸發(fā)相應(yīng)的鉤子以達(dá)到資源追蹤和限制的目的。
    提供以下幾個(gè)功能:

    • 資源限制,對(duì)任務(wù)使用的資源進(jìn)行限制,比如限制了內(nèi)存以后,超過(guò)內(nèi)存限制會(huì)報(bào)錯(cuò)OOM
    • 優(yōu)先級(jí)分配,通過(guò)分配CPU時(shí)間片和IO帶寬大小,相當(dāng)于控制了任務(wù)運(yùn)行優(yōu)先級(jí)。
    • 資源統(tǒng)計(jì):可以統(tǒng)計(jì)資源使用情況,比如CPU使用時(shí)間,內(nèi)存使用量
    • 任務(wù)控制:可以對(duì)任務(wù)掛起、恢復(fù)

    有幾個(gè)概念:

    • task:任務(wù),指一個(gè)進(jìn)程或者線程
    • cgroup:控制組,按照某種資源控制情況劃分的任務(wù)組,包含有一個(gè)或者多個(gè)子系統(tǒng),一個(gè)任務(wù)可以加入某個(gè)cgroup,也可以從一個(gè)cgroup遷移到另一個(gè)cgroup
    • subsystem(子系統(tǒng)):每個(gè)子系統(tǒng)就是一個(gè)資源控制器,比如CPU子系統(tǒng)控制CPU使用的時(shí)間
    • hierarchy(層級(jí)):層級(jí)由一系列cgroup以樹狀結(jié)構(gòu)排列,每層綁定對(duì)應(yīng)子系統(tǒng)實(shí)現(xiàn)資源控制

    有幾個(gè)規(guī)則關(guān)系:

    • 同一個(gè)層級(jí)可以附加多個(gè)子系統(tǒng),比如一個(gè)cgroup可以有CPU和Memory子系統(tǒng)
    • 一個(gè)子系統(tǒng)可以附加到多個(gè)層級(jí),當(dāng)且僅當(dāng)目標(biāo)層級(jí)只有唯一一個(gè)子系統(tǒng),比如如果B層級(jí)有內(nèi)存子系統(tǒng),不能附加CPU子系統(tǒng)了
    • 每次新建一個(gè)層級(jí)的時(shí)候,所有任務(wù)默認(rèn)加入到這個(gè)初始cgroup
    • frok、clone自身創(chuàng)建的子任務(wù)默認(rèn)與原任務(wù)在一個(gè)cgroup里,子任務(wù)允許被移動(dòng)到不同的cgroups

    子系統(tǒng)
    有如下

    • blkio:為塊設(shè)備設(shè)置輸入、輸出限制,比如物理驅(qū)動(dòng)設(shè)備(磁盤、USB等)
    • cpu:設(shè)置CPU使用時(shí)間,用于調(diào)度程序
    • cpuset:多處理器系統(tǒng)可以為任務(wù)分配相應(yīng)的處理器和內(nèi)存
    • cpuset:對(duì)cpu資源的使用情況生成報(bào)告
    • memory:對(duì)任務(wù)的任務(wù)使用量進(jìn)行限制,同時(shí)生成內(nèi)存使用情況的報(bào)告
    • devices:開啟或者管理cgroup里任務(wù)對(duì)設(shè)備的訪問(wèn)
    • freezer:掛起或者恢復(fù)cgroup的任務(wù)
    • perf_event:使得cgroup里的任務(wù)可以進(jìn)行性能測(cè)試
    • net_cls:標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包,允許流量控制程序識(shí)別cgroup里生成的數(shù)據(jù)包

    比如對(duì)于cpu子系統(tǒng),/sys/fs/cgroup/cpu里面有一些控制組的文件,創(chuàng)建一個(gè)控制組文件夾以后,會(huì)出現(xiàn)一些文件。
    限制一個(gè)指定進(jìn)程的cpu使用配額
    先添加進(jìn)程PID,然后添加具體配置

    echo 18828 >> /sys/fs/cgroup/cpu/cg1/tasks //設(shè)置使用20%cpu echo 20000 >> /sys/fs/cgroup/cpu/cg1/cpu.cfs_quato_us

    在創(chuàng)建容器時(shí),daemon會(huì)在單獨(dú)掛載的子系統(tǒng)控制目錄下創(chuàng)建一個(gè)對(duì)應(yīng)的docker控制組,然后再創(chuàng)建一個(gè)容器控制組名為Docker ID,容器的所有進(jìn)程好都會(huì)寫在這個(gè)的tasks里面,在對(duì)應(yīng)的控制文件里寫相應(yīng)的資源配額信息。

    對(duì)于內(nèi)存如果超過(guò)cgroup最大限制以后,如果設(shè)置了OOM Control(內(nèi)存超限控制),進(jìn)程就會(huì)收到OOM信號(hào)然后結(jié)束,否則會(huì)一直掛起,直到其他進(jìn)程釋放對(duì)應(yīng)的內(nèi)存資源。
    cgroup.procs可以對(duì)線程進(jìn)行配置,寫入線程組中的第一個(gè)進(jìn)程的PID,也就是把相關(guān)線程都加到cgroup里面

    驅(qū)動(dòng)

    docker的daemon進(jìn)程通過(guò)接收相應(yīng)的API請(qǐng)求,然后將去轉(zhuǎn)為使用相應(yīng)的系統(tǒng)調(diào)用,從而創(chuàng)建和管理容器。docker將這些系統(tǒng)調(diào)用抽象為了一些操作接口方便調(diào)用,包括:容器執(zhí)行驅(qū)動(dòng)、volume存儲(chǔ)驅(qū)動(dòng)以及鏡像存儲(chǔ)驅(qū)動(dòng)三種。
    execdriver
    對(duì)namesapce、cgroups等進(jìn)行了二次封裝,是默認(rèn)的libcontainer庫(kù)
    volumedriver
    負(fù)責(zé)volume的增刪改查,屏蔽不同驅(qū)動(dòng)帶來(lái)的差異,為上層提供一個(gè)統(tǒng)一的接口調(diào)用。
    graphdriver
    和鏡像有關(guān),維護(hù)一個(gè)一組與鏡像曾對(duì)應(yīng)的目錄,以及相應(yīng)的元數(shù)據(jù),用戶對(duì)鏡像的操作會(huì)對(duì)應(yīng)位對(duì)這些目錄文件以及元數(shù)據(jù)的增刪改查,屏蔽不同文件存儲(chǔ)實(shí)現(xiàn)帶來(lái)的差異。

    docker daemon的主要啟動(dòng)步驟如下三步

    • 啟動(dòng)API Server,工作在宿主機(jī)的HOST上
    • 使用NewDaemon方法創(chuàng)建daemon對(duì)象,保存信息和處理業(yè)務(wù)邏輯
    • 將API Server和daemon綁定起來(lái),接受處理client的請(qǐng)求
    啟動(dòng)一個(gè)容器的步驟

    從client 到 daemon,docker run舉例

  • docker run進(jìn)入client模式
  • 初始化一個(gè)client,反射找到cmdRun方法,解析參數(shù),然后發(fā)送POST請(qǐng)求創(chuàng)建并啟動(dòng)容器
  • Daemon解析用戶提交的這個(gè)POST表單信息,創(chuàng)建一個(gè)container對(duì)象,包含有Name、Path、ID、Created時(shí)間等,信息會(huì)返回給client,然后client發(fā)送啟動(dòng)命令
  • API Server接收到指令以后,調(diào)用daemon啟動(dòng)。創(chuàng)建相應(yīng)的容器。
  • 最后daemon向execdriver發(fā)送指令創(chuàng)建容器,信息包括:容器給i所需的所有配置集合、pipes將容器的輸入輸出重定向到daemon以及一個(gè)回調(diào)方法
  • 最后創(chuàng)建容器的時(shí)候會(huì)使用到libcontainer。
    在準(zhǔn)備好配置文件以后,會(huì)創(chuàng)建一個(gè)container對(duì)象,這里面存儲(chǔ)的是配置信息的對(duì)象,然后才是有Container邏輯容器對(duì)象,libcontainer會(huì)根據(jù)信息創(chuàng)建相應(yīng)的namespace,以及cgroups,然后創(chuàng)建docker。

    基礎(chǔ)

    什么是Docker

    Docker是一個(gè)容器化平臺(tái),以容器的形式將應(yīng)用程序和其環(huán)境依賴打包,可以在任何Docker環(huán)境中無(wú)縫銜接運(yùn)行

    Docker與虛擬機(jī)的不同

    Docker不是虛擬化,依賴于實(shí)際實(shí)現(xiàn)基于容器的虛擬話或者操作系統(tǒng)級(jí)虛擬化的其他工具,最初使用LXC驅(qū)動(dòng),后來(lái)移動(dòng)到libcontainer重命名為runc。
    專注于應(yīng)用程序容器內(nèi)自動(dòng)部署應(yīng)用程序,應(yīng)用程序指打包和運(yùn)行一個(gè)應(yīng)用程序,操作系統(tǒng)容器則設(shè)計(jì)為運(yùn)行多個(gè)進(jìn)程,如虛擬機(jī)。
    特點(diǎn):

  • 不需要引導(dǎo)操作系統(tǒng)內(nèi)核,啟動(dòng)創(chuàng)建非常快,不到1s
  • 基于容器的虛擬化對(duì)主機(jī)性能開銷增加很小甚至沒(méi)有,具有接近本機(jī)的性能
  • 對(duì)于基于容器的虛擬化不需要其他軟件就可以運(yùn)行
  • 主機(jī)所有容器共享主機(jī)的調(diào)度,節(jié)約資源成本
  • 鏡像體積很小,適合分發(fā)
  • 資源管理通過(guò)cgroup實(shí)現(xiàn),不允許容器消耗比cgroup規(guī)定還多的資源
  • 虛擬機(jī)底層是需要使用hypervisor來(lái)模擬硬件虛擬化的,可以虛擬出一個(gè)操作系統(tǒng)所需的各種硬件資源比如cpu、ram、disk,在其上安裝目標(biāo)操作系統(tǒng)。

    Docker和普通進(jìn)程的區(qū)別

    當(dāng)一個(gè)程序代碼被編譯為二進(jìn)制文件,然后這個(gè)文件被加載到內(nèi)存然后得到cpu的使用權(quán)時(shí),這個(gè)程序就變成了一個(gè)正在運(yùn)行的進(jìn)程,會(huì)去對(duì)寄存器進(jìn)行操作,對(duì)堆棧進(jìn)行操作以實(shí)現(xiàn)相應(yīng)功能。
    而容器則是通過(guò)約束和修改進(jìn)程的動(dòng)態(tài)表現(xiàn),給其創(chuàng)造一個(gè)邊界。cgroups主要用來(lái)進(jìn)行約束,而namespace則主要用來(lái)創(chuàng)造邊界

    鏡像

    什么是Docker鏡像和Docker容器

    鏡像就是容器的源代碼,用于創(chuàng)建容器。
    Docker容器包含了應(yīng)用程序和其所需的以來(lái),作為操作系統(tǒng)的一個(gè)獨(dú)立進(jìn)程運(yùn)行的。
    鏡像保存在/var/lib/docker/

    Docker鏡像分層

    是基于UnionFs(聯(lián)合文件系統(tǒng)),這是一種分層的、輕量級(jí)的而且高性能的文件系統(tǒng),支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層一層提交,而且可以把不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。
    實(shí)際上一次會(huì)加載多個(gè)文件系統(tǒng),但是使用上只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把每層文件系統(tǒng)疊加起來(lái),最終的文件系統(tǒng)就會(huì)包含所有的底層文件和目錄。
    實(shí)質(zhì)上就是一層一層的文件系統(tǒng)。

    所有docker都初始于一個(gè)基礎(chǔ)鏡像層,增加或者修改內(nèi)容的時(shí)候,會(huì)在這個(gè)基礎(chǔ)上新增一層。
    舉個(gè)例子
    如果需要基于ubuntu18.04配置新鏡像,第一層就是ubuntu18.04
    我們需要安裝python,第二層就是python包
    我們需要安裝一個(gè)安全補(bǔ)丁,這個(gè)補(bǔ)丁就是第三層
    Docker鏡像是只讀的,在啟動(dòng)容器的時(shí)候,會(huì)把一個(gè)可寫層加到鏡像頂部,就是容器層,容器層。下面都是鏡像層。

    bootfs

    boot file system。有一個(gè)bootloader和kernel,loader負(fù)責(zé)加載kernel,linux剛系統(tǒng)的時(shí)候就會(huì)加載bootfs,docker的底層就是bootfs,bootfs加載完成以后,內(nèi)核就在內(nèi)存里了,內(nèi)存的使用權(quán)就由bootfs交給內(nèi)核了,然后就可以卸載bootfs了。
    rootfs,root file system在bootfs之上,包含有l(wèi)inux中的/dev、/proc、/bin、/etc等標(biāo)準(zhǔn)目錄和文件,這個(gè)其實(shí)就是各種linux發(fā)行版。
    對(duì)于精簡(jiǎn)os,rootfs只需要包含最基本的命令、工具和程序庫(kù),因?yàn)榭梢灾苯邮褂玫讓觡ernel,所以只需要rootfs,而對(duì)于不同的發(fā)行版,bootfs都是差不多的,所以可以公用

    容器分層、寫時(shí)復(fù)制(copy-on-write)

    容器和鏡像的區(qū)別其實(shí)就是容器會(huì)在最頂層有一個(gè)可寫層,對(duì)于容器的所有寫操作都會(huì)記錄在這里面,容器刪除的話這個(gè)可寫層就刪除了。
    每個(gè)容器都有著自己的可寫層,所以多個(gè)容器可以共享一個(gè)鏡像
    對(duì)于多個(gè)鏡像來(lái)說(shuō),鏡像的分層會(huì)出現(xiàn)公用的情況,所以不能單純看docker images列出來(lái)的大小。
    多個(gè)容器之間可以共享鏡像,在啟動(dòng)容器的時(shí)候不必單獨(dú)復(fù)制一份,而是把所有鏡像層以只讀的形式掛載到一個(gè)掛載點(diǎn)上,在最上層加一個(gè)可讀寫的容器層,在沒(méi)有更改的時(shí)候所有容器共享一份數(shù)據(jù),只有對(duì)文件系統(tǒng)進(jìn)行修改的時(shí)候,會(huì)把相應(yīng)的內(nèi)容寫到可讀寫層里,并且隱藏只讀層里的老版本文件,用心的覆蓋,減少了鏡像對(duì)磁盤空間的占用和容器的啟動(dòng)時(shí)間。

    DockerFile常見指令

    Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。

    • FROM:指定基礎(chǔ)鏡像,基于什么鏡像
    • LABEL:指定鏡像的標(biāo)簽
    • RUN:運(yùn)行指定命令
    • CMD:啟動(dòng)容器的時(shí)候執(zhí)行什么命令,類似自啟動(dòng),如果有多個(gè)指令,只執(zhí)行最后一條
    • ENTRYPOINT:類似于CMD指令,但是不會(huì)被覆蓋掉,
    build

    docker build -t {name}:{tag} .
    最后的點(diǎn)就表示上下文路徑。
    docker在構(gòu)造的時(shí)候會(huì)使用到本機(jī)文件,比如復(fù)制進(jìn)去,他會(huì)在這個(gè)上下文路徑中去尋找,把里面的文件都打包進(jìn)去,不寫就默認(rèn)Dockerfile所在的目錄。

    步驟時(shí):

    • 發(fā)送請(qǐng)求個(gè)Server端,然后創(chuàng)建臨時(shí)目錄讀取Dockerfile
    • 根據(jù)解析的結(jié)果遍歷命令,將其分發(fā)給不同模塊進(jìn)行執(zhí)行。
    • parser會(huì)給每個(gè)指令創(chuàng)建一個(gè)臨時(shí)容器,在臨時(shí)容器中執(zhí)行當(dāng)前指令,然后使用commit生成一個(gè)鏡像層
    • 所有指令對(duì)應(yīng)的層的集合,就是build的而結(jié)果。最后一次commit生成的鏡像ID就是最后的鏡像ID
    Dockerfile的COPY和ADD

    COPY指的是從上下文目錄中復(fù)制文件到容器里的指定路徑。
    ADD也是復(fù)制文件。
    COPY的SRC只能是本地文件。
    而且ADD會(huì)自動(dòng)解壓一些格式的文件gzip等,不解壓的時(shí)候tar就不能復(fù)制進(jìn)去,會(huì)使得構(gòu)建失敗。
    ADD還可以給容器里添加遠(yuǎn)程文件。但是建議用curl或者wget命令下載文件,因?yàn)锳DD的話會(huì)給鏡像加一層,導(dǎo)致體積變大臃腫。

    Docker容器的狀態(tài)

    運(yùn)行、退出、已暫停、重新啟動(dòng)

    網(wǎng)絡(luò)

    docker的網(wǎng)絡(luò)部分已經(jīng)被獨(dú)立為libnetwork了。使用的CNM(容器網(wǎng)絡(luò)羋姓)提供了多種網(wǎng)絡(luò)接口可以使用。
    daemon通過(guò)調(diào)用libnetwork對(duì)外提供的API完成網(wǎng)絡(luò)的創(chuàng)建和管理,libcontainer則使用CNM。libcontainer里面提供了五種網(wǎng)絡(luò)驅(qū)動(dòng)可以使用,有三個(gè)核心組件。

    • 沙盒:包含一個(gè)容器網(wǎng)絡(luò)棧信息,可以對(duì)容器接口、路由和DNS等進(jìn)行管理,具體實(shí)現(xiàn)可以是namespace
    • 端點(diǎn):一個(gè)端點(diǎn)可以加入一個(gè)沙盒和一個(gè)網(wǎng)絡(luò),具體實(shí)現(xiàn)有veth pair、ovs內(nèi)部端口等
    • 網(wǎng)絡(luò):是一組可以互聯(lián)互通的端點(diǎn),具體實(shí)現(xiàn)可以是lunexbridge、vlan,一個(gè)網(wǎng)絡(luò)可以有多個(gè)端點(diǎn)

    驅(qū)動(dòng):

    • bridge:默認(rèn)配置,會(huì)將創(chuàng)建出來(lái)的容器連接到docker0網(wǎng)橋上,和外界通信使用NAT,復(fù)雜場(chǎng)景下使用會(huì)有不少限制
    • host:不會(huì)為容器創(chuàng)建網(wǎng)絡(luò)協(xié)議棧,不會(huì)有獨(dú)立的namespace,處于宿主機(jī)的網(wǎng)絡(luò)環(huán)境中,共用宿主機(jī)的namesapace,如IP、網(wǎng)卡端口等信息。較好的解決了與外界通信的地址轉(zhuǎn)換問(wèn)題,但是降低了容器和宿主機(jī)或者容器之間的網(wǎng)絡(luò)隔離問(wèn)題,網(wǎng)絡(luò)資源的使用可能會(huì)出現(xiàn)競(jìng)爭(zhēng)沖突。
    • overlay:vxlan比如大型云計(jì)算虛擬化環(huán)境里的SDN Controller模式
    • remote:這個(gè)欸有實(shí)現(xiàn)真正的網(wǎng)絡(luò)服務(wù),而是會(huì)調(diào)用用戶所提供的網(wǎng)絡(luò)驅(qū)動(dòng)插件,比如Kuryr-libnetwork。根據(jù)libnetwork提供的標(biāo)準(zhǔn)實(shí)現(xiàn)相應(yīng)的接口就可以找daemon進(jìn)行注冊(cè)使用
    • null:容器有自己的namespace,只有l(wèi)o網(wǎng)卡,需要用戶自己配置網(wǎng)卡IP等信息,優(yōu)點(diǎn)時(shí)配置使用非常自由,缺點(diǎn)就是 不配置不能使用,使用要求高。

    docker0本質(zhì)上就是網(wǎng)橋,而且這里的網(wǎng)橋概念可以相當(dāng)于時(shí)交換機(jī),可以為連接在其上的設(shè)備進(jìn)行數(shù)據(jù)幀的轉(zhuǎn)發(fā),容器的網(wǎng)卡eth0通過(guò)veth連接到docker0網(wǎng)橋上,不需要配置IP地址就可以進(jìn)行數(shù)據(jù)幀的轉(zhuǎn)發(fā)。

    Docker的網(wǎng)絡(luò)類型

    有4種類型,bridge、host、container以及none
    bridge:默認(rèn)情況創(chuàng)建容器是使用網(wǎng)橋bridge去連接,docker0,容器之間通過(guò)網(wǎng)橋通信。對(duì)外通信的話網(wǎng)橋會(huì)與宿主機(jī)進(jìn)行一個(gè)IP轉(zhuǎn)換。這里的虛擬連接也是使用類似與虛擬網(wǎng)線的那樣,就虛擬機(jī)里面的eth0連接到網(wǎng)橋?qū)?yīng)的veth。如果需要外部訪問(wèn)進(jìn)來(lái),得通過(guò)端口映射,然后使用宿主機(jī)的端口和這個(gè)映射的端口進(jìn)行訪問(wèn)
    host:會(huì)默認(rèn)使用宿主機(jī)的網(wǎng)絡(luò),不會(huì)有自己的命名空間虛擬機(jī)網(wǎng)卡之類的,在網(wǎng)絡(luò)上是沒(méi)辦法隔離的。使用了host就只能指定端口了,訪問(wèn)進(jìn)來(lái)的話用宿主機(jī)的IP和這個(gè)映射的端口
    container:指定新創(chuàng)建的容器和已有的容器共享namespace,同樣不會(huì)自己創(chuàng)建網(wǎng)卡和IP地址,和這個(gè)特定容器一起共享,進(jìn)程間通過(guò)lo通信。
    none:會(huì)創(chuàng)建一個(gè)命名空間 ,但是ip、虛擬網(wǎng)卡之類的都得自己配置,很不好用不方便。但是隔離安全性非常好

    docker常用命令
    • docker images:查看鏡像
    • docker rm / rmi:刪除容器/鏡像
    • docker pull / push:拉取/上傳鏡像
    • docker ps -a:列出所有鏡像,不帶參數(shù)只列出開機(jī)鏡像
    • docker cp {path} {docker_id}:{docker_path}:復(fù)制文件到指定容器的路徑下,也可以返回來(lái)復(fù)制出文件
    • docker run -d --name container cirros -p 5000:5050:啟動(dòng)容器

    面經(jīng)

    OpenStack

    一些命令行
    • 命令啟動(dòng)虛擬機(jī):openstack server create --flaver {name} --nic net-id={network-id} --security-group {id} {name}
      命令上傳下載鏡像:opensatck image create --disk-format qcow2 --container-format bare --public --file {local-path} {name}
      glance image-download --file {id} {local-path}
    • 修改實(shí)例狀態(tài)為活動(dòng)狀態(tài):比如有時(shí)候?qū)嵗龝?huì)卡住,比如刪除的時(shí)候因?yàn)槟承┕收峡ㄗ×?#xff0c;處于deleting狀態(tài)一直卡住,這個(gè)操作可以使其變?yōu)榛顒?dòng)狀態(tài),然后他大概會(huì)進(jìn)入error,然后就可以正常刪除了。nova restet-state --active {server-id}
    • 指定集群和節(jié)點(diǎn):–availiable-zone {region}:{host},指定在哪個(gè)集群的哪個(gè)節(jié)點(diǎn)創(chuàng)建
    • 查看實(shí)例的日志和控制臺(tái)url:openstack console log {id}和openstack console url show {id}
    OpenStack中計(jì)算節(jié)點(diǎn)上虛擬機(jī)默認(rèn)保存路徑在哪?

    在計(jì)算節(jié)點(diǎn)的/var/lib/nova/instances目錄。

    OpenStack中Glance鏡像的默認(rèn)保存路徑在哪?

    控制節(jié)點(diǎn)的/var/lib/glance/images目錄。

    OpenStack中計(jì)算節(jié)點(diǎn)的集成橋(br-int)的作用是什么?

    對(duì)通過(guò)實(shí)例的流量進(jìn)行標(biāo)記和取消標(biāo)記的操作,VLAN網(wǎng)絡(luò)。

    OpenStack中計(jì)算節(jié)點(diǎn)的隧道橋(br-tun)的作用是什么?

    隧道橋(br-tun)根據(jù) OpenFlow 規(guī)則將 VLAN 標(biāo)記的流量從集成網(wǎng)橋轉(zhuǎn)換為隧道 ID。
    隧道橋允許不同網(wǎng)絡(luò)的實(shí)例彼此進(jìn)行通信。隧道有利于封裝在非安全網(wǎng)絡(luò)上傳輸?shù)牧髁?#xff0c;它支持兩層網(wǎng)絡(luò),即 GRE 和 VXLAN。

    OpenStack中外部OVS橋(br-ex)的作用是什么?

    用于轉(zhuǎn)發(fā)來(lái)往的網(wǎng)絡(luò)流量,允許實(shí)例與外部網(wǎng)絡(luò)進(jìn)行通信

    OpenStack和Docker區(qū)別

    OpenStack是一個(gè)成熟的完整的云資源管理的平臺(tái)。可以統(tǒng)一管理平臺(tái)中的計(jì)算、存儲(chǔ)以及網(wǎng)絡(luò)等資源,提供對(duì)于虛擬機(jī)的調(diào)度管理。底層默認(rèn)使用kvm和qemu去管理虛擬機(jī),但是同樣可以管理容器。
    而docker則是負(fù)責(zé)管理計(jì)算機(jī)中需要與其他進(jìn)程相互隔離的容器,容器的開銷相比于虛擬機(jī)更少,本質(zhì)上就是一個(gè)操作系統(tǒng)進(jìn)程,可以將自己的環(huán)境或者應(yīng)用程序部署在容器里,然后打包分發(fā)之類的,可以實(shí)現(xiàn)快速部署。
    docker應(yīng)該和虛擬機(jī)是一個(gè)類別的。

    OpenStack和kvm的區(qū)別

    OpenStack本質(zhì)只是一個(gè)云管理平臺(tái),不具備比如虛擬化這種功能。虛擬化是通過(guò)系統(tǒng)底層實(shí)現(xiàn)的hypervisior(kvm、qemu和Xen、virtual box等)實(shí)現(xiàn)的。
    如果沒(méi)有OpenStack同樣可以使用其他工具來(lái)管理kvm,比如libvirt提供的vish-manager。

    kvm和xen區(qū)別

    kvm是一個(gè)內(nèi)核提供的輕量級(jí)虛擬化管理解決方案,需要虛擬化支持(Intel-VT或者AMD-V)。
    Xen是運(yùn)行支持的Xen內(nèi)核,可以在系統(tǒng)上使用qemu模擬多個(gè)虛擬機(jī)。
    kvm可以使用通常的linux調(diào)度和內(nèi)存管理
    Xen更新以后需要重新編譯內(nèi)核,而kvm只需要重新安裝模塊即可,更加精簡(jiǎn),避免出錯(cuò)的幾率。

    Neutron

    vlan和vxlan的區(qū)別

    vlan的vni是12位:1-4096,vxlan是24位,最大可以一一千六百多萬(wàn)個(gè)vni。

    vxlan是基于隧道技術(shù)在屋里三層網(wǎng)絡(luò)中模擬二層網(wǎng)絡(luò),對(duì)二層數(shù)據(jù)包的一個(gè)封裝,使用UDP在三層網(wǎng)絡(luò)進(jìn)行一個(gè)轉(zhuǎn)發(fā)。
    vlan只能用于廣播域的隔離,但是解決不了IP地址和MAC的重疊問(wèn)題,vxlan可以做到不同租戶獨(dú)立組網(wǎng),通信地址分配以及多租戶的地址沖突問(wèn)題可以解決。
    交換機(jī)一個(gè)端口對(duì)應(yīng)一個(gè)物理設(shè)備以及一個(gè)MAC地址,但是現(xiàn)在雖然一個(gè)端口還是連接一個(gè)物理機(jī),但是可能會(huì)連接到多個(gè)虛擬機(jī),傳統(tǒng)交換機(jī)收到一個(gè)數(shù)據(jù)幀以后,根據(jù)vlan和目的MAC找到相應(yīng)端口,將數(shù)據(jù)包轉(zhuǎn)發(fā)出去。同時(shí)交換機(jī)會(huì)記住學(xué)習(xí)這個(gè)MAC記錄,但是交換機(jī)內(nèi)存是有限的,隨著虛擬化的實(shí)現(xiàn),網(wǎng)絡(luò)中的MAC地址非常多的,交換機(jī)如果不足以支持的話,可能會(huì)移除,然后就不能正常工作,如果找不到MAC會(huì)進(jìn)行flood,增加其他網(wǎng)絡(luò)設(shè)備的負(fù)擔(dān)和網(wǎng)絡(luò)擁塞。
    使用VxLAN,以太幀會(huì)被VTEP封裝在UDP里面,一個(gè)VTEP可以被一個(gè)物理及的所有虛擬機(jī)使用,對(duì)于交換機(jī),他看到的只是VTEP之間傳遞信息,并看不到實(shí)際虛擬機(jī)傳遞信息。所以交換機(jī)只需要記錄VTEP的信息即主機(jī)信息即可。

    Docker

    命名空間
    • 網(wǎng)絡(luò)命名空間:網(wǎng)絡(luò)設(shè)備端口等
    • 進(jìn)程命名空間:進(jìn)程編號(hào)
    • 用戶命名空間:用戶和用戶組
    • 掛載命名空間:掛載點(diǎn)、文件系統(tǒng)
    • UTS命名空間:主機(jī)名和域名
    • IPC命名空間:信號(hào)量、消息隊(duì)列共享內(nèi)存

    總結(jié)

    以上是生活随笔為你收集整理的面经 - OpenStack(Docker、Django、K8S、SDN)知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    日本精品中文字幕 | 97精品久久人人爽人人爽 | 亚州精品在线视频 | 国产在线欧美日韩 | 18pao国产成视频永久免费 | 国产精品爽爽爽 | 国产黄a三级三级三级三级三级 | 激情五月看片 | 亚洲精品五月天 | 色噜噜在线观看 | 免费日韩 精品中文字幕视频在线 | 欧美一区二区伦理片 | 黄色日批网站 | 国产精品一区二区三区免费视频 | 视频在线一区 | 色网站黄 | 免费三及片 | 国产亚洲情侣一区二区无 | 亚洲最新视频在线 | 天天干天天色2020 | 韩日电影在线观看 | 免费a网 | 国产无套精品久久久久久 | 香蕉影视在线观看 | www.精选视频.com | 国产精品久久久久久久久久白浆 | 在线观看免费成人 | 永久免费精品视频网站 | 欧美视屏一区二区 | 日韩免费在线看 | 日韩在线视频一区二区三区 | 成人影视免费 | 免费观看成人av | 国产成人福利在线观看 | 337p欧美 | 国产伦理剧 | 天堂av网址 | 国产高清av在线播放 | 中文av在线免费观看 | 又黄又爽又无遮挡免费的网站 | 黄色看片 | 免费看黄色毛片 | 国产日产欧美在线观看 | 麻豆传媒在线免费看 | 久久伦理电影网 | 亚洲精品在线看 | 91xav| 日韩在线中文字幕 | 在线看免费| 在线一区二区三区 | 中文字幕久久精品亚洲乱码 | 久操视频在线播放 | 视频国产在线观看18 | 色综合天天天天做夜夜夜夜做 | 精品一区二区三区久久 | 国内久久精品视频 | 国产精品原创在线 | 免费久久99精品国产 | 国产精品99免费看 | 国产日韩视频在线观看 | 日韩理论在线观看 | 亚洲涩涩色 | 国产高清视频在线播放一区 | 超碰在线观看av.com | 91九色精品国产 | 一区二区三区国 | 97成人资源站 | 久保带人 | 国产一线二线三线性视频 | 日本护士三级少妇三级999 | 97免费在线观看视频 | 韩国av永久免费 | 伊人亚洲综合网 | 综合色站导航 | 日韩女同一区二区三区在线观看 | 九九三级毛片 | 国产中文字幕久久 | 天天色天天综合网 | 欧美日韩国产高清视频 | 日韩美女av在线 | 成人免费大片黄在线播放 | 天天草天天干天天 | 久草.com | 狠狠操操 | 亚洲经典视频在线观看 | 成人欧美亚洲 | 国产一级在线 | 亚洲第二色 | 婷婷综合久久 | 欧美日韩国产在线观看 | 日韩有码在线播放 | 人人揉人人揉人人揉人人揉97 | 国产又黄又爽无遮挡 | 国内精品福利视频 | 国产录像在线观看 | 九九免费在线看完整版 | 亚洲成人av一区二区 | 日韩免费久久 | 五月婷婷视频在线 | 亚洲精品免费视频 | 中文字幕 国产专区 | 亚洲黄色高清 | 99国产在线视频 | 日韩在线国产精品 | 亚洲精品人人 | 狠狠躁日日躁狂躁夜夜躁 | 91精品国产高清 | 国产美女精品人人做人人爽 | 97免费在线观看视频 | 国产免费片 | 色资源二区在线视频 | 在线久热| 国产喷水在线 | 狠狠色免费 | 91九色蝌蚪视频在线 | 日韩手机视频 | 国产午夜精品一区 | 日韩精品黄 | 国产成人av电影 | 日韩激情网 | 91视频91色 | 久精品在线观看 | www.国产视频 | 国产一区二区高清视频 | 亚洲精品动漫在线 | 亚洲人片在线观看 | 日韩丝袜在线观看 | 亚洲 欧美日韩 国产 中文 | 人人狠狠综合久久亚洲婷 | 亚洲最大激情中文字幕 | 成年人国产在线观看 | 91手机视频在线 | 久久福利综合 | 99国产精品免费网站 | 亚洲国产高清视频 | 久久久久伊人 | av免费在线免费观看 | 久久久久国产精品免费免费搜索 | 精品1区2区 | 色婷婷亚洲综合 | 日韩视频免费观看高清完整版在线 | 青青草在久久免费久久免费 | 亚洲欧美日韩国产一区二区 | 五月天激情视频在线观看 | 在线中文字母电影观看 | 久久精品视频网站 | 91污视频在线观看 | 欧美精品久久久久久久久久久 | 黄网站色成年免费观看 | 婷婷久久综合九色综合 | 午夜黄色 | 久久高清视频免费 | 久热色超碰| 麻豆传媒视频在线免费观看 | 精品视频在线播放 | 国产999精品视频 | 在线视频麻豆 | 婷婷色中文网 | 中文字幕二区在线观看 | 毛片激情永久免费 | 日韩视频www | 91漂亮少妇露脸在线播放 | 探花视频免费在线观看 | 欧美日韩亚洲第一 | 久久久国产精品久久久 | 人人爽人人爽人人片 | 天天插天天 | 久久国产精品精品国产色婷婷 | 最新av在线播放 | 久久精品99国产精品日本 | 欧美日本中文字幕 | 天堂av在线7 | 天天激情天天干 | 成人国产精品电影 | 美女网站视频一区 | 国产欧美最新羞羞视频在线观看 | 亚洲黄色av网址 | 亚洲精品在线网站 | 免费在线观看视频a | www最近高清中文国语在线观看 | 亚洲精品在线观看的 | 狠狠插狠狠操 | 蜜桃传媒一区二区 | 成人av地址| 精品国产91亚洲一区二区三区www | 天天干天天上 | 欧美日产一区 | 丁香久久综合 | 亚洲有 在线 | 中文字幕高清免费日韩视频在线 | 深夜免费福利 | 99久久久国产精品免费99 | 黄色片视频在线观看 | 国产精品久久久久久久久久久久久 | 韩日色视频 | 最新中文字幕在线观看视频 | av电影久久 | 天天天天色综合 | 日韩在线免费视频观看 | 国产在线精品国自产拍影院 | 国产99色| 天天综合网天天综合色 | 狠狠色伊人亚洲综合成人 | 欧美一区二区三区在线 | 国产一级片网站 | 久久综合狠狠综合久久激情 | av黄色免费看 | 99一区二区三区 | 91麻豆国产 | 91网在线 | 国产精品成人a免费观看 | 在线观看成人国产 | av电影免费观看 | 在线亚洲天堂网 | 射射色 | 天天干,天天干 | 青青河边草观看完整版高清 | 色先锋资源网 | 手机在线黄色网址 | 色射爱| 伊人永久在线 | 91精品秘密在线观看 | 一区中文字幕 | wwwwww黄 | 狠狠操精品 | 久久综合狠狠综合久久狠狠色综合 | 久草在线免 | 国产精品孕妇 | 久久天天躁夜夜躁狠狠躁2022 | 二区三区在线 | 毛片久久久 | 天天综合网久久综合网 | 亚洲综合精品视频 | 国产精品婷婷午夜在线观看 | 午夜私人影院久久久久 | 五月开心激情 | 国产精品女人久久久 | 久久超级碰视频 | 国产精品日韩欧美一区二区 | 黄网站色成年免费观看 | 精品免费视频 | 91成人精品在线 | 日韩成人精品一区二区三区 | 中文字幕精品久久 | 久久9999久久免费精品国产 | 久在线观看视频 | 激情视频综合网 | 国产成人黄色片 | 天天在线免费视频 | 国产精品第7页 | 国产高清免费观看 | 国语黄色片| 精品一区二区三区四区在线 | 亚洲精品中文在线 | 欧美日韩亚洲第一 | 国产原创中文在线 | 精品亚洲成a人在线观看 | 国产免费激情久久 | 精品久久久久久综合日本 | 韩国av不卡| 顶级欧美色妇4khd | 久草视频在线免费看 | 精品久久免费看 | 黄色在线看网站 | 亚洲国产精品一区二区久久hs | av网站地址 | 美女视频黄网站 | 综合网天天色 | 亚州欧美视频 | 狠狠干免费 | 99久久网站 | 欧美了一区在线观看 | 久久精美视频 | 欧美在线1| 久久久免费看 | 日本性生活免费看 | 日日干夜夜操视频 | 天天曰天天爽 | 婷婷在线网 | 99久久激情 | 欧美激情综合色 | 人人艹人人 | 亚洲黄网站 | 欧美一级大片在线观看 | 麻豆激情电影 | 国产在线国产 | 久久久久久久亚洲精品 | 美州a亚洲一视本频v色道 | 国产精品视频免费观看 | 亚洲综合小说电影qvod | 成年人免费在线观看网站 | 四虎国产精 | 国产伦理久久 | 国产麻豆精品一区 | 中文字幕av在线不卡 | 亚洲狠狠操 | 日韩一区二区三区不卡 | 日日爽日日操 | 欧美一二三区播放 | 免费视频在线观看网站 | 亚洲精品视频一二三 | 一级黄色片在线免费看 | 欧美激情xxxx | 精品在线观看一区二区 | 丁香六月婷婷激情 | 国产亚洲高清视频 | 色婷婷狠狠操 | 亚洲播放一区 | 国产精品大片免费观看 | 国产精品专区在线 | 亚洲日韩欧美一区二区在线 | 91福利区一区二区三区 | 国产免费影院 | 免费a视频| 国产成人一区二区三区影院在线 | av福利在线免费观看 | 视频一区二区视频 | 四虎国产精品免费观看视频优播 | 日韩综合一区二区三区 | 99久久9| 91久久国产精品 | 国产黄免费在线观看 | 午夜美女福利直播 | av先锋影音少妇 | 女人高潮一级片 | www.久草视频 | a天堂中文在线 | 精品久久久久久久久久岛国gif | 久草在线电影网 | 91丨九色丨丝袜 | 在线观看爱爱视频 | 亚洲国产精品成人女人久久 | 国产福利在线免费观看 | 99精品欧美一区二区三区黑人哦 | 久久久久女教师免费一区 | 免费看国产a| 日韩高清国产精品 | 国产精品原创av片国产免费 | 日本中文字幕在线 | 国产v亚洲v | av夜夜操| 久久久福利视频 | 91视频在线看 | 国产精品自在线拍国产 | 亚洲人成网站精品片在线观看 | 天堂在线一区二区三区 | 99久久99久久精品国产片果冰 | 狠狠干网站 | 99免费在线观看视频 | 久久优| 天天操夜夜看 | 91麻豆精品 | 一区二区 不卡 | 成人久久18免费网站图片 | 国产一区二区三区免费在线 | 久久久久久国产精品亚洲78 | 免费久草视频 | 国产黄色片一级三级 | 日本在线观看一区二区 | 中文字幕免费高清av | 欧美视频在线观看免费网址 | 免费视频国产 | 在线观看久久久久久 | 激情导航| 成人影视免费 | 免费观看mv大片高清 | 日韩高清国产精品 | 国语对白少妇爽91 | 国产成视频在线观看 | 日本公妇色中文字幕 | 丁香视频 | 九色91av | 欧美日本在线视频 | 超碰av在线播放 | 国产永久免费观看 | 成人在线免费视频 | 免费av在| 久久电影国产免费久久电影 | 99热最新在线 | 国产高清成人 | 国产电影一区二区三区四区 | 欧美午夜a | 99热只有精品在线观看 | 91日韩在线视频 | 贫乳av女优大全 | 久久99精品久久久久久三级 | 日韩有码欧美 | 久久五月激情 | 在线观看www. | 五月婷婷中文字幕 | 欧美一进一出抽搐大尺度视频 | 国产精品视频永久免费播放 | 色婷婷综合五月 | 在线观看av不卡 | 午夜影院在线观看18 | 久草视频免费观 | 色综合久久久久 | 久久精品日产第一区二区三区乱码 | 97超碰精品 | 久久久久久久看片 | 欧美日韩久久一区 | 国产精品区二区三区日本 | 欧美精品亚州精品 | 国产主播大尺度精品福利免费 | 久久成熟 | 国产精品午夜久久久久久99热 | 日韩中文字幕网站 | 91精品免费在线视频 | adn—256中文在线观看 | 天天干天天拍天天操天天拍 | 日韩一区视频在线 | 在线观看麻豆av | av一区二区三区在线播放 | 国内精品久久久久久久久久清纯 | 色综合久久久久网 | 天天操网址 | 欧美日韩精品二区第二页 | 亚洲午夜av电影 | 中国一 片免费观看 | 国产91精品在线观看 | 天天在线视频色 | 在线中文字幕网站 | av网站地址 | 探花视频免费在线观看 | 国产日韩精品一区二区 | 欧美日韩一区二区久久 | 国产精品网红直播 | 69精品人人人人 | 免费观看版 | 波多野结衣在线中文字幕 | 伊人天天综合 | 日本深夜福利视频 | 亚洲艳情| 视频精品一区二区三区 | 久久理伦片 | 青青河边草免费直播 | 国产香蕉视频在线观看 | 视频精品一区二区三区 | 免费看片成人 | 久久99亚洲精品久久久久 | 日韩特级片 | 草久视频在线观看 | 中文字幕日韩精品有码视频 | av免费看av| 91人人网| 在线免费观看视频一区二区三区 | 久久优 | 久久艹在线观看 | 亚洲综合欧美精品电影 | 精品电影一区二区 | 在线色网站 | 精品亚洲视频在线观看 | 久久中文字幕视频 | 国产专区日韩专区 | 亚洲国产无 | 日韩精品中文字幕在线播放 | 91自拍91| 永久免费在线 | 国产精品视频专区 | 狠狠干网 | 久久久久久久久久久福利 | 久久夜色精品国产欧美乱极品 | 亚洲黄色免费网站 | 高清在线一区 | 91精品视频免费在线观看 | 精品视频久久久 | 不卡av免费在线观看 | 美女国内精品自产拍在线播放 | 国产精品中文字幕在线播放 | 最新国产在线视频 | 亚洲91精品在线观看 | 久久久精品小视频 | 欧美日韩成人 | www视频在线免费观看 | 91成人精品观看 | 日本三级中文字幕在线观看 | 又爽又黄在线观看 | 丰满少妇麻豆av | www.五月天激情 | 91九色porny在线 | 国产精品久久网站 | 亚洲狠狠操 | 手机成人av| 国产一二三精品 | 亚洲日本国产 | 日韩av黄 | 国产二区免费视频 | 中文字幕在线观 | .国产精品成人自产拍在线观看6 | 欧美日韩国产一区二区三区在线观看 | 午夜精品视频福利 | 久久精品成人 | 91色一区二区三区 | 亚洲网站在线看 | 天天干天天射天天插 | 亚洲麻豆精品 | 午夜精品一二区 | 久久免费久久 | av中文字幕av| 国产视频1 | 97激情影院 | www.狠狠色.com | 欧美日韩网站 | 亚洲日本va中文字幕 | 久久久99精品免费观看乱色 | 中文字幕二区三区 | 麻豆一级视频 | 97视频在线观看网址 | 久久综合精品国产一区二区三区 | 91精品亚洲影视在线观看 | 欧美日韩在线电影 | 在线免费观看黄色小说 | 精品一区二区视频 | 国产日产精品一区二区三区四区的观看方式 | 日韩欧美一区二区三区黑寡妇 | 欧美黄在线 | 五月天激情综合 | 久久1电影院 | 欧洲精品码一区二区三区免费看 | 国产一区视频免费在线观看 | 亚洲精品成人av在线 | 99久久精品免费看国产一区二区三区 | 欧美男男tv网站 | 手机在线黄色网址 | 日韩久久精品一区二区三区下载 | 中文字幕视频一区 | 日本最新中文字幕 | 国产手机在线观看视频 | 中文在线天堂资源 | 国产精品av在线免费观看 | 又污又黄的网站 | 在线观看免费视频 | 操老逼免费视频 | 日韩区欠美精品av视频 | 国产一级免费播放 | 欧美一区二区三区免费观看 | 久精品视频免费观看2 | 免费看片网址 | 国产精品白虎 | 69国产精品视频免费观看 | 免费看短 | 免费亚洲视频在线观看 | 中文字幕麻豆 | 手机av资源 | 成人超碰在线 | 久久久久免费精品 | 国产123av | 精品电影一区 | 亚洲国内精品在线 | 中文字幕在线观看第三页 | 久草com| 日韩欧美一区二区三区免费观看 | 亚洲精品动漫在线 | 96精品高清视频在线观看软件特色 | 亚洲午夜小视频 | 国产精品久久久久一区二区 | av女优中文字幕在线观看 | 成人av一区二区兰花在线播放 | 免费视频在线观看网站 | 日韩午夜三级 | 91精品一区二区在线观看 | 中文字幕永久在线 | 99精品国自产在线 | 丝袜美女在线 | 久久久影视 | 国产免费人人看 | 久久精品91视频 | 国产亚洲在 | 在线亚洲播放 | 香蕉视频久久久 | 日本黄色黄网站 | 久久香蕉国产 | 在线观看免费版高清版 | 国产精品一区在线观看你懂的 | 三级动图| 久久久精品国产一区二区电影四季 | 毛片二区 | 午夜精品一区二区三区免费 | www色| 久久视频一区二区 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产日产欧美在线观看 | 成 人 黄 色 视频 免费观看 | 国产精品99视频 | 日本精品久久久一区二区三区 | 九九免费在线观看 | 午夜精品视频一区二区三区在线看 | 日本女人b | 久久婷婷亚洲 | 日韩精品一区二区三区水蜜桃 | 粉嫩aⅴ一区二区三区 | 97爱| 国产亚洲综合性久久久影院 | 久久国产精品99久久久久久丝袜 | 永久免费毛片在线观看 | 91麻豆精品国产91 | 久久欧美精品 | 中文字幕在线专区 | 久久麻豆视频 | 精品uu | 亚洲日本国产精品 | 99精品视频中文字幕 | 天天色天天射天天操 | 欧美日韩在线免费观看视频 | 国产一二三区在线观看 | 日韩在线在线 | 久久久www成人免费毛片麻豆 | 久久久久女教师免费一区 | 亚洲精品免费观看 | 久久久久久久久免费视频 | 国产精品99久久久久久久久 | 日本黄色大片免费看 | 91av原创 | 国产成人精品一区二区在线观看 | 久久免费视频在线观看 | 69视频网站| 欧美日韩国产精品爽爽 | 五月婷婷中文网 | 亚洲精品国精品久久99热 | 久久99视频免费观看 | 久草视频在线新免费 | 91激情视频在线播放 | 国产一级片播放 | 亚洲国产免费看 | 久久久 激情| 欧美精品亚洲精品 | 99热精品久久 | 国产成人在线一区 | 久久久久久国产精品免费 | 精品亚洲午夜久久久久91 | 久久综合久久88 | 久久国产一区二区三区 | 国产视频一级 | 久久免费国产精品 | 激情五月在线视频 | 国产精品日韩 | 亚洲专区欧美专区 | 又色又爽又黄高潮的免费视频 | 午夜精品视频福利 | 黄av免费 | 在线观看国产高清视频 | 亚洲男男gaygay无套 | 免费观看午夜视频 | 久久久国产精品成人免费 | 黄污网| 久久久久久久久久免费 | 日韩黄色免费在线观看 | 精品一区二区在线播放 | 久久成人高清 | 五月天综合激情 | 国产亚洲婷婷免费 | 国产精品丝袜久久久久久久不卡 | 久久国产品 | 国产视频每日更新 | 一区在线播放 | 久久久久久欧美二区电影网 | 在线你懂 | 欧美日韩中文视频 | 久久成人一区 | 中文字幕在线视频一区 | 久久99国产精品免费 | 91精品国产成人观看 | 四虎影视成人永久免费观看视频 | 免费观看成人网 | 久久精品电影院 | 91精品亚洲影视在线观看 | 国产成视频在线观看 | 国产成人精品一区二区三区网站观看 | 欧美资源在线观看 | 国产91九色蝌蚪 | 久久五月天综合 | 天天综合狠狠精品 | av黄免费看 | 激情电影影院 | 国产小视频在线免费观看 | 69精品久久 | 国产在线观看免费 | 99爱这里只有精品 | av大片网址 | 国产在线v | 国产一级视频 | 国产高清网站 | 日韩网站在线看片你懂的 | av大片网址 | 看毛片网站 | 91视频成人免费 | 日韩国产精品久久久久久亚洲 | 欧美精品第一 | 中文字幕在线观看第一区 | 国产精品一区二区吃奶在线观看 | 亚洲精品乱码久久久久久写真 | 亚洲国产成人高清精品 | 特黄特黄的视频 | 久久成人国产精品 | zzijzzij亚洲日本少妇熟睡 | 久久久久久久久久久黄色 | 国产精品乱看 | 91精品国 | 99草视频 | 日本免费久久高清视频 | 国产中文字幕视频在线观看 | 天天爽人人爽 | 成人91免费视频 | 免费看的黄色 | 5月丁香婷婷综合 | 在线看欧美 | 日韩黄色网络 | 在线免费av播放 | 日韩电影在线一区二区 | 伊人午夜| 天天射天天 | 欧美日韩一级久久久久久免费看 | 免费看久久久 | 国产四虎在线 | 国产精品伦一区二区三区视频 | 日韩综合视频在线观看 | 日韩乱色精品一区二区 | 日韩av高潮 | 91成人精品国产刺激国语对白 | 天堂在线成人 | 亚洲 综合 国产 精品 | 国产成人一二片 | 91九色国产蝌蚪 | 国产黄色大片免费看 | 久久精品国产亚洲精品2020 | 在线观看的a站 | 国产区精品在线观看 | 亚洲精品五月天 | 国产精品日韩欧美一区二区 | 日本在线观看一区二区 | 免费观看高清 | 一区二区伦理电影 | 伊人av综合 | av高清一区二区三区 | 国产一区二区在线免费观看 | 最近免费中文字幕 | 天天婷婷 | 99久久99视频 | 精品欧美一区二区在线观看 | 欧美一区二区三区在线 | 久久精品99 | av看片在线| 香蕉视频久久久 | 成片免费观看视频大全 | 色欲综合视频天天天 | 国产精品手机视频 | 国产免费亚洲高清 | 五月天国产 | 久久久久久国产一区二区三区 | 永久免费观看视频 | 在线导航av | 91视视频在线直接观看在线看网页在线看 | 久久国产精品一国产精品 | 极品久久久久久久 | 国产精品黄色 | 国产精品男女视频 | 久草在线免 | 麻豆免费观看视频 | www免费看 | 精品a级片 | 色婷婷激情网 | 国产精品久久久久亚洲影视 | 久久成人国产精品 | 色av男人的天堂免费在线 | 热re99久久精品国产66热 | 97超碰人人在线 | 91亚洲影院 | 啪啪精品| 久久99久久99精品免视看婷婷 | 国产视频午夜 | 免费在线观看一区 | 国产一级特黄电影 | 亚欧洲精品视频在线观看 | 日夜夜精品视频 | 婷婷六月久久 | 天天操夜夜拍 | 草久久精品| 激情综合亚洲精品 | 97精品国产91久久久久久久 | 国产在线国偷精品产拍 | 亚洲 av网站 | 亚洲综合情 | 久久五月情影视 | 成人午夜精品久久久久久久3d | 天天草夜夜 | 国产精品免费看久久久8精臀av | 日韩欧美综合精品 | 成人免费观看完整版电影 | 国产 中文 日韩 欧美 | av一级片在线观看 | 久久中文字幕在线视频 | 99精品免费视频 | 婷婷综合影院 | 不卡视频一区二区三区 | www久久久| av资源网在线播放 | 国产成人61精品免费看片 | 国产中文视 | 欧美色噜噜噜 | a一片一级 | 精品国产一二区 | 欧美久久久影院 | 一级一片免费视频 | 国产美女精品视频 | 久久黄色影视 | 成人a级网站| 久久五月天综合 | 亚洲美女视频网 | 99精品国产成人一区二区 | 欧美日韩久久一区 | 亚洲国产精品成人va在线观看 | 韩国精品视频在线观看 | 日韩在线免费观看视频 | 国产91九色视频 | 亚洲码国产日韩欧美高潮在线播放 | 日韩成人免费在线观看 | 国产亚洲视频在线 | 国内亚洲精品 | 天天搞夜夜骑 | 国内精品久久久久久久久久久 | 国产精品99久久久久的智能播放 | 亚洲人天堂 | 国模一二三区 | 999视频网 | 在线观看亚洲国产精品 | 天天色天天干天天 | 超碰在线亚洲 | 麻豆成人精品视频 | 婷婷精品视频 | 超碰免费在线公开 | 婷婷av资源 | 久久久久久久久福利 | 999久久精品 | 国产成人免费 | 91成人在线免费观看 | 日日婷婷夜日日天干 | 天天干天天操天天入 | 色噜噜在线观看视频 | 麻豆91在线看 | 日韩一区二区在线免费观看 | 国产一区二区三区免费观看视频 | 嫩草av在线 | 国产手机在线播放 | 综合久久精品 | 国产精品淫片 | 深夜福利视频在线观看 | 久色伊人 | 国产免费又粗又猛又爽 | 国产视频一区二区在线播放 | 韩国av永久免费 | 又紧又大又爽精品一区二区 | 欧美中文字幕久久 | 欧美性生活大片 | 午夜国产福利在线 | 视频国产一区二区三区 | 一区二区三区播放 | 在线视频区 | 国产剧情一区二区在线观看 | 免费看片网址 | 免费观看国产精品视频 | 久久成人午夜 | 在线一级片 | 久99精品 | 在线国产一区二区三区 | 国产在线视频一区二区三区 | 色搞搞| 一区二区三区精品在线视频 | 在线视频欧美日韩 | 久久久久久久综合色一本 | av综合网址 | 狠狠婷婷| 中文免费观看 | 午夜性福利 | 深夜激情影院 | 欧美日韩天堂 | 美女视频黄频 | 麻豆视频在线免费看 | 欧美一级片免费播放 | 国产一级免费播放 | 91综合久久一区二区 | 97碰在线视频 | 2020天天干夜夜爽 | 丁香综合激情 | 久久久久久久99精品免费观看 | 午夜12点 | 久久综合影院 | 五月婷婷视频在线观看 | 日韩丝袜视频 | 国产在线999 | 久久激情网站 | 欧美成人区 | 亚州天堂 | 亚洲h在线播放在线观看h | 成人免费在线看片 | 99re国产 | 日韩在线中文字幕 | 亚洲精品在线观看的 | 中文字幕你懂的 | 久久精品成人 | 欧美伦理一区 | 日韩精品免费 | 国产成人精品一区二 | 五月天丁香 | 亚a在线 | 午夜色影院 | 天天舔天天搞 | 国产三级午夜理伦三级 | 亚洲乱码国产乱码精品天美传媒 | 国产精品白浆视频 | 91精品久久久久久久久久久久久 | 在线观看免费一级片 | 欧美日韩高清免费 | 日韩久久久久久久久 | 精品免费视频123区 午夜久久成人 | 在线免费黄色片 | 成年人av在线播放 | 99re久久精品国产 | 日韩特黄一级欧美毛片特黄 | 91精品在线播放 | 伊人久久婷婷 | 日韩在线第一 | 亚洲精品99久久久久久 | 99热最新 | 国产中文字幕视频在线 | 黄色三级在线观看 | 午夜av一区二区三区 | 亚洲成av人影院 | 国产五月| 久久婷婷久久 | 婷婷久久网站 | 婷婷av网 | 久久精品一 | 精品综合久久 | 亚洲理论片在线观看 | 国产精选在线 | 99久久99久久免费精品蜜臀 | 国产一区在线免费观看 | 国产精品黄 | 亚洲尺码电影av久久 | 国产九九精品视频 | 日韩av高潮 | 18女毛片 | 天天艹天天 | 国产精品黄网站在线观看 | 欧美乱熟臀69xxxxxx | 亚洲日本中文字幕在线观看 | 日b视频国产 | 97视频在线看 | 色综合天天做天天爱 | 午夜精品电影一区二区在线 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 亚洲jizzjizz日本少妇 | 美女网站色 | 欧美日韩在线观看一区二区 | 国产 日韩 在线 亚洲 字幕 中文 | 人人爽人人干 | 一区二区三区电影 | 精品一区 精品二区 | 一区二区三区免费在线观看视频 | 97视频在线观看播放 | 不卡的av中文字幕 | ww视频在线观看 | 五月天婷婷免费视频 | 91chinesexxx| 91视频国产免费 | 亚洲第一成网站 | 亚洲黄色免费网站 | 中文在线a天堂 | 99热这里只有精品国产首页 | 成人av在线网址 | 欧美一级免费黄色片 | 亚洲精品视频在线观看视频 | 美女免费视频一区 | 日韩av黄| 四虎成人在线 | 在线色亚洲 | 97偷拍视频| 久久久精品二区 | 久久成人国产精品一区二区 | 久久久久久久久久国产精品 | 夜夜躁日日躁狠狠久久av | 不卡的一区二区三区 | 免费观看www视频 | 97视频资源 | 国产精品久久久久久久久搜平片 | 国产高清免费在线观看 | 国产一级三级 | 欧美性护士 | 天天插天天干天天操 | 最近中文字幕mv免费高清在线 | 久久久久亚洲国产精品 | 福利二区视频 | 日本精品视频网站 | 欧美精品久久久久久久久久白贞 | 视频三区在线 | a级国产乱理伦片在线观看 亚洲3级 | 91成人区| 亚洲激情p |