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

聊聊Docker EOF問(wèn)題排查

安全 應(yīng)用安全
問(wèn)題排查過(guò)程,源碼部分均由我的開(kāi)發(fā)同事排查和記錄;在征得其同意后,由我發(fā)表在此。

[[402863]]

本文轉(zhuǎn)載自微信公眾號(hào)「運(yùn)維開(kāi)發(fā)故事」,作者運(yùn)維開(kāi)發(fā)故事。轉(zhuǎn)載本文請(qǐng)聯(lián)系運(yùn)維開(kāi)發(fā)故事公眾號(hào)。

一、前言

問(wèn)題排查過(guò)程,源碼部分均由我的開(kāi)發(fā)同事排查和記錄;在征得其同意后,由我發(fā)表在此。

二、問(wèn)題

某天接到客戶反饋,pod的事件中出現(xiàn)大量的 warning event: Readiness probe failed: OCI runtime exec failed: exec failed: EOF: unknown。但不影響客戶訪問(wèn)該服務(wù)。

三、環(huán)境

特別說(shuō)明:客戶在負(fù)責(zé)運(yùn)行業(yè)務(wù)的k8s節(jié)點(diǎn)上堅(jiān)持開(kāi)啟了cpu-manager

組件 版本  
k8s 1.14.x  

四、排查

1、接到客戶反饋后,檢查該pod所在節(jié)點(diǎn)的kubelet日志,如下:

  1. I0507 03:43:28.310630  57003 prober.go:112] Readiness probe for "adsfadofadfabdfhaodsfa(d1aab5f0- 
  2. ae8f-11eb-a151-080027049c65):c0" failed (failure): OCI runtime exec failed: exec failed: EOF: unknown 
  3. I0507 07:08:49.834093  57003 prober.go:112] Readiness probe for "adsfadofadfabdfhaodsfa(a89a158e- 
  4. ae8f-11eb-a151-080027049c65):c0" failed (failure): OCI runtime exec failed: exec failed: unexpected EOF: unknown 
  5. I0507 10:06:58.307881  57003 prober.go:112] Readiness probe for "adsfadofadfabdfhaodsfa(d1aab5f0- 
  6. ae8f-11eb-a151-080027049c65):c0" failed (failure): OCI runtime exec failed: exec failed: EOF: unknown 

probe的錯(cuò)誤類型為failure,對(duì)應(yīng)代碼如下:圖片2、再查看docker日志,如下:

  1. time="2021-05-06T16:51:40.009989451+08:00" level=error msg="stream copy error: reading from a closed fifo" 
  2. time="2021-05-06T16:51:40.010054596+08:00" level=error msg="stream copy error: reading from a closed fifo" 
  3. time="2021-05-06T16:51:40.170676532+08:00" level=error msg="Error running exec 8e34e8b910694abe95a467b2936b37635fdabd2f7b7c464d 
  4. fef952fa5732aa4e in container: OCI runtime exec failed: exec failed: EOF: unknown" 

雖然從Docker日志中顯示是 stream copy error,但實(shí)際上是底層的 runc 返回了 EOF,導(dǎo)致返回了 error。3、因?yàn)槿罩局酗@示 probe 類型為 Failure,因此 e.CombinedOutPut() 的 err != nil,并且 ExitStatus 不為 0,data 的值為 OCI runtime exec failed: exec failed: unexpected EOF: unknown,最終會(huì)調(diào)用到 RunInContainer 方法

ExecSync 是通過(guò) GRPC 調(diào)用了 dockershim 的 ExecSync

