02-k8s各應(yīng)用管理器與pod介紹
前言:Deployment的發(fā)展
雖然ReplicaSet可以確保在任何給定時(shí)間運(yùn)行的Pod副本達(dá)到指定的數(shù)量,但是Deployment(部署)是一個(gè)更高級(jí)的概念,它管理ReplicaSet并為Pod和ReplicaSet提供聲明性更新以及許多其他有用的功能,所以建議在實(shí)際使用中,采用Deployment代替ReplicaSet。
如果在Deployment對(duì)象中描述了所需的狀態(tài),Deployment控制器就會(huì)以可控制的速率將實(shí)際狀態(tài)更改為期望狀態(tài)。也可以在Deployment中創(chuàng)建新的ReplicaSet,或者刪除現(xiàn)有的Deployment并使用新的Deployment部署所用的資源。
一、無狀態(tài)應(yīng)用管理器Deployment
deployment用于部署無狀態(tài)的服務(wù),是k8s中最常用的控制器。管理對(duì)象為pod。
一般用于管理維護(hù)企業(yè)內(nèi)部無狀態(tài)的微服務(wù),比如configserver、zuul、springboot。
deployment可以管理多個(gè)副本的Pod實(shí)現(xiàn)無縫遷移、自動(dòng)擴(kuò)容縮容、自動(dòng)災(zāi)難恢復(fù)、一鍵回滾等功能。
Deployment管理器基礎(chǔ)操作
創(chuàng)建Deployment
方式1:手動(dòng)創(chuàng)建
kubectl create deployment {deployment-name} --image=nginx
方式2:以yaml格式或json格式創(chuàng)建Deployment
kubectl create -f test-nginx.yaml
查詢deployment狀態(tài)
查看指定deployment的詳細(xì)信息
kubectl describe deployment {deployment-name} -n
kubectl get deployments -o wide
解析:-o wide 查看全部詳情
導(dǎo)出deployment配置
導(dǎo)出已創(chuàng)建的deployment配置文件至指定路徑:
kubectl get deployments test-nginx -o yaml >/data1/k8s-app/deploy/test-nginx.yaml
查看指定某一pod下的日志
kubectl logs {pod-name} -n
修改deployment配置
修改某個(gè)指定deployment配置
kubectl edit deployment {deployment-name} -n
kubectl apply -f xxx.yaml -n
kubectl replace -f xxx.yaml -n
版本升級(jí)操作:
手動(dòng)改鏡像并記錄:
kubectl set image deploy {deployment-name} -n {namespace-name} XXX=xx(版本信息) --record
解析:
--record 表示記錄本次修改
查看部署歷史:
kubectl rollout history deploy {deployment-name} -n
更新多次,需要查看某次更新的詳細(xì)信息:
kubectl rollout history deploy {deployment-name} -n {namespace-name} --revision=3
解析:
--revision 指定版本號(hào)
回滾到上一個(gè)版本:
kubectl rollout undo deploy {deployment-name} -n
回滾到指定版本:
kubectl rollout undo deploy {deployment-name} -n {namespace-name} --to-revision=2
解析:
--to-revision=2 表示回滾到更新的第2個(gè)版本
擴(kuò)容與縮容
動(dòng)態(tài)調(diào)整Pod的副本數(shù):
kubectl scale deploy {deployment-name} -n {namespace-name} --replicas=5
解析:
--replicas=5 將原有副本數(shù)修改為5,若原有為2個(gè),將擴(kuò)容3個(gè)副本;若原有為10個(gè),將縮容
注意:這里的擴(kuò)容縮容,不會(huì)修改原有rs
Deployment更新的暫停與恢復(fù)(用set 修改多處更新)
暫停Deployment更新
kubectl rollout pause deploy {deployment-name} -n
set修改deployment資源
kubectl set image ......
kubectl set resources deploy {deployment-name} -c {container-name}(指定容器) --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi
恢復(fù)Deployment更新:
kubectl rollout resume {deployment-name} -n
注意:恢復(fù)更新的Deployment創(chuàng)建了一個(gè)新的RS(復(fù)制集)
注意事項(xiàng):
可修改yaml格式來更新Deployment,其中在spec下的幾個(gè)參數(shù)配置解析為:
- replicas: 4 表示副本數(shù),4為4個(gè)副本
- revisionHistoryLimit:設(shè)置保留RS舊的revision的個(gè)數(shù),設(shè)置為0的話,不保留歷史數(shù)據(jù);
- minReadySeconds:可選參數(shù),指定新創(chuàng)建的Pod在沒有任何容器崩潰的情況下視為Ready最小的秒數(shù),默認(rèn)為0,即一旦被創(chuàng)建就視為可用。
關(guān)于滾動(dòng)更新的策略參數(shù)解析:
strategy.type:更新deployment的方式,默認(rèn)是RollingUpdate;
- RollingUpdate表示滾動(dòng)更新,可以指定maxSurge和maxUnavailable
- maxUnavailable:指定在回滾或更新時(shí)最大不可用的Pod的數(shù)量,可選字段,默認(rèn)25%,可以設(shè)置成數(shù)字或百分比,如果該值為0,那么maxSurge就不能0
- maxSurge:可以超過期望值的最大Pod數(shù),可選字段,默認(rèn)為25%,可以設(shè)置成數(shù)字或百分比,如果該值為0,那么maxUnavailable不能為0
- Recreate:重建,先刪除舊的Pod,在創(chuàng)建新的Pod
示例:
# kubectl get deploy nginx -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "12"
kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3
--record=true
creationTimestamp: "2020-09-19T02:41:11Z"
generation: 19
labels:
app: nginx
name: nginx
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.3
imagePullPolicy: IfNotPresent
name: nginx
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 10m
memory: 16Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
二、有狀態(tài)應(yīng)用管理StatefulSet
StatefulSet(有狀態(tài)集,縮寫為sts)主要用于管理有狀態(tài)應(yīng)用程序的工作負(fù)載API對(duì)象。常用于部署有狀態(tài)的且需要有序啟動(dòng)的應(yīng)用程序。
和Deployment類似,一個(gè)StatefulSet也同樣管理著基于相同容器規(guī)范的Pod。不同的是,StatefulSet為每個(gè)Pod維護(hù)了一個(gè)粘性標(biāo)識(shí)。這些Pod是根據(jù)相同的規(guī)范創(chuàng)建的,但是不可互換,每個(gè)Pod都有一個(gè)持久的標(biāo)識(shí)符,在重新調(diào)度時(shí)也會(huì)保留,一般格式為StatefulSetName-Number。比如定義一個(gè)名字是Redis-Sentinel的StatefulSet,指定創(chuàng)建三個(gè)Pod,那么創(chuàng)建出來的Pod名字就為Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。
StatefulSet創(chuàng)建的Pod一般使用Headless Service(無頭服務(wù))負(fù)責(zé)Pod的網(wǎng)絡(luò)身份和通信,需要提前創(chuàng)建此服務(wù)。和普通的Service的區(qū)別在于Headless Service沒有ClusterIP,它使用的是Endpoint進(jìn)行互相通信。在刪除一個(gè)StatefulSet時(shí),不保證對(duì)Pod的終止,要在StatefulSet中實(shí)現(xiàn)Pod的有序和正常終止,可以在刪除之前將StatefulSet的副本縮減為0。
Headless一般格式為:
statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
解析:
- statefulSetName 為StatefulSet的名字;
- 0..N-1 為Pod所在的序號(hào),從0開始到N-1;
- serviceName 為Headless Service的名字,創(chuàng)建StatefulSet時(shí),必須指定Headless Service名稱;
- namespace 為服務(wù)所在的命名空間;
- .cluster.local 為Cluster Domain(集群域)。
StatefulSet注意事項(xiàng):
一般StatefulSet用于有以下一個(gè)或者多個(gè)需求的應(yīng)用程序:
- 需要穩(wěn)定的獨(dú)一無二的網(wǎng)絡(luò)標(biāo)識(shí)符。
- 需要持久化數(shù)據(jù)。
- 需要有序的、優(yōu)雅的部署和擴(kuò)展。
- 需要有序的自動(dòng)滾動(dòng)更新。
- 如果應(yīng)用程序不需要任何穩(wěn)定的標(biāo)識(shí)符或者有序的部署、刪除或者擴(kuò)展,應(yīng)該使用無狀態(tài)的控制器部署應(yīng)用程序,比如Deployment或者ReplicaSet。
StatefulSet是Kubernetes 1.9版本之前的beta資源,在1.5版本之前的任何Kubernetes版本都沒有。
Pod所用的存儲(chǔ)必須由PersistentVolume Provisioner(持久化卷配置器)根據(jù)請(qǐng)求配置StorageClass,或者由管理員預(yù)先配置,當(dāng)然也可以不配置存儲(chǔ)。
為了確保數(shù)據(jù)安全,刪除和縮放StatefulSet不會(huì)刪除與StatefulSet關(guān)聯(lián)的卷,可以手動(dòng)選擇性地刪除PVC和PV(參考PV和PVC節(jié))。
Deployment管理器基礎(chǔ)操作
定義一個(gè)StatefulSet資源yaml文件
定義一個(gè)簡(jiǎn)單的StatefulSet的示例如下:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
注意:
此示例沒有添加存儲(chǔ)配置
其中:
- kind: Service 定義了一個(gè)名字為Nginx的Headless Service,創(chuàng)建的Service格式為nginx-0.nginx.default.svc.cluster.local,其他的類似,因?yàn)闆]有指定Namespace(命名空間),所以默認(rèn)部署在default。
- kind: StatefulSet 定義了一個(gè)名字為web的StatefulSet,replicas表示部署Pod的副本數(shù)。
- 在StatefulSet中必須設(shè)置Pod選擇器(.spec.selector)用來匹配其標(biāo)簽(.spec.template.metadata.labels)。在1.8版本之前,如果未配置該字段(.spec.selector),將被設(shè)置為默認(rèn)值,在1.8版本之后,如果未指定匹配Pod Selector,則會(huì)導(dǎo)致StatefulSet創(chuàng)建錯(cuò)誤。
- 當(dāng)StatefulSet控制器創(chuàng)建Pod時(shí),它會(huì)添加一個(gè)標(biāo)簽statefulset.kubernetes.io/pod-name,該標(biāo)簽的值為Pod的名稱,用于匹配Service。
查看更新過程
kubuctl rollout status sts {statefulset-name} -n
過濾查看pod配置中某一信息
kubectl get pod {pod-name} -n {namespace-name} -oyaml | grep image
kubectl get po -l app=nginx -w
-w 參數(shù)表示動(dòng)態(tài)查看pod的更新過程
在pod的配置中,updateStrategy 表示更新策略,其中若type: RollingUpdate 表示滾動(dòng)更新,修改pod配置后會(huì)根據(jù)創(chuàng)建順序更新,配置為:
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
解析:
partition: 0 表示分段更新,0表示小于0的pod不更新(即更新所有pod);其中數(shù)字表示更新的分段(pod)數(shù);舉例:若StatefulSet的pod數(shù)有5個(gè),現(xiàn)在partition: 2;那么pod2前面的pod不會(huì)更新(pod0、pod1),更新的pod為pod2、pod3、pod4。多用于灰度發(fā)布(先讓指定pod更新,在更新其它pod)
若type: OnDelete 表示只有刪除pod時(shí),才會(huì)更新修改的配置,且配置應(yīng)為:
updateStrategy:
type: RollingUpdate
StatefulSet的刪除
一般情況,刪除sts時(shí),pod會(huì)被重建
涉及概念:級(jí)聯(lián)刪除與非級(jí)聯(lián)刪除
- 級(jí)聯(lián)刪除:刪除StatefulSet時(shí)同時(shí)刪除pod,若不指定,默認(rèn)為級(jí)聯(lián)刪除
- 非級(jí)聯(lián)刪除:刪除StatefulSet時(shí)不刪除pod,但刪除sts后,pod變成“孤兒”,此時(shí)刪除pod不會(huì)被重建
設(shè)置級(jí)聯(lián)刪除或非級(jí)聯(lián)刪除
非級(jí)聯(lián)刪除:
kubectl delete sts {statefulset-name} -n {namespace-name} --cascade=false
三、守護(hù)進(jìn)程服務(wù)DaemonSet
DaemonSet 是守護(hù)進(jìn)程集,縮寫為ds,在所有節(jié)點(diǎn)或者是匹配條件的節(jié)點(diǎn)(通過打標(biāo)簽形式)上都部署一個(gè)Pod。
使用DaemonSet的場(chǎng)景
- 運(yùn)行集群存儲(chǔ)的daemon,比如ceph或者glusterd
- 節(jié)點(diǎn)的CNI網(wǎng)絡(luò)插件,calico
- 節(jié)點(diǎn)日志的收集:fluentd或者是filebeat
- 節(jié)點(diǎn)的監(jiān)控:node exporter
- 服務(wù)暴露:部署一個(gè)ingress-nginx
創(chuàng)建DaemonSet
kubectl create -f nginx-ds.yaml
示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: nginx
name: nginx
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
updateStrategy:
rollingUpdate:
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
設(shè)置匹配條件的node部署pod
方法1命令部署:
kubectl label nodeXX(節(jié)點(diǎn)名稱) nodeXX(節(jié)點(diǎn)名稱-多個(gè)節(jié)點(diǎn)) ... ds=true
查看標(biāo)簽
kubectl get node --show-labels
方法2修改yaml文件:(注意,若replace YAML文件,會(huì)更新配置)
在spec下,添加
......
nodeSelector:
ds: "ture"
......
另外,若需要添加或刪除ds節(jié)點(diǎn),需進(jìn)行l(wèi)abel添加或刪除即可
DaemonSet更新配置
......
updateStrategy:
rollingUpdate:
maxUnavailable: 1 ###最大不可用范圍,建議設(shè)為1
......
注意:在DaemonSet的生產(chǎn)環(huán)境中,建議更新策略采用OnDelete,避免影響所有節(jié)點(diǎn)上的pod,可用幾個(gè)不重要的pod做測(cè)試用
......
updateStrategy:
type: RollingUpdate
......
四、Label與Selector
Label:對(duì)k8s中各種資源進(jìn)行分類、分組,添加一個(gè)具有特別屬性的一個(gè)標(biāo)簽。
Selector:通過一個(gè)過濾的語法進(jìn)行查找到對(duì)應(yīng)標(biāo)簽的資源
刪除label
kubectl label node {node-name} app- -n
修改label
kubectl label pod {pod-name} app=xx(新名稱) -n {namespace-name} --overwrite
查看所有ns下符合條件的標(biāo)簽
kubectl get svc -A --show-labels
kubectl get pod -A --show-labels
kubectl get node -A --show-labels
根據(jù)需求查看匹配條件的多種標(biāo)簽表達(dá)示例:
所有ns下,標(biāo)簽包含metrics-server和kubernetes-dashboad的pod
kubectl get po -A -l 'k8s-app in (metrics-server, kubernetes-dashboad)'
標(biāo)簽為nginx,但不包含v1版本的pod
kubectl get po -l version!=v1,app=nginx
所有ns下,標(biāo)簽為nginx,但不包含v1版本的pod
kubectl get po -A -l version!=v1,'app02 in (nginx,busybox)'
未完待續(xù)。。。。

浙公網(wǎng)安備 33010602011771號(hào)