還記得17年的夏天,我第一次接觸docker,馬上就被容器化的新穎理念以及它帶來的種種優點所震撼了html
容器化帶給業界的衝擊是巨大的,不到短短一年的時間裏,容器化的部署和運維就已經完全替代傳統機器部署成爲了主流,同時docker也爲服務端的發展形態帶來了很是多的可能性,使得「微服務」這一架構如雨後春筍般生長起來,迅速成熟node
當服務的載體由虛擬機器變爲容器後,部署和運維的粒度更小了,但從宏觀的角度來看,一個完整的服務系統變得更加零碎和複雜了 —— 數量衆多的微服務以及承載他們的容器交織成一張脈絡複雜的巨網,如何對這樣龐大的系統進行管理便成爲一個難題sql
那一年,k8s尚未「爆紅」,談到容器管理,人們的第一反應仍然是docker官方團隊著名的「三劍客」:docker
docker-machine提供底層的跨平臺虛擬api
docker-compose解決複雜服務的自動部署瀏覽器
docker-swarm實現大型集羣的管理bash
一切看起來都很美妙,直到半路殺出google孕育的k8s,以其強大的功能和扁平易用的管理方式一統江湖,2018年咱們幾乎再也看不到三劍客的身影,k8s和lstio以及它們所帶來的「服務網格」正在成爲雲原生時代新的基礎設施,愈來愈多的大型系統開始在雲上構建和部署restful
做爲一個工程師,應當有意識的去了解本身服務究竟生長在什麼樣的一片土壤上,這也正是本次開坑學習k8s的緣由網絡
什麼是k8s?架構
Kubernetes是一個用於容器集羣的自動化部署、擴容以及運維的開源平臺。
k8s誕生的目的
k8s孕育的初衷是培育出一個組件及工具的生態,幫助你們減輕在公有云及私有云上運行應用的負擔,換言之,使得大型分佈式應用的構建和運維變得更加簡單(固然,越簡單的表面意味着越複雜的內部細節)。
總體架構圖
下面逐步展開介紹各個組件
Node是k8s中最小的計算硬件單元,它相似於傳統集羣中單臺機器的概念,是對硬件物理資源的一層抽象,它能夠是真實機房的物理機器,又或者是雲平臺上的ECS,甚至能夠是邊緣計算的一個終端。
不管如何,藉助Node的抽象,咱們能夠把任何一臺機器簡單的看作是一組CPU和RAM資源的組合,從而達到解耦的效果
對於大型系統,咱們每每不會把關注點放在單個機器上,而是聚焦更大粒度的集羣。
在k8s中,通常將集羣看作一個總體,而不關心內部節點的狀態,集羣內部狀態的調整將由k8s自動完成。
考慮到集羣內部的節點始終在發生調度和變更,因此全部節點內部的文件系統都是易失的,沒法保證持久,爲了解決這一問題,k8s引入了持久卷的概念,用於映射實際的物理儲存節點(雲盤或者是物理磁盤),它能夠隨時被掛載到任何的集羣上去。
容器是打包好的運行環境,這點無需再多贅述。值得一提的是k8s中的容器支持不只僅包含了docker,還支持一些其餘的容器標準
這是k8s區別於其餘容器編排平臺的一個顯著特色:它不直接運行容器,而是運行一種稱爲Pod的高級結構,裏面封裝了一系列相關的容器,並共享相同的namespace和網絡。
Pod也是k8s進行服務編排和縮擴容的基本單位,這意味着Pod裏全部的容器都會被一併縮放(不論是否有必要),所以定製Pod時應該使它的體積儘量小一些。
另外還有一個和Pod相關的概念,就是副本集(Replica Sets),它是指在擴容時產生的Pod的複製
咱們能夠把上面幾個邏輯概念的關係用下圖表示:
deployment是用於管理pod的抽象層,它的定位相似於docker-compose。
k8s一個很巧妙的地方在於它把deployment層設計成「過程無關」的,你只須要聲明你所指望的最終狀態,k8s將會自動爲你調度pod並保證它們知足你的預期。
當咱們將整個系統以及其精巧的內部結構搭建起來後,咱們仍然須要一個通道,使得它可以真正地與外界溝通,這就是Ingress
瞭解一門技術最快的方法就是用它寫一個Hello World,因爲真實的k8s須要部署在較大規模的集羣上,普通的開發PC顯然不能達到這個需求,因此使用官方提供的本地實驗環境工具minikube來作嘗試
(如下實踐均運行在OSX 10.11環境下)
首先須要安裝minikube
+ kubectl
,由於minikube須要docker做爲底層支持,因此你還須要先提早安裝好docker
,docker的安裝就很少贅述了,這裏說下如何在國內環境安裝另外兩個重要的組件:
kubectl
的安裝:
wget https://storage.googleapis.com/kubernetes-
release/release/v1.5.1/bin/darwin/amd64/kubectl
chmod +x kubectl
mv kubectl /usr/local/bin/kubectl
複製代碼
minikube
的安裝:
首先須要安裝VirtualBox
做爲底層的driver,而後從命令行安裝。這裏用的是阿里雲在國內的源,因此會比brew快不少
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
複製代碼
安裝完畢後能夠啓動k8s環境了,命令行運行minikube start
,能夠看到它會自動更新和下載一些組件(這個過程可能會持續幾分鐘)
啓動完畢後運行minikube ssh
進入minikube的虛擬機內部,執行docker ps
查看全部的組件容器是否啓動成功
若是沒有問題退出登陸,在外部執行minikube dashboard
便可在瀏覽器啓動控制檯,到這裏k8s的實驗環境就已經搭建完畢了
k8s環境啓動後,就能夠開始部署應用和服務了。首先咱們須要一個可用的應用鏡像,這裏用我本身打包好的一個簡單的Http Hello World服務鏡像來作示範(鏡像地址:registry.cn-qingdao.aliyuncs.com/gold-faas/gold-rest-demo:1.0
)
接下來第一步就是建立Deployment,它將負責建立和更新咱們的應用實例,而且持續監控應用的狀態。
使用kubectl
來建立一個deployment:
kubectl run helloworld --image=registry.cn-qingdao.aliyuncs.com/gold-faas/gold-rest-demo:1.0 --port=8080
複製代碼
執行後master節點將會選擇一個合適的node來部署該應用(minikube環境下只有一個node),建立完成後可使用kubectl get deployment
來查看該應用:
此時控制檯中也能夠看到相應的部署:
應用部署好後,暫時還只能在內部訪問,咱們能夠進入pod內部來作一個測試:
能夠看到服務已經在正常運行了,若是想要在外部的終端訪問,能夠簡單的使用kubectl proxy
來建立一個當前終端到k8s cluster的代理,而後來訪問咱們的pod(能夠先用kubectl get pod
來查看pod名)
代理啓動後在新終端經過restful api的方式就能夠經過代理訪問到內部pod所提供的服務,restful的url模式以下:
/api/v1/namespace/{namespace}/pods/{name}/proxy/{path:*}
複製代碼
效果:
(這是k8s對外暴露的resftul api的一部分,是經過代碼和網絡手段控制k8s的重要手段,後面會再詳細展開講)
上面使用proxy來訪問內部容器的方法更多適合在debug等場景下使用,當咱們須要對外提供可用的真實服務時,須要更加可靠的手段,那就是Service
,能夠暫時把它理解爲一個集合了負載均衡、服務發現等功能的外部服務入口(後面再詳細展開)。
如圖,一個Service能夠映射多個Pod,爲了把多個Pod在邏輯上組合起來,k8s又引入了Label
的概念,簡單的說就是每一個Pod上均可以打一個Label(標籤),具備相同Label的Pod就成爲一個邏輯分組。Service就是經過Label Selector的方式來關聯多個Pod的,以下圖:
如今咱們來建立一個Service並將它暴露到外部,一般能夠有LoadBalancer
和NodePort
兩種手段,不過minikube只支持後者,使用kubectl expose
命令便可建立Service:
使用kubectl get service
咱們能夠看到已經建立的服務,其中kubernetes
是k8s默認已經建立好的。能夠看到,新建立的service把對應pod的8080端口暴露到了外部的32344端口,接下來經過這個端口就能夠訪問到hello world服務了:
這裏的ip是minikube的docker-daemon的ip,能夠經過minikube docker-env
來查看:
咱們能夠查看一下service和pod的詳情,來看看Label是否按照咱們預期的被建立:
label是key=value
的形式被建立的,若是想要自定義一些label,使用kubectl label
命令便可:
在pod和service很是多的時候,能夠用做一種過濾的手段,使用-l參數便可進行篩選,就像sql的where語句同樣:
最後,若是想要刪除一個service,只須要運行kubectl delete service [服務名]
便可,固然服務刪除後pod仍然存在而且會持續運行,只是對外的入口消失了而已。
到這裏,k8s的基礎概念已經介紹的差很少了,也瞭解瞭如何在k8s上部署應用和服務,get了大概的運做流程。不過目前能看到的只是k8s基礎能力的一部分,更多的實踐以及背後的工做原理,將會在後面的文章中陸續介紹。
原文地址: http://marklux.cn/blog/104, 轉載請註明出處