精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

eBPF 助力 NAS 分鐘級別 Pod 實例溯源

云計算 云原生
在多業務共享的場景中,單個業務流量異常容易引發全局故障。目前,異常發生后需依賴云服務廠商 NAS?的溯源能力,但只能定位到主機級別,無法識別具體異常服務。要定位到服務級別,仍需依賴所有使用方協同排查,并由 SRE 多輪統計分析,效率低下(若服務實例發生遷移或重建,排查難度進一步增加)。

一、背景

二、流量溯源方案調研和驗證

    1. NAS 工作原理

    2. 方案調研和驗證

三、架構設計和實現

    1. 整體架構設計

    2. 內核 eBPF 程序流程

    3. 用戶空間程序架構

四、總結

一、 背景

云存儲 NAS 產品是一個可共享訪問、彈性擴展、高可靠、高性能的分布式文件系統。 NAS 兼容了 POSIX 文件接口,可支持數千臺計算節點共享訪問,可掛載到彈性計算 ECS、容器實例等計算業務上,提供高性能的共享存儲服務。

鑒于多主機間共享的便利性和高性能, NAS 在得物的算法訓練、應用構建等場景中均成為了基礎支撐。

圖片圖片

在多業務共享的場景中,單個業務流量異常容易引發全局故障。目前,異常發生后需依賴云服務廠商 NAS 的溯源能力,但只能定位到主機級別,無法識別具體異常服務。要定位到服務級別,仍需依賴所有使用方協同排查,并由 SRE 多輪統計分析,效率低下(若服務實例發生遷移或重建,排查難度進一步增加)。

為避免因 NAS 異常或帶寬占滿導致模型訓練任務受阻,因此需構建支持服務級流量監控、快速溯源及 NAS 異常實時感知的能力,以提升問題定位效率并減少業務中斷。

二、 流量溯源方案調研和驗證

NAS工作原理

NAS 本地掛載原理

在 Linux 平臺上,NAS 的產品底層是基于標準網絡文件系統 NFS(Network File System),通過將遠端文件系統掛載到本地,實現用戶對遠端文件的透明訪問。

NFS 協議(主要支持 NFS v3 和 v4,通常以 v3 為主)允許將遠端服務掛載到本地,使用戶能夠像訪問本地文件目錄一樣操作遠端文件。文件訪問請求通過 RPC 協議發送到遠端進行處理,其整體流程如下:

文件系統訪問時的數據流向示意文件系統訪問時的數據流向示意

Linux 內核中 NFS 文件系統Linux 內核中 NFS 文件系統

在 Linux NFS 文件系統的實現中,文件操作接口由 nfs_file_operations 結構體定義,其讀取操作對應的函數為: 

//NFS 文件系統的 VFS 層實現的函數如下所示:
const struct file_operations nfs_file_operations = {
        .llseek           = nfs_file_llseek,
        .read_iter        = nfs_file_read,
        .write_iter       = nfs_file_write,
        // ...
};

針對 NFS 文件系統的讀操作涉及到 2 個階段(寫流程類似,只是函數名字有所差異,本文僅以讀取為例介紹)。由于文件讀取涉及到網絡操作因此這兩個階段涉及為異步操作:

※ 兩個階段
  • 讀取請求階段:當應用程序針對 NFS 文件系統發起 read() 讀操作時,內核會在VFS層調用 nfs_file_read 函數,然后調用 NFS 層的 nfs_initiate_read 函數,通過 RPC 的 rpc_task_begin 函數將讀請求發送到 NFS Server,至此向 NFS Server 發起的請求工作完成。
  • 讀響應階段:在 NFS Server 返回消息后,會調用 rpc_task_end 和 nfs_page_read_done 等函數,將數據返回到用戶空間的應用程序。

圖片圖片

在了解 NFS 文件系統的讀流程后,我們回顧一下 NFS Server 為什么無法區分單機訪問的容器實例或進程實例。

這是因為 NFS 文件系統的讀寫操作是在內核空間實現的。當容器 A/B 和主機上的進程 C 發起讀請求時,這些請求在進入內核空間后,統一使用主機 IP(如 192.168.1.2)作為客戶端 IP 地址。因此,NFS Server 端的統計信息只能定位到主機維度,無法進一步區分主機內具體的容器或進程。

內核空間實現示意內核空間實現示意

方案調研和驗證

進程對應容器上下文信息關聯

