日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

企业应用快速跨向容器时代的正确姿势

發布時間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 企业应用快速跨向容器时代的正确姿势 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

戳藍字“CSDN云計算”關注我們哦!


編者按:1月18日,網易云首席解決方案架構師劉超在微信群帶來了主題為“企業應用快速跨向容器時代的正確姿勢”的線上講座,順接上個月“云計算的前世今生”,為大家進一步詳細解讀了容器的誕生、容器的管理、以及容器如何對應用打包等問題。

?

劉超︱網易云首席解決方案架構師


云計算的發展脈絡


云計算整個發展過程,用一句話來形容,就是“分久必合,合久必分”。

容器的誕生


云計算解決了基礎資源層的彈性伸縮,卻沒有解決 PaaS層應用隨基礎資源層彈性伸縮而帶來的批量、快速部署問題。于是容器應運而生。


容器是 Container,Container另一個意思是集裝箱,其實容器的思想就是要變成軟件交付的集裝箱。集裝箱的特點,一是打包,二是標準。

在沒有集裝箱的時代,假設將貨物從 A運到 B,中間要經過三個碼頭、換三次船。每次都要將貨物卸下船來,擺的七零八落,然后搬上船重新整齊擺好。因此在沒有集裝箱的時候,每次換船,船員們都要在岸上待幾天才能走。

有了集裝箱以后,所有的貨物都打包在一起了,并且集裝箱的尺寸全部一致,所以每次換船的時候,一個箱子整體搬過去就行了,小時級別就能完成,船員再也不用上岸長時間耽擱了。

?

這是集裝箱“打包”、“標準”兩大特點在生活中的應用。下面用一個簡單的案例來看看容器在開發部署中的實際應用。


假設有一個簡單的 Java網站需要上線,代碼的運行環境如下:

看,一個簡單的 Java網站,就有這么多零零散散的東西!這就像很多零碎的貨物,如果不打包,就需要在開發、測試、生產的每個環境上重新查看以保證環境的一致,有時甚至要將這些環境重新搭建一遍,就像每次將貨物卸載、重裝一樣麻煩。中間稍有差池,比如開發環境用了 JDK 1.8,而線上是 JDK 1.7;比如開發環境用了 root用戶,線上需要使用 hadoop用戶,都可能導致程序的運行失敗。

那么容器如何對應用打包呢?還是要學習集裝箱,首先要有個封閉的環境,將貨物封裝起來,讓貨物之間互不干擾,互相隔離,這樣裝貨卸貨才方便。好在 ubuntu中的 lxc技術早就能做到這一點。

封閉的環境主要使用了兩種技術,一種是看起來是隔離的技術,稱為 namespace,也即每個 namespace中的應用看到的是不同的 IP地址、用戶空間、程號等。另一種是用起來是隔離的技術,稱為 cgroup,也即明明整臺機器有很多的 CPU、內存,而一個應用只能用其中的一部分。

?

有了這兩項技術,集裝箱的鐵盒子我們是焊好了,接下來就是決定往里面放什么。

最簡單粗暴的方法,就是將上面列表中所有的都放到集裝箱里面。但是這樣太大了!因為即使你安裝一個干干靜靜的 ubuntu操作系統,什么都不裝,就很大了。把操作系統裝進容器相當于把船也放到了集裝箱里面!傳統的虛擬機鏡像就是這樣的,動輒幾十G。答案當然是 NO!所以第一項操作系統不能裝進容器。

?

撇下第一項操作系統,剩下的所有的加起來,也就幾百 M,就輕便多了。因此一臺服務器上的容器是共享操作系統內核的,容器在不同機器之間的遷移不帶內核,這也是很多人聲稱容器是輕量級的虛擬機的原因。輕不白輕,自然隔離性就差了,一個容器讓操作系統崩潰了,其他容器也就跟著崩潰了,這相當于一個集裝箱把船壓漏水了,所有的集裝箱一起沉。

?

另一個需要撇下的就是隨著應用的運行而產生并保存在本地的數據。這些數據多以文件的形式存在,例如數據庫文件、文本文件。這些文件會隨著應用的運行,越來越大,如果這些數據也放在容器里面,會讓容器變得很大,影響容器在不同環境的遷移。而且這些數據在開發、測試、線上環境之間的遷移是沒有意義的,生產環境不可能用測試環境的文件,所以往往這些數據也是保存在容器外面的存儲設備上。這也是為什么人們稱容器是無狀態的。

?

至此集裝箱焊好了,貨物也裝進去了,接下來的問題就是如何將這個集裝箱標準化,從而在哪艘船上都能運輸。這里的標準一個是鏡像,一個是容器的運行環境。

