上一篇介紹了用kubeadm安裝k8s集群,能把k8s安裝起來是開始學習和實踐的第一步。
集群安裝好了,今天我們來簡單介紹下k8s的基礎實踐,并在實踐中介紹基本概念。
Kubernetes 對象包含哪些?
在 Kubernetes 系統(tǒng)中,Kubernetes 對象是持久化的實體。Kubernetes 使用這些實體去表示整個集群的狀態(tài)。也許你覺得這句話很抽象,說人話,對象用來描述以下的一些信息:
- 哪些容器化應用在運行(以及在哪個 Node 上)
- 可以被應用使用的資源
- 關于應用運行時表現(xiàn)的策略,比如重啟策略、升級策略,以及容錯策略
操作 Kubernetes 對象 —— 無論是創(chuàng)建、修改,或者刪除 —— 需要使用 Kubernetes API。比如,當使用 kubectl 命令行接口時,CLI 會執(zhí)行必要的 Kubernetes API 調(diào)用,也可以在程序中直接調(diào)用 Kubernetes API。
例如用kubectl查看集群所有的節(jié)點(節(jié)點就是一個k8s對象),執(zhí)行以下命令:
kubectl get node
Kubernetes對象包含:
Node
Node 是 Kubernetes 的工作節(jié)點,以前叫做 minion。取決于你的集群,Node 可以是一個虛擬機或者物理機器。每個 node 都有用于運行 pods 的必要服務,并由 master 組件管理。Node 上的服務包括 Docker、kubelet 和 kube-proxyPod
Pod 是 Kubernetes 的基本構建塊,它是 Kubernetes 對象模型中創(chuàng)建或部署的最小和最簡單的單元。 Pod 表示集群上正在運行的進程。Replication Controller
ReplicationController 確保在任何時候都有特定數(shù)量的 pod 副本處于運行狀態(tài)。 換句話說,ReplicationController 確保一個 pod 或一組同類的 pod 總是可用的。現(xiàn)在推薦使用配置 ReplicaSet 的 Deployment 來建立副本管理機制。ReplicaSet
ReplicaSet 是下一代的 Replication Controller。 ReplicaSet 和 Replication Controller 的唯一區(qū)別是選擇器的支持。ReplicaSet 支持新的基于集合的選擇器需求,這在標簽用戶指南中有描述。而 Replication Controller 僅支持基于相等選擇器的需求。Deployments
Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新。 Deployment 中描述您想要的目標狀態(tài)是什么,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態(tài)改變到您的目標狀態(tài)。-
StatefulSet
StatefulSet 剛開始接觸有點不好理解,她用來管理 Deployment 和擴展一組 Pod,并且能為這些 Pod 提供序號和唯一性保證。
StatefulSet是為了解決有狀態(tài)服務的問題(對應Deployments和ReplicaSets是為無狀態(tài)服務而設計),其應用場景包括:- 穩(wěn)定的持久化存儲,即Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)
- 穩(wěn)定的網(wǎng)絡標志,即Pod重新調(diào)度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實現(xiàn)
- 有序部署(比如服務啟動需要依賴其他服務已經(jīng)啟動),有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據(jù)定義的順序依次依次進行(即從0到N-1,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態(tài)),基于init containers來實現(xiàn)
- 有序收縮,有序刪除(即從N-1到0)
DaemonSet
DaemonSet 確保全部(或者某些)節(jié)點上運行一個 Pod 的副本。當有節(jié)點加入集群時,該控制器會自動部署對應Pod或服務。比如在每個節(jié)點上運行監(jiān)控 daemon: Prometheus Node ExporterJob
Job負責批處理任務,即僅執(zhí)行一次的任務,它保證批處理任務的一個或多個Pod成功結束CronJob
Cron Job 管理基于時間的 Job,如:在給定時間點只運行一次或周期性地在給定時間點運行。Volumes
存儲和網(wǎng)絡是k8s中比較難的部分。
我們知道docker容器中的文件在磁盤上是臨時存放的,這給容器中運行的特殊應用程序帶來一些問題。 首先,當容器崩潰時,kubelet 將重新啟動容器,容器中的文件將會丟失——因為容器會以干凈的狀態(tài)重建。 其次,當在一個 Pod 中同時運行多個容器時,常常需要在這些容器之間共享文件,所以Kubernetes 抽象出 Volume 對象來解決這兩個問題。k8s的存儲和docker的volumes不是同一個概念,docker的volume僅僅是掛載docker容器所在的主機的磁盤路徑。而k8s是一組抽象的定義,volumes由不同的存儲class插件來實現(xiàn)。下面是詳細介紹
Kubernetes 支持下列類型的卷:awsElasticBlockStore
azureDisk
azureFile
cephfs
configMap
csi
downwardAPI
emptyDir
fc (fibre channel)
flocker
gcePersistentDisk
gitRepo (deprecated)
glusterfs
hostPath
iscsi
local
nfs
persistentVolumeClaim
projected
portworxVolume
quobyte
rbd
scaleIO
secret
storageos
vsphereVolume
PV & PVC
PersistentVolume 子系統(tǒng)為用戶和管理員提供了一個 API,該 API 將如何提供存儲的細節(jié)抽象了出來。為此,我們引入兩個新的 API 資源:PersistentVolume 和 PersistentVolumeClaim。
PersistentVolume(PV)是由管理員設置的存儲,它是群集的一部分。就像節(jié)點是集群中的資源一樣,PV 也是集群中的資源。 PV 是 Volume 之類的卷插件,但具有獨立于使用 PV 的 Pod 的生命周期。此 API 對象包含存儲實現(xiàn)的細節(jié),即 NFS、iSCSI 或特定于云供應商的存儲系統(tǒng)。
PersistentVolume 子系統(tǒng)為用戶和管理員提供了一個 API,該 API 將如何提供存儲的細節(jié)抽象了出來。為此,我們引入兩個新的 API 資源:PersistentVolume 和 PersistentVolumeClaim。
PersistentVolume(PV)是由管理員設置的存儲,它是群集的一部分。就像節(jié)點是集群中的資源一樣,PV 也是集群中的資源。 PV 是 Volume 之類的卷插件,但具有獨立于使用 PV 的 Pod 的生命周期。此 API 對象包含存儲實現(xiàn)的細節(jié),即 NFS、iSCSI 或特定于云供應商的存儲系統(tǒng)。
PersistentVolumeClaim(PVC)是用戶存儲的請求。它與 Pod 相似。Pod 消耗節(jié)點資源,PVC 消耗 PV 資源。Pod 可以請求特定級別的資源(CPU 和內(nèi)存)。聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或 只讀多次模式掛載)。PersistentVolumeClaim(PVC)是用戶存儲的請求。它與 Pod 相似。Pod 消耗節(jié)點資源,PVC 消耗 PV 資源。Pod 可以請求特定級別的資源(CPU 和內(nèi)存)。聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或 只讀多次模式掛載)。
Secret
Secret解決了密碼、token、密鑰等敏感數(shù)據(jù)的配置問題,而不需要把這些敏感數(shù)據(jù)暴露到鏡像或者Pod Spec中。Secret可以以Volume或者環(huán)境變量的方式使用。
Secret有三種類型:
- Service Account :用來訪問Kubernetes API,由Kubernetes自動創(chuàng)建,并且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中;
- Opaque :base64編碼格式的Secret,用來存儲密碼、密鑰等;
- kubernetes.io/dockerconfigjson :用來存儲私有docker registry的認證信息。
ConfigMap
ConfigMap API資源用來保存key-value pair配置數(shù)據(jù),這個數(shù)據(jù)可以在pods里使用,或者被用來為像controller一樣的系統(tǒng)組件存儲配置數(shù)據(jù)。雖然ConfigMap跟Secrets類似,但是ConfigMap更方便的處理不含敏感信息的字符串。 注意:ConfigMaps不是屬性配置文件的替代品。
網(wǎng)絡、服務和負載均衡
前面已經(jīng)講過,網(wǎng)絡是比較難的部分。網(wǎng)絡部分包含服務、負載均衡等。理解K8S集群服務的概念,是比較不容易的一件事情。這部分我們下篇文章再聊。