內核中進程以 PID 作為唯一編號,與此同時,內核會建立一個 struct task_struct 對象與之關聯,在 struct task_struct 結構會保存進程對應的上下文信息。如實現 PID 信息與用戶空間容器上下文的對應(進程 PID 1000 的進程屬于哪個 Pod 哪個 Container 容器實例),我們需基于內核 task_struct 結構獲取到容器相關的信息。

通過分析內核代碼和資料確認,發現可以通過 task_struct 結構中對應的 cgroup 信息獲取到進程對應的 cgroup_name 的信息,而該信息中包含了容器 ID 信息,例如 docker-2b3b0ba12e92...983.scope ,完整路徑較長,使用 .... 省略。基于容器 ID 信息,我們可進一步管理到進程所歸屬的 Pod 信息,如 Pod NameSpace 、 Pod Name 、 Container Name 等元信息,最終完成進程 PID 與容器上下文信息元數據關聯。

struct task_struct {
        struct css_set __rcu                *cgroups;
}


struct css_set {
        struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
}


struct cgroup_subsys_state {
        struct cgroup *cgroup;
}


struct cgroup {
  struct kernfs_node *kn;                /* cgroup kernfs entry */
}


struct kernfs_node {
        const char                *name;  // docker-2b3b0ba12e92...983.scope
}

以某容器進程為例,該進程在 Docker 容器環境中的 cgroup 路徑完整為   /sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podefeb3229_4ecb_413a_8715_5300a427db26.slice/docker-2b3b0ba12e925820ac8545f67c8cadee864e5b4033b3d5004d8a3aa742cde2ca.scope 。

經驗證,我們在內核中讀取 task->cgroups->subsys[0]->kn->name 的值為 docker-2b3b0ba12e925820ac8545f67c8cadee864e5b4033b3d5004d8a3aa742cde2ca.scope 。

圖片圖片

其中容器 ID 字段為 docker- 與 .scope 間的字段信息,在 Docker 環境中一般取前 12 個字符作為短 ID,如 2b3b0ba12e92 ,可通過 docker 命令進行驗證,結果如下:

docker ps -a|grep 2b3b0ba
2b3b0ba12e92        registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/pause:3.5

NAS 上下文信息關聯

NAS 產品的訪問通過掛載命令完成本地文件路徑的掛載。我們可以通過 mount 命令將 NAS 手工掛載到本地文件系統中。

mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport \
  3f0f3489aa-xxxx.cn-shanghai.nas.aliyuncs.com:/test /mnt/nas

執行上述掛載命令成功后,通過 mount 命令則可查詢到類似的掛載記錄:

5368 47 0:660 / /mnt/nas rw,relatime shared:1175 \
     - nfs 3f0f3489aa-xxxx.cn-shanghai.nas.aliyuncs.com:/test \    
     rw,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,\
     noresvport,proto=tcp,timeo=600,retrans=2,sec=sys, \
     mountaddr=192.168.0.91,mountvers=3,mountport=2049,mountproto=tcp,\
     local_lock=all,addr=192.168.0.92

核心信息分析如下:

# 掛載點 父掛載點 掛載設備號   目錄     掛載到本機目錄  協議   NAS地址
5368     47       0:660     /       /mnt/nas     nfs    3f0f3489aa-xxxx.cn-shanghai.nas.aliyuncs.com:/test
                maror:minor

掛載記錄中的 0:660 為本地設備編號,格式為 major:minor , 0 為 major 編號, 660 為 minor 編號,系統主要以 minor 為主。在系統的 NFS 跟蹤點 nfs_initiate_read 的信息中的 dev 字段則為在掛載記錄中的 minor 編號。

cat /sys/kernel/debug/tracing/events/nfs/nfs_initiate_read/format
format:
      
        field:dev_t dev;        offset:8;         size:4;        signed:0;
         ...
        field:u32 count;        offset:32;        size:4;        signed:0;

通過用戶空間 mount 信息和跟蹤點中 dev_id 信息,則可實現內核空間設備編號與 NAS 詳情的關聯。

內核空間信息獲取

如容器中進程針對掛載到本地的目錄 /mnt/nas 下的文件讀取時,會調用到 nfs_file_read() 和 nfs_initiate_read 函數。通過 nfs_initiate_read 跟蹤點我們可以實現進程容器信息和訪問 NFS 服務器的信息關聯。

