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

請收藏!運(yùn)維必會的 Kubernetes 指南

新聞 系統(tǒng)運(yùn)維
此文章適合沒有任何 Kubernetes/容器/Docker 經(jīng)驗(yàn)的同學(xué) — 在不久的將來,你不懂如何操作 Kubernetes 接口,就等于現(xiàn)在的你不懂最普通的 Linux 命令。

请收藏!运维必会的 Kubernetes 指南

此文章適合沒有任何 Kubernetes/容器/Docker 經(jīng)驗(yàn)的同學(xué) — 在不久的將來,你不懂如何操作 Kubernetes 接口,就等于現(xiàn)在的你不懂最普通的 Linux 命令。此文章閱讀耗時大概 15 分鐘。

螞蟻金服資源調(diào)度組致力于將 Kubernetes 落地到世界上最有價值的金融科技獨(dú)角獸公司,歡迎聯(lián)系作者微信 answer1991chen 咨詢招聘事宜。

文章 Markdown 源碼位于

https://github.com/answer1991/articles/blob/master/Kubernetes-is-the-next-generation-os.md ,遵從 Apache License 2.0 開源協(xié)議。

導(dǎo)言

此文章著重介紹如何在入門階段使用 Kubernetes,以及要面向 Kubernetes 編程帶來的優(yōu)勢,不會介紹復(fù)雜的 Kubernetes 架構(gòu)、實(shí)現(xiàn)。

因此此文章適合沒有任何 Kubernetes/容器/Docker 經(jīng)驗(yàn)的同學(xué),對 Kubernetes 有了解的同學(xué)也可以從此文章里面獲取一些靈感,可以更加酷炫的玩轉(zhuǎn) Kubernetes。

希望在閱讀完此文章之后,你可以從 “我需要一個 Linux VM 做開發(fā)、測試和部署”,變成 “我需要一個 Kubernetes 做開發(fā)、測試和部署”。

Kubernetes 是下一代操作系統(tǒng)

Kubernetes 是這幾年非常熱門的一個詞匯,大概所有的軟件工程師都已經(jīng)聽說過這個詞。

那么 Kubernetes 到底是什么呢?可能 Google 會告訴你很多,但是我想告訴你的是:

Kubernetes 是下一代操作系統(tǒng);一個 Kubernetes 集群是一個資源無限大(可擴(kuò)容)的虛擬機(jī)。

而且,Kubernetes 的接口是是聲明式的,是天然面向分布式系統(tǒng)而設(shè)計(jì)的(下面會詳細(xì)介紹)。

說到這里,大家估計(jì)立刻就有疑問了。我想大概是這些:

Q: 那么,Linux、Windows 要被淘汰了?

A: 不會被淘汰,只是 Linux、Windows 是一個底層的單機(jī)操作系統(tǒng)。而我們這些普通的應(yīng)用軟件工程師將來都不會跟 Linux 打交道了,都會使用 Kubernetes 這個更上層、同時功能也更強(qiáng)大的操作系統(tǒng)。

Q: 那么,我不學(xué) Kubernetes 可以嗎?

A: 不行!在未來不久的某一天,也許云廠商只賣 Kubernetes “虛擬機(jī)”了:阿里云不單獨(dú)賣 ecs 了,亞馬遜AWS,微軟云,Google 云等各種云廠商都不賣 Linux 虛擬機(jī)了。

如果你想買單機(jī)版的 Linux 虛擬機(jī),他們都會一臉驚訝的問你,你買那么底層的、功能那么薄弱的計(jì)算機(jī)干什么?就像你現(xiàn)在從云廠商那里買不到一個還沒有安裝 Linux 的虛擬機(jī)一樣。

以后,云廠商交付的 “虛擬機(jī)” 必定是 “集群級別的虛擬機(jī)” ,而 “集群級別的虛擬機(jī)” 的操作系統(tǒng)就是 Kubernetes。

在不久的將來,你不懂如何操作 Kubernetes 接口,就等于現(xiàn)在的你不懂最普通的 Linux 命令。

Q: 那這樣的話,我買不到 Linux 虛擬機(jī),我連學(xué)習(xí) Linux 的機(jī)會都沒有了?

A: 當(dāng)然不是,有了 Kubernetes,你可以在 1秒內(nèi)自己搞一個任何 Linux 發(fā)行版本的 “單機(jī)虛擬機(jī)” 出來。

Q: Kubernetes 真的是一個操作系統(tǒng)?Show me….

A:

请收藏!运维必会的 Kubernetes 指南

 

