国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Kubernetes 從入門到進(jìn)階實(shí)戰(zhàn)教程 (2021 最新萬字干貨版)

共 20740字,需瀏覽 42分鐘

 ·

2021-01-13 19:27


作者:oonamao 毛江云,騰訊 CSIG 應(yīng)用開發(fā)工程師
原文:來源騰訊技術(shù)工程,https://tinyurl.com/ya3ennxf


寫在前面

筆者今年 9 月從端側(cè)開發(fā)轉(zhuǎn)到后臺開發(fā),第一個系統(tǒng)開發(fā)任務(wù)就強(qiáng)依賴了 K8S,加之項(xiàng)目任務(wù)重、排期緊,必須馬上對 K8S 有概念上的了解。然而,很多所謂“K8S 入門\概念”的文章看的一頭霧水,對于大部分新手來說并不友好。經(jīng)歷了幾天痛苦地學(xué)習(xí)之后,回顧來看,K8S 根本不復(fù)雜。于是,決心有了這一系列的文章:一方面希望對新手同學(xué)有幫助;另一方面,以文會友,希望能夠有機(jī)會交流討論技術(shù)。

本文組織方式:

1. K8S 是什么,即作用和目的。涉及 K8S 架構(gòu)的整理,Master 和 Node 之間的關(guān)系,以及 K8S 幾個重要的組件:API Server、Scheduler、Controller、etcd 等。
2. K8S 的重要概念,即 K8S 的 API 對象,也就是常常聽到的 Pod、Deployment、Service 等。
3. 如何配置 kubectl,介紹kubectl工具和配置辦法。
4. 如何用kubectl 部署服務(wù)。
5. 如何用kubectl 查看、更新/編輯、刪除服務(wù)。
6.?如何用kubectl?排查部署在K8S集群上的服務(wù)出現(xiàn)的問題

I. K8S 概覽

1.1 K8S 是什么?

K8S 是Kubernetes的全稱,官方稱其是:

Kubernetes is an open source system for managing?containerized applications?across multiple hosts. It provides basic mechanisms for deployment, maintenance, and scaling of applications.

用于自動部署、擴(kuò)展和管理“容器化(containerized)應(yīng)用程序”的開源系統(tǒng)。

翻譯成大白話就是:“K8S 是 負(fù)責(zé)自動化運(yùn)維管理多個 Docker 程序的集群”。那么問題來了:Docker 運(yùn)行可方便了,為什么要用 K8S,它有什么優(yōu)勢?

插一句題外話:

  • 為什么 Kubernetes 要叫 Kubernetes 呢?維基百科已經(jīng)交代了(老美對星際是真的癡迷):

    Kubernetes(在希臘語意為“舵手”或“駕駛員”)由 Joe Beda、Brendan Burns 和 Craig McLuckie 創(chuàng)立,并由其他谷歌工程師,包括 Brian Grant 和 Tim Hockin 等進(jìn)行加盟創(chuàng)作,并由谷歌在 2014 年首次對外宣布 。該系統(tǒng)的開發(fā)和設(shè)計都深受谷歌的 Borg 系統(tǒng)的影響,其許多頂級貢獻(xiàn)者之前也是 Borg 系統(tǒng)的開發(fā)者。在谷歌內(nèi)部,Kubernetes 的原始代號曾經(jīng)是Seven,即星際迷航中的 Borg(博格人)。Kubernetes 標(biāo)識中舵輪有七個輪輻就是對該項(xiàng)目代號的致意。

  • 為什么 Kubernetes 的縮寫是 K8S 呢?我個人贊同Why Kubernetes is Abbreviated k8s中說的觀點(diǎn)“嘛,寫全稱也太累了吧,不如整個縮寫”。其實(shí)只保留首位字符,用具體數(shù)字來替代省略的字符個數(shù)的做法,還是比較常見的。

1.2 為什么是 K8S?

試想下傳統(tǒng)的后端部署辦法:把程序包(包括可執(zhí)行二進(jìn)制文件、配置文件等)放到服務(wù)器上,接著運(yùn)行啟動腳本把程序跑起來,同時啟動守護(hù)腳本定期檢查程序運(yùn)行狀態(tài)、必要的話重新拉起程序。

有問題嗎?顯然有!最大的一個問題在于:**如果服務(wù)的請求量上來,已部署的服務(wù)響應(yīng)不過來怎么辦?**傳統(tǒng)的做法往往是,如果請求量、內(nèi)存、CPU 超過閾值做了告警,運(yùn)維馬上再加幾臺服務(wù)器,部署好服務(wù)之后,接入負(fù)載均衡來分擔(dān)已有服務(wù)的壓力。

問題出現(xiàn)了:從監(jiān)控告警到部署服務(wù),中間需要人力介入!那么,有沒有辦法自動完成服務(wù)的部署、更新、卸載和擴(kuò)容、縮容呢?

這,就是 K8S 要做的事情:自動化運(yùn)維管理 Docker(容器化)程序。

1.3 K8S 怎么做?

我們已經(jīng)知道了 K8S 的核心功能:自動化運(yùn)維管理多個容器化程序。那么 K8S 怎么做到的呢?這里,我們從宏觀架構(gòu)上來學(xué)習(xí) K8S 的設(shè)計思想。首先看下圖,圖片來自文章Components of Kubernetes Architecture:

K8S 是屬于主從設(shè)備模型(Master-Slave 架構(gòu)),即有 Master 節(jié)點(diǎn)負(fù)責(zé)核心的調(diào)度、管理和運(yùn)維,Slave 節(jié)點(diǎn)則在執(zhí)行用戶的程序。但是在 K8S 中,主節(jié)點(diǎn)一般被稱為Master Node 或者 Head Node(本文采用 Master Node 稱呼方式),而從節(jié)點(diǎn)則被稱為Worker Node 或者 Node(本文采用 Worker Node 稱呼方式)。

要注意一點(diǎn):Master Node 和 Worker Node 是分別安裝了 K8S 的 Master 和 Woker 組件的實(shí)體服務(wù)器,每個 Node 都對應(yīng)了一臺實(shí)體服務(wù)器(雖然 Master Node 可以和其中一個 Worker Node 安裝在同一臺服務(wù)器,但是建議 Master Node 單獨(dú)部署),所有 Master Node 和 Worker Node 組成了 K8S 集群,同一個集群可能存在多個 Master Node 和 Worker Node。

首先來看Master Node都有哪些組件:

  • API Server。K8S 的請求入口服務(wù)。API Server 負(fù)責(zé)接收 K8S 所有請求(來自 UI 界面或者 CLI 命令行工具),然后,API Server 根據(jù)用戶的具體請求,去通知其他組件干活。
  • SchedulerK8S 所有 Worker Node 的調(diào)度器。當(dāng)用戶要部署服務(wù)時,Scheduler 會選擇最合適的 Worker Node(服務(wù)器)來部署。
  • Controller Manager。K8S 所有 Worker Node 的監(jiān)控器。Controller Manager 有很多具體的 Controller,在文章Components of Kubernetes Architecture中提到的有 Node Controller、Service Controller、Volume Controller 等。Controller 負(fù)責(zé)監(jiān)控和調(diào)整在 Worker Node 上部署的服務(wù)的狀態(tài),比如用戶要求 A 服務(wù)部署 2 個副本,那么當(dāng)其中一個服務(wù)掛了的時候,Controller 會馬上調(diào)整,讓 Scheduler 再選擇一個 Worker Node 重新部署服務(wù)。
  • etcd。K8S 的存儲服務(wù)。etcd 存儲了 K8S 的關(guān)鍵配置和用戶配置,K8S 中僅 API Server 才具備讀寫權(quán)限,其他組件必須通過 API Server 的接口才能讀寫數(shù)據(jù)(見Kubernetes Works Like an Operating System)。

接著來看Worker Node的組件,筆者更贊同HOW DO APPLICATIONS RUN ON KUBERNETES文章中提到的組件介紹:

  • Kubelet。Worker Node 的監(jiān)視器,以及與 Master Node 的通訊器。Kubelet 是 Master Node 安插在 Worker Node 上的“眼線”,它會定期向 Worker Node 匯報自己 Node 上運(yùn)行的服務(wù)的狀態(tài),并接受來自 Master Node 的指示采取調(diào)整措施。
  • Kube-Proxy。K8S 的網(wǎng)絡(luò)代理。私以為稱呼為 Network-Proxy 可能更適合?Kube-Proxy 負(fù)責(zé) Node 在 K8S 的網(wǎng)絡(luò)通訊、以及對外部網(wǎng)絡(luò)流量的負(fù)載均衡。
  • Container RuntimeWorker Node 的運(yùn)行環(huán)境。即安裝了容器化所需的軟件環(huán)境確保容器化程序能夠跑起來,比如 Docker Engine。大白話就是幫忙裝好了 Docker 運(yùn)行環(huán)境。
  • Logging LayerK8S 的監(jiān)控狀態(tài)收集器。私以為稱呼為 Monitor 可能更合適?Logging Layer 負(fù)責(zé)采集 Node 上所有服務(wù)的 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等監(jiān)控項(xiàng)信息。
  • Add-OnsK8S 管理運(yùn)維 Worker Node 的插件組件。有些文章認(rèn)為 Worker Node 只有三大組件,不包含 Add-On,但筆者認(rèn)為 K8S 系統(tǒng)提供了 Add-On 機(jī)制,讓用戶可以擴(kuò)展更多定制化功能,是很不錯的亮點(diǎn)。