?

所謂的鏡像,就是將你焊好集裝箱的那一刻,將集裝箱的狀態保存下來,就像孫悟空說:“定”,集裝箱里面就定在了那一刻,然后將這一刻的狀態保存成一系列文件。這些文件的格式是標準的,誰看到這些文件都能還原當時定住的那個時刻。將鏡像還原成運行時的過程(就是讀取鏡像文件,還原那個時刻的過程)就是容器運行的過程。除了大名鼎鼎的 Docker,還有其他的容器,例如 AppC、Mesos Container,都能運行容器鏡像。所以說容器不等于 Docker。

?

總而言之,容器是輕量級的、隔離差的、適用于無狀態的,可以基于鏡像標準實現跨主機、跨環境的隨意遷移。

有了容器,使得 PaaS層對于用戶自身應用的自動部署變得快速而優雅。容器快就快在兩方面:第一,虛擬機啟動的時候要先啟動操作系統,容器不用啟動操作系統,因為是共享內核的;第二,虛擬機啟動后使用腳本安裝應用,容器不用安裝應用,因為已經打包在鏡像里面了。所以最終虛擬機的啟動是分鐘級別,而容器的啟動是秒級。容器咋這么神奇?其實一點都不神奇,第一是偷懶少干活了,第二是提前把活干好了。

?

因為容器啟動快,人們往往不會創建一個個小的虛擬機來部署應用,因為這樣太浪費時間了,而是創建一個大的虛擬機,然后在大的虛擬機里面再劃分容器,而不同的用戶不共享大的虛擬機,可以實現操作系統內核的隔離。這又是一次合久必分的過程。由 IaaS層的虛擬機池,劃分為更細粒度的容器池。


容器管理平臺


有了容器的管理平臺,又是一次分久必合的過程。

?

容器的粒度更加細,管理起來更難管,甚至是手動操作難以應對的。假設你有 100臺物理機,其實規模不是太大,用 Excel人工管理是沒問題的,但是一臺上面開 10臺虛擬機,虛擬機的個數就是 1000臺,人工管理已經很困難了,但是一臺虛擬機里面開 10個容器,就是 10000個容器,你是不是已經徹底放棄人工運維的想法了。

?

所以容器層面的管理平臺是一個新的挑戰,關鍵字就是自動化:

自發現:容器與容器之間的相互配置還能像虛擬機一樣,記住 IP地址然后互相配置嗎?這么多容器,一旦一臺虛擬機掛了重啟,IP改變,你怎么記得住應該改哪些配置,列表長度至少萬行級別的啊。所以容器之間的配置通過名稱來的,無論容器跑到哪臺機器上,名稱不變,就能訪問到。

自修復:容器掛了,或是進程宕機了,能像虛擬機那樣登陸上去查看一下進程狀態,如果不正常可以重啟一下么?那你要登陸萬臺 docker了。所以容器的進程掛了,容器就自動掛掉了,然后自動重啟。

彈性自伸縮 ?Auto Scaling:當容器的性能不足的時候,需要手動伸縮、手動部署么?當然也要自動來。


當前火熱的容器管理平臺有三大流派:

一個是 Kubernetes,我們稱為段譽型。


段譽 (Kubernetes)的父親 (Borg)武功高強,出身皇族 (Google),管理過偌大的一個大理國 (Borg是 Google數據中心的容器管理平臺)。作為大理段式后裔,段譽的武功基因良好 (Kubernetes的理念設計比較完善),周圍的高手云集,習武環境也好 (Kubernetes生態活躍,熱度高),雖然剛剛出道的段譽武功不及其父親,但是只要跟著周圍的高手不斷切磋,武功即可飛速提升。


一個是 Mesos,我們稱為喬峰型。


喬峰 (Mesos)的主要功夫降龍十八掌 (Mesos的調度功能)獨步武林,為其他幫派所無。而且喬峰也管理過人數眾多的丐幫 (Mesos管理過 Tweeter的容器集群)。后來喬峰從丐幫出來,在江湖中特例獨行 (Mesos的創始人成立了公司 Mesosphere)。喬峰的優勢在于,喬峰的降龍十八掌 (Mesos)就是在丐幫中使用的降龍十八掌,相比于段譽初學其父的武功來說,要成熟很多。但是缺點是,降龍十八掌只掌握在少數的幾個丐幫幫主手中 (Mesos社區還是以 Mesosphere為主導),其他丐幫兄弟只能遠遠崇拜喬峰,而無法相互切磋(社區熱度不足)。