通過編寫 eBPF 程序針對跟蹤點 tracepoint/nfs/nfs_initiate_read 觸發事件進行數據獲取,我們可獲取到訪問進程所對應的 cgroup_name 信息和訪問 NFS Server 在本機的設備 dev_id 編號。

圖片圖片

獲取cgroup_name信息

  • 進程容器上下文獲取: 通過 cgroup_name 信息,如樣例中的 docker-2b3b0ba12e92...983.scope ,后續可以基于 container_id 查詢到容器對應的 Pod NameSpace 、 Pod Name 和 Container Name 等信息,從而定位到訪問進程關聯的 Pod 信息。
  • NAS 上下文信息獲取: 通過 dev 信息,樣例中的 660 ,通過掛載到本地的記錄,可以通過 660 查詢到對應的 NAS 產品的地址,比如3f0f3489aa-xxxx.cn-shanghai.nas.aliyuncs.com 。

用戶空間元信息緩存

圖片圖片

在用戶空間中,可以通過解析掛載記錄來獲取 DEV 信息,并將其與 NAS 信息關聯,從而建立以 DevID 為索引的查詢緩存。如此,后續便可以基于內核獲取到 dev_id 進行關聯,進一步補全 NAS 地址及相關詳細信息。

對于本地容器上下文的信息獲取,最直接的方式是通過 K8s  kube-apiserver 通過 list-watch 方法進行訪問。然而,這種方式會在每個節點上啟動一個客戶端與 kube-apiserver 通信,顯著增加 K8s 管控面的負擔。因此,我們選擇通過本地容器引擎進行訪問,直接在本地獲取主機的容器詳情。通過解析容器注解中的 Pod 信息,可以建立容器實例緩存。后續在處理指標數據時,則可以通過 container-id 實現信息的關聯與補全。

三、架構設計和實現

整體架構設計

內核空間的信息采集采用 Linux eBPF 技術實現,這是一種安全且高效的內核數據采集方式。簡單來說,eBPF 的原理是在內核中基于事件運行用戶自定義程序,并通過內置的 map 和 perf 等機制實現用戶空間與內核空間之間的雙向數據交換。

在 NFS 和 RPC 調用事件觸發的基礎上,可以通過編寫內核空間的 eBPF 程序來獲取必要的原始信息。當用戶空間程序搜集到內核指標數據后,會對這些原始信息進行二次處理,并在用戶空間的采集程序中補充容器進程信息(如 NameSpace、Pod 和 Container 名稱)以及 NFS 地址信息(包括 NFS 遠端地址)。

圖片圖片

內核eBPF程序流程

以 NFS 文件讀為例,通過編寫 eBPF 程序跟蹤 nfs_initiate_read / rpc_task_begin / rpc_task_end / nfs_page_read_done 等關鍵鏈路上的函數,用于獲取到 NFS 讀取的數據量和延時數據,并將訪問鏈路中的進程上下文等信息保存到內核中的指標緩存中。

圖片圖片

如上圖所示, nfs_initate_read 和 rpc_task_begin 發生在同一進程上下文中,而 rpc_task_begin 與 rpc_task_end 是異步操作,盡管兩者不處于同一進程上下文,但可以通過 task_id 進行關聯。同時, page_read_done 和 rpc_task_end 則發生在同一進程上下文中。

圖片圖片

 nfs_initiate_read 函數調用觸發的 eBPF 代碼示例如下所示:

SEC("tracepoint/nfs/nfs_initiate_read")
int tp_nfs_init_read(struct trace_event_raw_nfs_initiate_read *ctx)
    // 步驟1 獲取到 nfs 訪問的設備號信息,比如 3f0f3489aa-xxxx.cn-shanghai.nas.aliyuncs.com
    // dev_id 則為: 660 
    dev_t dev_id = BPF_CORE_READ(ctx, dev);
    u64 file_id = BPF_CORE_READ(ctx, fileid);
    u32 count = BPF_CORE_READ(ctx, count);
   
    struct task_struct *task = (struct task_struct *)bpf_get_current_task();


    // 步驟2 獲取進程上下文所在的容器 cgroup_name 信息
    // docker-2b3b0ba12e925820ac8545f67c8cadee864e5b4033b3d5004d8a3aa742cde2ca.scope
    const char *cname = BPF_CORE_READ(task, cgroups, subsys[0], cgroup, kn, name);
    if (cname)
    {
        bpf_core_read_str(&info.container, MAX_PATH_LEN, cname);
    }


    bpf_map_update_elem(&link_begin, &tid, &info, BPF_ANY);
}