總結(jié)來看,K8S 的 Master Node 具備:請求入口管理(API Server),Worker Node 調(diào)度(Scheduler),監(jiān)控和自動調(diào)節(jié)(Controller Manager),以及存儲功能(etcd);而 K8S 的 Worker Node 具備:狀態(tài)和監(jiān)控收集(Kubelet),網(wǎng)絡(luò)和負(fù)載均衡(Kube-Proxy)、保障容器化運(yùn)行環(huán)境(Container Runtime)、以及定制化功能(Add-Ons)。

到這里,相信你已經(jīng)對 K8S 究竟是做什么的,有了大概認(rèn)識。接下來,再來認(rèn)識下 K8S 的 Deployment、Pod、Replica Set、Service 等,但凡談到 K8S,就繞不開這些名詞,而這些名詞也是最讓 K8S 新手們感到頭疼、困惑的。

II. K8S 重要概念

2.1 Pod 實(shí)例

官方對于Pod的解釋是:

Pod是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計算單元。

這樣的解釋還是很難讓人明白究竟 Pod 是什么,但是對于 K8S 而言,Pod 可以說是所有對象中最重要的概念了!因此,我們必須首先清楚地知道“Pod 是什么”,再去了解其他的對象。

從官方給出的定義,聯(lián)想下“最小的 xxx 單元”,是不是可以想到本科在學(xué)校里學(xué)習(xí)“進(jìn)程”的時候,教科書上有一段類似的描述:資源分配的最小單位;還有”線程“的描述是:CPU 調(diào)度的最小單位。什么意思呢?”最小 xx 單位“要么就是事物的衡量標(biāo)準(zhǔn)單位,要么就是資源的閉包、集合。前者比如長度米、時間秒;后者比如一個”進(jìn)程“是存儲和計算的閉包,一個”線程“是 CPU 資源(包括寄存器、ALU 等)的閉包。

同樣的,Pod 就是 K8S 中一個服務(wù)的閉包。這么說的好像還是有點(diǎn)玄乎,更加云里霧里了。簡單來說,Pod 可以被理解成一群可以共享網(wǎng)絡(luò)、存儲和計算資源的容器化服務(wù)的集合。再打個形象的比喻,在同一個 Pod 里的幾個 Docker 服務(wù)/程序,好像被部署在同一臺機(jī)器上,可以通過 localhost 互相訪問,并且可以共用 Pod 里的存儲資源(這里是指 Docker 可以掛載 Pod 內(nèi)的數(shù)據(jù)卷,數(shù)據(jù)卷的概念,后文會詳細(xì)講述,暫時理解為“需要手動 mount 的磁盤”)。筆者總結(jié) Pod 如下圖,可以看到:同一個 Pod 之間的 Container 可以通過 localhost 互相訪問,并且可以掛載 Pod 內(nèi)所有的數(shù)據(jù)卷;但是不同的 Pod 之間的 Container 不能用 localhost 訪問,也不能掛載其他 Pod 的數(shù)據(jù)卷。

對 Pod 有直觀的認(rèn)識之后,接著來看 K8S 中 Pod 究竟長什么樣子,具體包括哪些資源?

K8S 中所有的對象都通過 yaml 來表示,筆者從官方網(wǎng)站摘錄了一個最簡單的 Pod 的 yaml:

apiVersion:?v1
kind:?Pod
metadata:
??name:?memory-demo
??namespace:?mem-example
spec:
??containers:
??-?name:?memory-demo-ctr
????image:?polinux/stress
????resources:
??????limits:
????????memory:?"200Mi"
??????requests:
????????memory:?"100Mi"
????command:?["stress"]
????args:?["--vm",?"1",?"--vm-bytes",?"150M",?"--vm-hang",?"1"]
????volumeMounts:
????-?name:?redis-storage
??????mountPath:?/data/redis
??volumes:
??-?name:?redis-storage
????emptyDir:?{}

看不懂不必慌張,且耐心聽下面的解釋:

  • apiVersion記錄 K8S 的 API Server 版本,現(xiàn)在看到的都是v1,用戶不用管。
  • kind記錄該 yaml 的對象,比如這是一份 Pod 的 yaml 配置文件,那么值內(nèi)容就是Pod。
  • metadata記錄了 Pod 自身的元數(shù)據(jù),比如這個 Pod 的名字、這個 Pod 屬于哪個 namespace(命名空間的概念,后文會詳述,暫時理解為“同一個命名空間內(nèi)的對象互相可見”)。
  • spec記錄了 Pod 內(nèi)部所有的資源的詳細(xì)信息,看懂這個很重要:
    • containers記錄了 Pod 內(nèi)的容器信息,containers包括了:name容器名,image容器的鏡像地址,resources容器需要的 CPU、內(nèi)存、GPU 等資源,command容器的入口命令,args容器的入口參數(shù),volumeMounts容器要掛載的 Pod 數(shù)據(jù)卷等??梢钥吹?,上述這些信息都是啟動容器的必要和必需的信息。
    • volumes記錄了 Pod 內(nèi)的數(shù)據(jù)卷信息,后文會詳細(xì)介紹 Pod 的數(shù)據(jù)卷。

2.2 Volume 數(shù)據(jù)卷

K8S 支持很多類型的 volume 數(shù)據(jù)卷掛載,具體請參見K8S 卷。前文就“如何理解 volume”提到:“需要手動 mount 的磁盤”,此外,有一點(diǎn)可以幫助理解:數(shù)據(jù)卷 volume 是 Pod 內(nèi)部的磁盤資源

其實(shí),單單就 Volume 來說,不難理解。但是上面還看到了volumeMounts,這倆是什么關(guān)系呢?

volume 是 K8S 的對象,對應(yīng)一個實(shí)體的數(shù)據(jù)卷;而 volumeMounts 只是 container 的掛載點(diǎn),對應(yīng) container 的其中一個參數(shù)。但是,volumeMounts 依賴于 volume,只有當(dāng) Pod 內(nèi)有 volume 資源的時候,該 Pod 內(nèi)部的 container 才可能有 volumeMounts。

2.3 Container 容器

本文中提到的鏡像 Image、容器 Container,都指代了 Pod 下的一個container。關(guān)于 K8S 中的容器,在 2.1Pod 章節(jié)都已經(jīng)交代了,這里無非再啰嗦一句:一個 Pod 內(nèi)可以有多個容器 container。

在 Pod 中,容器也有分類,對這個感興趣的同學(xué)歡迎自行閱讀更多資料:

  • 標(biāo)準(zhǔn)容器 Application Container。
  • 初始化容器 Init Container。
  • 邊車容器 Sidecar Container。
  • 臨時容器 Ephemeral Container

一般來說,我們部署的大多是標(biāo)準(zhǔn)容器( Application Container)

2.4 Deployment 和 ReplicaSet(簡稱 RS)

除了 Pod 之外,K8S 中最常聽到的另一個對象就是 Deployment 了。那么,什么是 Deployment 呢?官方給出了一個要命的解釋:

一個?Deployment?控制器為 Pods 和 ReplicaSets 提供聲明式的更新能力。

你負(fù)責(zé)描述 Deployment 中的?目標(biāo)狀態(tài),而 Deployment 控制器以受控速率更改實(shí)際狀態(tài), 使其變?yōu)槠谕麪顟B(tài)。你可以定義 Deployment 以創(chuàng)建新的 ReplicaSet,或刪除現(xiàn)有 Deployment,并通過新的 Deployment 收養(yǎng)其資源。

翻譯一下:Deployment 的作用是管理和控制 Pod 和 ReplicaSet,管控它們運(yùn)行在用戶期望的狀態(tài)中。哎,打個形象的比喻,Deployment 就是包工頭,主要負(fù)責(zé)監(jiān)督底下的工人 Pod 干活,確保每時每刻有用戶要求數(shù)量的 Pod 在工作。如果一旦發(fā)現(xiàn)某個工人 Pod 不行了,就趕緊新拉一個 Pod 過來替換它。

新的問題又來了:那什么是 ReplicaSets 呢?

ReplicaSet 的目的是維護(hù)一組在任何時候都處于運(yùn)行狀態(tài)的 Pod 副本的穩(wěn)定集合。因此,它通常用來保證給定數(shù)量的、完全相同的 Pod 的可用性。

再來翻譯下:ReplicaSet 的作用就是管理和控制 Pod,管控他們好好干活。但是,ReplicaSet 受控于 Deployment。形象來說,ReplicaSet 就是總包工頭手下的小包工頭

筆者總結(jié)得到下面這幅圖,希望能幫助理解:

新的問題又來了:如果都是為了管控 Pod 好好干活,為什么要設(shè)置 Deployment 和 ReplicaSet 兩個層級呢,直接讓 Deployment 來管理不可以嗎?

回答:不清楚,但是私以為是因?yàn)橄扔?ReplicaSet,但是使用中發(fā)現(xiàn) ReplicaSet 不夠滿足要求,于是又整了一個 Deployment(有清楚 Deployment 和 ReplicaSet 聯(lián)系和區(qū)別的小伙伴歡迎留言啊)。