dockershim 最終調(diào)用到 ExecInContainer 方法,并且該方法的返回了 exitcode 不為 0 的 error。

  1. func (*NativeExecHandler) ExecInContainer(client libdocker.Interface, container *dockertypes.ContainerJSON, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error { 
  2.    execObj, err := client.CreateExec(container.ID, createOpts) 
  3.     
  4.    startOpts := dockertypes.ExecStartCheck{Detach: false, Tty: tty} 
  5.    streamOpts := libdocker.StreamOptions{ 
  6.       InputStream:  stdin, 
  7.       OutputStream: stdout, 
  8.       ErrorStream:  stderr, 
  9.       RawTerminal:  tty, 
  10.       ExecStarted:  execStarted, 
  11.    } 
  12.    err = client.StartExec(execObj.ID, startOpts, streamOpts) 
  13.    if err != nil { 
  14.       return err 
  15.    } 
  16.  
  17.     ticker := time.NewTicker(2 * time.Second
  18.     defer ticker.Stop() 
  19.     count := 0 
  20.     for { 
  21.        inspect, err2 := client.InspectExec(execObj.ID) 
  22.        if err2 != nil { 
  23.           return err2 
  24.        } 
  25.        if !inspect.Running { 
  26.           if inspect.ExitCode != 0 { 
  27.              err = &dockerExitError{inspect} 
  28.           } 
  29.           break 
  30.        } 
  31.      
  32.        count++ 
  33.        if count == 5 { 
  34.           klog.Errorf("Exec session %s in container %s terminated but process still running!", execObj.ID, container.ID) 
  35.           break 
  36.        } 
  37.      
  38.        <-ticker.C 
  39.     } 
  40.  
  41.    return err 

ExecInContainer 做了以下幾件事:

  1. 調(diào)用 CreateExec 創(chuàng)建 ExecID
  2. 調(diào)用 StartExec 執(zhí)行 exec,并通過(guò) holdHijackedConnection 來(lái)重定向輸入輸出。將 inputStream 寫(xiě)入到 connection,并將 response stream 重定向到 stdout,stderr。
  3. 調(diào)用 InspectExec 獲取本次 exec 的運(yùn)行狀態(tài)和 exitcode

那么日志中打印的報(bào)錯(cuò)就是 response stream 傳遞過(guò)來(lái)的字符流。也就是說(shuō),dockerd 的 response 中包含了錯(cuò)誤值。

此時(shí)去 docker 代碼中查找原因,ExecStart 會(huì)調(diào)用到 dockerd 的以下代碼:

根據(jù)上面 docker 的日志,err 的錯(cuò)誤信息為:OCI runtime exec failed: exec failed: EOF: unknown。也就是說(shuō) ContainerExecStart 返回了錯(cuò)誤。ContainerExecStart 會(huì)調(diào)用到 containerd.Exec,也就是 dockerd 和 containerd 之間進(jìn)行通信

  1. // docker/libcontainerd/client_daemon.go 
  2. // Exec creates exec process. 
  3. // 
  4. // The containerd client calls Exec to register the exec config in the shim side. 
  5. // When the client calls Start, the shim will create stdin fifo if needs. But 
  6. // for the container main process, the stdin fifo will be created in Create not 
  7. // the Start call. stdinCloseSync channel should be closed after Start exec 
  8. // process. 
  9. func (c *client) Exec(ctx context.Context, containerID, processID string, spec *specs.Process, withStdin bool, attachStdio StdioCallback) (int, error) { 
  10.    ctr := c.getContainer(containerID) 
  11.    if ctr == nil { 
  12.       return -1, errors.WithStack(newNotFoundError("no such container")) 
  13.    } 
  14.    t := ctr.getTask() 
  15.    if t == nil { 
  16.       return -1, errors.WithStack(newInvalidParameterError("container is not running")) 
  17.    } 
  18.  
  19.    if p := ctr.getProcess(processID); p != nil { 
  20.       return -1, errors.WithStack(newConflictError("id already in use")) 
  21.    } 
  22.  
  23.    var ( 
  24.       p              containerd.Process 
  25.       rio            cio.IO 
  26.       err            error 
  27.       stdinCloseSync = make(chan struct{}) 
  28.    ) 
  29.  
  30.    fifos := newFIFOSet(ctr.bundleDir, processID, withStdin, spec.Terminal) 
  31.  
  32.    defer func() { 
  33.       if err != nil { 
  34.          if rio != nil { 
  35.             rio.Cancel() 
  36.             rio.Close() 
  37.          } 
  38.       } 
  39.    }() 
  40.  
  41.    p, err = t.Exec(ctx, processID, spec, func(id string) (cio.IO, error) { 
  42.       rio, err = c.createIO(fifos, containerID, processID, stdinCloseSync, attachStdio) 
  43.       return rio, err 
  44.    }) 
  45.    if err != nil { 
  46.       close(stdinCloseSync) 
  47.       return -1, wrapError(err) 
  48.    } 
  49.  
  50.    ctr.addProcess(processID, p) 
  51.  
  52.    // Signal c.createIO that it can call CloseIO 
  53.    // 
  54.    // the stdin of exec process will be created after p.Start in containerd 
  55.    defer close(stdinCloseSync) 
  56.  
  57.    if err = p.Start(ctx); err != nil { 
  58.       // use new context for cleanup because old one may be cancelled by user, but leave a timeout to make sure 
  59.       // we are not waiting forever if containerd is unresponsive or to work around fifo cancelling issues in 
  60.       // older containerd-shim 
  61.       ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second
  62.       defer cancel() 
  63.       p.Delete(ctx) 
  64.       ctr.deleteProcess(processID) 
  65.       return -1, wrapError(err) 
  66.    } 
  67.  
  68.    return int(p.Pid()), nil 

這里 new 了一個(gè) FIFOSet,而 reading from a closed fifo 僅出現(xiàn)在 fifo 被 close 掉時(shí),仍然在讀取的情況。即 f.Close() 發(fā)生在 f.Read() 前面。在外層可以看到

  1. defer func() { 
  2.    if err != nil { 
  3.       if rio != nil { 
  4.          rio.Cancel() 
  5.          rio.Close() // 這里 Close 會(huì)導(dǎo)致 fifo close 
  6.       } 
  7.    } 
  8. }() 
  9.  
  10. p, err = t.Exec(ctx, processID, spec, func(id string) (cio.IO, error) { 
  11.    rio, err = c.createIO(fifos, containerID, processID, stdinCloseSync, attachStdio) 
  12.    return rio, err 
  13. }) 
  14. if err != nil { 
  15.    close(stdinCloseSync) 
  16.    return -1, wrapError(err) 
  17.  
  18. ctr.addProcess(processID, p) 
  19.  
  20. // Signal c.createIO that it can call CloseIO 
  21. // 
  22. // the stdin of exec process will be created after p.Start in containerd 
  23. defer close(stdinCloseSync) 
  24.  
  25. // p.Start 出錯(cuò),會(huì)導(dǎo)致內(nèi)部的 fifo 關(guān)閉,從而導(dǎo)致 reading from a closed fifo 的問(wèn)題 
  26. if err = p.Start(ctx); err != nil { 
  27.    // use new context for cleanup because old one may be cancelled by user, but leave a timeout to make sure 
  28.    // we are not waiting forever if containerd is unresponsive or to work around fifo cancelling issues in 
  29.    // older containerd-shim 
  30.    ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second
  31.    defer cancel() 
  32.    p.Delete(ctx) 
  33.    ctr.deleteProcess(processID) 
  34.    return -1, wrapError(err) 

p.Start 調(diào)用到下面的代碼,通過(guò) GRPC 和 containerd 通信。

  1. // github.com/containerd/containerd/task.go 
  2. func (t *task) Start(ctx context.Context) error { 
  3.    r, err := t.client.TaskService().Start(ctx, &tasks.StartRequest{ 
  4.       ContainerID: t.id, 
  5.    }) 
  6.    if err != nil { 
  7.       t.io.Cancel() 
  8.       t.io.Close() 
  9.       return errdefs.FromGRPC(err) 
  10.    } 
  11.    t.pid = r.Pid 
  12.    return nil 

這個(gè) GRPC 調(diào)用會(huì)到達(dá) containerd 以下的代碼:

  1. func (e *execProcess) start(ctx context.Context) (err error) { 
  2.    var ( 
  3.       socket  *runc.Socket 
  4.       pidfile = filepath.Join(e.path, fmt.Sprintf("%s.pid", e.id)) 
  5.    ) 
  6.    if e.stdio.Terminal { 
  7.       if socket, err = runc.NewTempConsoleSocket(); err != nil { 
  8.          return errors.Wrap(err, "failed to create runc console socket"
  9.       } 
  10.       defer socket.Close() 
  11.    } else if e.stdio.IsNull() { 
  12.       if e.io, err = runc.NewNullIO(); err != nil { 
  13.          return errors.Wrap(err, "creating new NULL IO"
  14.       } 
  15.    } else { 
  16.       if e.io, err = runc.NewPipeIO(e.parent.IoUID, e.parent.IoGID, withConditionalIO(e.stdio)); err != nil { 
  17.          return errors.Wrap(err, "failed to create runc io pipes"
  18.       } 
  19.    } 
  20.    opts := &runc.ExecOpts{ 
  21.       PidFile: pidfile, 
  22.       IO:      e.io, 
  23.       Detach:  true
  24.    } 
  25.    if socket != nil { 
  26.       opts.ConsoleSocket = socket 
  27.    } 
  28.    // err 返回了 exec failed: EOF: unknown 
  29.    // 這里的 runtime 就是 runc 的二進(jìn)制文件執(zhí)行命令 
  30.    if err := e.parent.runtime.Exec(ctx, e.parent.id, e.spec, opts); err != nil { 
  31.       close(e.waitBlock) 
  32.       return e.parent.runtimeError(err, "OCI runtime exec failed"
  33.    } 

Exec 的代碼如下:

  1. // Exec executres and additional process inside the container based on a full 
  2. // OCI Process specification 
  3. func (r *Runc) Exec(context context.Context, id string, spec specs.Process, opts *ExecOpts) error { 
  4.    f, err := ioutil.TempFile(os.Getenv("XDG_RUNTIME_DIR"), "runc-process"
  5.    if err != nil { 
  6.       return err 
  7.    } 
  8.    defer os.Remove(f.Name()) 
  9.    err = json.NewEncoder(f).Encode(spec) 
  10.    f.Close() 
  11.    if err != nil { 
  12.       return err 
  13.    } 
  14.    args := []string{"exec""--process", f.Name()} 
  15.    if opts != nil { 
  16.       oargs, err := opts.args() 
  17.       if err != nil { 
  18.          return err 
  19.       } 
  20.       args = append(args, oargs...) 
  21.    } 
  22.    cmd := r.command(context, append(args, id)...) 
  23.    if opts != nil && opts.IO != nil { 
  24.       opts.Set(cmd) 
  25.    } 
  26.    if cmd.Stdout == nil && cmd.Stderr == nil { 
  27.       data, err := cmdOutput(cmd, true
  28.       if err != nil { 
  29.          return fmt.Errorf("%s: %s", err, data) 
  30.       } 
  31.       return nil 
  32.    } 
  33.    ec, err := Monitor.Start(cmd) 
  34.    if err != nil { 
  35.       return err 
  36.    } 
  37.    if opts != nil && opts.IO != nil { 
  38.       if c, ok := opts.IO.(StartCloser); ok { 
  39.          if err := c.CloseAfterStart(); err != nil { 
  40.             return err 
  41.          } 
  42.       } 
  43.    } 
  44.    status, err := Monitor.Wait(cmd, ec) 
  45.    if err == nil && status != 0 { 
  46.       err = fmt.Errorf("%s did not terminate sucessfully", cmd.Args[0]) 
  47.    } 
  48.    return err 

因此是 runc 在運(yùn)行后輸出了 exec failed: EOF: unknown 這個(gè)錯(cuò)誤。

將 runc 指令循環(huán)執(zhí)行,可少量復(fù)現(xiàn)。經(jīng)過(guò)排查,發(fā)現(xiàn) runc exec 在運(yùn)行期間會(huì)讀取 container 的 state.json,并使用 json decode 時(shí)出現(xiàn)異常。

此時(shí)聯(lián)想到開(kāi)啟 kubelet cpu-manager 后,會(huì) update container,也就是更新這個(gè) state.json 文件。導(dǎo)致 runc 讀到了部分 cpu-manager 更新的內(nèi)容。從而導(dǎo)致 json decode 失敗。此時(shí)排查 runc EOF 和 kubelet cpu-manager update container(默認(rèn)每 10s 更新一次) 的時(shí)間,發(fā)現(xiàn)時(shí)間點(diǎn)剛好吻合,驗(yàn)證猜想。

查看 runc 是否有修復(fù),發(fā)現(xiàn)了這個(gè) pr: https://github.com/opencontainers/runc/pull/2467。 修復(fù)思路是將 saveState 變成原子操作,這樣就不會(huì)出現(xiàn)讀取 state.json 時(shí),讀到部分寫(xiě)入的內(nèi)容,導(dǎo)致 unexpected EOF (或 EOF)的問(wèn)題

  1. // 原來(lái)的 
  2. func (c *linuxContainer) saveState(s *State) error { 
  3.    f, err := os.Create(filepath.Join(c.root, stateFilename)) 
  4.    if err != nil { 
  5.       return err 
  6.    } 
  7.    defer f.Close() 
  8.    return utils.WriteJSON(f, s) 
  9. // 修復(fù)后的 
  10. func (c *linuxContainer) saveState(s *State) (retErr error) { 
  11.         tmpFile, err := ioutil.TempFile(c.root, "state-"
  12.         if err != nil { 
  13.                 return err 
  14.         } 
  15.  
  16.         defer func() { 
  17.                 if retErr != nil { 
  18.                         tmpFile.Close() 
  19.                         os.Remove(tmpFile.Name()) 
  20.                 } 
  21.         }() 
  22.  
  23.         err = utils.WriteJSON(tmpFile, s) 
  24.         if err != nil { 
  25.                 return err 
  26.         } 
  27.         err = tmpFile.Close() 
  28.         if err != nil { 
  29.                 return err 
  30.         } 
  31.  
  32.         stateFilePath := filepath.Join(c.root, stateFilename) 
  33.         return os.Rename(tmpFile.Name(), stateFilePath) 

五、解決

關(guān)閉cpu-manager

 

升級(jí)runc

 

責(zé)任編輯:武曉燕 來(lái)源: 運(yùn)維開(kāi)發(fā)故事
相關(guān)推薦

2021-11-14 05:00:56

排查Sdk方式

2020-05-09 13:49:00

內(nèi)存空間垃圾

2021-08-24 08:01:15

死鎖工具多線編程

2022-07-26 07:14:52

Docker宿主命令

2024-08-14 14:20:00

2024-02-21 08:19:54

2022-01-26 19:42:05

MySQL亂碼排查

2024-10-29 08:08:44

2021-12-01 15:03:56

Java開(kāi)發(fā)代碼

2021-11-09 06:55:03

SQLServer排序

2020-12-04 14:19:08

KubernetesDocker容器

2022-03-04 08:45:11

Docker開(kāi)源Linux

2024-12-02 09:10:15

Redis性能優(yōu)化

2023-08-04 08:20:56

DockerfileDocker工具

2023-03-26 09:08:36

2023-09-27 07:33:48

Docker命令容器

2023-07-26 07:18:54

死鎖線程池

2021-10-14 07:28:03

Kubernetes通用排查

2024-08-19 00:10:00

C++內(nèi)存

2021-06-28 08:00:00

Python開(kāi)發(fā)編程語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人黄色大片在线免费观看| 日韩精品一区二区三区中文精品| 日本在线观看一区二区三区| 亚洲在线观看av| 香蕉久久网站| 精品久久久久一区二区国产| 欧美 日韩 亚洲 一区| 国产在线电影| 国产成人av影院| 青青草国产精品一区二区| 懂色av粉嫩av浪潮av| 综合激情久久| 欧美男男青年gay1069videost| 99er在线视频| eeuss影院www在线播放| 久久国产精品一区二区| 韩国视频理论视频久久| 成年人看的免费视频| 91国内精品| 欧美日韩亚洲综合在线| 少妇无码av无码专区在线观看| 9i精品一二三区| 成人av电影在线网| 91亚洲精华国产精华| 欧美 日韩 精品| 欧美激情1区2区| 一区二区三区视频免费在线观看| 蜜臀aⅴ国产精品久久久国产老师| 99爱在线视频| 国产精品麻豆欧美日韩ww| 97人人澡人人爽| 又骚又黄的视频| 久久久精品网| 91高清视频免费观看| 开心激情五月网| 国产伦精品一区二区三区免费优势 | 欧美一区二区大胆人体摄影专业网站| 一区二区不卡免费视频| 深夜福利亚洲| 欧美婷婷六月丁香综合色| 俄罗斯av网站| 爱啪视频在线观看视频免费| 亚洲精品国产a| 黄频视频在线观看| www视频在线观看免费| 26uuu国产一区二区三区| 国产精品xxxx| 正在播放木下凛凛xv99| 肉丝袜脚交视频一区二区| 欧美一性一乱一交一视频| 熟女少妇a性色生活片毛片| 久久高清免费| 少妇高潮久久77777| 林心如三级全黄裸体| 精品一区在线| 亚洲片在线观看| 中文字幕网站在线观看| 精品久久91| 亚洲欧美一区二区三区情侣bbw| 精品国产一区在线| 日本国产精品| 亚洲精品电影网| 玖草视频在线观看| 久久99久久人婷婷精品综合| 亚洲欧美日韩一区在线| 少妇真人直播免费视频| 亚州综合一区| 一区二区三区无码高清视频| 偷拍夫妻性生活| 红桃成人av在线播放| 色偷偷偷亚洲综合网另类| 中文国语毛片高清视频| 亚洲欧美偷拍自拍| 久久久久久成人精品| 日本一区二区网站| 欧美日韩91| 97超级碰在线看视频免费在线看 | 喷水视频在线观看| 西瓜成人精品人成网站| 日韩av中文在线| 亚洲黄色小说视频| 婷婷综合五月| 国内自拍欧美激情| 亚洲成人av影片| 久久精品国产999大香线蕉| 91成人免费视频| 无码国产色欲xxxx视频| 国产欧美日韩激情| 午夜欧美性电影| 天使と恶魔の榨精在线播放| 精品人伦一区二区三区蜜桃网站 | 国产精品资源在线观看| 国产精品制服诱惑| 天堂中文在线看| 国产日韩精品一区二区三区| 中文字幕99| f2c人成在线观看免费视频| 欧美视频中文字幕在线| www.超碰97.com| 日韩欧美中文字幕在线视频| 亚洲福利视频久久| 日本视频在线免费| 极品中文字幕一区| 国产成人精品最新| 亚洲av无码一区二区三区性色 | 日本在线视频中文有码| 一本久久精品一区二区| 污视频在线观看免费网站| 日韩深夜影院| 久久综合五月天| 国产黄色片免费看| 国产在线国偷精品产拍免费yy| 国内一区在线| av在线app| 亚洲影院在线观看| www黄色日本| 亚洲国产精品久久久久婷婷老年| 中文字幕天天干| 久草国产在线观看| 视频在线观看国产精品| dy888夜精品国产专区| 亚洲欧美色视频| 一区二区三区日本| 国产精品一区二区小说| 日韩av影院| 欧美老女人在线视频| 少妇一级淫片日本| 91网站视频在线观看| 婷婷视频在线播放| 欧亚一区二区| 日韩精品在线观看一区| 中文字幕第28页| 国产美女精品在线| 麻豆精品传媒视频| 黑森林国产精品av| 日韩精品一区二区三区四区| 亚洲区自拍偷拍| 国产日韩一区二区三区在线| 国产精品对白一区二区三区| 好吊日视频在线观看| 欧美日韩国产影片| 极品尤物一区二区| 秋霞午夜鲁丝一区二区老狼| 欧美一级爱爱| 国模套图日韩精品一区二区| 国产偷亚洲偷欧美偷精品| 久久久一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久久久一本一区二区青青蜜月| 岳乳丰满一区二区三区| 中文字幕成人av| 成人免费在线观看视频网站| 日韩精品1区| 98精品国产高清在线xxxx天堂| 高h放荡受浪受bl| 亚洲一区二区视频在线观看| 中文字幕亚洲日本| 欧美日本免费| 国产亚洲欧美另类一区二区三区| 91av久久| 日韩精品在线视频美女| 狠狠人妻久久久久久综合| 国产亚洲人成网站| 九热视频在线观看| 9999国产精品| 国产97人人超碰caoprom| 岛国在线大片| 欧美日韩在线不卡| 永久免费看黄网站| 成人aa视频在线观看| 免费黄色日本网站| 欧美色爱综合| 国产精品久久99久久| av中文字幕在线| 欧美一级爆毛片| 精品成人久久久| 国产亚洲成aⅴ人片在线观看 | 国产精品77777竹菊影视小说| 无码毛片aaa在线| 亚洲男人在线| 欧美黑人狂野猛交老妇| 青青国产在线| 欧美浪妇xxxx高跟鞋交| 国产一级片网址| 久久久久久99精品| 成人在线免费播放视频| 欧美精选视频在线观看| 亚洲在线免费视频| 鲁鲁在线中文| 色琪琪综合男人的天堂aⅴ视频| 国产特黄一级片| 天天色综合成人网| 青青青视频在线播放| 粉嫩久久99精品久久久久久夜| 中国丰满人妻videoshd | 69成人免费视频| 国产精品毛片大码女人| 黄色在线免费播放| 麻豆成人免费电影| 国产精品专区在线| 欧美gayvideo| 国产精品swag| 国产精品蜜月aⅴ在线| 久久亚洲精品成人| 日本成人一区二区三区| 欧美日韩不卡视频| 国产综合精品视频| 亚洲毛片av在线| 中文字幕 自拍| 丁香婷婷综合网| 国产视频手机在线播放| 亚洲精品九九| 最新欧美日韩亚洲| 全国精品免费看| 99re国产视频| 91成人短视频在线观看| 日韩av成人在线| av成人 com a| 久久国产精品久久久久久| 色婷婷激情五月| 日韩三级.com| 中文字幕高清在线免费播放| 亚洲国产裸拍裸体视频在线观看乱了| 国产一级淫片久久久片a级| 99精品视频免费在线观看| 伊人成人免费视频| 久久99精品一区二区三区| 日韩精品一区二区三区不卡| 在线日韩中文| 欧美性受xxxx黑人猛交88| 青青久久av| 国产一区二区三区四区hd| 国产日本久久| 性欧美暴力猛交69hd| 亚洲大胆人体大胆做受1| 中文字幕欧美精品日韩中文字幕| 三级理论午夜在线观看| 亚洲第一av在线| 黄色片一区二区| 精品国产凹凸成av人导航| 一级特黄特色的免费大片视频| 色综合 综合色| 亚洲av中文无码乱人伦在线视色| 欧美日韩国产一中文字不卡| 五月天婷婷丁香| 亚洲国产中文字幕| 久久免费在线观看视频| 国产精品美女久久久久aⅴ国产馆| 成人在线一级片| 国产亚洲精品7777| 免费一级特黄3大片视频| 26uuu另类欧美| a级大片在线观看| 国产欧美中文在线| 成熟人妻av无码专区| 91视频.com| 精品人妻一区二区三区视频| 2023国产精品| 欧美人与性囗牲恔配| 欧美激情一区二区三区蜜桃视频 | 国产成人久久| 日韩中文字幕av在线| 人人狠狠综合久久亚洲婷| 日本一区二区三区免费看| 日韩.com| 300部国产真实乱| 亚洲福利一区| 干日本少妇首页| 日韩精品亚洲专区| 亚洲综合激情视频| 国产ts人妖一区二区| 国产美女视频免费观看下载软件| a美女胸又www黄视频久久| 免费看黄色aaaaaa 片| 国产婷婷色一区二区三区四区| 少妇的滋味中文字幕bd| 亚洲另类在线视频| 偷偷操不一样的久久| 欧美怡红院视频| 国产免费叼嘿网站免费| 亚洲成人精品av| 国产小视频免费在线网址| 久久亚洲综合国产精品99麻豆精品福利| 性xxxfreexxxx性欧美| 9.1国产丝袜在线观看 | 亚洲va欧美va在线观看| 国产伦理久久久久久妇女 | 你懂的视频在线免费| 色偷偷91综合久久噜噜| 91超碰国产在线| 国产狼人综合免费视频| 99国产精品久久一区二区三区| 欧美精品人人做人人爱视频| 午夜影院欧美| 99久久久无码国产精品6| 狠狠v欧美v日韩v亚洲ⅴ| 国产偷人妻精品一区| 亚洲人被黑人高潮完整版| 成人午夜视频在线播放| 在线综合视频播放| 免费国产在线观看| 欧美超级乱淫片喷水| 深夜成人影院| 国产精品亚洲一区| 国产精品久久久久一区二区三区厕所| 久久国产精品视频在线观看| 国模少妇一区二区三区| 日韩中文字幕电影| 亚洲国产精品嫩草影院| 亚洲视频在线免费播放| 日韩精品在线影院| 黄色羞羞视频在线观看| 成人国内精品久久久久一区| 最新亚洲精品| 国产日韩欧美精品在线观看| 久久99精品久久只有精品| 成年人网站免费看| 亚洲国产日韩a在线播放 | 欧美精品一区二区三区很污很色的 | 精品99在线观看| 欧美日韩国产片| 国外av在线| 69久久夜色精品国产69| 一区中文字幕| 色哺乳xxxxhd奶水米仓惠香| 日韩va亚洲va欧美va久久| xxxx黄色片| 亚洲图片欧美色图| 99热这里只有精品9| 日韩视频―中文字幕| 日韩精品三区| 日产精品高清视频免费| 午夜综合激情| 黄色短视频在线观看| 亚洲国产一区二区a毛片| 国产ts人妖调教重口男| 久久天天躁狠狠躁夜夜躁2014| 成人免费黄色| 视频一区二区精品| 日韩av一区二区在线影视| 色噜噜日韩精品欧美一区二区| 五月综合激情日本mⅴ| 囯产精品久久久久久| 欧美日韩福利在线观看| 永久免费精品视频| 777久久精品一区二区三区无码| 国产精品亚洲综合色区韩国| av网站有哪些| 日韩欧美国产视频| 黄色av免费在线观看| 国产精品日韩在线观看| 第一会所亚洲原创| 久久久久久久久久久久91| 国产精品日日摸夜夜摸av| 黄色国产一级视频| 亚洲视频www| 国产精品久久久久久久无码| 午夜精品一区二区三区电影天堂| 人妻无码一区二区三区久久99| 国a精品视频大全| 亚洲aaa级| 亚洲福利精品视频| 亚洲视频图片小说| 国产精品一区二区av白丝下载 | 亚洲一区一卡| av av在线| 日韩欧美精品网站| 触手亚洲一区二区三区| 成人亲热视频网站| 国内精品久久久久久久影视麻豆 | 91片黄在线观看喷潮| 欧美床上激情在线观看| 国产一二区在线| 国产精品99免视看9| 国产精品久久久久久久| 久久久久亚洲av成人网人人软件| 香蕉加勒比综合久久 | 一区二区三区日韩在线| 九九九九九九精品任你躁| 日韩日韩日韩日韩日韩| 成人黄色网址| 亚洲香蕉成人av网站在线观看| 四虎成人在线| 日本免费黄色小视频| 99精品久久只有精品| 亚洲天堂国产精品| 欧美日韩国产成人在线| 丝袜久久网站| 激情文学亚洲色图| 亚洲品质自拍视频网站| 国产原创中文av| 欧美激情一区二区三区高清视频| 日韩漫画puputoon| 日本三级中文字幕在线观看| 日本亚洲欧美天堂免费| 亚洲第一成人网站| 日韩久久久精品| 四虎成人在线| 国产综合中文字幕| 亚洲色图视频网|