SEC("tracepoint/nfs/nfs_readpage_done")
int tp_nfs_read_done(struct trace_event_raw_nfs_readpage_done *ctx)
{
   //... 省略
}


SEC("tracepoint/sunrpc/rpc_task_begin")
int tp_rpc_task_begin(struct trace_event_raw_rpc_task_running *ctx)
{
    //... 省略
}


SEC("tracepoint/sunrpc/rpc_task_end")
int tp_rpc_task_done(struct trace_event_raw_rpc_task_running *ctx)
{
   //... 省略
}

用戶空間程序架構

圖片圖片

元數據緩存

※ NAS 掛載信息緩存

通過解析掛載記錄,可以獲取 DEV 信息與 NAS 信息的關聯關系。以下是實現該功能的關鍵代碼詳情:

scanner := bufio.NewScanner(mountInfoFile)
count := 0
for scanner.Scan() {
    line := scanner.Text()
    devID,remoteDir, localDir, NASAddr = parseMountInfo(line)


    mountInfo := MountInfo{
       DevID:         devID,
       RemoteDir:     remoteDir,
       LocalMountDir: localDir,
       NASAddr: NASAddr,
    }
    mountInfos = append(mountInfos, mountInfo)

※  容器元信息緩存

通過 Docker 或 Containerd 客戶端,從本地讀取單機的容器實例信息,并將容器的上下文數據保存到本地緩存中,以便后續查詢使用。

podInfo := PodInfo{
    NameSpace:     labels["io.kubernetes.pod.namespace"],
    PodName:       labels["io.kubernetes.pod.name"],
    ContainerName: labels["io.kubernetes.container.name"],
    UID:           labels["io.kubernetes.pod.uid"],
    ContainerID:   conShortID,
}

數據處置流程

用戶空間程序的主要任務是持續讀取內核 eBPF 程序生成的指標數據,并對讀取到的原始數據進行處理,提取訪問設備的 dev_id 和 container_id 。隨后,通過查詢已建立的元數據緩存,分別獲取 NAS 信息和容器 Pod 的上下文數據。最終,經過數據合并與處理,生成指標數據緩存供后續使用。

func (m *BPFEventMgr) ProcessIOMetric() {
    // ...
    events := m.ioMetricMap
    iter := events.Iterate()


    for iter.Next(&nextKey, &event) {
       // ① 讀取到的 dev_id 轉化為對應的完整 NAS 信息
       devId := nextKey.DevId
       mountInfo, ok := m.mountMgr.Find(int(devId))


       // ② 讀取 containerID 格式化并查詢對應的 Pod 上下文信息
       containerId := getContainerID(nextKey.Container)
       podInfo, ok = m.criMgr.Find(containerId)
      
       // ③ 基于事件信息、NAS 掛載信息和 Pod 上下文信息,生成指標數據緩存 
       metricKey, metricValue := formatMetricData(nextKey, mountInfo, podInfo)
       value, loaded := metricCache.LoadOrStore(metricKey, metricValue)
    }
    
    // ④ 指標數據緩存,生成最終的 Metrics 指標并更新 
    var ioMetrics []metric.Counter
    metricCache.Range(func(key, value interface{}) bool {
       k := key.(metric.IOKey)
       v := value.(metric.IOValue)


       ioMetrics = append(ioMetrics, metric.Counter{"read_count", float64(v.ReadCount),
             []string{k.NfsServer, v.NameSpace, v.Pod, v.Container})
         // ...
       }
       return true
    })
    
    m.metricMgr.UpdateIOStat(ioMetrics)
}

啟動 Goroutine 處理指標數據:通過啟動一個 Goroutine,循環讀取內核存儲的指標數據,并對數據進行處理和信息補齊,最終生成符合導出格式的 Metrics 指標。

※  具體步驟
  • 獲取 NAS 信息:從讀取的原始數據中提取 dev_id ,并通過 dev_id 查詢掛載的 NAS 信息,例如遠端訪問地址等相關數據。
  • 查詢 Pod 上下文:對 containerID 進行格式化處理,并查詢對應的容器 Pod 上下文信息。
  • 生成指標數據緩存:基于事件數據、NAS 掛載信息和 Pod 上下文信息,生成指標數據緩存。此過程主要包括對相同容器上下文的數據進行合并和累加。
  • 導出 Metrics 指標:根據指標數據緩存,生成最終的 Metrics 指標,并更新到指標管理器。隨后,通過自定義的 Collector 接口對外導出數據。當 Prometheus 拉取數據時,指標會被轉換為最終的 Metrics 格式。

通過上述步驟,用戶空間能夠高效地處理內核 eBPF 程序生成的原始數據,并結合 NAS 掛載信息和容器上下文信息,生成符合 Prometheus 標準的 Metrics 指標,為后續的監控和分析提供了可靠的數據基礎。

自定義指標導出器

在導出指標的場景中,我們需要基于保存在 Go 語言中的 map 結構中的動態數據實時生成,因此需要實現自定義的 Collector 接口。自定義 Collector 接口需要實現元數據描述函數 Describe() 和指標搜集的函數 Collect() ,其中 Collect() 函數可以并發拉取,因此需要通過加鎖實現線程安全。該接口需要實現以下兩個核心函數:

  •  Describe() :用于定義指標的元數據描述,向 Prometheus 注冊指標的基本信息。
  •  Collect() :用于搜集指標數據,該函數支持并發拉取,因此需要通過加鎖機制確保線程安全。
type Collector interface {
    // 指標的定義描述符
    Describe(chan<- *Desc)
   
    // 并將收集的數據傳遞到Channel中返回
    Collect(chan<- Metric)
}

我們在指標管理器中實現 Collector 接口, 部分實現代碼,如下所示:

nfsIOMetric := prometheus.NewDesc(
    prometheus.BuildFQName(prometheusNamespace, "", "io_metric"),
    "nfs io metrics by cgroup",
    []string{"nfs_server", "ns", "pod", "container", "op", "type"},
    nil,
)


// Describe and Collect implement prometheus collect interface
func (m *MetricMgr) Describe(ch chan<- *prometheus.Desc) {
    ch <- m.nfsIOMetric
}


func (m *MetricMgr) Collect(ch chan<- prometheus.Metric) {
    // Note:加鎖保障線程并發安全
    m.activeMutex.Lock()
    defer m.activeMutex.Unlock()
    
    for _, v := range m.ioMetricCounters {
       ch <- prometheus.MustNewConstMetric(m.nfsIOMetric, prometheus.GaugeValue, v.Count, v.Labels...)
    }

四、總結

當前 NAS 溯源能力已正式上線,以下是主要功能和視圖介紹:

※  單 NAS 實例整體趨勢

支持基于環境和 NAS 訪問地址過濾,展示 NAS 產品的讀寫 IOPS 和吞吐趨勢圖。同時,基于內核空間統計的延時數據,提供 P95 讀寫延時指標,用于判斷讀寫延時情況,輔助問題分析和定位。

圖片圖片

圖片圖片

在 NAS 流量溯源方面,我們結合業務場景設計了基于任務和 Pod 實例維度的流量分析視圖:

※  任務維度流量溯源

通過聚合具有共同屬性的一組 Pod 實例,展示任務級別的整體流量情況。該視圖支持快速定位任務級別的流量分布,幫助用戶進行流量溯源和多任務錯峰使用的依據。

圖片圖片

※  Pod 實例維度流量溯源

以 Pod 為單位進行流量分析和匯總,提供 Pod  NameSpace 和 Name 信息,支持快速定位和分析實例級別的流量趨勢,幫助細粒度監控和異常流量的精準定位。

圖片圖片

在整體能力建設完成后,我們成功構建了 NAS 實例級別的 IOPS、吞吐和讀寫延時數據監控大盤。通過該能力,進一步實現了 NAS 實例的 IOPS 和吞吐可以快速溯源到任務級別和 Pod 實例級別,流量溯源時效從小時級別縮短至分鐘級別,有效提升了異常問題定位與解決的效率。同時,基于任務流量視圖,我們為后續帶寬錯峰復用提供了直觀的數據支持。


責任編輯:武曉燕 來源: 得物技術
相關推薦

2021-11-05 16:34:58

區塊鏈資格證技術

2022-08-22 10:29:16

APT溯源反溯源APT攻擊

2023-06-14 08:49:22

PodKubernetes

2022-08-16 09:15:30

存儲

2020-02-12 07:21:03

人工智能AI疫情防控

2023-01-10 11:34:06

2016-04-19 18:20:29

阿里巴巴HBase宕機恢復

2023-10-13 13:40:29

2024-04-30 08:17:57

eBPF技術性能

2024-02-01 12:38:22

事件流事件溯源系統

2020-11-05 10:39:19

安全技術

2015-10-30 10:49:27

OpenStackIaaS

2015-04-23 16:07:18

云存儲

2022-04-01 17:21:59

戴爾

2021-03-22 21:25:47

AI

2022-10-17 15:03:18

eBPFiptables可觀測

2022-01-26 00:01:02

網格EbpfISTIO

2022-02-15 11:49:08

eBPFGo內存

2023-10-05 06:13:12

點贊
收藏

51CTO技術棧公眾號

亚洲电影免费观看高清| 亚洲综合免费观看高清完整版| 日本一区二区不卡| 日本黄区免费视频观看| 欧美最猛性xxxx| 性爱在线免费视频| 视频一区中文字幕精品| 午夜视频一区二区三区| 日韩久久在线| 性中国古装videossex| 国产视频久久| 久久亚洲国产精品成人av秋霞| 欧洲美女亚洲激情| 亚洲人体影院| 亚洲欧美日韩在线不卡| 久久天堂国产精品| jlzzjlzz亚洲女人18| 天堂蜜桃一区二区三区 | 亚洲精品乱码久久| 免费在线观看一区| 亚洲国产精品久久人人爱| 五月天亚洲综合情| 天堂中文在线观看视频| 激情久久久久久久久久久久久久久久| 97视频在线看| 国产在线一卡二卡| 欧美精品一区二区三区中文字幕 | 天堂在线观看免费视频| 蜜桃精品视频在线观看| 97精品国产97久久久久久春色| 亚洲人与黑人屁股眼交| 国产成人精品一区二区免费看京 | 国产麻豆剧传媒精品国产av| av亚洲一区| 色综合久久九月婷婷色综合| 男女日批视频在线观看| 超碰在线caoporn| 国产精品无遮挡| 欧洲精品国产| 日韩欧美亚洲系列| 99国产精品久久久久久久久久 | 欧洲杯足球赛直播| 精品一区二区三区四区| 超碰caoprom| 一区二区三区欧洲区| 欧美一区二区三区人| 中文字幕12页| 成人51免费| 欧美日韩另类一区| 91n.com在线观看| 久草在线资源福利站| 午夜视频在线观看一区| 800av在线免费观看| 免费观看久久久久| 国产欧美日韩视频一区二区 | 福利网址在线观看| 91久久亚洲| 九九热精品视频| 加勒比婷婷色综合久久| 国产二区精品| 久久国产一区二区三区| 色综合99久久久无码国产精品| 你懂的在线观看一区二区| 欧美刺激脚交jootjob| 一级网站在线观看| 成人性生活视频| 午夜天堂影视香蕉久久| 亚洲国产精品成人天堂| 18av在线播放| 亚洲乱码国产乱码精品精可以看| 99re99热| av片在线观看永久免费| 亚洲女爱视频在线| 91精品国产吴梦梦| 日本动漫同人动漫在线观看| 亚洲精品精品亚洲| 国产一级黄色录像片| h片在线免费观看| 亚洲欧美乱综合| 日本美女爱爱视频| 超碰电影在线播放| 亚洲另类一区二区| 岛国大片在线播放| 在线观看v片| 在线视频观看一区| 中日韩av在线播放| 国产美女精品视频免费播放软件| 日韩一区二区在线看| 日韩高清一二三区| 色婷婷久久久| 一区二区三区精品99久久 | 玖玖精品在线视频| 激情图片在线观看高清国产| 亚洲精品久久久久久国产精华液| 免费人成自慰网站| caoporn视频在线| 色系网站成人免费| 中文字幕一区久久| 久久男人av| 国产一区二区三区中文| √天堂中文官网8在线| 激情欧美日韩一区| 国产精品成人v| 国产超碰人人模人人爽人人添| 丁香婷婷深情五月亚洲| 欧美二区三区| 午夜老司机在线观看| 亚洲精品欧美二区三区中文字幕| 欧美美女黄色网| 深夜福利视频一区二区| 精品视频在线免费观看| 国产精品嫩草69影院| 偷拍一区二区| 北条麻妃一区二区三区中文字幕| 日韩字幕在线观看| 免费一级欧美片在线观看| 97在线电影| 国产午夜视频在线观看| 亚洲欧美日韩精品久久久久| 少妇人妻在线视频| 全球中文成人在线| 日韩电视剧免费观看网站| 亚洲欧美日韩第一页| 欧美日韩午夜| 国产精品视频男人的天堂| 黄色成人一级片| 亚洲国产精品成人久久综合一区| 色撸撸在线观看| 3d性欧美动漫精品xxxx软件| 精品88久久久久88久久久| 亚洲激情图片网| 国产精品三上| 99久久99久久| 又爽又大又黄a级毛片在线视频| 亚洲一区二区精品视频| www.日本一区| 青草久久视频| 欧美激情视频一区二区| 91无套直看片红桃| 99久久精品免费| 久久99国产精品一区| 成人全视频在线观看在线播放高清| 精品成人一区二区三区四区| 日本成人免费在线观看| 日韩国产高清在线| 久热这里只精品99re8久 | 国产又色又爽又黄又免费| 久久一日本道色综合| 妺妺窝人体色www看人体| 97精品国产99久久久久久免费| 亚洲欧美一区二区三区久久| 日韩精品在线不卡| 国产91丝袜在线播放九色| 亚洲综合欧美日韩| 日本欧美韩国| 亚洲片av在线| 亚洲日本视频在线观看| av在线不卡免费看| 日韩a∨精品日韩在线观看| 91精品啪在线观看国产爱臀| 欧美成人免费视频| 国产深喉视频一区二区| 亚洲另类春色国产| 四川一级毛毛片| 一区二区影视| 91沈先生在线观看| 久久日韩视频| 884aa四虎影成人精品一区| 三级黄色免费观看| 国内精品自线一区二区三区视频| 在线一区日本视频| 国产精品国产三级在线观看| 久久躁狠狠躁夜夜爽| 国产手机视频在线| 一区二区三区精品在线| 高清中文字幕mv的电影| 亚洲人成久久| 国产精品日韩一区二区免费视频 | xxxxxxxxx欧美| 国产精品久久久久久久久久久久久久久久久久 | 欧美一级片在线播放| 三级黄视频在线观看| 色猫猫国产区一区二在线视频| 中文字幕xxx| 国产精品久久国产愉拍| 九九九九精品| 日韩在线影院| 久久精品亚洲热| 亚洲h视频在线观看| 午夜精品福利在线| 91中文字幕永久在线| 免费人成精品欧美精品| 中文字幕日韩精品一区二区| 日韩一区免费| 欧美一级视频在线观看| 成人在线高清视频| 欧美日韩国产首页在线观看| 久操视频免费在线观看| 99久久精品免费| 一区二区免费av| 国产亚洲成人一区| 亚洲无玛一区| 亚洲va久久久噜噜噜久久| 国产欧美一区二区白浆黑人| 国产伦子伦对白在线播放观看| 亚洲性av网站| 狠狠躁日日躁夜夜躁av| 在线欧美小视频| 日本熟女一区二区| 国产精品网站一区| 亚洲av无码成人精品国产| 老司机午夜精品99久久| 日本久久久精品视频| 亚洲一区二区三区无吗| 日韩免费毛片| 嫩草国产精品入口| av蓝导航精品导航| 青青热久免费精品视频在线18| 久热精品视频在线观看| 男操女在线观看| 欧美不卡在线视频| 一二三区免费视频| 精品色蜜蜜精品视频在线观看| 亚洲不卡的av| ww亚洲ww在线观看国产| 亚洲精品国产久| 久久久久久网| av在线观看地址| 91精品一区国产高清在线gif| 成人av电影免费| 国产精品亚洲一区二区在线观看| 日本免费一区二区三区视频观看| 手机av免费在线| 在线观看91久久久久久| 五月婷在线视频| 日韩欧美激情在线| 国产乱叫456在线| 欧美中文字幕一区| 免费看一级一片| 亚洲免费色视频| 2014亚洲天堂| 国产精品色一区二区三区| 国产精品一区二区入口九绯色| 国产成人aaa| 中文字幕1234区| 蜜桃av噜噜一区二区三区小说| 丁香六月激情婷婷| 亚洲欧洲视频| 国产美女永久无遮挡| 婷婷综合视频| 午夜欧美一区二区三区免费观看| 偷拍精品福利视频导航| 精品国产一区二区三| 99亚洲乱人伦aⅴ精品| 95av在线视频| 色播一区二区| 成人在线观看网址| 亚洲精品观看| 超碰97国产在线| 亚洲91网站| 成人免费视频视频在| 2023国产精华国产精品| 成人久久一区二区| 中文字幕av一区二区三区四区| 92国产精品久久久久首页| gogo大尺度成人免费视频| 91精品久久久久久久久久入口| 电影在线观看一区二区| 国产精品免费一区豆花| av成人亚洲| 91沈先生作品| 牲欧美videos精品| 日韩不卡av| 日本午夜一区| 中文字幕欧美日韩一区二区| 在线精品视频在线观看高清| 成人午夜免费剧场| 亚洲先锋影音| 每日在线更新av| 日韩中文字幕91| 亚洲a级黄色片| 国产乱码精品一区二区三区五月婷| 三级黄色片免费观看| 国产91高潮流白浆在线麻豆| 污污免费在线观看| 91视频一区二区| 99久久精品久久亚洲精品| 国产精品成人午夜| 麻豆亚洲av熟女国产一区二| 精品久久久精品| 色婷婷久久综合中文久久蜜桃av| 欧美乱妇23p| 黑人乱码一区二区三区av| 亚洲福利小视频| 成人在线免费公开观看视频| 欧美成人午夜激情| 色一区二区三区| 成人精品视频99在线观看免费| 伊人久久影院| 欧美日韩在线精品一区二区三区| 日韩大片在线播放| 99视频精品全部免费看| 亚洲在线成人| 中文字幕 日韩 欧美| 国产91对白在线观看九色| 亚洲精品国产熟女久久久| 亚洲精品国产高清久久伦理二区| 中日韩精品视频在线观看| 色综合天天在线| 黄色片网站免费在线观看| 在线看片第一页欧美| 青草在线视频在线观看| 国产成人激情小视频| 国产精久久久| 欧美久久综合性欧美| 日本久久一二三四| 国产一区二区三区精彩视频 | 成人综合久久网| 91美女蜜桃在线| 亚洲色图综合区| 在线一区二区视频| 日本激情视频网站| 精品少妇一区二区30p| 国产成人精品123区免费视频| 国产精品久久久久久久久婷婷| 精品中文一区| 久青草视频在线播放| 蜜臀av一区二区在线免费观看 | 欧美亚洲韩国| 成人一区二区三区四区| 99精品在线观看| 91免费视频网站在线观看| 成人av午夜电影| 紧身裙女教师波多野结衣| 欧美性猛片aaaaaaa做受| 人妻va精品va欧美va| 久久久国产一区二区三区| 亚洲天堂一区二区| 精品一区二区不卡| 久久综合99| www午夜视频| 国产午夜精品一区二区三区四区| 日韩久久精品视频| 亚洲福利视频二区| av男人的天堂在线观看| 91精品久久久久久久久久久| 精品免费在线| 久久久久免费精品| 久久久噜噜噜久久人人看| 亚洲日本韩国在线| 精品国产91乱码一区二区三区 | 日韩欧美在线综合网| 国产福利片在线| 国产97人人超碰caoprom| 久久久久影视| 精品视频免费在线播放| 国产69精品久久久久777| 特级片在线观看| 欧美一级午夜免费电影| 日韩在线观看www| 91亚色免费| 欧美激情视频一区二区三区免费| 爱爱爱爱免费视频| 亚洲欧美在线视频| 国产一区二区三区黄片| www日韩欧美| 天堂久久一区| 国产日韩欧美大片| 欧美性猛交xxxxx少妇| 国产精品二区一区二区aⅴ污介绍| 久久国产乱子伦精品| 国产性色av一区二区| 色偷偷偷在线视频播放| 五月天色一区| 久久99精品久久久| √天堂中文官网8在线| 欧美成人精品福利| av中文资源在线资源免费观看| 精品久久一区二区三区蜜桃| 久久视频一区| 欧美性受xxxx黑人| 欧美久久免费观看| av在线免费网址| 国产亚洲福利社区| 日韩黄色免费网站| jizzjizz日本少妇| 337p日本欧洲亚洲大胆精品 | 777午夜精品福利在线观看| 牛牛影视一区二区三区免费看| 国产女女做受ⅹxx高潮| 国产精品欧美精品| www.国产.com| 88xx成人精品| 婷婷亚洲五月色综合| 中文字幕一区二区三区人妻在线视频| 亚洲第一久久影院| 国产原创av在线| 91久久精品一区二区别 | 少妇性饥渴无码a区免费| 久久久精品免费网站|