但是,從 K8S 使用者角度來看,用戶會直接操作 Deployment 部署服務(wù),而當(dāng) Deployment 被部署的時候,K8S 會自動生成要求的 ReplicaSet 和 Pod。在K8S 官方文檔中也指出用戶只需要關(guān)心 Deployment 而不操心 ReplicaSet:

This actually means that you may never need to manipulate ReplicaSet objects: use a Deployment instead, and define your application in the spec section.

這實(shí)際上意味著您可能永遠(yuǎn)不需要操作 ReplicaSet 對象:直接使用 Deployments 并在規(guī)范部分定義應(yīng)用程序。

補(bǔ)充說明:在 K8S 中還有一個對象 ---?ReplicationController(簡稱 RC),官方文檔對它的定義是:

ReplicationController?確保在任何時候都有特定數(shù)量的 Pod 副本處于運(yùn)行狀態(tài)。換句話說,ReplicationController 確保一個 Pod 或一組同類的 Pod 總是可用的。

怎么樣,和 ReplicaSet 是不是很相近?在Deployments, ReplicaSets, and pods教程中說“ReplicationController 是 ReplicaSet 的前身”,官方也推薦用 Deployment 取代 ReplicationController 來部署服務(wù)。

2.5 Service 和 Ingress

吐槽下 K8S 的概念/對象/資源是真的多啊!前文介紹的 Deployment、ReplicationController 和 ReplicaSet 主要管控 Pod 程序服務(wù);那么,Service 和 Ingress 則負(fù)責(zé)管控 Pod 網(wǎng)絡(luò)服務(wù)。

我們先來看看官方文檔中 Service 的定義:

將運(yùn)行在一組 Pods 上的應(yīng)用程序公開為網(wǎng)絡(luò)服務(wù)的抽象方法。

使用 Kubernetes,您無需修改應(yīng)用程序即可使用不熟悉的服務(wù)發(fā)現(xiàn)機(jī)制。Kubernetes 為 Pods 提供自己的 IP 地址,并為一組 Pod 提供相同的 DNS 名, 并且可以在它們之間進(jìn)行負(fù)載均衡。

翻譯下:K8S 中的服務(wù)(Service)并不是我們常說的“服務(wù)”的含義,而更像是網(wǎng)關(guān)層,是若干個 Pod 的流量入口、流量均衡器。

那么,為什么要 Service 呢

私以為在這一點(diǎn)上,官方文檔講解地非常清楚:

Kubernetes Pod 是有生命周期的。它們可以被創(chuàng)建,而且銷毀之后不會再啟動。如果您使用 Deployment 來運(yùn)行您的應(yīng)用程序,則它可以動態(tài)創(chuàng)建和銷毀 Pod。

每個 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一時刻運(yùn)行的 Pod 集合可能與稍后運(yùn)行該應(yīng)用程序的 Pod 集合不同。

這導(dǎo)致了一個問題:如果一組 Pod(稱為“后端”)為群集內(nèi)的其他 Pod(稱為“前端”)提供功能, 那么前端如何找出并跟蹤要連接的 IP 地址,以便前端可以使用工作量的后端部分?

補(bǔ)充說明:K8S 集群的網(wǎng)絡(luò)管理和拓?fù)湟灿刑貏e的設(shè)計,以后會專門出一章節(jié)來詳細(xì)介紹 K8S 中的網(wǎng)絡(luò)。這里需要清楚一點(diǎn):K8S 集群內(nèi)的每一個 Pod 都有自己的 IP(是不是很類似一個 Pod 就是一臺服務(wù)器,然而事實(shí)上是多個 Pod 存在于一臺服務(wù)器上,只不過是 K8S 做了網(wǎng)絡(luò)隔離),在 K8S 集群內(nèi)部還有 DNS 等網(wǎng)絡(luò)服務(wù)(一個 K8S 集群就如同管理了多區(qū)域的服務(wù)器,可以做復(fù)雜的網(wǎng)絡(luò)拓?fù)洌?/p>

此外,筆者推薦k8s 外網(wǎng)如何訪問業(yè)務(wù)應(yīng)用對于 Service 的介紹,不過對于新手而言,推薦閱讀前半部分對于 service 的介紹即可,后半部分就太復(fù)雜了。我這里做了簡單的總結(jié):

Service 是 K8S 服務(wù)的核心,屏蔽了服務(wù)細(xì)節(jié),統(tǒng)一對外暴露服務(wù)接口,真正做到了“微服務(wù)”。舉個例子,我們的一個服務(wù) A,部署了 3 個備份,也就是 3 個 Pod;對于用戶來說,只需要關(guān)注一個 Service 的入口就可以,而不需要操心究竟應(yīng)該請求哪一個 Pod。優(yōu)勢非常明顯:一方面外部用戶不需要感知因?yàn)?Pod 上服務(wù)的意外崩潰、K8S 重新拉起 Pod 而造成的 IP 變更,外部用戶也不需要感知因升級、變更服務(wù)帶來的 Pod 替換而造成的 IP 變化,另一方面,Service 還可以做流量負(fù)載均衡。

但是,Service 主要負(fù)責(zé) K8S 集群內(nèi)部的網(wǎng)絡(luò)拓?fù)洹D敲醇和獠吭趺丛L問集群內(nèi)部呢?這個時候就需要 Ingress 了,官方文檔中的解釋是:

Ingress 是對集群中服務(wù)的外部訪問進(jìn)行管理的 API 對象,典型的訪問方式是 HTTP。

Ingress 可以提供負(fù)載均衡、SSL 終結(jié)和基于名稱的虛擬托管。

翻譯一下:Ingress 是整個 K8S 集群的接入層,復(fù)雜集群內(nèi)外通訊。

最后,筆者把 Ingress 和 Service 的關(guān)系繪制網(wǎng)絡(luò)拓?fù)潢P(guān)系圖如下,希望對理解這兩個概念有所幫助:

2.6 namespace 命名空間

和前文介紹的所有的概念都不一樣,namespace 跟 Pod 沒有直接關(guān)系,而是 K8S 另一個維度的對象?;蛘哒f,前文提到的概念都是為了服務(wù) Pod 的,而 namespace 則是為了服務(wù)整個 K8S 集群的。

那么,namespace 是什么呢?

上官方文檔定義:

Kubernetes 支持多個虛擬集群,它們底層依賴于同一個物理集群。這些虛擬集群被稱為名字空間。

翻譯一下:namespace 是為了把一個 K8S 集群劃分為若干個資源不可共享的虛擬集群而誕生的

也就是說,可以通過在 K8S 集群內(nèi)創(chuàng)建 namespace 來分隔資源和對象。比如我有 2 個業(yè)務(wù) A 和 B,那么我可以創(chuàng)建 ns-a 和 ns-b 分別部署業(yè)務(wù) A 和 B 的服務(wù),如在 ns-a 中部署了一個 deployment,名字是 hello,返回用戶的是“hello a”;在 ns-b 中也部署了一個 deployment,名字恰巧也是 hello,返回用戶的是“hello b”(要知道,在同一個 namespace 下 deployment 不能同名;但是不同 namespace 之間沒有影響)。前文提到的所有對象,都是在 namespace 下的;當(dāng)然,也有一些對象是不隸屬于 namespace 的,而是在 K8S 集群內(nèi)全局可見的,官方文檔提到的可以通過命令來查看,具體命令的使用辦法,筆者會出后續(xù)的實(shí)戰(zhàn)文章來介紹,先貼下命令:

#?位于名字空間中的資源
kubectl?api-resources?--namespaced=true

#?不在名字空間中的資源
kubectl?api-resources?--namespaced=false

不在 namespace 下的對象有:

在 namespace 下的對象有(部分):

2.7 其他

K8S 的對象實(shí)在太多了,2.1-2.6 介紹的是在實(shí)際使用 K8S 部署服務(wù)最常見的。其他的還有 Job、CronJob 等等,在對 K8S 有了比較清楚的認(rèn)知之后,再去學(xué)習(xí)更多的 K8S 對象,不是難事。

III. 配置 kubectl

3.1 什么是 kubectl?

官方文檔中介紹 kubectl 是:

Kubectl 是一個命令行接口,用于對 Kubernetes 集群運(yùn)行命令。Kubectl 的配置文件在$HOME/.kube 目錄。我們可以通過設(shè)置 KUBECONFIG 環(huán)境變量或設(shè)置命令參數(shù)--kubeconfig 來指定其他位置的 kubeconfig 文件。

也就是說,可以通過 kubectl 來操作 K8S 集群,基本語法:

使用以下語法?kubectl?從終端窗口運(yùn)行命令:

kubectl?[command]?[TYPE]?[NAME]?[flags]

其中?command、TYPENAME?和?flags?分別是:

  • command:指定要對一個或多個資源執(zhí)行的操作,例如?create、get、describe、delete。

  • TYPE:指定資源類型。資源類型不區(qū)分大小寫,可以指定單數(shù)、復(fù)數(shù)或縮寫形式。例如,以下命令輸出相同的結(jié)果:

