概述
在JAVA開發中使用 docker run
命令配合上自建的Docker倉庫能夠很容易部署JAVA服務,可是使用Docker部署應用會有幾個問題:java
-
一個 docker run
不是部署服務的可靠方法,由於它建立的容器在單個機器運行。雖然Docker引擎提供了一些基本的管理功能,例如在容器崩潰或計算器重啓時自動重啓容器。可是它不能處理機器崩潰。沒法保證服務的高可用! -
另外一個問題是服務一般不是孤立存在,而是相互依賴的,例如數據庫和消息隊列。咱們一般須要將服務及其依賴項做爲一個單元部署或取消部署。
在開發過程當中特別好用的方法是使用Docker Compose。Docker Compose是一個工具,它容許使用YAML文件以聲明方式定義一組容器,而後以組的形式啓動和中止這些容器。git
可是使用Docker Compose也有個很明顯的問題就是它僅限於一臺機器。要可靠的部署服務,必須使用Docker編排框架,例如Kubernetes。程序員
Kubernetes簡介
Kubernates是一個Docker編排框架,是Docker之上的一個軟件層,它將一組計算機硬件資源轉變成用於運行服務的單一資源池。它努力保持每一個服務所須要的實例數量,並確保它們一直在線,即便服務實例或機器崩潰也是如此。容器的靈活性和Kubernetes的複雜性相結合是部署服務的一種強有力的方式。web
Kubernetes有三個主要功能:docker
-
資源管理:將一組計算機視爲由CPU、內存和存儲卷構成的資源池,將計算機集羣視爲一臺計算機。 -
調度:選擇要運行容器的機器。默認狀況下,調度考慮容器的資源需求和每一個節點的可用資源。它還能夠實如今同一節點部署具備親和性(affinity)的容器,或保持特定幾個容器分散部署在不一樣的節點上(反親和性,anti-affinity) -
服務管理:實現命名和版本化服務的概念,這個概念能夠直接映射到微服務架構中的具體服務。編排框架確保始終運行所需數量的正常實例。它實現請求的負載均衡。編排框架也能夠執行服務的滾動升級,並容許你回滾到舊版本。
Kubernetes架構
Kubernetes在一組機器上運行。Kubernetes集羣中的計算機角色分爲主節點和普通節點。集羣中只有不多的幾個主節點(可能只有一個)和不少普通節點。數據庫
「主節點」負責管理集羣。Kubernetes的「普通節點」稱爲 「工做節點」,它會運行一個或多個Pod。Pod是Kubernetes的部署單元,由一組容器組成。服務器
主節點運行多個組件,包括如下內容:微信
-
API服務器:用於部署和管理服務的REST API,例如,可被kubectl命令行使用。 -
Etcd:存儲集羣數據鍵值的NoSQL數據庫。 -
調度器:選擇要運行POD的節點。 -
控制器管理器:運行控制器,確保集羣狀態與預期狀態匹配。例如,一種被稱爲 複製(replication)控制器 的控制器經過啓動和終止實例來確保運行所須要的服務實例。
普通節點運行多個組件,包括如下內容:網絡
-
Kubelet:建立和管理節點上運行的Pod。 -
Kube-proxy:管理網絡,包括跨Pod的負載均衡。 -
Pods:應用程序服務。
接下來咱們看一下Kubernetes上部署服務須要掌握的關鍵Kubernetes概念,掌握這幾個概念就抓住了Kubernetes的核心。架構
Kubernetes的關鍵概念
Kubernetes是很複雜的,可是,一旦掌握了一些「關鍵對象」的概念,就能夠高效的使用Kubernetes。Kubernetes定義了許多類型的對象,從開發人員的角度來看,最重要的對象以下:
-
Pod:
Pod是Kubernetes的基本部署單元。它由一個或多個共享IP地址和存儲卷的容器組成。服務實例的pod一般由單個容器組成,例如運行 JVM 的容器。但在某些狀況下,Pod包含一個或多個實現支持功能的 「邊車」(sidecar)容器。例如,Nginx 服務器能夠有一個邊車容器,按期執行 git pull 如下載最新版本的網站。Pod的生命週期很短,由於Pod的容器或它運行的節點可能會崩潰。
-
Deployment:
Deployment : Pod 的聲明性規範。Deployment是一個控制器,可確保始終運行所需數量的Pod實例 (服務實例)。它經過滾動升級和回滾來支持版本控制。
-
Service:
嚮應用程序服務的客戶端提供的一個靜態/穩定的網絡地址。它是基礎設施提供的服務發現的一種形式。每一個 Service具備一個 IP 地址和一個可解析爲該 IP 地址的 DNS 名稱,並跨一個或多個 Pod對 TCP 和 UDP 流量進行負載均衡處理。IP地址和 DNS 名稱只能在Kubernetes內部訪問。
Service默認是使用ClusterIp模式,若是須要外部能訪問到這個Service則須要使用另外兩種類型的對象:NodePort 和 LoadBalancer。
-
ConfigMap:
名稱與值對的命名集合,用於定義一個或多個應用程序服務的外部化配置。Pod容器的定義能夠引用ConfigMap來定義容器的環境變量。它還可使用ConfigMap在容器內建立配置文件。可使用Secret來存儲敏感信息(如密碼),它也是 ConfigMap的一種形式。
以上,但願對你有所幫助!
乾貨分享
這裏爲你們準備了一份小小的禮物,關注公衆號,輸入以下代碼,便可得到百度網盤地址,無套路領取!
001:《程序員必讀書籍》
002:《從無到有搭建中小型互聯網公司後臺服務架構與運維架構》
003:《互聯網企業高併發解決方案》
004:《互聯網架構教學視頻》
006:《SpringBoot實現點餐系統》
007:《SpringSecurity實戰視頻》
008:《Hadoop實戰教學視頻》
009:《騰訊2019Techo開發者大會PPT》
010: 微信交流羣
近期熱文top
我就知道你「在看」
本文分享自微信公衆號 - JAVA日知錄(javadaily)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。