一、重要概念
1.1 基礎(chǔ)
1、為了保證k8s的穩(wěn)定,和其他的應(yīng)用一樣,我們會搭建k8s集群。
2、k8s集群管理我們發(fā)布的容器。
3、k8s是通過pod管理容器的:將共享一些資源和端口的容器放到同一個pod中,然后負責(zé)pod的創(chuàng)建和部署。
4、k8s部署pod的方式:選擇一個node(就是節(jié)點,也可以理解為主機),將pod部署上去。
5、k8s將node進行分類,一類的在同一個service中
1.2 補充
- k8s集群
為了保證k8s的運行正常,一般會搭建k8s集群 - deployment
在集群中,需要搭建deployment,用來創(chuàng)建和管理pod - pod
創(chuàng)建或部署的最小/最簡單的基本單位。
pod可以有多個容器(容器就是我們部署的,一般用docker作為容器),他們常會共享一些資源和端口空間。
同時,pod是有生命周期的。當(dāng)一個工作節(jié)點(Node)銷毀時,節(jié)點上運行的Pod也會銷毀,然后通過ReplicationController動態(tài)創(chuàng)建新的Pods來保持應(yīng)用的運行。 - node
node可以是虛擬機、物理機。pod創(chuàng)建后,會被部署到不同的node上面。
二、組件
本文介紹了Kubernetes集群所需的各種二進制組件。
2.1 Master 組件
Master組件提供集群的管理控制中心。
Master組件可以在集群中任何節(jié)點上運行。但是為了簡單起見,通常在一臺VM/機器上啟動所有Master組件,并且不會在此VM/機器上運行用戶容器。請參考 構(gòu)建高可用群集以來構(gòu)建multi-master-VM。
kube-apiserver
kube-apiserver用于暴露Kubernetes API。任何的資源請求/調(diào)用操作都是通過kube-apiserver提供的接口進行。請參閱構(gòu)建高可用群集。
ETCD
etcd是Kubernetes提供默認的存儲系統(tǒng),保存所有集群數(shù)據(jù),使用時需要為etcd數(shù)據(jù)提供備份計劃。
kube-controller-manager
kube-controller-manager運行管理控制器,它們是集群中處理常規(guī)任務(wù)的后臺線程。邏輯上,每個控制器是一個單獨的進程,但為了降低復(fù)雜性,它們都被編譯成單個二進制文件,并在單個進程中運行。
這些控制器包括:
- 節(jié)點(Node)控制器。
- 副本(Replication)控制器:負責(zé)維護系統(tǒng)中每個副本中的pod。
- 端點(Endpoints)控制器:填充Endpoints對象(即連接Services&Pods)。
- Service Account和Token控制器:為新的Namespace 創(chuàng)建默認帳戶訪問API Token。
- cloud-controller-manager
云控制器管理器負責(zé)與底層云提供商的平臺交互。云控制器管理器是Kubernetes版本1.6中引入的,目前還是Alpha的功能。
云控制器管理器僅運行云提供商特定的(controller loops)控制器循環(huán)??梢酝ㄟ^將—cloud-provider flag設(shè)置為external啟動kube-controller-manager ,來禁用控制器循環(huán)。
cloud-controller-manager 具體功能:
節(jié)點(Node)控制器
路由(Route)控制器
Service控制器
卷(Volume)控制器
kube-scheduler
kube-scheduler 監(jiān)視新創(chuàng)建沒有分配到Node的Pod,為Pod選擇一個Node。
插件 addons
插件(addon)是實現(xiàn)集群pod和Services功能的 。Pod由Deployments,ReplicationController等進行管理。Namespace 插件對象是在kube-system Namespace中創(chuàng)建。
DNS
雖然不嚴格要求使用插件,但Kubernetes集群都應(yīng)該具有集群 DNS。
群集 DNS是一個DNS服務(wù)器,能夠為 Kubernetes services提供 DNS記錄。
由Kubernetes啟動的容器自動將這個DNS服務(wù)器包含在他們的DNS searches中。
用戶界面
kube-ui提供集群狀態(tài)基礎(chǔ)信息查看。更多詳細信息,請參閱使用HTTP代理訪問Kubernetes API
容器資源監(jiān)測
容器資源監(jiān)控提供一個UI瀏覽監(jiān)控數(shù)據(jù)。
Cluster-level Logging
Cluster-level logging,負責(zé)保存容器日志,搜索/查看日志。
2.2 節(jié)點(Node)組件
節(jié)點組件運行在Node,提供Kubernetes運行時環(huán)境,以及維護Pod。
kubelet
kubelet是主要的節(jié)點代理,它會監(jiān)視已分配給節(jié)點的pod,具體功能:
安裝Pod所需的volume。
下載Pod的Secrets。
Pod中運行的 docker(或experimentally,rkt)容器。
定期執(zhí)行容器健康檢查。
Reports the status of the pod back to the rest of the system, by creating a mirror pod if necessary.
Reports the status of the node back to the rest of the system.
kube-proxy
kube-proxy通過在主機上維護網(wǎng)絡(luò)規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā)來實現(xiàn)Kubernetes服務(wù)抽象。
docker
docker用于運行容器。
RKT
rkt運行容器,作為docker工具的替代方案。
supervisord
supervisord是一個輕量級的監(jiān)控系統(tǒng),用于保障kubelet和docker運行。
fluentd
fluentd是一個守護進程,可提供cluster-level logging.。
三、pod詳解
Kubernetes中的Pod使用可分兩種主要方式:
- Pod中運行一個容器?!皁ne-container-per-Pod”模式是Kubernetes最常見的用法; 在這種情況下,你可以將Pod視為單個封裝的容器,但是Kubernetes是直接管理Pod而不是容器。
- Pods中運行多個需要一起工作的容器。Pod可以封裝緊密耦合的應(yīng)用,它們需要由多個容器組成,它們之間能夠共享資源,這些容器可以形成一個單一的內(nèi)部service單位 - 一個容器共享文件,另一個“sidecar”容器來更新這些文件。Pod將這些容器的存儲資源作為一個實體來管理。
請注意,在單個Pod中共同管理多個容器是一個相對高級的用法,應(yīng)該只有在容器緊密耦合的特殊實例中使用此模式。
網(wǎng)絡(luò)
每個Pod被分配一個獨立的IP地址,Pod中的每個容器共享網(wǎng)絡(luò)命名空間,包括IP地址和網(wǎng)絡(luò)端口。Pod內(nèi)的容器可以使用localhost相互通信。當(dāng)Pod中的容器與Pod 外部通信時,他們必須協(xié)調(diào)如何使用共享網(wǎng)絡(luò)資源(如端口)。
存儲
Pod可以指定一組共享存儲volumes。Pod中的所有容器都可以訪問共享volumes,允許這些容器共享數(shù)據(jù)。volumes 還用于Pod中的數(shù)據(jù)持久化,以防其中一個容器需要重新啟動而丟失數(shù)據(jù)。有關(guān)Kubernetes如何在Pod中實現(xiàn)共享存儲的更多信息,請參考Volumes。
使用Pod
你很少會直接在kubernetes中創(chuàng)建單個Pod。因為Pod的生命周期是短暫的,用后即焚的實體。當(dāng)Pod被創(chuàng)建后(不論是由你直接創(chuàng)建還是被其他Controller),都會被Kuberentes調(diào)度到集群的Node上。直到Pod的進程終止、被刪掉、因為缺少資源而被驅(qū)逐、或者Node故障之前這個Pod都會一直保持在那個Node上。
注意:重啟Pod中的容器跟重啟Pod不是一回事。Pod只提供容器的運行環(huán)境并保持容器的運行狀態(tài),重啟容器不會造成Pod重啟。
Pod不會自愈。如果Pod運行的Node故障,或者是調(diào)度器本身故障,這個Pod就會被刪除。同樣的,如果Pod所在Node缺少資源或者Pod處于維護狀態(tài),Pod也會被驅(qū)逐。Kubernetes使用更高級的稱為Controller的抽象層,來管理Pod實例。雖然可以直接使用Pod,但是在Kubernetes中通常是使用Controller來管理Pod的。
Pod和Controller
Controller可以創(chuàng)建和管理多個Pod,提供副本管理、滾動升級和集群級別的自愈能力。例如,如果一個Node故障,Controller就能自動將該節(jié)點上的Pod調(diào)度到其他健康的Node上。
包含一個或者多個Pod的Controller示例:
Deployment
StatefulSet
DaemonSet
通常,Controller會用你提供的Pod Template來創(chuàng)建相應(yīng)的Pod。
Pod模板
Pod模板是包含了其他對象(如Replication Controllers,Jobs和 DaemonSets)中的pod定義 。Controllers控制器使用Pod模板來創(chuàng)建實際需要的pod。
pod模板類似cookie cutters?!耙坏╋灨杀磺械簦灨珊偷秾]有關(guān)系”。隨后對模板的后續(xù)更改甚至切換到新模板對已創(chuàng)建的pod并沒有任何的影響。
四、deployment詳解
Deployment為Pod和Replica Set(升級版的 Replication Controller)提供聲明式更新。
你只需要在 Deployment 中描述您想要的目標狀態(tài)是什么,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態(tài)改變到您的目標狀態(tài)。您可以定義一個全新的 Deployment 來創(chuàng)建 ReplicaSet 或者刪除已有的 Deployment 并創(chuàng)建一個新的來替換。
注意:您不該手動管理由 Deployment 創(chuàng)建的 Replica Set,否則您就篡越了 Deployment controller 的職責(zé)!下文羅列了 Deployment 對象中已經(jīng)覆蓋了所有的用例。如果未有覆蓋您所有需要的用例,請直接在 Kubernetes 的代碼庫中提 issue。
典型的用例如下:文章來源:http://www.zghlxwxcb.cn/news/detail-443961.html
- 使用Deployment來創(chuàng)建ReplicaSet。ReplicaSet在后臺創(chuàng)建pod。檢查啟動狀態(tài),看它是成功還是失敗。
- 然后,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會創(chuàng)建一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。
- 如果當(dāng)前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision。
- 擴容Deployment以滿足更高的負載。
- 暫停Deployment來應(yīng)用PodTemplateSpec的多個修復(fù),然后恢復(fù)上線。
- 根據(jù)Deployment 的狀態(tài)判斷上線是否hang住了。
- 清除舊的不必要的 ReplicaSet。
四、Deployments詳解
Deployment為Pod和Replica Set(升級版的 Replication Controller)提供聲明式更新。
你只需要在 Deployment 中描述您想要的目標狀態(tài)是什么,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態(tài)改變到您的目標狀態(tài)。您可以定義一個全新的 Deployment 來創(chuàng)建 ReplicaSet 或者刪除已有的 Deployment 并創(chuàng)建一個新的來替換。
注意:您不該手動管理由 Deployment 創(chuàng)建的 Replica Set,否則您就篡越了 Deployment controller 的職責(zé)!下文羅列了 Deployment 對象中已經(jīng)覆蓋了所有的用例。如果未有覆蓋您所有需要的用例,請直接在 Kubernetes 的代碼庫中提 issue。
典型的用例如下:
使用Deployment來創(chuàng)建ReplicaSet。ReplicaSet在后臺創(chuàng)建pod。檢查啟動狀態(tài),看它是成功還是失敗。
然后,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態(tài)。這會創(chuàng)建一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。
如果當(dāng)前狀態(tài)不穩(wěn)定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision。
擴容Deployment以滿足更高的負載。
暫停Deployment來應(yīng)用PodTemplateSpec的多個修復(fù),然后恢復(fù)上線。
根據(jù)Deployment 的狀態(tài)判斷上線是否hang住了。
清除舊的不必要的 ReplicaSet。文章來源地址http://www.zghlxwxcb.cn/news/detail-443961.html
到了這里,關(guān)于kubernetes(k8s)——使用教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!