```shell
kubectl?get?pod?pod1
kubectl?get?pods?pod1
kubectl?get?po?pod1

-?`NAME`:指定資源的名稱。名稱區(qū)分大小寫。如果省略名稱,則顯示所有資源的詳細(xì)信息?`kubectl get pods`。

在對多個資源執(zhí)行操作時,您可以按類型和名稱指定每個資源,或指定一個或多個文件:

-?要按類型和名稱指定資源:
??-?要對所有類型相同的資源進(jìn)行分組,請執(zhí)行以下操作:`TYPE1 name1 name2 name<#>`。
?例子:`kubectl get pod example-pod1 example-pod2`
??-?分別指定多個資源類型:`TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>`。
?例子:`kubectl get pod/example-pod1 replicationcontroller/example-rc1`
-?用一個或多個文件指定資源:`-f file1 -f file2 -f file<#>`
??-?[使用?YAML?而不是?JSON](https://kubernetes.io/zh/docs/concepts/configuration/overview/#general-config-tips)?因?yàn)?YAML 更容易使用,特別是用于配置文件時。
?例子:`kubectl get -f ./pod.yaml`
-?`flags`:?指定可選的參數(shù)。例如,可以使用?`-s`?或?`-server`?參數(shù)指定 Kubernetes API 服務(wù)器的地址和端口。

就如何使用 kubectl 而言,官方文檔已經(jīng)說得非常清楚。不過對于新手而言,還是需要解釋幾句:

  1. kubectl 是 K8S 的命令行工具,并不需要 kubectl 安裝在 K8S 集群的任何 Node 上,但是,需要確保安裝 kubectl 的機(jī)器和 K8S 的集群能夠進(jìn)行網(wǎng)絡(luò)互通。
  2. kubectl 是通過本地的配置文件來連接到 K8S 集群的,默認(rèn)保存在$HOME/.kube 目錄下;也可以通過 KUBECONFIG 環(huán)境變量或設(shè)置命令參數(shù)--kubeconfig 來指定其他位置的 kubeconfig 文件【官方文檔】。

接下來,一起看看怎么使用 kubectl 吧,切身感受下 kubectl 的使用。

請注意,如何安裝 kubectl 的辦法有許多非常明確的教程,比如《安裝并配置 kubectl》,本文不再贅述。

3.2 怎么配置 kubectl?

第一步,必須準(zhǔn)備好要連接/使用的 K8S 的配置文件,筆者給出一份杜撰的配置:

apiVersion:?v1
clusters:
-?cluster:
????certificate-authority-data:?thisisfakecertifcateauthoritydata00000000000
????server:?https://1.2.3.4:1234
??name:?cls-dev
contexts:
-?context:
????cluster:?cls-dev
????user:?kubernetes-admin
??name:?kubernetes-admin@test
current-context:?kubernetes-admin@test
kind:?Config
preferences:?{}
users:
-?name:?kubernetes-admin
??user:
????token:?thisisfaketoken00000

解讀如下:

  • clusters記錄了 clusters(一個或多個 K8S 集群)信息:
    • name是這個 cluster(K8S 集群)的名稱代號
    • server是這個 cluster(K8S 集群)的訪問方式,一般為 IP+PORT
    • certificate-authority-data是證書數(shù)據(jù),只有當(dāng) cluster(K8S 集群)的連接方式是 https 時,為了安全起見需要證書數(shù)據(jù)
  • users記錄了訪問 cluster(K8S 集群)的賬號信息:
    • name是用戶賬號的名稱代號
    • user/token是用戶的 token 認(rèn)證方式,token 不是用戶認(rèn)證的唯一方式,其他還有賬號+密碼等。
  • contexts是上下文信息,包括了 cluster(K8S 集群)和訪問 cluster(K8S 集群)的用戶賬號等信息:
    • name是這個上下文的名稱代號
    • cluster是 cluster(K8S 集群)的名稱代號
    • user是訪問 cluster(K8S 集群)的用戶賬號代號
  • current-context記錄當(dāng)前 kubectl 默認(rèn)使用的上下文信息
  • kindapiVersion都是固定值,用戶不需要關(guān)心
  • preferences則是配置文件的其他設(shè)置信息,筆者沒有使用過,暫時不提。

第二步,給 kubectl 配置上配置文件。

  1. --kubeconfig參數(shù)。第一種辦法是每次執(zhí)行 kubectl 的時候,都帶上--kubeconfig=${CONFIG_PATH}。給一點(diǎn)溫馨小提示:每次都帶這么一長串的字符非常麻煩,可以用 alias 別名來簡化碼字量,比如alias k=kubectl --kubeconfig=${CONFIG_PATH}。
  2. KUBECONFIG環(huán)境變量。第二種做法是使用環(huán)境變量KUBECONFIG把所有配置文件都記錄下來,即export KUBECONFIG=$KUBECONFIG:${CONFIG_PATH}。接下來就可以放心執(zhí)行 kubectl 命令了。
  3. $HOME/.kube/config 配置文件。第三種做法是把配置文件的內(nèi)容放到$HOME/.kube/config 內(nèi)。具體做法為:
    1. 如果$HOME/.kube/config 不存在,那么cp ${CONFIG_PATH} $HOME/.kube/config即可;
    2. 如果如果 $HOME/.kube/config已經(jīng)存在,那么需要把新的配置內(nèi)容加到 $HOME/.kube/config 下。單只是cat ${CONFIG_PATH} >> $HOME/.kube/config是不行的,正確的做法是:KUBECONFIG=$HOME/.kube/config:${CONFIG_PATH} kubectl config view --flatten > $HOME/.kube/config?。解釋下這個命令的意思:先把所有的配置文件添加到環(huán)境變量KUBECONFIG中,然后執(zhí)行kubectl config view --flatten打印出有效的配置文件內(nèi)容,最后覆蓋$HOME/.kube/config 即可。

請注意,上述操作的優(yōu)先級分別是 1>2>3,也就是說,kubectl 會優(yōu)先檢查--kubeconfig,若無則檢查KUBECONFIG,若無則最后檢查$HOME/.kube/config,如果還是沒有,報錯。但凡某一步找到了有效的 cluster,就中斷檢查,去連接 K8S 集群了。

第三步:配置正確的上下文

按照第二步的做法,如果配置文件只有一個 cluster 是沒有任何問題的,但是對于有多個 cluster 怎么辦呢?到這里,有幾個關(guān)于配置的必須掌握的命令:

  • kubectl config get-contexts。列出所有上下文信息。

  • kubectl config current-context。查看當(dāng)前的上下文信息。其實(shí),命令 1 線束出來的*所指示的就是當(dāng)前的上下文信息。

  • kubectl config use-context ${CONTEXT_NAME}。更改上下文信息。

  • kubectl config set-context ${CONTEXT_NAME}|--current --${KEY}=${VALUE}。修改上下文的元素。比如可以修改用戶賬號、集群信息、連接到 K8S 后所在的 namespace。

    關(guān)于該命令,還有幾點(diǎn)要啰嗦的:

    • config set-context可以修改任何在配置文件中的上下文信息,只需要在命令中指定上下文名稱就可以。而--current 則指代當(dāng)前上下文。

    • 上下文信息所包括的內(nèi)容有:cluster 集群(名稱)、用戶賬號(名稱)、連接到 K8S 后所在的 namespace,因此有config set-context嚴(yán)格意義上的用法:

      kubectl config set-context [NAME|--current] [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace] [options]

      (備注:[options]可以通過 kubectl options 查看)

綜上,如何操作 kubectl 配置都已交代。

IV. kubectl 部署服務(wù)

K8S 核心功能就是部署運(yùn)維容器化服務(wù),因此最重要的就是如何又快又好地部署自己的服務(wù)了。本章會介紹如何部署 Pod 和 Deployment。

4.1 如何部署 Pod?

通過 kubectl 部署 Pod 的辦法分為兩步:1). 準(zhǔn)備 Pod 的 yaml 文件;2). 執(zhí)行 kubectl 命令部署

第一步:準(zhǔn)備 Pod 的 yaml 文件。關(guān)于 Pod 的 yaml 文件初步解釋,本系列上一篇文章《K8S 系列一:概念入門》已經(jīng)有了初步介紹,這里再復(fù)習(xí)下:

apiVersion:?v1
kind:?Pod
metadata:
??name:?memory-demo
??namespace:?mem-example
spec:
??containers:
??-?name:?memory-demo-ctr
????image:?polinux/stress
????resources:
??????limits:
????????memory:?"200Mi"
??????requests:
????????memory:?"100Mi"
????command:?["stress"]
????args:?["--vm",?"1",?"--vm-bytes",?"150M",?"--vm-hang",?"1"]
????volumeMounts:
????-?name:?redis-storage
??????mountPath:?/data/redis
??volumes:
??-?name:?redis-storage
????emptyDir:?{}