一個是 Swarm,我們稱為慕容型。


慕容家族 (Swarm是 Docker家族的集群管理軟件)的個人功夫是非常棒的 (Docker可以說稱為容器的事實標準),但是看到段譽和喬峰能夠管理的組織規模越來越大,有一統江湖的趨勢,著實眼紅了,于是開始想創建自己的慕容鮮卑帝國(推出 Swarm容器集群管理軟件)。但是個人功夫好,并不代表著組織能力強 (Swarm的集群管理能力),好在慕容家族可以借鑒段譽和喬峰的組織管理經驗,學習各家公司,以彼之道,還施彼身,使得慕容公子的組織能力 (Swarm借鑒了很多前面的集群管理思想)也在逐漸的成熟中。

?

三大容器門派,到底鹿死誰手,誰又能一統江湖,尚未可知。


網易之所以選型 Kubernetes作為自己的容器管理平臺,是因為基于 Borg 成熟的經驗打造的 Kubernetes為容器編排管理提供了完整的開源方案,并且社區活躍,生態完善,積累了大量分布式、服務化系統架構的最佳實踐。


容器初體驗


想不想嘗試一下最先進的容器管理平臺呢?我們先了解一下 Docker的生命周期。如圖所示。

圖中中間的就是最核心的兩個部分,一個是鏡像 Images,一個是容器 Containers。鏡像運行起來就是容器。容器運行的過程中,基于原始鏡像做了改變,比如安裝了程序,添加了文件,也可以提交回去 (commit)成為鏡像。


如果大家安裝過系統,鏡像有點像 GHOST鏡像,從 GHOST鏡像安裝一個系統,運行起來,就相當于容器;容器里面自帶應用,就像 GHOST鏡像安裝的系統里面不是裸的操作系統,里面可能安裝了微信,QQ,視頻播放軟件等。安裝好的系統使用過程中又安裝了其他軟件,或者下載了文件,還可以將這個系統重新 GHOST成一個鏡像,當其他人通過這個鏡像再安裝系統的時候,則其他的軟件也就自帶了。

?

普通的 GHOST鏡像就是一個文件,但是管理不方便。比如如果有十個 GHOST鏡像的話,你可能已經記不清楚哪個鏡像里面安裝了哪個版本的軟件了。所以容器鏡像有 tag的概念,就是一個標簽,比如 dev-1.0,dev-1.1,production-1.1等,凡是能夠幫助你區分不同鏡像的都可以。

?

為了鏡像的統一管理,有一個鏡像庫的東西,可以通過 push將本地的鏡像放到統一的鏡像庫中保存,可以通過 pull將鏡像庫中的鏡像拉到本地來。

?

從鏡像運行一個容器可使用下面的命令,如果初步使用 Docker,記下下面這一個命令就可以了。

這行命令會啟動一個里面安裝了 mysql的容器。其中 docker run就是運行一個容器;--name就是給這個容器起個名字;-v 就是掛數據盤,將外面的一個目錄 /my/own/datadir掛載到容器里面的一個目錄 /var/lib/mysql作為數據盤,外面的目錄是在容器所運行的主機上的,也可以是遠程的一個云盤;-e 是設置容器運行環境的環境變量,環境變量是最常使用的設置參數的方式,例如這里設置 mysql的密碼。mysql:tag就是鏡像的名字和標簽。

?

docker stop可以停止這個容器,start可以再啟動這個容器,restart可以重啟這個容器。在容器內部做了改變,例如安裝了新的軟件,產生了新的文件,則調用 docker commit變成新的鏡像。

?

鏡像生產過程,除了可以通過啟動一個 docker,手動修改,然后調用 docker commit形成新鏡像之外,還可以通過書寫 Dockerfile,通過 docker build來編譯這個 Dockerfile形成新的鏡像。為什么要這樣做呢?前面的方式太不自動化了,需要手工干預,而且還經常會忘了手工都做了什么。用 Dockerfile可以很好地解決這個問題。

?

Dockerfile 的一個簡單的例子如下:

這其實是一個鏡像的生產說明書,Docker build 的過程就是根據這個生產說明書來生產鏡像:


  • FROM基礎鏡像,先下載這個基礎鏡像,然后從這個鏡像啟動一個容器,并且登陸到容器里面;

  • RUN 運行一個命令,在容器里面運行這個命令;

  • COPY/ADD 將一些文件添加到容器里面;

  • 最終給容器設置啟動命令 ?ENTRYPOINT,這個命令不在鏡像生成過程中執行,而是在容器運行的時候作為主程序執行;

  • 將所有的修改 commit成鏡像。

?