“一頓操作猛如虎” 聽起來很酷,但是你在做一些沒必要的事情,同時你做了這些事情并不討好你的老板,可能在因?yàn)槟愕氖д`操作引起更大的故障和問題。

 

面向 Kubernetes 做最簡單的操作,達(dá)到最佳的效果,才是更酷的事情。

A: 行了行了,別說那么多了,我還是需要一個 Linux VM。

Q: 好的,我給您一個 Kubernetes,然后給你一個 基礎(chǔ) OS Pod “菜單”文件,然后您自己就可以創(chuàng)建任何一個 Linux 發(fā)行版、任何一個 Linux 版本的的 Linux VM了。在文章的最后會有介紹。

小試牛刀

既然是“小試”,那么我們來嘗試一個最簡單的應(yīng)用,一個 HTTP 服務(wù):nignx。同時,我應(yīng)該部署一個高可用、多副本(例子中為3副本)天然容災(zāi)的 nginx。

部署完成的結(jié)構(gòu)圖大概如下所示:

请收藏!运维必会的 Kubernetes 指南

沒有 Kubernetes 之前的部署

在沒有 Kubernetes 之前,我們大概要做這么些操作才能交付這個 nginx 服務(wù):

  1. 到三個 Linux VM 上面,分別把三個 nginx 進(jìn)程起好。這里可能還需要關(guān)心 nginx 進(jìn)程怎么起、啟動命令是啥、配置怎么配。
  2. 到負(fù)載均衡管理頁面,申請一個負(fù)載均衡,把 3個 nignx 進(jìn)程的 IP 填入。拿回負(fù)載均衡的 IP。
  3. 到 DNS 管理頁面申請一個 DNS 記錄,寫入把拿到的負(fù)載均衡的 IP 寫入 A 記錄。
  4. 把這個 DNS 記錄作為這個 nginx 服務(wù)的交付成果,交付給用戶。

有了 Kubernetes 的部署

有了 Kubernetes 之后, 我們只需要寫一個 nginx 如何部署的 “菜單”,然后提交這個“菜單”給 Kubernetes,我們就完成了部署。

“菜單” 是一個 yaml 文件(例子中文件名 nginx.yaml),大概這個樣子:

  1. apiVersion: apps/v1 
  2.  
  3. kind: Deployment 
  4.  
  5. metadata: 
  6.  
  7. name: nginx 
  8.  
  9. spec: 
  10.  
  11. replicas: 3 
  12.  
  13. selector: 
  14.  
  15. matchLabels: 
  16.  
  17. app-name: my-nginx 
  18.  
  19. template: 
  20.  
  21. metadata: 
  22.  
  23. labels: 
  24.  
  25. app-name: my-nginx 
  26.  
  27. spec: 
  28.  
  29. containers: 
  30.  
  31. - name: nginx 
  32.  
  33. image: nginx 
  34.  
  35. --- 
  36.  
  37. apiVersion: v1 
  38.  
  39. kind: Service 
  40.  
  41. metadata: 
  42.  
  43. name: nginx 
  44.  
  45. spec: 
  46.  
  47. selector: 
  48.  
  49. app-name: my-nginx 
  50.  
  51. type: ClusterIP 
  52.  
  53. ports: 
  54.  
  55. - name: http 
  56.  
  57. port: 80 
  58.  
  59. protocol: TCP 
  60.  
  61. targetPort: 80 

提交“菜單”到 Kubernetes 集群:

  1. $ kubectl apply -f ./nginx.yaml 

訪問剛部署的 HTTP 服務(wù):

请收藏!运维必会的 Kubernetes 指南

發(fā)生了什么?這里大概簡單的介紹一下我們的“菜單”:

  1. 我們向 Kubernetes 提交了一個叫 nginx 的 Deployment。Deployment 是 Kubernetes 里的一種副本保持 “資源聲明”,我們在我們的 Deployment 聲明了 需要3個副本(replica: 3),副本的內(nèi)容(template: … )是用 nginx 鏡像啟動的Pod(Pod 即 Linux 里的進(jìn)程,如上章節(jié)介紹的)。如果沒有玩過 docker 的同學(xué),可以把 nginx 鏡像 認(rèn)為是 nginx 二進(jìn)制包,只不過它是 docker 鏡像方式存在的,不在這里詳細(xì)展開。我們的 nginx Pod 打上了 my-app=nginx 這樣的 Label, Label 可以理解成 分類“標(biāo)簽”,別人(Service)來定位我們 Pod 需要用這樣的 “標(biāo)簽” 來匹配。
  2. 我們還向 Kubernetes 提交了一個 Service。提交一個 Service 就是向 Kubernetes 申請一個 負(fù)載均衡。Service 依靠 Label (selector: …) 去找到它的后端真實(shí)進(jìn)程(Pod)。
  3. Service 會根據(jù)規(guī)則自動生成域名。規(guī)則不在這里詳細(xì)展開介紹。
  4. 我們就能用 Service 自動生成的域名作為交付成果,交付給用戶了!

容災(zāi)

Deployment 能自動副本保持,即我們的 nginx Pod 少了一個,Kubernetes 能自動幫我們補(bǔ)齊。

變更、發(fā)布、升級

如需要調(diào)整副本數(shù)目,我們只需要修改 Deployment.Spec.Replica 字段,再次 kubectl apply-f./nginx.yaml 即可,副本調(diào)整完成。

如果我們需要升級鏡像(nginx 二進(jìn)制版本),同樣的修改 PodSpec.Containers[*].Image 即可,然后 kubectl apply-f./nginx.yaml

Deployment 支持滾動升級,在升級時可以一個個升級你的 Pod(滾動升級)。

當(dāng)然,我們線上可能有更加復(fù)雜的升級策略,螞蟻金服提供的增強(qiáng)版 Kubernetes 提供比 Deployment 更加實(shí)用的升級策略,比如“灰度升級”, “分批升級” 等更加符合生產(chǎn)環(huán)境發(fā)布策略的升級方案。

關(guān)于“菜單” 和 聲明式系統(tǒng)

Kubernetes 是聲明式的系統(tǒng)。關(guān)于詳細(xì)的介紹 “什么是聲明式系統(tǒng)”,您可以去 Google 或者內(nèi)網(wǎng)上面也有許多聲明式系統(tǒng)的介紹。

我這邊有個簡單的比喻:假如你需要一桌菜(至于為什么是“菜”,是因?yàn)檫@個文章是我在做飯的時候構(gòu)思的)。

但是,這個放菜的 “桌子” 不太穩(wěn)定(或者說有老鼠來偷吃菜品),一直發(fā)生一些事故,就像我們的線上部署應(yīng)用的環(huán)境一樣,服務(wù)器可能故障。當(dāng)你需要在這個桌子上面擺上一桌 “菜” 的時候,“菜”可能會壞掉。

別擔(dān)心,在聲明式系統(tǒng)里,“廚師長”是個盡職的好同志,當(dāng)你提交了一份“菜單”之后,我們的“廚師長”會一直保證你桌子上的菜一直會和你寫的“菜單”里的菜一模一樣。

如果某道“菜”壞了,“廚師長”就幫你再做一份。

在 Kubernetes 里面,有各種各樣這樣盡職的廚師長(有負(fù)責(zé) Deployment 的廚師長,有負(fù)責(zé) Service 的廚師長等等)。只要天沒塌下來,你提交的“菜單”里的菜都會一直美美的在桌子上“迎客”。

那么,我們回過頭來看我說的 “不久的某一天,云廠商只賣 Kubernetes 虛擬機(jī)了,而不單純的賣 Linux VM”。

你真的要買幾個 Linux VM 自己去啟動進(jìn)程(命令式),然后自己去搭建一套聲明式的系統(tǒng)去守護(hù)你的落在各個機(jī)器上的分布式應(yīng)用進(jìn)程?而不使用更高級、更好用的 Kubernetes 操作系統(tǒng)?

談軟件交付

軟件交付即把我們開發(fā)的一套應(yīng)用程序部署到其它環(huán)境。

軟件交付幾個重要關(guān)注的點(diǎn):

  1. 如何快速的部署一套我們的 “全家桶” 應(yīng)用到客戶環(huán)境。為什么說“全家桶”,是因?yàn)槲覀儾豢赡苤唤桓兑粋€ nginx 服務(wù),我們肯定會交付一套非常復(fù)雜的應(yīng)用或者中間件系統(tǒng),比如交付一套 “支付寶系統(tǒng)” 到某個商業(yè)銀行。
  2. 如何在客戶現(xiàn)場做自動化容災(zāi),降低駐場和支持成本,或者根本不駐場。
  3. 如何簡單、可靠地升級后續(xù)的版本。
  4. 上述的幾點(diǎn),不管是 “部署”,“容災(zāi)”,“升級” 都需要關(guān)注客戶現(xiàn)場的運(yùn)行環(huán)境,我們有沒有辦法屏蔽這種運(yùn)行環(huán)境差異。比如:我們帶過去的可運(yùn)行軟件,在客戶的 OS 上是不是能運(yùn)行;客戶現(xiàn)場的負(fù)載均衡方案都不一樣,如果到了客戶現(xiàn)場查看了他們的負(fù)載均衡方案之后再寫一個負(fù)責(zé)均衡部署方案肯定大大降低了交付效率。
  5. 客戶現(xiàn)場的環(huán)境不一樣,必定帶來配置文件不一樣。讓一個現(xiàn)場交付人員弄懂所有應(yīng)用的配置參數(shù),是不是一件讓他很頭疼的事情?

軟件交付方案的歷史:

  1. 交付 源代碼:這應(yīng)該是最早的時代,客戶現(xiàn)場的環(huán)境(操作系統(tǒng)、機(jī)型)都不同,需要帶著代碼到客戶現(xiàn)場編譯,然后運(yùn)行軟件。
  2. 交付 可運(yùn)行文件:像 Java 提出的 “Build once, run everywhere” 概念,在這個時代,我們可以面向一個運(yùn)行時虛擬機(jī)交付軟件。或者我們都面向 Linux 交付,我們的使用 Go 編譯的二進(jìn)制,能順利的部署到大多數(shù)的 Linux OS 上。但是這種方案也強(qiáng)依賴客戶現(xiàn)場需要裝上指定版本的 Java 虛擬機(jī),或者 Linux 特定的版本(應(yīng)用依賴 Linux 內(nèi)核特性)。
  3. 交付 鏡像:交付鏡像,最大可能的屏蔽了底層 OS, Java 虛擬機(jī)的差異。在鏡像里面,我們把自己需要的 OS 基礎(chǔ) 和 Java 虛擬機(jī)也裝上了。不再依賴客戶現(xiàn)場的 OS 和 Java 虛擬機(jī)版本了。

鏡像最大可能的程度上把我們需要的運(yùn)行時環(huán)境和我們的應(yīng)用可執(zhí)行文件打在一起,在各種環(huán)境下面都能完美地運(yùn)行。那么,只有鏡像就能快樂的交付軟件了嗎?在我眼里,鏡像做的事情完全不夠。原因無非也是這么些:

  1. 怎么配置啟動參數(shù),要交付人員辛苦的讀懂啟動參數(shù)配置說明說嗎?
  2. 怎么做分布式應(yīng)用的組網(wǎng)、服務(wù)發(fā)現(xiàn)
  3. 怎么做容災(zāi)
  4. 怎么做部署的元數(shù)據(jù)錄入:今天我在客戶現(xiàn)場把 A 應(yīng)用部署到了 節(jié)點(diǎn)1 上面,我要把這個信息記在哪兒?

你可能會告訴我,你說的這些我們的 PaaS 系統(tǒng)都能搞定。是的,你說的沒錯!但是當(dāng) PaaS 能用統(tǒng)一標(biāo)準(zhǔn)管理應(yīng)用、屏蔽應(yīng)用的細(xì)節(jié),解決應(yīng)用的組網(wǎng)和服務(wù)發(fā)現(xiàn),監(jiān)聽每個應(yīng)用的實(shí)例變化(自動化感知故障發(fā)生)然后自動恢復(fù)(副本保持),那么它就已經(jīng)差不多是 Kubernetes 了。

把上述的所有功能邏輯都整合在 PaaS,勢必導(dǎo)致 PaaS 的臃腫,我們是不是可以面向 Kubernetes 這個 OS 去做一個輕量級的 PaaS?因?yàn)楹芏喙δ茉?Kubernetes 已經(jīng)有了,而且肯定比我們自己研發(fā)的 PaaS 要好用許多。

我們的 PaaS 是不是可以向 Kubernetes 提交 Deployment,而不是自己親自去做進(jìn)程拉起、副本健康檢查、副本保持等功能。

面向 Kubernetes 交付軟件

正如我上文所說,可能有一天所有客戶現(xiàn)場的 OS 都是 Kubernetes,那我們是不是可以像上文啟動 nginx 服務(wù)一樣,用這種 YAML “聲明” 的方式去交付我們的軟件?

當(dāng)然可以!但是,當(dāng)我們?nèi)ソ桓兑粋€ “全家桶” 服務(wù)的時候,我們會發(fā)現(xiàn)我們的 YAML 寫了幾千行,甚至上萬行了。

這個上萬行的 YAML 誰來維護(hù)?就算是分開給各個子應(yīng)用的 owner 維護(hù),是不是也可能會發(fā)生牽一發(fā)而動全身。有沒有更加簡單的方式?

當(dāng)然有。我們再回來談 “菜單” 和做菜。我是一個吃貨,但是我很懶。當(dāng)我點(diǎn)菜的時候,非常希望點(diǎn)一個 “套餐”,而不希望一個個的去點(diǎn)每個菜,更不希望弄懂菜是怎么做出來的。

我想要點(diǎn)一個 “滿漢全席”(復(fù)雜的應(yīng)用),可我不想清楚的弄懂套餐里面單獨(dú)有什么菜、每個菜的配方是什么。一個“滿漢全席”(復(fù)雜的應(yīng)用)里面,可能有“山珍”(數(shù)據(jù)庫)和“海味”(Web服務(wù))。

我只想告訴我們的“大廚”, 我要 “滿漢全席” ,然后我們的 “大廚” 就心領(lǐng)神會的知道 “滿漢全席” 里面有什么,然后把 “滿漢全席” 給做出來。

那么這個 “大廚” 要親自做這里的每道菜嗎?也不必,因?yàn)槲覀兊?“大廚” 也可能是個 “懶人”,當(dāng)需要一桌 “滿漢全席” 的時候,他只會告訴負(fù)責(zé) “山珍” 的 “大廚” ,要一桌 “山珍”(數(shù)據(jù)庫),然后告訴負(fù)責(zé) “海味” 的 “大廚”,要一桌 “海味”(Web服務(wù))。

當(dāng)我們的大廚發(fā)現(xiàn) “山珍“ 和 “海味” 都準(zhǔn)備好的時候,他會告我 “滿漢全席” 準(zhǔn)備好了。

是不是發(fā)現(xiàn)和交付軟件很像?為什么我們不交付一個 “大廚” 出去?到客戶現(xiàn)場負(fù)責(zé)交付的人員,只要告訴 “大廚” 我們需要一個 “滿漢全席” 這種套餐級別的聲明就行了。

并不是說套餐沒有參數(shù),只是套餐的參數(shù)能做到對用戶屏蔽不必要的細(xì)節(jié):比如我們的 “滿漢全席” 就只要一個參數(shù),只要讓用戶填他的 “滿漢全席” 需要支持 “多少Q(mào)PS”。

面向 Kubernetes 編程:使用 Operator 交付軟件

上面提到的使用“交付大廚”的方式去交付軟件看起來很美好。那么,如何實(shí)現(xiàn)呢?也就是我們要怎么培養(yǎng)出屬于我們自己的“廚師”。

其實(shí)我們在 “小試牛刀” 的章節(jié)已經(jīng)介紹了一位 “廚師” 了:負(fù)責(zé) “Deployment” 的廚師。只是,他的工作比較通用化、沒有什么業(yè)務(wù)含義。

它只是負(fù)責(zé)守護(hù)用戶在 “菜單” 里面描述的 “進(jìn)程”(Pod) 數(shù)量,至于怎么起 “進(jìn)程” 都是用戶傳入的。

那么,我們是不是可以根據(jù)這個 “廚師” 的模仿出有業(yè)務(wù)含義的 “廚師”?比如,業(yè)界有一位比較出名的一個 “廚師”,是負(fù)責(zé) etcd 集群的。

如果我需要一個副本數(shù)是3的 etcd 集群,只要向 Kubernetes 提交如下的一個 “菜單”:

  1. apiVersion: "etcd.database.coreos.com/v1beta2" 
  2.  
  3. kind: "EtcdCluster" 
  4.  
  5. metadata: 
  6.  
  7. name: "example-etcd-cluster" 
  8.  
  9. spec: 
  10.  
  11. size: 3 

“etcd廚師長” 就會根據(jù)這個 “菜單” 做出一個副本數(shù)是3(Spec.Size=3)的 etcd 集群給你。用戶不需要知道 3 副本的 etcd 集群里每個副本參數(shù)是什么樣的。

“etcd廚師長” 真實(shí)的名字叫 etcd-operator。顧名思義,operator 就是“廚師長”,“xxx-operator”就是 “xxx應(yīng)用-廚師長”。

在不久的將來,我覺得我們也會有 “xx-db-operator”,“xx-web-operator”,我們也用這種簡潔明了的聲明方式,快速得到一個 db 實(shí)例, 或者一個 “xx-web” 應(yīng)用。

回到怎么培養(yǎng)廚師長的話題,首先我們來介紹一下名詞:

1. CRD (CustomResourceDefinitions):定義“滿漢全席”這樣的全家桶。Deployment 是 Kubernetes 官方的資源定義,Kubernetes 同時向開發(fā)者提供了 “自定義資源定義”。開發(fā)者可以向 Kubernetes 集群提交有 “滿漢全席” 的定義,那么當(dāng)用戶提交一桌 “滿漢全席” 時,Kubernetes 就明白用戶的請求了,也就是說 Kubernetes 知道用戶所說的 “滿漢全席” 是什么了。

2. CR (Custom Resources):一個 CRD 實(shí)例,即一桌 “滿漢全席”,也就是類似上文一樣的 YAML 聲明。

3. Custom Controller:我們的“廚師長”。當(dāng) Controller 發(fā)現(xiàn)用戶提交了 一桌 “滿漢全席”,那么他就開始做菜了。當(dāng)然它并不是完全親自做每道菜,正如我上文所說。我們的 “廚師長” 可以依賴另一位 “廚師長”,比如 “db 廚師長” 可以依賴 “Deployment 廚師長”,當(dāng)用戶需要一個 db 實(shí)例的時候,“db 廚師長” 只需要負(fù)責(zé)再向 Kubernetes 提交一個 Deployment 聲明即可。

注意:“廚師長” 之間的交互也是靠 “CR” 或者 Kubernetes 官方定義的資源(如 Deployment、Pod)。“廚師長” 一般也是通過 Deployment 的方式部署在 Kubernetes 集群內(nèi)(保證了 “廚師長” 自身的穩(wěn)定性),除非像 “Deployment 廚師長” 這種 Kubernetes 核心 “廚師長”的穩(wěn)定性 由 Kubernetes 服務(wù)提供商保證。

4. Operator: Kubernetes 里的 Operator,即 CRD + Custom Controller。

一個簡單的圖將它們串起來:

请收藏!运维必会的 Kubernetes 指南

上圖展示了我們的 My-App-Operator 的 “廚師長” 的關(guān)系圖。當(dāng)我們需要一個 “my-app” 應(yīng)用實(shí)例時,我們只要告訴我們的 “廚師長” 是需要多少副本數(shù)的實(shí)例。

我們的 “廚師長” 自動將需求轉(zhuǎn)化成 Deployment,其它的功能就完全依靠了 “Deployment 廚師長”。

如何面向 Kubernetes 寫一個 Operator

首先我們來看一下 “廚師長” (Operator) 需要關(guān)注一些什么事情,以及它做了什么事情:

  1. 多久要開始做菜(Observe):即 “廚師長” (Operator/Controller) 需要知道多久他要開始工作了。當(dāng)用戶提交了 “菜單”(CR),“廚師長” 要開始做菜。或者,因?yàn)?“桌子” 上少了一個預(yù)期中的 “菜”(Pod 因?yàn)楣收仙倭艘粋€),“廚師長” 也要開始做菜了。
  2. 做什么菜(Analyze):“廚師長” 首先要看看桌子上的菜,再對比一下用戶的 “菜單”,得出還缺少什么菜,那么就做什么菜。
  3. 開始做菜(Action):得出做什么菜之后,那么后面的事情就簡單了。通知其他 “廚師長” 做菜(提交一個其他的CR),或者自己親手做個菜(提交一個 Pod)。

這 3 件事情,其實(shí)就是 Controller 模式的核心三件事:

请收藏!运维必会的 Kubernetes 指南

那么用 Kubernetes 寫一個 Operator 需要多久?

可能從 “0” 到可以把 Operator 運(yùn)行起來只需要 10分鐘吧。因?yàn)?Kubernetes 的 Kube-Apiserver 提供天然的 watch 接口,我們可以去關(guān)注我們在意的資源(我們的 CR,我們的 Pod 等),這樣我們的 “廚師” 就能很自然的得到通知該干活了。

然后 “廚師” 就開始做出分析,到最后再向 Kube-Apiserver 提交我們想要的資源(Deployment,或者其它的 CR)。

我們都面向 Kube-Apiserver 做編程, 所有的“廚師”都 向 Kube-Apiserver 提交、修改、Watch資源作為統(tǒng)一的交互協(xié)議,一切都會變得簡單許多。

最后,再加上 Operator 的腳手架幫我們生成基礎(chǔ)代碼(初始化 Kubernetes 客戶端,建立 Watch 等),我們開發(fā)者只需要關(guān)心的怎么 Analyze 和 Action 即可。Operator 的腳手架社區(qū)常見的有 kube-builder 和 coreos 提供的 operator-framework 等。

我們用偽代碼來寫一下上文畫的 My-App-Operator 核心邏輯 (其它都腳手架做好了,甚至如何 build,Operator 本身它自己如何部署的“菜單” YAML 都是腳手架生成好了):

  1. // Reconcile 即我們 Operator 核心代碼邏輯 
  2.  
  3. // Reconcile 何時觸發(fā),也是 Operator 生成好了 
  4.  
  5. func Reconcile(crName string) error { 
  6.  
  7. // 獲取 CR (用戶提交的“菜單”) 
  8.  
  9. cr := client.getCR(crName) 
  10.  
  11. // 計(jì)算出這個 CR 期望的 Deployment (用戶提交的“菜單”應(yīng)該在桌子上有什么菜) 
  12.  
  13. desireDeployment := getDesireDeployment(client, cr) 
  14.  
  15. // 目前集群里面實(shí)際的 Deployment (實(shí)際上桌子上有什么菜) 
  16.  
  17. deployment := client.GetDeployment(crName) 
  18.  
  19. // 如果期望和實(shí)際的不太一樣,把實(shí)際的更新一下就行了。if diff(desireDeployment, deployment) { 
  20.  
  21. return client.UpdateDeployment(desireDeployment); 
  22.  
  23.  
  24. // 如果期望和實(shí)際都一樣,什么事情都不做了。return nil 
  25.  

面向 Kubernetes 變成 和 Operator 的優(yōu)勢總結(jié)

  1. 統(tǒng)一的信息獲取源和統(tǒng)一的接口:Kube-Apiserver 就像是一個大的信息流轉(zhuǎn)中心。所有的組件(“廚師長”)都通過這個中心上傳他負(fù)責(zé)的資源(CR,Deployment,Pod都是 Kubernetes 的資源)的信息,同時,他也通過這個接口,去感知其它資源狀態(tài)的變化,如果這些變化是他感興趣的,那么他就開始工作(“廚師長” 開始工作)。
  2. 構(gòu)建在 Kubernetes 核心組件以及 社區(qū)通用的 Operator 之上:站在巨人的肩膀上能讓我們的工作更加的減負(fù)同時達(dá)到更加理想的效果。

上文中,我們的 Operator 可能在依賴 Deployment 之后,他負(fù)責(zé)的 “菜”(Pod)就自帶副本保持功能。同時,假如我們的應(yīng)用(DB,Web)要依賴社區(qū)的 MySQL 數(shù)據(jù)庫,那么我們的應(yīng)用 Operator(Web + DB) 可以通過社區(qū)的 MySQL-Operator 提供的 CR 快速建出 MySQL 實(shí)例,然后再使用 Deployment 建出 Web。

優(yōu)秀的社區(qū) Operator

優(yōu)秀的社區(qū) Operator (awesome-operators): 

https://github.com/operator-framework/awesome-operators

FaaS

用 Operator 交付軟件,目前看起來是最酷的一種交付軟件方式。

但是在當(dāng)今云原生技術(shù)快速發(fā)展的時代,可能在不久的將來,Operator 模式可能也會被淘汰。因?yàn)?Operator 也需要開發(fā)者關(guān)注一些部署的細(xì)節(jié),讓開發(fā)者真正只關(guān)注在自己的業(yè)務(wù)邏輯,“業(yè)務(wù)代碼” 變成 “服務(wù)” 完全對開發(fā)者透明,可能需要比 Kubernetes 更上層的框架 - FaaS框架。

FaaS 全稱是 Function as a service 。用戶只要寫自己的業(yè)務(wù)函數(shù),向 Kubernetes 提交業(yè)務(wù)函數(shù),F(xiàn)aaS 框架將業(yè)務(wù)函數(shù)變成 Deployment,變成 Pod,變成 Service。但是 FaaS 目前還在發(fā)展階段,并不像 Kubernetes 已經(jīng)變成事實(shí)標(biāo)準(zhǔn),這里不再詳細(xì)討論。

落地

說了那么多,其實(shí)我的初衷是希望每個開發(fā)者都從 Linux VM 轉(zhuǎn)向 Kubernetes “VM”。但是轉(zhuǎn)變發(fā)生在每個人身上,應(yīng)該是有各種困難。我能想到的一些最基本的困難大概列在下面,同時歡迎跟我交流你的一些困惑。

代碼變成鏡像

大家都知道,Kubernetes 只允許以 Pod 的方式運(yùn)行“進(jìn)程”。在 FaaS 沒成熟之前,如何把我們的代碼變成一個鏡像是一個比較頭疼的事情。可能應(yīng)用的開發(fā)同學(xué)并不想自己去理解 docker,怎么去打鏡像。

別擔(dān)心!Spring 框架或者其擴(kuò)展的腳手架應(yīng)該已經(jīng)可以在工程里自動添加 Dockerfile 文件,使用腳手架之后,用戶只要執(zhí)行 make image 這樣的命令,就能構(gòu)建出鏡像了。

別說了,我還是想要一個 Linux VM

向 Kubernetes 提交下面這樣的一個 YAML 文件,你就能得到一個 ubuntu VM:

  1. apiVersion: v1 
  2.  
  3. kind: Pod 
  4.  
  5. metadata: 
  6.  
  7. name: my-vm-1 
  8.  
  9. spec: 
  10.  
  11. containers: 
  12.  
  13. - name: vm 
  14.  
  15. image: ubuntu 

同時,告訴你一個更酷炫的玩法:自己定制一個屬于你自己的 Linux 發(fā)行版!在原有的 OS 鏡像基礎(chǔ)上,加上你的 Shell 工具腳本、寫一串向愛人表白的話、搞個開機(jī) Logo,都很簡單!

做一個屬于你自己的 Linux 鏡像,那么在世界的任何地方,你都能起動一個經(jīng)過你定制的 Linux VM。

 

責(zé)任編輯:張燕妮 來源: 高效運(yùn)維
相關(guān)推薦

2020-07-02 09:55:32

運(yùn)維架構(gòu)技術(shù)

2022-03-28 11:27:17

Kubernetes運(yùn)維服務(wù)發(fā)現(xiàn)

2022-07-27 11:10:27

Kubectl命令運(yùn)維

2022-05-31 10:30:23

KubernetesCalico運(yùn)維

2022-02-08 10:21:17

運(yùn)維應(yīng)用監(jiān)控

2020-11-18 11:14:27

運(yùn)維架構(gòu)技術(shù)

2023-09-03 22:55:37

Linux命令

2012-06-13 10:39:43

2020-10-30 08:34:58

Kubernetes運(yùn)維技巧

2020-04-21 10:11:12

運(yùn)維體系趨勢

2024-07-25 11:22:23

2018-12-28 09:11:28

運(yùn)維監(jiān)控開源

2018-10-09 10:15:32

2015-08-27 09:35:29

OpenStack運(yùn)維指南VLAN

2015-08-10 10:56:59

運(yùn)維互聯(lián)網(wǎng)

2018-04-18 08:36:48

Linux命令運(yùn)維

2023-11-02 10:24:30

KubectlKubernetes

2020-06-03 15:25:27

運(yùn)維架構(gòu)技術(shù)

2020-06-09 08:10:20

Kubernetes運(yùn)維容器

2018-11-15 09:08:34

運(yùn)維架構(gòu)技術(shù)
點(diǎn)贊
收藏

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

久久精品久久国产| 天堂一区在线观看| 青青青草原在线| 蜜桃av一区二区| 色中色综合影院手机版在线观看| 亚洲精品第二页| 成人亚洲免费| 亚洲成人综合网站| 亚洲制服欧美久久| 黄色av网址在线| 日韩高清不卡在线| 欧美极品美女电影一区| 日韩一级av毛片| 中文字幕av一区二区三区四区| 日本高清不卡在线观看| 欧美a级免费视频| 国产天堂在线| 成人国产精品免费观看视频| 国产欧美日韩中文字幕在线| 日本少妇裸体做爰| 亚洲女同一区| 亚洲人成网站在线播| 中文字幕在线观看视频www| 黄色一区二区视频| 97精品在线| 精品视频在线播放免| 永久av免费在线观看| 日韩大尺度黄色| 亚洲福利视频三区| 特大黑人娇小亚洲女mp4| 成人18在线| 91首页免费视频| 成人av播放| 一级特黄色大片| 蜜桃av一区| 91高清视频在线免费观看| 色欲人妻综合网| 日韩综合一区| 中日韩美女免费视频网站在线观看 | 欧美午夜视频在线观看| 激情五月六月婷婷| 永久免费网站在线| 亚洲视频狠狠干| 一本久久a久久精品vr综合 | 91视频观看免费| 国产一区二区在线观看免费播放 | 亚洲精品理论电影| 在线xxxxx| 精品自拍偷拍| 亚洲国产成人av在线| 你懂的在线观看网站| 成人免费直播在线| 精品国产成人系列| 性欧美18—19sex性高清| www.成人网| 精品成人a区在线观看| 亚洲美女高潮久久久| 中文在线免费一区三区| 亚洲高清福利视频| 亚洲蜜桃精久久久久久久久久久久| 国产精品chinese在线观看| 精品欧美一区二区在线观看| 不许穿内裤随时挨c调教h苏绵| 国产 日韩 欧美| 日韩精品影音先锋| 中国黄色片视频| 亚洲色图丝袜| 国产亚洲成av人片在线观看桃| xxxx日本黄色| 五月开心六月丁香综合色啪| 九九久久久久久久久激情| 国产精品18p| 国产精品美女| 国产精品中文字幕久久久| 国产又粗又猛又爽| 成人高清视频免费观看| 久久综合伊人77777麻豆| 国产美女性感在线观看懂色av| 国产欧美一区视频| 日韩人妻精品一区二区三区| 欧美aaa免费| 91搞黄在线观看| 亚洲高清视频免费| 日本欧美高清| 日韩在线视频观看| 国产无码精品在线播放| 日韩高清中文字幕一区| 亚洲最大福利视频网| 亚洲区小说区图片区| 国产精品的网站| 给我免费播放片在线观看| 欧美成a人片在线观看久| 制服丝袜亚洲色图| 黄色性生活一级片| 青青草国产成人a∨下载安卓| 久久亚洲国产精品| 国产美女激情视频| 国产精品1区2区3区| 欧美综合77777色婷婷| 超碰在线免费播放| 色女孩综合影院| 美女流白浆视频| 日本不卡免费一区| 国外成人性视频| 7777久久亚洲中文字幕| 91一区在线观看| 成人av在线播放观看| 亚洲天堂1区| 亚洲激情在线视频| 日韩影院一区二区| 爽好久久久欧美精品| 国产精品中出一区二区三区| 最新97超碰在线| 欧美日韩一区二区免费在线观看| 一起草最新网址| 欧美好骚综合网| 国产精品av网站| 日韩三级电影网| 亚洲国产你懂的| 午夜福利123| 日韩欧美视频| 国产精品电影网站| 天堂av在线7| 亚洲aaa精品| 91成人在线观看喷潮蘑菇| 羞羞答答成人影院www| 国产成人精品一区二区三区| 手机看片福利在线| 亚洲在线中文字幕| 久久无码人妻一区二区三区| 天天久久综合| 国产精品亚洲自拍| 福利视频在线播放| 色婷婷精品久久二区二区蜜臂av| 国产又粗又长又爽| 亚洲三级视频| 国产九色精品| 9999在线视频| 亚洲黄色av女优在线观看| 久久免费在线观看视频| 国产精品小仙女| 国产91porn| 日韩免费一级| 欧美成人免费网| 性生活视频软件| 亚洲综合另类小说| 亚洲婷婷在线观看| 亚洲精品婷婷| 久久大片网站| 周于希免费高清在线观看| 亚洲福利精品在线| 影音先锋在线国产| 国产亚洲欧美日韩俺去了| 青青草av网站| 久久精品国产68国产精品亚洲| 国产精品99一区| 日本免费在线观看| 日韩一区二区免费在线电影| 久久免费小视频| 91在线视频网址| 黄色免费网址大全| 日韩欧美视频在线播放| 亚洲综合色av| 国产伦理精品| 国产一区二区动漫| 亚洲天堂久久久久| 亚洲黄色av一区| 日韩Av无码精品| 视频一区二区不卡| 永久免费精品视频网站| 清纯唯美激情亚洲| 97热在线精品视频在线观看| 国产专区在线| 欧美精品黑人性xxxx| 免费中文字幕在线观看| 99久久婷婷国产综合精品电影| 日韩a在线播放| 久久密一区二区三区| 成人激情直播| 亚洲第一影院| 粗暴蹂躏中文一区二区三区| 免费观看黄一级视频| 日本精品视频一区二区三区| 三级av在线免费观看| 成人avav影音| 成人亚洲精品777777大片| 欧美日韩亚洲一区二区三区在线| 久久精品五月婷婷| 3d动漫一区二区三区在线观看| 久久久久久久影院| yw193.com尤物在线| 日韩精品一区二区三区在线播放| 国产一区二区99| 日韩一区欧美一区| 变态另类丨国产精品| 麻豆成人av在线| 男女激情无遮挡| 我不卡手机影院| 欧美精品人人做人人爱视频| 精品一区二区三区中文字幕在线| 91精品国产九九九久久久亚洲| 免费高清在线观看| 亚洲美女精品久久| www.欧美国产| 欧美日韩在线精品一区二区三区激情| 日本熟妇毛耸耸xxxxxx| 国产精品日韩成人| 成人免费av片| 高清成人免费视频| 欧美三级理论片| 亚久久调教视频| av网站手机在线观看| 久久免费大视频| 免费成人在线观看av| 亚洲国产一区二区三区网站| 国产精品第3页| 欧美电影免费看| 欧美夫妻性视频| 九七电影韩国女主播在线观看| 亚洲人高潮女人毛茸茸| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 欧美日韩成人在线一区| 乱子伦一区二区三区| 精品久久久免费| 久久久久性色av无码一区二区| 亚洲欧洲无码一区二区三区| 丁香激情五月少妇| 国产农村妇女毛片精品久久麻豆 | 国产一区二区在线视频观看| 在线观看三级视频欧美| 国产免费av一区| 欧美日韩亚洲一区二| 欧美一区二区三区四| 亚洲风情在线资源站| 黄网站免费在线| 亚洲五码中文字幕| 国产一级一级片| 亚洲成a人v欧美综合天堂下载 | 欧美日本高清| xxxxxxxxx欧美| 永久免费av在线| 色婷婷**av毛片一区| 99re在线视频| 精品国产美女在线| 麻豆网站在线免费观看| 久久久国产影院| 永久免费网站在线| 色综合天天狠天天透天天伊人| 性爱视频在线播放| 欧美日本高清一区| 国产福利在线免费观看| 久久久人成影片一区二区三区观看 | 99精品国产一区二区三区2021 | 精品国精品国产自在久国产应用 | 中国免费黄色片| 99久久伊人久久99| 国产免费一区二区三区网站免费| 久久精品在线观看| 天堂av网手机版| 亚洲精品日日夜夜| 国产成人精品亚洲男人的天堂| 五月天欧美精品| 免费黄色一级大片| 91精品国产91久久综合桃花| 黑人乱码一区二区三区av| 国产丝袜一区二区| 91在线看片| 欧美裸体xxxx极品少妇| 国产99在线观看| 国产精品美女免费视频| 国产一区精品二区| 精品日产一区2区三区黄免费| 国产99久久| 一本二本三本亚洲码 | 亚洲欧洲在线观看av| 久久黄色小视频| 一道本成人在线| 国产伦一区二区| 日韩电影免费观看在线观看| av片在线免费观看| 欧美黄色小视频| 欧美电影免费观看网站| 2019国产精品视频| 天天躁日日躁狠狠躁欧美巨大小说 | 国产亚洲第一伦理第一区| 中文字幕制服丝袜在线| 亚洲国产国产亚洲一二三| 国产成人精品无码播放| 国产福利一区在线观看| 偷拍女澡堂一区二区三区| 日韩理论片在线| 国产熟妇一区二区三区四区| 欧美一区二区在线播放| 欧美婷婷久久五月精品三区| 北条麻妃一区二区三区中文字幕| 9999热视频在线观看| 国产日本欧美一区二区三区| 久久1电影院| 中文字幕日韩一区二区三区| 国产欧美大片| 无码人妻少妇色欲av一区二区| 久久伊99综合婷婷久久伊| 欧美色图亚洲视频| 欧美亚洲高清一区二区三区不卡| 欧美在线 | 亚洲| 久久深夜福利免费观看| 3d欧美精品动漫xxxx无尽| 成人午夜电影免费在线观看| 久久国产成人精品| 日本在线观看a| aaa欧美色吧激情视频| 丝袜美腿小色网| 欧美日韩免费不卡视频一区二区三区| 天天综合在线视频| 欧美理论电影在线播放| 成人做爰视频www| 蜜桃视频在线观看成人| 最新亚洲视频| 性折磨bdsm欧美激情另类| 亚洲欧美影音先锋| 怡红院成永久免费人全部视频| 国产婷婷色综合av蜜臀av| 超免费在线视频| 成人资源av| 国产精品啊v在线| 亚洲热在线视频| 亚洲视频狠狠干| 国产精品久久久久久久久久久久久久久久久久 | 欧美一级视频精品观看| 久久日韩视频| 国产原创欧美精品| 日韩一区自拍| 亚洲高清免费在线观看| 国产精品国产成人国产三级| 最新中文字幕在线观看视频| 亚洲天堂视频在线观看| 日产精品一区| 日韩色妇久久av| 日本午夜精品一区二区三区电影| 亚洲精品国产一区黑色丝袜 | 欧美激情手机在线视频 | 日韩欧美的一区| 欧美大胆的人体xxxx| 国产精品v欧美精品∨日韩| 欧美全黄视频| 日本精品一二三| 亚洲成av人**亚洲成av**| 老司机午夜福利视频| 国内精品久久久久久中文字幕| 国产伦精品一区二区三区在线播放| h无码动漫在线观看| 成人不卡免费av| 欧美亚洲精品天堂| 国产小视频91| 亚洲精品三区| 成人在线视频一区二区三区| 成人免费视频免费观看| 狠狠躁夜夜躁人人爽天天高潮| 精品香蕉一区二区三区| 国产综合av| www.黄色网址.com| 成人天堂资源www在线| 国产情侣自拍av| 在线观看欧美www| 欧美日韩中出| 波多野结衣家庭教师在线| 久久精品视频在线看| 91福利在线观看视频| 欧美丰满片xxx777| 日韩高清影视在线观看| 国产精品亚洲二区在线观看| 国产精品护士白丝一区av| 午夜免费福利视频| 国产69久久精品成人| 欧美成人自拍| 国产免费一区二区三区最新6| 色老综合老女人久久久| 免费a级在线播放| 精品国产日本| 看电视剧不卡顿的网站| 久久久久久蜜桃| 一区二区亚洲精品国产| 深夜福利一区二区三区| 日本熟妇人妻xxxxx| 亚洲色图19p| 九色国产在线观看| 97人人澡人人爽| 日韩国产一区二| 国产一级aa大片毛片| 在线观看亚洲视频| 精品国产影院| 性生生活大片免费看视频| 亚洲国产精品久久人人爱 | 国产精品狼人久久影院观看方式| 超碰在线观看av| 国产精品久久久一区| 亚洲黄色影片| 182在线观看视频| 亚洲欧美日韩精品久久亚洲区 | 欧美三级免费看|