繼續(xù)解讀:

  • metadata,對于新入門的同學(xué)來說,需要重點(diǎn)掌握的兩個字段:

    • name。這個 Pod 的名稱,后面到 K8S 集群中查找 Pod 的關(guān)鍵字段。
    • namespace。命名空間,即該 Pod 隸屬于哪個 namespace 下,關(guān)于 Pod 和 namespace 的關(guān)系,上一篇文章已經(jīng)交代了。
  • spec記錄了 Pod 內(nèi)部所有的資源的詳細(xì)信息,這里我們重點(diǎn)查看containers下的幾個重要字段:

    • name。Pod 下該容器名稱,后面查找 Pod 下的容器的關(guān)鍵字段。

    • image。容器的鏡像地址,K8S 會根據(jù)這個字段去拉取鏡像。

    • resources。容器化服務(wù)涉及到的 CPU、內(nèi)存、GPU 等資源要求。可以看到有limitsrequests兩個子項(xiàng),那么這兩者有什么區(qū)別嗎,該怎么使用?在What's the difference between Pod resources.limits and resources.requests in Kubernetes?回答了:

      limits是 K8S 為該容器至多分配的資源配額;而requests則是 K8S 為該容器至少分配的資源配額。打個比方,配置中要求了 memory 的requests為 100M,而此時如果 K8S 集群中所有的 Node 的可用內(nèi)存都不足 100M,那么部署服務(wù)會失?。挥秩绻幸粋€ Node 的內(nèi)存有 16G 充裕,可以部署該 Pod,而在運(yùn)行中,該容器服務(wù)發(fā)生了內(nèi)存泄露,那么一旦超過 200M 就會因?yàn)?OOM 被 kill,盡管此時該機(jī)器上還有 15G+的內(nèi)存。

    • command。容器的入口命令。對于這個筆者還存在很多困惑不解的地方,暫時挖個坑,有清楚的同學(xué)歡迎留言。

    • args。容器的入口參數(shù)。同上,有清楚的同學(xué)歡迎留言。

    • volumeMounts。容器要掛載的 Pod 數(shù)據(jù)卷等。請務(wù)必記?。?strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">Pod 的數(shù)據(jù)卷只有被容器掛載后才能使用!

第二步:執(zhí)行 kubectl 命令部署。有了 Pod 的 yaml 文件之后,就可以用 kubectl 部署了,命令非常簡單:kubectl create -f ${POD_YAML}

隨后,會提示該命令是否執(zhí)行成功,比如 yaml 內(nèi)容不符合要求,則會提示哪一行有問題:

修正后,再次部署:

4.2 如何部署 Deployment?

第一步:準(zhǔn)備 Deployment 的 yaml 文件。首先來看 Deployment 的 yaml 文件內(nèi)容:

?apiVersion:?extensions/v1beta1
?kind:?Deployment
?metadata:
???name:?rss-site
???namespace:?mem-example
?spec:
???replicas:?2
???template:
?????metadata:
???????labels:
?????????app:?web
?????spec:
??????containers:
???????-?name:?memory-demo-ctr
?????????image:?polinux/stress
?????????resources:
?????????limits:
???????????emory:?"200Mi"
?????????requests:
???????????memory:?"100Mi"
?????????command:?["stress"]
?????????args:?["--vm",?"1",?"--vm-bytes",?"150M",?"--vm-hang",?"1"]
?????????volumeMounts:
?????????-?name:?redis-storage
???????????mountPath:?/data/redis
?????volumes:
?????-?name:?redis-storage
???????emptyDir:?{}

繼續(xù)來看幾個重要的字段:

  • metadata同 Pod 的 yaml,這里提一點(diǎn):如果沒有指明 namespace,那么就是用 kubectl 默認(rèn)的 namespace(如果 kubectl 配置文件中沒有指明 namespace,那么就是 default 空間)。
  • spec,可以看到 Deployment 的spec字段是在 Pod 的spec內(nèi)容外“包了一層”,那就來看 Deployment 有哪些需要注意的:
    • metadata,新手同學(xué)先不管這邊的信息。
    • spec,會發(fā)現(xiàn)這完完全全是上文提到的 Pod 的spec內(nèi)容,在這里寫明了 Deployment 下屬管理的每個 Pod 的具體內(nèi)容。
    • replicas。副本個數(shù)。也就是該 Deployment 需要起多少個相同的 Pod,如果用戶成功在 K8S 中配置了 n(n>1)個,那么 Deployment 會確保在集群中始終有 n 個服務(wù)在運(yùn)行。
    • template。

第二步:執(zhí)行 kubectl 命令部署。Deployment 的部署辦法同 Pod:kubectl create -f ${DEPLOYMENT_YAML}。由此可見,K8S 會根據(jù)配置文件中的kind字段來判斷具體要創(chuàng)建的是什么資源。

這里插一句題外話:部署完 deployment 之后,可以查看到自動創(chuàng)建了 ReplicaSet 和 Pod,如下圖所示:

還有一個有趣的事情:通過 Deployment 部署的服務(wù),其下屬的 RS 和 Pod 命名是有規(guī)則的。讀者朋友們自己總結(jié)發(fā)現(xiàn)哦。

綜上,如何部署一個 Pod 或者 Deployment 就結(jié)束了。

V. kubectl 查看、更新/編輯、刪除服務(wù)

作為 K8S 使用者而言,更關(guān)心的問題應(yīng)該是本章所要討論的話題:如何通過 kubectl 查看、更新/編輯、刪除在 K8S 上部署著的服務(wù)。

5.1 如何查看服務(wù)?

請務(wù)必記得一個事情:在 K8S 中,一個獨(dú)立的服務(wù)即對應(yīng)一個 Pod。即,當(dāng)我們說要 xxx 一個服務(wù)的就是,也就是操作一個 Pod。而與 Pod 服務(wù)相關(guān)的且需要用戶關(guān)心的,有 Deployment。

通過 kubectl 查看服務(wù)的基本命令是:

$?kubectl?get|describe?${RESOURCE}?[-o?${FORMAT}]?-n=${NAMESPACE}
#?${RESOURCE}有:?pod、deployment、replicaset(rs)

在此之前,還有一個需要回憶的事情是:Deployment、ReplicaSet 和 Pod 之間的關(guān)系 - 層層隸屬;以及這些資源和 namespace 的關(guān)系是 - 隸屬。如下圖所示。

因此,要查看一個服務(wù),也就是一個 Pod,必須首先指定 namespace!那么,如何查看集群中所有的 namespace 呢?kubectl get ns

于是,只需要通過-n=${NAMESPACE}就可以指定自己要操作的資源所在的 namespace。比如查看 Pod:kubectl get pod -n=oona-test,同理,查看 Deployment:kubectl get deployment -n=oona-test

問題又來了:如果已經(jīng)忘記自己所部屬的服務(wù)所在的 namespace 怎么辦?這么多 namespace,一個一個查看過來嗎?

kubectl get pod --all-namespaces

這樣子就可以看到所有 namespace 下面部署的 Pod 了!同理,要查找所有的命名空間下的 Deployment 的命令是:kubectl get deployment --all-namespaces。

于是,就可以開心地查看 Pod:kubectl get pod [-o wide] -n=oona-test,或者查看 Deployment:kubectl get deployment [-o wide] -n=oona-test

哎,這里是否加-o wide有什么區(qū)別嗎?實(shí)際操作下就明白了,其他資源亦然:

哎,我們看到之前部署的 Pod 服務(wù) memory-demo 顯示的“ImagePullBackOff”是怎么回事呢?先不著急,我們慢慢看下去。

5.2 如何更新/編輯服務(wù)?

兩種辦法:1). 修改 yaml 文件后通過 kubectl 更新;2). 通過 kubectl 直接編輯 K8S 上的服務(wù)。

方法一:修改 yaml 文件后通過 kubectl 更新。我們看到,創(chuàng)建一個 Pod 或者 Deployment 的命令是kubectl create -f ${YAML}。但是,如果 K8S 集群當(dāng)前的 namespace 下已經(jīng)有該服務(wù)的話,會提示資源已經(jīng)存在:

通過 kubectl 更新的命令是kubectl apply -f ${YAML},我們再來試一試:

(備注:命令kubectl apply -f ${YAML}也可以用于首次創(chuàng)建一個服務(wù)哦)

方法二:通過 kubectl 直接編輯 K8S 上的服務(wù)。命令為kubectl edit ${RESOURCE} ${NAME},比如修改剛剛的 Pod 的命令為kubectl edit pod memory-demo,然后直接編輯自己要修改的內(nèi)容即可。

但是請注意,無論方法一還是方法二,能修改的內(nèi)容還是有限的,從筆者實(shí)戰(zhàn)下來的結(jié)論是:只能修改/更新鏡像的地址和個別幾個字段。如果修改其他字段,會報錯:

The Pod "memory-demo" is invalid: spec: Forbidden: pod updates may not change fields other than?spec.containers[*].image,?spec.initContainers[*].image,?spec.activeDeadlineSeconds?or?spec.tolerations?(only additions to existing tolerations)

如果真的要修改其他字段怎么辦呢?恐怕只能刪除服務(wù)后重新部署了。

5.3 如何刪除服務(wù)?

在 K8S 上刪除服務(wù)的操作非常簡單,命令為kubectl delete ${RESOURCE} ${NAME}。比如刪除一個 Pod 是:kubectl delete pod memory-demo,再比如刪除一個 Deployment 的命令是:kubectl delete deployment ${DEPLOYMENT_NAME}。但是,請注意:

  • 如果只部署了一個 Pod,那么直接刪除該 Pod 即可;

  • 如果是通過 Deployment 部署的服務(wù),那么僅僅刪除 Pod 是不行的,正確的刪除方式應(yīng)該是:先刪除 Deployment,再刪除 Pod。

關(guān)于第二點(diǎn)應(yīng)該不難想象:僅僅刪除了 Pod 但是 Deployment 還在的話,Deployment 定時會檢查其下屬的所有 Pod,如果發(fā)現(xiàn)失敗了則會再拉起。因此,會發(fā)現(xiàn)過一會兒,新的 Pod 又被拉起來了。

