Kubernetes集羣的組件衆多,要部署一套符合生產環境的集羣不是一件容易的事。好在隨着社區的快速發展,特別是在它成爲事實上的容器編排標準之後,基本全部的主流雲平臺都徹底支持Kubernetes,或把它做爲核心的雲解決方案。同時,本地部署也出現了各種成熟的主動化解決方案,特別是Kubeadm,在最新的1.13版本已經官方GA了,也就是徹底能夠用在生產環境中了。這些雲服務或自動化工具都大大減小了Kubernetes的部署難度,讓運維力量不足的小型公司也能快速的搭建出可用的Kubernetes生產環境。html
Kubernetes官方文檔中,總共列出了5大類,不下30種的Kubernetes安裝方式。不說別的,單從數量來講,就能夠看出當前Kubernetes生態的包容性和目前其餘各種平臺對它的技術支持有多強。文檔中把部署方案分爲如下幾類:node
能夠理解爲單機版的Kubernetes,很是適合入門Kubernetes學習或測試使用。表明的解決方案爲Minikube。web
這三種方式能夠放在一塊說,他們都是基於雲服務商提供的解決方案,區別以下:segmentfault
Hosted方式是指雲服務商搭建的一套公共的Kubernetes,用戶直接使用就行了,集羣的搭建、管理、運維等操做所有都由雲服務商提供,用戶只要專一於本身的應用開發,不用關注集羣的運維。這種解決方案特別適合小開發團隊或小型公司,不只省去了自有硬件的維護成本,連繫統運維人員均可以不用了。api
Turnkey–Cloud Solutions指雲服務商幫忙搭建了Kubernetes Master節點,並負責維護其可用性,用戶能夠自定義Node節點加入集羣,能夠根據具體需求靈活並只用關注Node節點的維護瀏覽器
Turnkey–On-Premises Solutions方案是指包括Master節點和Node節點都由用戶配置及維護,靈活性最高,但資源成本和運維成本也最高。
但無論上述哪一種方式,雲服務商都已經把Kubernetes作了一層包裝,用戶能夠用簡單的幾個命令就能夠部署Kubernetes集羣,不須要從頭開始一步步安裝。服務器
這三種不一樣的解決方案,阿里雲的文檔容器服務Kubernetes集羣三種形態對比介紹的很清楚,能夠對比着理解:負載均衡
其中,Serverless對應Hosted Solution,託管版對應Turnkey – Cloud Solution,專有版對應Turnkey – On-Premises Solution。less
Custom安裝方式顧名思義,是徹底由用戶本身安裝維護Kubernetes,集羣服務器和部署、配置、運維都由用戶本身完成。這種方案靈活度最高,相對的,付出的硬件成本和部署、維護成本也最高。這裏的服務器能夠是相似EC二、ECS這種雲主機,也能夠是本地服務器、虛擬機等,甚至基於ARM的嵌入式硬件目前也能運行Kubernetes。Custom方式也是通常大公司在生產環境使用Kubernetes的最佳選擇,一方面,大公司運維、開發團隊人員完善,能夠獨立部署和運維Kubernetes集羣,而且還能夠根據本身的需求進行二開,整合Kubernetes容器部署、日誌、監控等,打造出適合公司業務的容器平臺。另外一方面,不少公司考慮容器化業務的出發點之一就是能夠優化公司現有的硬件資源,把原來跑物理服務器或虛擬機的業務遷移到容器平臺上來,以提升自有硬件資源利用率及節省成本。現階段,Custom部署方式除了一步步編譯並部署、配置各組件,還能夠經過Kubeadmin簡單快速的部署出生產可用的集羣。運維
雖然官網列出的Kubernetes部署方式不少,但也不用被這麼多種部署方式搞糊塗了。全部Kubernetes集羣,都少不了關鍵的基礎組件。(參考Kubernetes概念與術語中的組件部分),不一樣的部署方式,無非是這些組件由雲服務商部署好了,用戶只要使用集羣就好(Host 或 Turnkey方案),或着被作成容器運行以方便快速部署和管理(Minicube、Kubeadm等)。
Minikube是由Kubernetes社區維護的單機版的Kubernetes集羣,支持macOS, Linux, and Windows等多種操做系統平臺,使用最新的官方stable版本,並支持Kubernetes的大部分功能,從基礎的容器編排管理,到高級特性如負載均衡、Ingress,權限控制等。很是適合做爲Kubernetes入門,或開發測試環境使用。Minikube實際是跑在本地的虛擬機中的,因此,須要先安裝一套Hypervisor。這裏以VirtualBox爲例。
Minikube的誕生的初衷就是爲了能快速部署一個單機Kubernetes集羣,因此,整個部署很是簡單,就2條命令搞定:
brew cask install minikube minikube start
brew cask install直接從官方下載了minikube程序,並加入環境變量。minikube start雖然只是一條命令,但其實執行了不少步驟,命令執行後輸出以下:
$ minikube start o minikube v0.35.0 on darwin (amd64) > Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ... - "minikube" IP address is 192.168.99.100 - Configuring Docker as the container runtime ... - Preparing Kubernetes environment ... @ Downloading kubeadm v1.13.4 @ Downloading kubelet v1.13.4 - Pulling images required by Kubernetes v1.13.4 ... - Launching Kubernetes v1.13.4 using kubeadm ... : Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns - Configuring cluster permissions ... - Verifying component health ..... + kubectl is now configured to use "minikube" = Done! Thank you for using minikube!
能夠看到,minikube start主要作了這些事:
因此,minikube其實是基於Kubeadm工具來部署Kubernetes的,咱們經過minikube ssh命令能夠進入部署的虛擬機中,看下里面在跑的容器:
有木有看到不少熟悉的身影,有Master節點的組件kube-apiserver、kube-scheduler、kube-controller、etcd 容器,以及Node節點的kube-proxy容器,還有些附加的組件好比Coredns等。沒錯,Kubeadm實際就是把Kubernetes各個組件都容器化了(除了kubelet),而minikube再用虛擬機把它們都跑在一塊兒。關於Kubeadm,下一篇文章會詳細再介紹。
Minikube成功運行之後,就已經在用戶操做系統中安裝了kubectl,並將運行的集羣變量設置爲了minkube,能夠經過kubectl config view 命令查看當前的配置:
kubectl的做用集羣已經被指定爲minikube的虛擬機了。執行kubectl get node -o wide確認Kubernetes集羣節點信息。
集羣名稱爲minikube,只有一個master節點。
下面咱們部署一個簡單的goweb服務,該容器運行時會暴露8000端口,同時訪問/info路徑會顯示容器的主機名。服務由3個容器實例構成,而且經過Nodeport方式暴露給用戶。
// 建立一個名爲goweb的Deployment,使用lingtony/goweb鏡像,暴露8000端口,副本pod數爲3 $ kubectl run goweb --image=lingtony/goweb --port=8000 --replicas=3 // 查看建立的對象,能夠看到已經有3個pod在運行了 $ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE goweb 3/3 3 3 2m59s $ kubectl get po NAME READY STATUS RESTARTS AGE goweb-8559474b8c-rphcs 1/1 Running 0 3m2s goweb-8559474b8c-wzvsl 1/1 Running 0 3m2s goweb-8559474b8c-xxtlz 1/1 Running 0 3m2s // 建立svc,經過Nodeport方式暴露服務 $ kubectl expose deployment goweb --name=gowebsvc --port=80 --target-port=8000 --type=NodePort service/gowebsvc exposed // 查看svc,能夠看到NodePort隨機分配的端口爲31543 $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gowebsvc NodePort 10.108.29.53 <none> 80:31534/TCP 3s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h58m
接下來,在用戶操做系統就能夠經過minikube虛擬機的ip地址:31543來訪問這個gowebsvc了,gowebsvc會把80口的請求再負載均衡到實際的goweb pod上。更方便的,可使用minikube server命令直接獲取到svc的訪問地址:
// 經過minikube server命令獲取svc地址 $ minikube service gowebsvc --url http://192.168.99.100:31534 // 測試訪問一下
能夠看到,每次的訪問請求是都進入不一樣的pod,與kubectl get po命令所示的pod一致。
能夠經過minikube dashboard命令直接開啓dashboard
macOS會自動在你的默認瀏覽器打開,能夠經過web查看和管理集羣了。
本文介紹了Kubernetes不一樣部署方式的區別,同時詳細說明了minikube這個單節點Kubernetes工具的部署步驟、以及對部署後的集羣作了簡單測試。經過上面的部署分析能夠看出,minikube的核心實際仍是依靠kubeadm這個工具來部署集羣的,後面的文章會介紹如何用Kubeadm部署一個多節點集羣。