這里需要說明一下的就是主程序是 Docker里面的一個重要的概念,雖然鏡像里面可以安裝很多的程序,但是必須有一個主程序,主程序和容器的生命周期完全一致,主程序在則容器在,主程序亡則容器亡。

就像圖中展示的一樣,容器是一個資源限制的框,但是這個框沒有底,全靠主進程撐著,主進程掛了,衣服架子倒了,衣服也就垮了。

?

了解了如何運行一個獨立的容器,接下來介紹如何使用容器管理平臺。


容器管理平臺初體驗


容器管理平臺會對容器做更高的抽象,容器不再是單打獨斗,而且組成集團軍共同戰斗。

?

多個容器組成一個 Pod,這幾個容器親如兄弟,干的也是相關性很強的活,能夠通過 localhost訪問彼此,真是兄弟齊心,力可斷金。有的任務一幫兄弟還扛不住,就需要多個 Pod合力完成,這個由 ReplicationController進行控制,可以將一個 Pod復制 N個副本,同時承載任務,眾人拾柴火焰高。

?

N個 Pod如果對外散兵作戰,一是無法合力,二是給人很亂的感覺,因而需要有一個老大作為代言人,將大家團結起來,一致對外,這就是 Service。老大對外提供統一的虛擬 IP和端口,并將這個 IP和服務名關聯起來,訪問服務名則自動映射為虛擬 IP。老大的意思就是如果外面要訪問我這個團隊,喊一聲名字就可以,例如”雷鋒班,幫敬老院打掃衛生!”,你不用管雷鋒班的哪個人去打掃衛生,每個人打掃哪一部分,班長會統一分配。

?

最上層通過 namespace分隔完全隔離的環境,例如生產環境,測試環境,開發環境等。就像軍隊分華北野戰軍,東北野戰軍一樣。野戰軍立正,出發,部署一個 Tomcat的 Java應用。


實戰案例


有個 blog的 war,可以從這里下載

http://demo.nos-eastchina1.126.net/springblog.war

還需要一個 jar,從這里下載

http://demo.nos-eastchina1.126.net/spring-instrument-tomcat-4.2.2.RELEASE.jar


1. ? ?將編譯結果上傳到對象存儲


登陸網易蜂巢,點擊對象存儲,創建桶。上傳 springblog.war到這個桶里面。

對于 spring,還需要 spring-instrument-tomcat-4.2.2.RELEASE.jar 放到這個桶里面。


2. ? ? ?寫一個 Dockerfile


由于這是基于 Tomcat的,所以我們使用 hub.c.163.com/library/tomcat:8.0-jre7 作為基礎鏡像。這個鏡像可以在鏡像倉庫里面搜到。

?

?

通過 ADD命令,將對象存儲中的 war,jar放入容器鏡像中,并且修改權限。注意 URL地址不是本例子中的地址,而是您自己的地址,可以在對象存儲界面上通過復制地址得到這個地址。


將 catalina.sh run作為 ENTRYPOINT。


3. ?? ?構建一個鏡像


在鏡像倉庫里面,創建鏡像倉庫,起個名字

點擊鏡像倉庫,點擊構建鏡像

在本地選擇寫好的 Dockerfile開始構建。


構建成功則顯示如下:

4.??? 創建 tomcat服務


在服務管理中,點擊創建服務。


填寫名稱 testtomcat,選擇無狀態


鏡像選擇前面構建的鏡像。


選擇默認的規格,端口映射為 8080映射為 8080。


點擊立即創建。等待創建成功。


5.??? 創建負載均衡器


在負載均衡頁面,點擊創建負載均衡,取名 testtomcat。


點擊創建監聽。


取名 testtomcat,監聽端口 8080,映射為 testtomcat服務的 8080.


點擊立即創建。


6.??? 訪問頁面


使用負載均衡的 IP地址加上 8080端口訪問 tomcat。


使用 user/user登陸,創建一個博客。


?



福利

掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!


2、公眾號后臺回復:工具,獲取開源云監控工具詳細資料!


推薦閱讀:

  • 一部刷爆朋友圈的5G短片,看完才知道5G多暖多重要!

  • 小團隊的微服務之路

  • 女神節該送程序媛什么禮物?保命指南來了!| 程序員有話說

  • Android 告急!

  • 兩會第一天, 大佬們關于區塊鏈的探討, 你要了解的都在這了

  • 云評測 | 開發者最有用的開源云監控工具有哪些呢? 這7款神器總有一款適合你!


喜歡就點擊“好看”吧

總結

以上是生活随笔為你收集整理的企业应用快速跨向容器时代的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。