另外,還有一個事情:有時候會發(fā)現(xiàn)一個 Pod 總也刪除不了,這個時候很有可能要實(shí)施強(qiáng)制刪除措施,命令為kubectl delete pod --force --grace-period=0 ${POD_NAME}。

VI. kubectl 排查服務(wù)問題

上文說道:部署的服務(wù) memory-demo 失敗了,是怎么回事呢?本章就會帶大家一起來看看常見的 K8S 中服務(wù)部署失敗、服務(wù)起來了但是不正常運(yùn)行都怎么排查呢?

首先,祭出筆者最愛的一張 K8S 排查手冊,來自博客《Kubernetes Deployment 故障排除圖解指南》:

哈哈哈,對于新手同學(xué)來說,上圖還是不夠友好,下面我們簡單來看兩個例子:

6.1 K8S 上部署服務(wù)失敗了怎么排查?

請一定記住這個命令:kubectl describe ${RESOURCE} ${NAME}。比如剛剛的 Pod 服務(wù) memory-demo,我們來看:

拉到最后看到Events部分,會顯示出 K8S 在部署這個服務(wù)過程的關(guān)鍵日志。這里我們可以看到是拉取鏡像失敗了,好吧,大家可以換一個可用的鏡像再試試。

一般來說,通過kubectl describe pod ${POD_NAME}已經(jīng)能定位絕大部分部署失敗的問題了,當(dāng)然,具體問題還是得具體分析。大家如果遇到具體的報錯,歡迎分享交流。

6.2 K8S 上部署的服務(wù)不正常怎么排查?

如果服務(wù)部署成功了,且狀態(tài)為running,那么就需要進(jìn)入 Pod 內(nèi)部的容器去查看自己的服務(wù)日志了:

  • 查看 Pod 內(nèi)部某個 container 打印的日志:kubectl log ${POD_NAME} -c ${CONTAINER_NAME}。
  • 進(jìn)入 Pod 內(nèi)部某個 container:kubectl exec -it [options] ${POD_NAME} -c ${CONTAINER_NAME} [args],嗯,這個命令的作用是通過 kubectl 執(zhí)行了docker exec xxx進(jìn)入到容器實(shí)例內(nèi)部。之后,就是用戶檢查自己服務(wù)的日志來定位問題。

顯然,線上可能會遇到更復(fù)雜的問題,需要借助更多更強(qiáng)大的命令和工具。

寫在后面

本文希望能夠幫助對 K8S 不了解的新手快速了解 K8S。筆者一邊寫文章,一邊查閱和整理 K8S 資料,過程中越發(fā)感覺 K8S 架構(gòu)的完備、設(shè)計的精妙,是值得深入研究的,K8S 大受歡迎是有道理的。


本文轉(zhuǎn)載自:「騰訊技術(shù)工程」,原文:https://tinyurl.com/ya3ennxf,版權(quán)歸原作者所有。




- End -

關(guān)注「開源Linux」加星標(biāo),提升IT技能

