--- title: Study notes of kube by example --- ## [TOC] ## Pods `共同一個網路的containers集合,是k8s的基本部署單元,在一個pod的所有containers都被安排在相同的node` ## Labels `用來組織k8s物件的機制,一個label是一個有長度和允許值限制的鍵值對,但沒有任何預定義的含義,可以自由選擇合適的label,例如表達pod的運作環境環境或所有權。` ## Deployments `是pod的監督者,用來控制pod如何與何時進行更版或還原。` ## Services `一個服務是pod的抽象,提供一個穩定的virtual IP (VIP) 位址,當pods各自有不同的IP而且隨著重新建立而改動,一個服務允許clients使用VIP可靠地連接到pod中的containers。使用virtual這個字是因為它不是一個連接到網路介面的真實IP位址,它的用途單純是用來轉發流量到一個或多個pods。保持VIP和pods對應的更新是kube-proxy的工作,每個節點都需要運行kube-proxy,它透過API伺服器查詢在cluster中的新服務` ## Port Forwarding `開發在k8s中的應用程式時,若能夠快速存取在本地端的服務而不用將它暴露出來,這通常很有用,例如使用負載平衡或ingress資源 (resource),在這些情況下可以使用連接埠轉發 (port forwarding)。` ## Health Checks `為了驗證在一個pod中的一個container是健康而且已準備好提供流量,k8s提供了一系統的健康檢查機制。健康檢查,在k8s又叫探針 (probes),由kubelet運行,liveness probes決定何時可以重啟container,readiness probes被services和deployments使用來決定一個pod是否應該接收流量。這裡將會專注在HTTP的健康檢查,請注意開發人員有責任提供一個URL讓kubelet可以使用來決定是否container的健康與否,並且已準備就緒` ## Environment Variables `可以為在一個pod中運行的containers設定環境變數,而且k8s也會自動將某些運行環境的參數透過環境變數暴露出來。` ## Namespaces `命名空間為k8s的資源提供一個範圍,將叢集劃分為更小的單位。可以把它當成一個與其他使用者的工作空間,很多資源包括pods、services都能設定命名空間,無法設定命名空間的,將視為叢集範圍的。作為開發者,你通常會使用一個被指派的命名空間;對於管理者而言,通常會想要管理它們,例如存取控制與資源配額。` ## Volumes `k8s的volume本質上是在一個pod中所有運行中的containers都能存取的目錄;相較於container-local的檔案系統,在volume的資料可以在container重啟時保留。一個volume的媒介和內容由volume類型而定: node-local => emptyDir or hostPath file-sharing => nfs cloud provicer-specific => awsElasticBlockStore、azureDisk、gcePersistentDisk distributed file system => glusterfs、cephfs special-purpose => secret、gitRepo ` ## Persistent Volumes `一個persistent volume是叢集範圍的資源,可以用來保存超過一個pod生命週期的資料,一個PV不是由連接於一個worker node的本地儲存器所支持,而是由網路儲存系統,像是EBS、NFS;或者分散式檔案系統,像是Ceph。` ## Secrets `敏感性資料像是資料庫密碼或者是API金鑰不能以明文形式儲存,Secrets提供一個安全可靠的機制儲存這類型的資料,有以下性質: Secrets是命名空間範圍的物件,可以存在於一個特定命名空間。 可以透過volume或運行於pod的container環境變數存取 在nodes上的secret資料被儲存於tmpfs volumes 每個secret存在1MB的大小限制 API server以明碼儲存secret於etcd中` ## Logging `記錄是一個用來了解在應用程式內部至整個cluster中發生事情的選項,在k8s中基本的記錄是一個container產生的輸出,可以透過kubectl工具獲得;較進階的設定會考量跨nodes的記錄,並且將記錄儲存於中心位置,可以是在cluster內部或者是透過專用基於雲的服務。` ## Jobs `在k8s中的一個job是對運行一段時間到完成的pod的監督者,例如運算或備份操作` ## Nodes `在k8s中,nodes是運行工作負載的機器 (可能是虛擬的),作為一個開發者,你不會想要直接處理nodes,然而對於管理者來說,你必須熟悉nodes的操作。`