天天看點

開發人員如何了解kubernetes

概述

在JAVA開發中使用

docker run

指令配合上自建的Docker倉庫可以很容易部署JAVA服務,但是使用Docker部署應用會有幾個問題:

  1. 一個

    docker run

    不是部署服務的可靠方法,因為它建立的容器在單個機器運作。雖然Docker引擎提供了一些基本的管理功能,例如在容器崩潰或電腦重新開機時自動重新開機容器。但是它不能處理機器崩潰。無法保證服務的高可用!
  1. 另一個問題是服務通常不是孤立存在,而是互相依賴的,例如資料庫和消息隊列。我們通常需要将服務及其依賴項作為一個單元部署或取消部署。

在開發過程中特别好用的方法是使用Docker Compose。Docker Compose是一個工具,它允許使用YAML檔案以聲明方式定義一組容器,然後以組的形式啟動和停止這些容器。

但是使用Docker Compose也有個很明顯的問題就是它僅限于一台機器。要可靠的部署服務,必須使用Docker編排架構,例如

Kubernetes

Kubernetes簡介

Kubernates是一個Docker編排架構,是Docker之上的一個軟體層,它将一組計算機硬體資源轉變成用于運作服務的單一資源池。它努力保持每個服務所需要的執行個體數量,并確定它們一直線上,即使服務執行個體或機器崩潰也是如此。容器的靈活性和Kubernetes的複雜性相結合是部署服務的一種強有力的方式。

Kubernetes有三個主要功能:

  • 資源管理:将一組計算機視為由CPU、記憶體和存儲卷構成的資源池,将計算機叢集視為一台計算機。
  • 排程:選擇要運作容器的機器。預設情況下,排程考慮容器的資源需求和每個節點的可用資源。它還可以實作在同一節點部署具有親和性(affinity)的容器,或保持特定幾個容器分散部署在不同的節點上(反親和性,anti-affinity)
  • 服務管理:實作命名和版本化服務的概念,這個概念可以直接映射到微服務架構中的具體服務。編排架構確定始終運作所需數量的正常執行個體。它實作請求的負載均衡。編排架構也可以執行服務的滾動更新,并允許你復原到舊版本。

Kubernetes架構

開發人員如何了解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的一種形式。

開發人員如何了解kubernetes

以上,希望對你有所幫助!