瀏覽 71
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 激情小视频国产在线播放| 久久久久久无码日韩欧美电影| 免费手机av| 加勒比无码综合| 午夜一区二区三区| 操人妻| 美女做爱视频网站| 婷婷少妇激情| 国产成人片色情AAAA片| 无码高清在线播放| 一级av片| 亚洲AV无码永久精品| 能看的操逼视频| 国产欧美二区综合中文字幕精品一 | 亚洲精品成人7777777| 九一av| 操逼首页123| 美女性爱3P视频| 97超碰大香蕉| 草久在线视频| 超碰免费人妻| 欧性猛交ⅩXXX乱大交| 亚洲中文字幕无码在线观看| 水蜜桃视频网站| 免费的操逼视频| 欧美亚洲动漫| 宅男噜噜噜66一区二区| 特黄色A级片视频| 欧美日韩中字| 99在线观看视频| 无码AV在线播放| 精品人妻一区二区蜜桃视频| 日韩三级久久| 国产91无码精品秘入口| 国产成人小视频在线观看| 免费看黄片网站| 免费AV大全| 亚洲在线一区| 黄色免费AV| 亚洲无码免费视频在线观看| 黄色视频免费看| 无码精品一区二区三区同学聚会| www.色悠悠| www三级片| 手机在线操B视频| 大香蕉伊人青青草| 视频一区中文字幕| AV资源在线播放| 北条麻妃黄色视频| 中文在线观看免费视频| 无码不卡中文字幕| 国产91在线拍揄自揄拍无码九色 | 一级黄色电影免费看| 69er小视频| 国产性猛交╳XXX乱大交| 精品国产精品三级精品AV网址| 日本三级AAA三级AAAA97| 豆花视频在线| 欧美一二三区| 亚洲日韩av在线| aaa无码| 大香蕉国产在线视频| 中文字幕第27页| 伊人精品大香蕉| 91最新在线播放| 日韩视频在线免费观看| 国产秘久久一区二区| 五月天AV在线| 亚洲视频无码在线| 亚洲污污| 一级片免费观看视频| 77q视频| 91夫妻交友视频| 国产精品电影| 老熟女乱伦| 国产成人av网站| 香蕉AV777XXX色综合一区| аⅴ资源新版在线天堂| wwwxx国产| 亚洲AV久久无码| 综合激情五月婷婷| 美女黄色视频永费在线观看网站 | 日韩aaa| 人人看人人摸人人| 免费看黃色AAAAAA片| 东方AV在线播放| 久久久精品免费| 久草视频免费看| 91久久精品日日躁夜夜躁欧美| 成人免费一级视频| av黄色网| 伊人久久大香线蕉| 日本成人免费电影| 中文字幕视频在线免费观看| 精品中文在线视频| 高清无码免费视频| 一本色道久久综合亚洲精东小说| 欧美日韩三级| 日韩在线小视频| 日本午夜福利电影| 日韩黄视频| 北条麻妃无码播放| 久久久人妻| 午夜福利91| 操操操网| 日韩成人免费在线观看| 一级a性色毛片| 精品一二三四| 风间由美大荫蒂无码AV| 懂色AV无码中字幕一区| 最近中文字幕中文翻译歌词| 天天射日| 伊人大香蕉网站| 可以看的黄色视频| 国产欧美综合三级伦| 六月综合激情| 日日射视频| 在线观看中文字幕亚洲| 午夜资源站| www.日本黄色| 日韩无码2024| 亚洲一区视频在线| 超碰av电影| 精品秘一区性综合三区| 中国12一13毛片| www.91在线看| 夜夜嗨AⅤ一区二区三区| 最新亚洲无码在线观看| 国产最新AV| 97人妻人人| 日本熟妇无码一区二区| 国产1级a毛a毛1级a毛1级| 国内自拍视频网| jizz日韩| 日韩色在线| 久久久青草| 成人自拍在线| 国产一级a毛一级a毛视频在线网站)| 日本成人高清视频| 日韩无码AV一区二区| 久久久一| 99国产精品免费视频观看8| 成人性爱av| 国产免费一区| 五月丁香花| 日韩一级无码特黄AAA片| 国产成人无码区亚洲A片356p| 91色在线观看| 中文字幕人成人乱码亚洲电影| AV无码观看| 成人三级电影在线观看| 激情AV在线| 麻豆av在线| 亚洲十八禁| 欧美黄网站| 婷婷五月天激情网| 欧美成人18| 怡春院熟女精品AV| 裸体黄色一极大片| 日本少妇黄色视频| 大香蕉在线视频75| 国产男女性爱视频播放| 大香蕉av一区二区三区在线观看| 亚洲一区av| 亚洲国产爱| AV无码观看| 国产一级a毛一级a毛视频在线网站 | 精品一区在线| 粗长哭叫打桩H体育生| 中国人妻HDbute熟睡| 波多野结衣亚洲| 骚网站在线观看| A色片| 免费看操逼| 精品国产三级片| 黄色视频免费在线观看网站| 五月天国产视频| 周晓琳AV| 欧美性爱高清| 久久久久无码国产精品一区| 女侠吕四娘第二部| 特级444WWW大胆高清| 中文在线字幕高清电视剧| 骚骚网| 大鸡巴视频在线| 精品AV| 一级午夜福利| 人人艹在线观看| 北条麻妃无码在线| 亚洲性爱一区| 三级片网站大全| 日韩一级片免费| 日韩中文字幕精品| 亚洲精品影视| 中文字幕理论片| 天天想天天干| 国产精品成人AV在线| 一级国产欧美成人A片| 天天日天天噜| 台湾色综合| 日本色中文字幕| 大香蕉75| 亚洲有码在线| 大香蕉综合久久| 操逼首页123| 中文字幕在线看成人电影| 成人影音先锋| 亚洲av网址| 精品国精品自拍自在线| 久久精品免费看| 免费高清无码视频| 五月天精品| 日逼大香蕉| 亚洲日本三级片| 亚洲色综合| 亚洲射| 亚洲无码免费在线视频| 欧美日逼超碰| 大香蕉伊人在线观看视频| 国产曰韩欧美综合另类在线| 日韩精品人妻无码| 久久久久久久久久久久高清毛片一级 | 久久这里精品| 国产高清无码免费在线观看| 无码任你躁久久久久| 激情性爱五月天| 亚洲黄在线观看| 亚洲色啪| 精国产品一区二区三区A片| 亚洲AV无码国产精品| 日韩一区二区免费视频| 日本一区二区视频在线| AAA一区二区三区| 夜夜骑婷婷91| 日韩在线视频观看| 欧美老熟妇乱大交XXXXX| 久久精品性爱| 久久午夜无码鲁丝片午夜精品偷窥| 黄色一级片视频| 综合AV| 五月天婷婷黄色| 久久撸在线视频| 亚洲人成免费网站| 国产一区| 一道本在线视频| 天天添天天操| 91丨PORNY丨丰满人妻网站| 成人免费视频国产在线观看| www.豆花福利视频| 亚洲中文中出| 51福利导航| 日日免费视频| 日本中文字幕在线观看| 无码视频免费在线观看| 天天av天天av天天爽| 人妻丰满熟妇av无码区| 亚洲av动漫| 亚洲AV无码精品国产| 欧美做受高潮白| 中文字幕日韩乱伦| 91在线无码视频| 亚洲性生活| 国精产品一区二区三区| 性V天堂| 成人看片黄a免费看视频| 午夜福利大香蕉| 欧美色色视频| 国产精品国产精品国产专区不52 | 久久黄色视频免费看| 在线综合国产欧美| 亚洲色婷婷| www操逼| 亚洲国产高清视频| 天天射日日干| 久久久久久亚洲| 影音先锋一区二区三区| 四川w搡BBB搡wBBB搡| 18禁一区二区三区| 欧美第1页| 久久综合久久鬼| 蜜桃精品在线观看| 99热热久久| 国产精品蜜| 久热精品免费| 欧美三级黄色| 午夜成人鲁丝片午夜精品| 日本女人牲交视频| 爽妇综合网| 在线观看的av网站| 影音先锋久久久| 亚洲中文字幕色| 91人妻人人爽人人澡| 五月停亭六月,六月停亭的英语| 四虎91| 免费在线观看无码| 成人免费黄色片| 亚洲高清视频免费| 日本边摸边吻奶边做爰| 日韩黄网站| 江苏妇搡BBB搡BBBB| 特大妓女BBwBBWBBw| 福利视频二区| 国产精品卡一卡二| www.6969成人片亚洲| 国产成人精品免高潮在线人与禽一 | 操逼逼网站| AV网站免费在线观看| 亚洲秘一区二区三区-精品亚洲二区- | 桃花岛tⅴ+亚洲品质| 欧一美一婬一伦一区二区三区自慰,| 亚洲AV综合网| 国产黄色一级| 波多野结衣东京热| 无码av在线播放| 久草99| 免费黄色在线观看| 欧美日韩狠狠操在线观看视频| 久久久久久国际四虎免费精品视频| 亚洲小说图片AV在线| 亚洲影院中文字幕| 亚洲天堂网2025| av在线三级| 亚洲A片V一区二区三区| 成人在线欧美| 91人妻无码精品蜜桃| EEUSS| 偷拍三区| 青操av| 日本人妻在线播放| 天天日av| 日韩欧美国产精品综合嫩V| 天天草天天| 西西444www| 成人精品视频| 淫色网址| 国产精品国产三级囯产普通话2| 人与禽一级A片一区二区三区| 五月丁香视频在线观看| 成人亚洲A片V一区二区三区蜜月| 欧美精品在线播放| 中文字字幕在线中文乱码更新时间| 久操| 久久理论电影| 17c白丝喷水自慰| www.久久久| 亚洲无码成人视频| 亚洲欧美在线播放| 中文字幕亚洲有码| 成人欧美一区二区三区白人| 色婷婷俺来也| 香蕉视频毛片| 欧美日韩视频在线播放| 日韩熟妇无码中文字幕| 99在线精品视频| 99在线精品视频在线观看| 亚洲无码在线精品| 无码内射在线播放| 色图欧美色图| 天天射天天| 国产亚洲aⅴ| 91麻豆国产福利在线观看| 中文字幕亚洲天堂| 亚欧三级| 人妻互换一二三区免费| 国产成人宗合| 日韩第一色| 精品久久一区二区三区四区 | 高清无码三级片| 日韩欧美日韩| 国产精品99视频| 亚洲AV男人天堂| 日韩三级AV在线观看| 在线中出| 日本黄色视频在线免费观看| AV免费在线播放| 少妇精品无码一区二区免费视频| 午夜无码福利视频| 久久久久无码国产精品不卡| 亚洲无码系列| 在线观看免费视频无码| 草在线| 综合无码| 麻豆国产成人AV一区二区三区| 2025中文字幕在线| 丰满的人妻一区二区三区果冻 | 一级乱伦网站| 国产黄色视频在线观看免费| 广东BBW搡BBBB搡| 日本少妇激情视频| 思思热思思操| 国产美女操逼| 欧美大胆a| 超碰97av| 99精品视频在线| 色999亚洲人成色| 国产久久精品| 国产骚逼| 日韩毛片大全| 国产欧美精品一区二区色综合 | 精品国产一级A片黄毛网站| 国产黄色视频网站在线观看| 人人看人人摸人人操| 成人777777| 午夜性爱AV| sesese| 99热只有精| 在线观看者亚洲| 精品无码一区二区三区四区五区| 久久免费在线视频| 成人毛片网| 豆花成人视频在线观看| 97精品综合久久| 99视频免费在线| 日本A片免费观看| 日韩福利片| 久久日精品| 久久久久久高清毛片一级| 美女性爱3P视频| 天堂网色| 东京热这里只有精品| 欧美男女操逼视频| 日韩免费无码视频| 成人五月天黄色电影| 亚洲中文免费视频| 猫咪视频大全视频| a网站在线| 全国最大成人网站| 亚洲高清无码视频大全| 97资源超碰| 亚洲无码AV免费观看| 黑人人妻黑人ThePorn| 狼友视频免费| 中文字幕日韩高清| 五月天激情网址| 麻豆激情| AV草逼| 国产精品久久久精品cos| 国产乱婬片视频| 西西444WWW无码精品| 8050午夜一级免费| 亚洲污| 日韩在线中文字幕亚洲| 123好逼网| 影音av在线| 日韩国无码| 久久精品无码一区二区无码性色| 黄片午夜| 日韩18在线| 超碰在线观看91| 粉嫩99精品99久久久久久特污| 另类图片亚洲色图| 色99在线| 91成人一区二区三区| 婷婷伊人久操网| AV网站在线播放| 人人爽人人爽人人| 激情网站在线观看| 久久久久久大香蕉| 亚洲无码免费观看视频| 欧美成人中文字幕在线| 91AV视频| 在线观看污网站| 日韩69| 99人妻人人爽人人添人人精品| 91综合视频在线播放| 国产操| 国产精品二| 欧美性爱XXXX| 亚洲日韩中字| yjizz国产| 大香蕉av在线| 亚洲欧美成人电影| 麻豆国产成人AV一区二区三区| 色爽av| 最新亚洲中文字幕| 五月天激情网站| 熟女综合网| 欧美性爱日韩| 午夜国产在线观看| 摸BBB搡BBB搡BBBB| 久久久三级片| 91一级特黄大片| 日本免费福利视频| 国产精品久久视频| aaaaaa在线观看免费高清| 日本一级理论片在线大全| 亚洲你懂的| 无码不卡在线播放| 亚洲天堂中文字幕| 国产一区二区成人久久919色| 在线三级av| 成人怡红院| 国产农村妇女精品一二区| 澳门簧片| 黄色无码网站| 97香蕉网| 人人色人人黄| 日逼视频网站| 国产成人视频免费| 国产精品久久7777777精品无码 | 蝌蚪窝免费在线视频| 豆花视频成人精品视频| 国产久久久久久久久| 操美女一区二区| 国产第一页在线观看| av午夜激情| 青青久久91| 日本爱爱视频| 中文字幕亚洲综合| 成人黄色性爱视频| 精品国产AV无码一区二区三区| 国产大奶一区二区| 插插插视频| 屁屁影院CCYYCOM国产| 北条麻妃无码精品AV怎么看| 国产成人免费在线观看| 日韩视频――中文字幕| 久久久精品中文字幕麻豆发布| 四虎影院人妻| 韩国久久久| 日本中文在线观看| 一本久久综合亚洲鲁鲁五月天 | 51午夜福利| 欧美91| 中文字幕有码在线视频| 久久国产欧美| 亚洲黄色视频在线观看网站| 99色逼| 亚洲中文AV| 加勒比无码在线播放| 三级成人免费| 黑人AV在线播放| 一区二区无码视频| 人妻FrXXeeXXee护士| 成人AV十八亚洲二区| 久久国产精品精品国产色婷婷 | 天天干天天日蜜臀色欲av| 国产午夜福利电影| 秋霞国产| 操鸡巴网站| 97人妻精品一区二区三区软件| 天天干天天操综合| 日韩AAA| 水蜜桃网址| 无码精品视频在线观看| 五月色丁香| 中文字幕超清在线观看| 日本中文字幕在线免费观看| 欧美在线观看网站18| 色我影院| 乱子伦国产精品| 思思热99| 狠狠操狠狠操狠狠操| 国产高清A片| 人操人操人操| 91丨PORN首页| 影音av在线| 黄色毛片网站| 嫩BBB嫩BBB嫩BBB| 大香蕉网视频| 豆花视频logo进入官网| 久久久精品免费视频| AV色天堂| 亚洲精品秘一区二区三区影| 51嘿嘿嘿国产精品伦理| 国产特黄| 自拍偷拍免费| 久草视频免费在线观看| 五月天丁香| 亚洲三级视频在线观看| 一区二区水蜜桃| 人人妻人人要| 欧美日韩高清丝袜| 四虎无码视频| 日韩AV手机在线观看| 毛片黄片| 在线看片国产| 最新中文字幕在线播放| jizz亚洲| 国产a片| 亚洲精品在线观看视频| 永久免费看片视频| 中文字幕国产av| 欧美一级网站| 九一香蕉视频| 国产卡一卡二| 少妇激情av| 人妻天天爽夜夜爽| 一级香蕉视频| 国产免费一级特黄A片| 免费尻屄视频| 东方av在线播放| 免费视频A| 久热激情| 伊人综合视频| 淫色淫香综合网| 国产精品99久久久久久成人| avwww| 国产三级av在线| 西西人体444rt高清大胆模特| 久久超碰精品| 欧美三级黄色| 深夜福利av| 亚洲天堂无码高清| 一级黄色片免费| 日本伊人大香蕉| 欧美婷婷五月天| 成人久久精品| 亚洲欧美日韩国产| 无码av在线播放| 成人h在线| 欧美人操逼一二区| 2019中文字幕在线免费观看| 浪潮在线观看完整版| 久色视频福利| 午夜精品久久久久久不卡8050| 一区二区三区四区不卡| 韩国一区二区三区在线观看| 亚洲欧洲免费看| 日韩操比视频| 欧美麻豆| 日韩一级片网站| 欧美囗交大荫蒂免费| 91精品国产aⅴ一区二区| 超碰人人插| 亚洲无码视频一区| 大香蕉伊在线观看| 久久丁香五月婷婷五月天激情视频| 一级免费a片| 一区二区三区三级片| 91精品午夜少妇| jlzzzjlzzz国产免费观看| 色欲91| 亚洲精品不卡| 91久久久久久| 亚洲无码视频免费观看| 日韩操B| 黄色片视频日本| 在线播放亚洲无码| 日韩网站在线观看| 97免费| 婷婷伊人綜合中文字幕| 五月婷婷综合网| 午夜精品久久久久久久久无码99热| 久久五月天综合| 欧美A在线观看| 国产成人视频免费观看| 黄色毛片在线观看| 亚洲一区二区三区在线++中国| 亚洲无码午夜| 国产av中文| 国产原创精品| 国产做受91一片二片老头| 精品无码一| A视频免费在线观看| 想要xx视频| 亚洲不卡中文字幕| 欧美日本国产| 日韩免费视频在线观看| 无码成人在线观看| 99欧美精品| 欧美中文字幕在线播放| 国产色av| 午夜成人福利视频| 久久电影精品| 欧美浮力影院| 3D动漫精品啪啪一区二区下载| 少妇被躁到高潮无码| 欧美午夜电影| 懂色av蜜臀av粉嫩av分享| 精品大香蕉| 亚洲国际中文字幕在线| 天堂网2018| 欧美一级精品| 亚洲精品一区二区三区| 水果派成人播放无码| 91在线一区| 亚洲午夜久久久久久久久红桃| 中文字幕在线资源| 欧美一级操| 久久看片| 日韩精品电影| 欧美特级毛片| 嫩BBB槡BBBB槡BBBB免费视频| 91日韩精品| 成人免费黄片| 欧美精品网| 久久久久精| 99久久精品国产色欲| 六月综合激情| 五月天激情小说网| 壹屌探花| 成人久久大香蕉| 撸一撸AV| www.四虎成人网站| 国内精品人妻无码久久久影院蜜桃 | 亚洲色视频在线| 狠狠干伊人| 伊人网综合| 欧美成人性爱影院| 亚洲第一黄片| 成人无码免费毛片A片| 在线免费看A| 毛片三级片| 99热在线观看| 91亚洲国产成人久久精品网站 | 激情五月丁香婷婷| 97人妻人人操| 91亚洲精品在线观看| 五月天婷婷丁香| 无码高清18| 午夜成人视频在线观看| 久草黄色电影在线观看| 久久国产乱子伦精品免费午夜...| jiujiuav| 97免费在线视频| 久久一| 亚洲精品成人无码| 五月婷婷综合激情| 人人爱人人射| 天天草夜夜操| 亚洲五月天在线| 亚洲午夜无码精品专区| 神马午夜福利影院| 另类一区| 老熟女伦一区二区三区| 日日av| 秋霞欧美在线| 亚洲AV无码成人精品区欧洲| 国产无遮挡又黄又爽又| 亚洲国产黄色视频| 午夜精品18码视频国产17c| 亚洲AV播放| 久草在线| 91网站在线播放| 17.3c一起起草| 日韩一区二| 在线观看黄色片| 日韩a在线观看| 日韩人妻无码一区二区三区99| 亚洲综合片| 99爱爱| 国产精品人妻无码一区牛牛影视| 亚洲色图一区二区三区| 欧美A一| 黄色视频在线免费播放| 国产午夜福利免费视频在线观看| 乱伦内射| 特级西西444www高清大胆免费看| 亚洲无码AV在线播放| 五月丁香花婷婷| 黄色视频在线网站| 亚洲高清国产欧美综合s8| 综合久久中文字幕| 91人妻人人澡人人爽人人精吕| 五月天国产| 香蕉大综合| 日本免费不卡| 色老板在线精品免费观看| 亚洲夜夜操| 国产亚洲婷婷| 都市激情亚洲| 久草视频这里只有精品| 国产亲子乱A片免费视频| 亚洲乱伦小说网| 国产欧美综合视频| 凹凸熟女凹凸BBWBBW| 在线免费AV片| 无码一区二区三区四| 99av| 亚洲欧美成人在线| 久久99国产乱子伦...| 男女精品一区| 婷婷五月天网址| 久久久久久久久久久国产精品| 国产性色| 一级午夜| 综合网视频| 激情AV| 伊人影院99| 操杨幂| 五月深爱| 亚洲欧美日韩成人| 欧美日日日| 九九综合伊人7777777| 一区二区高清无码视频| 午夜福利资源| 久9久9久9久9久9久9| 在线中文字幕网站| 抽插免费视频| 屁屁影院国产第一页| 91免费| 刘玥一级婬片A片AAA| 国产精品久久久久久久久免费无码 | 国产乱妇无码毛片A片在线看下载| 久久成人无码| 亚洲天堂av在线免费观看| 国精产品一区一区三区四川| 91大奶熟女| 欧美操逼视频| 欧美性受| 俺也去官网| 一级黄色电影A片| 日韩无码三级| 伊人婷婷大香蕉| 欧洲毛片基地c区| 中文日韩欧美| 91色逼| 99A片| 人人妻人人摸| 欧美人妻精品| 黄色操逼片| 一本大道香蕉av久久精东影业| 日韩一级电影在线观看| 免费无码毛片一区二区A片| 九九精品12| 你懂的在线播放| 黄色片在线观看视频| 三级黄,色| 婷婷色综合视频二区| 99热都是精品| 日韩在线看片| 草久av| 中文字幕在线观看福利视频| 成人久久精品| 女同久久另类99精品国产91| 久婷婷| 欧美毛视频| 91在线视频精品| wwwa片| 香蕉视频日韩| 国产黄色片网站| 国产乱子伦真实精品| 亚洲v欧美| 97超碰资源总站| 无码三级午夜久久人妻| 中文字幕的色| 丁香五月中文字幕| 麻豆亚洲AV成人无码久久精品| 亚州无码精品| 日本免费福利视频| 99视频精品| 欧美三级在线视频| 综合一区二区三区| 日韩一区二区三区无码| 亚洲无吗在线播放| 国产黄色三级片| 成人毛片| 99成人免费视频| 日韩免费成人视频| 人人人妻人人人操| 亚洲二区后入极品| 国产成人精品一区二区三区在线| 丁香五月婷婷在线| 精品人妻午夜| 国产三级精品三级在线观看| 免费的AV网站| 麻豆福利在线| 日韩在线中文字幕| 伊人亚洲综合| 日韩一级大片| 影音先锋色先锋| 蜜臀av在线免费观看| 欧美级黑寡妇毛片app| 日韩欧美一级A片| 美日韩一区二区| 亚洲成人无码在线观看| 91色色色| 嫩BBB搡BBB槡BBB小号| 精品一区二区ww| 欧美一级在线免费观看| 91西安站街老熟女露脸| 激情婷婷六月| 自拍一区在线观看| 成人做爰100片免费-百度| 樱桃av| 五月丁香五月婷婷| 久热精品在线观看| 午夜激情视频网站| 伊人久久中文字幕| 草逼国产| 狠狠躁18三区二区一区免费人| 男女操逼视频网站| 四川BBB嫩BBBB爽BBBB| 操屄在线观看| 91理论片| 一区二区三区四区| 成人18视频| 中文字幕无码一区二区三区一本久 | 久久黄色大片| 中日韩特黄A片免费视频| av超碰在线| 大香蕉大香蕉网| 精品视频999| 伊人大香蕉精品| 成人激情四射网| 国产香蕉视频在线播放| 日本成人一区二区三区| 特级西西人体www高清大胆| 黄色视频A片|