您好,登錄后才能下訂單哦!
Pod是一組緊密關(guān)聯(lián)的容器集合,支持多個容器在一個Pod 里共 享網(wǎng)絡(luò)和文件系統(tǒng),可以通過進(jìn)程間通信和文件共享這種簡單高效的方式完成服務(wù),是Kubernetes調(diào)度的基本單位。 Pod的設(shè)計理念是 每個Pod都有一個唯一的IP。
Pod具有如下特征:
容器生命周期鉤子函數(shù),用于監(jiān)聽容器生命周期的特定事件,并在事件發(fā)生時執(zhí)行已注冊的回調(diào)函數(shù),支持兩種鉤子函數(shù):postStart和preStop,前者是在容器啟動后執(zhí)行,后者是在容器停止前執(zhí)行
Namespace(命名空間)是對一組資源和對象的抽象集合,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項(xiàng)目組或者用戶組。常見的pod、service、replicaSet和deployment等都是屬于某一個namespace的(默認(rèn)是default),而node, persistentVolumes等則不屬于任何namespace。
常用namespace操作:
# 查詢所有namespaces kubectl get namespace # 創(chuàng)建namespace kubectl create namespace ns-name # 刪除namespace kubectl delete namespace ns-name
刪除命名空間時,需注意以下幾點(diǎn):
Events是否屬于namespace取決于產(chǎn)生events的對象。
Node是Pod真正運(yùn)行的主機(jī),可以是物理機(jī)也可以是虛擬機(jī)。Node本質(zhì)上不是Kubernetes來創(chuàng)建的, Kubernetes只是管理Node上的資源。為了管理Pod,每個Node節(jié)點(diǎn)上至少需要運(yùn)行container runtime(Docker)、kubelet和kube-proxy服務(wù)。
常用node操作:
# 查詢所有node kubectl get nodes # 將node標(biāo)志為不可調(diào)度 kubectl cordon $nodename # 將node標(biāo)志為可調(diào)度 kubectl uncordon $nodename
taint(污點(diǎn))
使用kubectl taint命令可以給某個Node節(jié)點(diǎn)設(shè)置污點(diǎn),Node被設(shè)置上污點(diǎn)之后就和Pod之間存在了一種相斥的關(guān)系,可以讓Node拒絕Pod的調(diào)度執(zhí)行,甚至將Node已經(jīng)存在的Pod驅(qū)逐出去。每個污點(diǎn)的組成:
key=value:effect
,當(dāng)前taint effect支持如下三個選項(xiàng):
常用命令如下:
# 為節(jié)點(diǎn)node0設(shè)置不可調(diào)度污點(diǎn) kubectl taint node node0 key1=value1:NoShedule # 將node0上key值為key1的污點(diǎn)移除 kubectl taint node node0 key- # 為kube-master節(jié)點(diǎn)設(shè)置不可調(diào)度污點(diǎn) kubectl taint node node1 node-role.kubernetes.io/master=:NoSchedule # 為kube-master節(jié)點(diǎn)設(shè)置盡量不可調(diào)度污點(diǎn) kubectl taint node node1 node-role.kubernetes.io/master=PreferNoSchedule
容忍(Tolerations)
設(shè)置了污點(diǎn)的Node將根據(jù)taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之間產(chǎn)生互斥的關(guān)系,Pod將在一定程度上不會被調(diào)度到Node上。 但我們可以在Pod上設(shè)置容忍(Toleration),意思是設(shè)置了容忍的Pod將可以容忍污點(diǎn)的存在,可以被調(diào)度到存在污點(diǎn)的Node上。
Service是對一組提供相同功能的Pods的抽象,并為他們提供一個統(tǒng)一的入口,借助 Service 應(yīng)用可以方便的實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)與負(fù)載均衡,并實(shí)現(xiàn)應(yīng)用的零宕機(jī)升級。 Service通過標(biāo)簽(label)來選取后端Pod,一般配合ReplicaSet或者Deployment來保證后端容器的正常運(yùn)行。
service 有如下四種類型,默認(rèn)是ClusterIP:
NodeIP:NodePort
來訪問該服務(wù)另外,也可以將已有的服務(wù)以Service的形式加入到Kubernetes集群中來,只需要在創(chuàng)建 Service 的時候不指定Label selector,而是在Service創(chuàng)建好后手動為其添加endpoint。
默認(rèn)情況下容器的數(shù)據(jù)是非持久化的,容器消亡以后數(shù)據(jù)也會跟著丟失,所以Docker提供了Volume機(jī)制以便將數(shù)據(jù)持久化存儲。Kubernetes提供了更強(qiáng)大的Volume機(jī)制和插件,解決了容器數(shù)據(jù)持久化以及容器間共享數(shù)據(jù)的問題。
Kubernetes存儲卷的生命周期與Pod綁定
目前Kubernetes主要支持以下Volume類型:
...
PersistentVolume(PV)是集群之中的一塊網(wǎng)絡(luò)存儲。跟 Node 一樣,也是集群的資源。PersistentVolume (PV)和PersistentVolumeClaim (PVC)提供了方便的持久化卷: PV提供網(wǎng)絡(luò)存儲資源,而PVC請求存儲資源并將其掛載到Pod中。
PV的訪問模式(accessModes)有三種:
不是每一種存儲都支持這三種方式,像共享方式,目前支持的還比較少,比較常用的是 NFS。在PVC綁定PV時通常根據(jù)兩個條件來綁定,一個是存儲的大小,另一個就是 訪問模式。
PV的回收策略(persistentVolumeReclaimPolicy)也有三種
Delete,刪除存儲資源
一般情況下我們不需要手動創(chuàng)建Pod實(shí)例,而是采用更高一層的抽象或定義來管理Pod,針對無狀態(tài)類型的應(yīng)用,Kubernetes使用Deloyment的Controller對象與之對應(yīng)。其典型的應(yīng)用場景包括:
常用的操作命令如下:
# 生成一個Deployment對象 kubectl run www --image=10.0.0.183:5000/hanker/www:0.0.1 --port=8080 # 查找Deployment kubectl get deployment --all-namespaces # 查看某個Deployment kubectl describe deployment www # 編輯Deployment定義 kubectl edit deployment www # 刪除某Deployment kubectl delete deployment www # 擴(kuò)縮容操作,即修改Deployment下的Pod實(shí)例個數(shù) kubectl scale deployment/www --replicas=2 # 更新鏡像 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 # 回滾操作 kubectl rollout undo deployment/nginx-deployment # 查看回滾進(jìn)度 kubectl rollout status deployment/nginx-deployment # 啟用水平伸縮(HPA - horizontal pod autoscaling),設(shè)置最小、最大實(shí)例數(shù)量以及目標(biāo)cpu使用率 kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 # 暫停更新Deployment kubectl rollout pause deployment/nginx-deployment # 恢復(fù)更新Deployment kubectl rollout resume deploy nginx
更新策略
.spec.strategy
指新的Pod替換舊的Pod的策略,有以下兩種類型
RollingUpdate
滾動升級,可以保證應(yīng)用在升級期間,對外正常提供服務(wù)。Recreate
重建策略,在創(chuàng)建出新的Pod之前會先殺掉所有已存在的Pod。Deployment和ReplicaSet兩者之間的關(guān)系
當(dāng)執(zhí)行更新操作時,會創(chuàng)建一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移 動到新的ReplicaSet中
Deployments和ReplicaSets是為無狀態(tài)服務(wù)設(shè)計的,那么StatefulSet則是為了有狀態(tài)服務(wù)而設(shè)計,其應(yīng)用場景包括:
支持兩種更新策略:
.spec.template
更新時,并不立即刪除舊的Pod,而是等待用戶手動刪除這些舊Pod后自動創(chuàng)建新Pod。這是默認(rèn)的更新策略,兼容v1.6版本的行為.spec.template
更新時,自動刪除舊的Pod并創(chuàng)建新Pod替換。在更新時這些Pod是按逆序的方式進(jìn)行,依次刪除、創(chuàng)建并等待Pod變成Ready狀態(tài)才進(jìn)行下一個Pod的更新。9 DaemonSet 守護(hù)進(jìn)程集
DaemonSet保證在特定或所有Node節(jié)點(diǎn)上都運(yùn)行一個Pod實(shí)例,常用來部署一些集群的日志采集、監(jiān)控或者其他系統(tǒng)管理應(yīng)用。典型的應(yīng)用包括:
指定Node節(jié)點(diǎn)
目前支持兩種策略*
RollingUpdate: 更新DaemonSet模版后,自動刪除舊的Pod并創(chuàng)建新的Pod
Kubernetes中的負(fù)載均衡我們主要用到了以下兩種機(jī)制:
Service和Pod的IP僅可在集群內(nèi)部訪問。集群外部的請求需要通過負(fù)載均衡轉(zhuǎn)發(fā)到service所在節(jié)點(diǎn)暴露的端口上,然后再由kube-proxy通過邊緣路由器將其轉(zhuǎn)發(fā)到相關(guān)的Pod,Ingress可以給service提供集群外部訪問的URL、負(fù)載均衡、HTTP路由等,為了配置這些Ingress規(guī)則,集群管理員需要部署一個Ingress Controller,它監(jiān)聽Ingress和service的變化,并根據(jù)規(guī)則配置負(fù)載均衡并提供訪問入口。
常用的ingress controller:
Openresty
Job負(fù)責(zé)批量處理短暫的一次性任務(wù) (short lived one-off tasks),即僅執(zhí)行一次的任務(wù),它保證批處理任務(wù)的一個或多個Pod成功結(jié)束。
CronJob即定時任務(wù),就類似于Linux系統(tǒng)的crontab,在指定的時間周期運(yùn)行指定的任務(wù)。
Horizontal Pod Autoscaling可以根據(jù)CPU、內(nèi)存使用率或應(yīng)用自定義metrics自動擴(kuò)展Pod數(shù)量 (支持replication controller、deployment和replica set)。
支持三種metrics類型
可以通過如下命令創(chuàng)建HPA:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
Service account是為了方便Pod里面的進(jìn)程調(diào)用Kubernetes API或其他外部服務(wù)而設(shè)計的
授權(quán)
Service Account為服務(wù)提供了一種方便的認(rèn)證機(jī)制,但它不關(guān)心授權(quán)的問題??梢耘浜蟁BAC(Role Based Access Control)來為Service Account鑒權(quán),通過定義Role、RoleBinding、ClusterRole、ClusterRoleBinding來對sa進(jìn)行授權(quán)。
Sercert-密鑰解決了密碼、token、密鑰等敏感數(shù)據(jù)的配置問題,而不需要把這些敏感數(shù)據(jù)暴露到鏡像或者Pod Spec中。Secret可以以Volume或者環(huán)境變量的方式使用。有如下三種類型:
Service Account:用來訪問Kubernetes API,由Kubernetes自動創(chuàng)建,并且會自動掛載到Pod的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
Opaque:base64編碼格式的Secret,用來存儲密碼、密鑰等;
kubernetes.io/dockerconfigjson: 用來存儲私有docker registry的認(rèn)證信息。
ConfigMap用于保存配置數(shù)據(jù)的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感信息的字符串。ConfigMap可以通過三種方式在Pod中使用,三種分別方式為:設(shè)置環(huán)境變量、設(shè)置容器命令行參數(shù)以及在Volume中直接掛載文件或目錄。
可以使用 kubectl create configmap從文件、目錄或者key-value字符串創(chuàng)建等創(chuàng)建 ConfigMap。也可以通過 kubectl create -f value.yaml 創(chuàng)建。
資源配額(Resource Quotas)是用來限制用戶資源用量的一種機(jī)制。
資源配額有如下類型:
計算資源,包括cpu和memory
存儲資源,包括存儲資源的總量以及指定storage class的總量
對象數(shù),即可創(chuàng)建的對象的個數(shù)
它的工作原理為:
用戶超額后禁止創(chuàng)建新的資源
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。