Kubernetes:核心概念

  • 2019 年 12 月 4 日
  • 筆記

最初在Medium上發布。

https://medium.com/yld-engineering-blog/kubernetes-core-concepts-324ea7028c29

作者:Tom Gallacher, YLD工程師

不需要很難

掌握Kubernetes是非常困難的,因為有如此多的資訊漂浮在互聯網的海洋上,有時很難找到理解Kubernetes的「核心」資訊,尤其是當看到Kubernetes.io的概念頁和文檔上的資訊多麼密集時。在這個「Kubernetes」部落格系列的第一部分中,我們將探索Kubernetes的核心概念,以獲得基本的知識,這樣我們就可以一起揭開Kubernetes的神秘面紗。

Kubernetes是什麼?

Kubernetes提供了基本基礎和構建塊,為你的團隊構建一個可用於開發和發布的可用平台。

用戶可以通過圖形用戶介面,以及命令式和聲明式命令行介面管理Kubernetes集群,旨在管理你的容器化應用程式和服務的整個生命周期。

可以上下伸縮應用程式、執行滾動部署並管理哪些服務應該響應某些請求。它還提供了一個可擴展的開發框架,允許你的團隊擴展核心kubernetes基本功能,直到他們高興為止!以及創建自己概念的選項。

但是,與大多數框架一樣,它的缺點之一是缺少了許多現成的功能,無法分類作為一站式解決方案。在標準發行版中,它不包含關於服務如何相互通訊的方法(甚至不包含網路組件!),但有其他發行版存在,你也可以構建自己的發行版。

容器(Container)

容器是一個獨立的、可執行的軟體,它包含運行容器所需的所有內容。例如程式碼、庫和任何外部依賴項。它確保運行的內容是相同的,即使運行在不同的環境中也是如此。這是通過將運行程式碼與其執行環境隔離來實現的。

這在Linux中是通過使用稱為cgroup的API來分割Linux內核的子集來實現的。這提供了與作業系統的高度隔離,但沒有虛擬化環境運行時性能的影響,如VMWare、KVM等。

Pod

Pod是Kubernetes中最基本的物件。

Pod是容器的集合,共享存儲和網路,有關於如何運行它們的規範。每個Pod獲分配自己的IP地址。Pod中的容器共享這個IP地址、埠空間,並且可以通過localhost彼此查找。

Pod應該被看作是短暫的基本功能。

Replicaset

一個replicaset根據提供的模板運行n個Pod。

Replicaset不被直接使用,但是需要理解該資源,因為它是用於在Kubernetes上構建應用程式的基本構建。

Replicaset可以(在指示下)按比例增加或減少所需的Pod數量。

服務(Service)

由於Pod是短暫的(Replicaset通過上下伸Pod的數量來實現這一點),就出現了一個問題;現在,如果沒有跟蹤拓撲變化的複雜邏輯,幾乎不可能引用單個pod。

服務通過提供對Pod的抽象和提供與Pod通訊的可定址方法來解決這個問題。

服務在OSI模型中「第4層」(IP上的TCP/UDP)操作。

部署(Deployment)

部署管理Replicaset,並可用於在應用程式的不同版本之間運行滾動升級。

這是最常用的資源類型,它通過一個介面提供了對Replicaset和Pod的抽象。

在更新此部署的情況下,也就是說,部署應用程式的新版本,部署控制器將創建一個新的Replicaset,並管理從舊版本到新版本的滾動升級。

在Kubernetes 1.11發行版中,部署目前不自動處理回滾。

ConfigMap

設計良好的應用程式應該遵循12因素的應用程式聲明,對於應用程式的配置,應該將配置存儲在「環境」中。儘管現在常見的安全實踐指出,在環境中存儲配置可能會導致機密的意外泄漏,因為一些應用程式在失敗時拋出了它們的環境,但是配置應該與構建的應用程式分開存儲,因為每個環境都有配置更改。(開發、臨時、生產)。

ConfigMap允許將配置文件作為環境變數或文件系統掛載到Pod中,從而解決了這個問題。

秘密(Secret)

Secret非常類似於ConfigMap,它們跟名稱一樣,是「秘密」[1][2][3][4]。

Daemonset

Daemonset確保所有節點運行特定的Pod。這對於在所有節點上運行諸如fluentd之類的日誌代理非常有用。

也可以通過使用污點(Taint)略過某些節點。

入口(Ingress)

在大多數情況下,服務和Pod的IP地址只能從Kubernetes集群中訪問。服務與互聯網流量隔離。

「入口是允許入站連接到達集群服務的規則集合。」

它可以用於負載平衡、終止TLS、提供外部可路由URL等等。一個入口只是另一個Kubernetes資源,然而,在大多數情況下,它需要有一個入口控制器(Ingress Controller)像Nginx或Træfik等。


Kubernetes是一個用於自動化容器編排的平台,使應用程式能夠在大量平台上大規模運行,這些平台可以包含處理器體系結構和作業系統的組合,由實現者決定。


使用這些核心概念,Kubernetes可以將Pod編排到適當的節點上,由Kubernetes實現多種演算法(如Bin Packing)來控制,以確保Pod的最大密度,從而實現更高的硬體容量利用率。


[1] https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-68d061f7ab5b

[2] https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-part-2-3dc37111f0dc

[3] https://kubernetes.io/docs/concepts/configuration/secret/

[4] https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/

作者:Tom Gallacher – YLD工程師。