開發(fā)人員如何理解kubernetes
本文轉(zhuǎn)載自微信公眾號「JAVA日知錄」,作者+++++。轉(zhuǎn)載本文請聯(lián)系JAVA日知錄公眾號。
概述
在JAVA開發(fā)中使用 docker run命令配合上自建的Docker倉庫可以很容易部署JAVA服務(wù),但是使用Docker部署應(yīng)用會有幾個問題:
- 一個docker run 不是部署服務(wù)的可靠方法,因為它創(chuàng)建的容器在單個機器運行。雖然Docker引擎提供了一些基本的管理功能,例如在容器崩潰或計算器重啟時自動重啟容器。但是它不能處理機器崩潰。無法保證服務(wù)的高可用!
- 另一個問題是服務(wù)通常不是孤立存在,而是相互依賴的,例如數(shù)據(jù)庫和消息隊列。我們通常需要將服務(wù)及其依賴項作為一個單元部署或取消部署。
在開發(fā)過程中特別好用的方法是使用Docker Compose。Docker Compose是一個工具,它允許使用YAML文件以聲明方式定義一組容器,然后以組的形式啟動和停止這些容器。
但是使用Docker Compose也有個很明顯的問題就是它僅限于一臺機器。要可靠的部署服務(wù),必須使用Docker編排框架,例如Kubernetes。
Kubernetes簡介
Kubernates是一個Docker編排框架,是Docker之上的一個軟件層,它將一組計算機硬件資源轉(zhuǎn)變成用于運行服務(wù)的單一資源池。它努力保持每個服務(wù)所需要的實例數(shù)量,并確保它們一直在線,即使服務(wù)實例或機器崩潰也是如此。容器的靈活性和Kubernetes的復雜性相結(jié)合是部署服務(wù)的一種強有力的方式。
Kubernetes有三個主要功能:
- 資源管理:將一組計算機視為由CPU、內(nèi)存和存儲卷構(gòu)成的資源池,將計算機集群視為一臺計算機。
- 調(diào)度:選擇要運行容器的機器。默認情況下,調(diào)度考慮容器的資源需求和每個節(jié)點的可用資源。它還可以實現(xiàn)在同一節(jié)點部署具有親和性(affinity)的容器,或保持特定幾個容器分散部署在不同的節(jié)點上(反親和性,anti-affinity)
- 服務(wù)管理:實現(xiàn)命名和版本化服務(wù)的概念,這個概念可以直接映射到微服務(wù)架構(gòu)中的具體服務(wù)。編排框架確保始終運行所需數(shù)量的正常實例。它實現(xiàn)請求的負載均衡。編排框架也可以執(zhí)行服務(wù)的滾動升級,并允許你回滾到舊版本。
Kubernetes架構(gòu)
Kubernetes架構(gòu)
Kubernetes在一組機器上運行。Kubernetes集群中的計算機角色分為主節(jié)點和普通節(jié)點。集群中只有很少的幾個主節(jié)點(可能只有一個)和很多普通節(jié)點。
「主節(jié)點」負責管理集群。Kubernetes的「普通節(jié)點」稱為 “工作節(jié)點”,它會運行一個或多個Pod。Pod是Kubernetes的部署單元,由一組容器組成。
主節(jié)點運行多個組件,包括以下內(nèi)容:
- API服務(wù)器:用于部署和管理服務(wù)的REST API,例如,可被kubectl命令行使用。
- Etcd:存儲集群數(shù)據(jù)鍵值的NoSQL數(shù)據(jù)庫。
- 調(diào)度器:選擇要運行POD的節(jié)點。
- 控制器管理器:運行控制器,確保集群狀態(tài)與預(yù)期狀態(tài)匹配。例如,一種被稱為 復制(replication)控制器 的控制器通過啟動和終止實例來確保運行所需要的服務(wù)實例。
普通節(jié)點運行多個組件,包括以下內(nèi)容:
- Kubelet:創(chuàng)建和管理節(jié)點上運行的Pod。
- Kube-proxy:管理網(wǎng)絡(luò),包括跨Pod的負載均衡。
- Pods:應(yīng)用程序服務(wù)。
接下來我們看一下Kubernetes上部署服務(wù)需要掌握的關(guān)鍵Kubernetes概念,掌握這幾個概念就抓住了Kubernetes的核心。
Kubernetes的關(guān)鍵概念
Kubernetes是很復雜的,但是,一旦掌握了一些「關(guān)鍵對象」的概念,就可以高效的使用Kubernetes。Kubernetes定義了許多類型的對象,從開發(fā)人員的角度來看,最重要的對象如下:
- Pod:
Pod是Kubernetes的基本部署單元。它由一個或多個共享IP地址和存儲卷的容器組成。服務(wù)實例的pod通常由單個容器組成,例如運行 JVM 的容器。但在某些情況下,Pod包含一個或多個實現(xiàn)支持功能的 「邊車」(sidecar)容器。例如,Nginx 服務(wù)器可以有一個邊車容器,定期執(zhí)行 git pull 以下載最新版本的網(wǎng)站。Pod的生命周期很短,因為Pod的容器或它運行的節(jié)點可能會崩潰。
- Deployment:
Deployment : Pod 的聲明性規(guī)范。Deployment是一個控制器,可確保始終運行所需數(shù)量的Pod實例 (服務(wù)實例)。它通過滾動升級和回滾來支持版本控制。
- Service:
向應(yīng)用程序服務(wù)的客戶端提供的一個靜態(tài)/穩(wěn)定的網(wǎng)絡(luò)地址。它是基礎(chǔ)設(shè)施提供的服務(wù)發(fā)現(xiàn)的一種形式。每個 Service具有一個 IP 地址和一個可解析為該 IP 地址的 DNS 名稱,并跨一個或多個 Pod對 TCP 和 UDP 流量進行負載均衡處理。IP地址和 DNS 名稱只能在Kubernetes內(nèi)部訪問。
Service默認是使用ClusterIp模式,如果需要外部能訪問到這個Service則需要使用另外兩種類型的對象:NodePort 和 LoadBalancer。
- ConfigMap:
名稱與值對的命名集合,用于定義一個或多個應(yīng)用程序服務(wù)的外部化配置。Pod容器的定義可以引用ConfigMap來定義容器的環(huán)境變量。它還可以使用ConfigMap在容器內(nèi)創(chuàng)建配置文件??梢允褂肧ecret來存儲敏感信息(如密碼),它也是 ConfigMap的一種形式。