目錄
一、概述
二、YAML文件詳解
三、企業應用案例
3.1 環境準備
3.2 擴縮容
3.3 滾動更新
3.4 回滾
四、自定義更新策略
4.1類型
4.2 設置方式
4.3 配置案例
一、 DaemonSet 概述
DaemonSet 工作原理
Daemonset 典型的應用場景
DaemonSet 與 Deployment 的區別
二、DaemonSet 資源清單文件編寫技巧
清單模版
三、DaemonSet 使用案例
一、概述
Deployment為Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代以前的ReplicationController來方便的管理應用。
典型的應用場景包括:
-
定義Deployment來創建Pod和ReplicaSet
-
滾動升級和回滾應用
-
擴容和縮容
-
暫停和繼續Deployment更新
Deployment表示用戶對K8S集群的一次更新操作。Deployment是一個比RS( Replica Set, RS) 應用模型更廣的 API 對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是創建一個新的RS,然后逐漸將新 RS 中副本數增加到理想狀態,將舊RS中的副本數減少到0的復合操作。
這樣一個復合操作用一個RS是不好描述的,所以用一個更通用的Deployment來描述。以K8S的發展方向,未來對所有長期伺服型的業務的管理,都會通過Deployment來管理。
二、YAML文件詳解
apiVersion: apps/v1 #接口版本
kind: Deployment ? ? ? ? ? ? ? ? #接口類型
metadata:name: cango-demo ? ? ? ? ? ? ? #Deployment名稱namespace: cango-prd ? ? ? ? ? #命名空間labels:app: cango-demo ? ? ? ? ? ? ?#標簽
spec:replicas: 3selector:matchLabels:app: cango-demo ?#匹配模板中labelstrategy:rollingUpdate: ?##由于replicas為3,則整個升級,pod個數在2-4個之間maxSurge: 1 ? ? ?#滾動升級時會先啟動1個podmaxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數template: ? ? ? ? metadata:labels:app: cango-demo ?#模板名稱必填sepc: #定義容器模板,該模板可以包含多個容器containers: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? - name: cango-demo1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #鏡像名稱image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #鏡像地址command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] ? ?#啟動命令args: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟動參數- '-storage.local.retention=$(STORAGE_RETENTION)'- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'- '-config.file=/etc/prometheus/prometheus.yml'- '-alertmanager.url=http://alertmanager:9093/alertmanager'- '-web.external-url=$(EXTERNAL_URL)'#如果command和args均沒有寫,那么用Docker默認的配置。#如果command寫了,但args沒有寫,那么Docker默認的配置會被忽略而且僅僅執行.yaml文件的command(不帶任何參數的)。#如果command沒寫,但args寫了,那么Docker默認配置的ENTRYPOINT的命令行會被執行,但是調用的參數是.yaml中的args。#如果如果command和args都寫了,那么Docker默認的配置被忽略,使用.yaml的配置。imagePullPolicy: IfNotPresent ?#如果不存在則拉取livenessProbe: ? ? ? #表示container是否處于live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨后kubelet將kill掉container,并根據RestarPolicy進行進一步的操作。默認情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;httpGet:path: /health #如果沒有心跳檢測接口就為/port: 8080scheme: HTTPinitialDelaySeconds: 60 ##啟動后延時多久開始運行檢測timeoutSeconds: 5successThreshold: 1failureThreshold: 5readinessProbe:httpGet:path: /health #如果沒有心跳檢測接口就為/port: 8080scheme: HTTPinitialDelaySeconds: 30 ##啟動后延時多久開始運行檢測timeoutSeconds: 5successThreshold: 1failureThreshold: 5resources: ? ? ? ? ? ? ?##CPU內存限制requests:cpu: 2memory: 2048Milimits:cpu: 2memory: 2048Mienv: ? ? ? ? ? ? ? ? ? ?##通過環境變量的方式,直接傳遞pod=自定義Linux OS環境變量- name: LOCAL_KEY ? ? #本地Keyvalue: value- name: CONFIG_MAP_KEY ?#局策略可使用configMap的配置Key,valueFrom:configMapKeyRef:name: special-config ? #configmap中找到name為special-configkey: special.type ? ? ?#找到name為special-config里data下的keyports:- name: httpcontainerPort: 8080 #對service暴露端口volumeMounts: ? ? #掛載volumes中定義的磁盤- name: log-cachemountPath: /tmp/log- name: sdb ? ? ? #普通用法,該卷跟隨容器銷毀,掛載一個目錄mountPath: /data/media ? ?- name: nfs-client-root ? ?#直接掛載硬盤方法,如掛載下面的nfs目錄到/mnt/nfsmountPath: /mnt/nfs- name: example-volume-config ?#高級用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名文件,直接覆蓋。mountPath: /etc/config ? ? ? - name: rbd-pvc ? ? ? ? ? ? ? ?#高級用法第2中,掛載PVC(PresistentVolumeClaim)
?
#使用volume將ConfigMap作為文件或目錄直接掛載,其中每一個key-value鍵值對都會生成一個文件,key為文件名,value為內容,volumes: ?# 定義磁盤給上面volumeMounts掛載- name: log-cacheemptyDir: {}- name: sdb ?#掛載宿主機上面的目錄hostPath:path: /any/path/it/will/be/replaced- name: example-volume-config ?# 供ConfigMap文件內容到指定路徑使用configMap:name: example-volume-config ?#ConfigMap中名稱items:- key: log-script ? ? ? ? ? #ConfigMap中的Keypath: path/to/log-script ?#指定目錄下的一個相對路徑path/to/log-script- key: backup-script ? ? ? ?#ConfigMap中的Keypath: path/to/backup-script ?#指定目錄下的一個相對路徑path/to/backup-script- name: nfs-client-root ? ? ? ? #供掛載NFS存儲類型nfs:server: 10.42.0.55 ? ? ? ? ?#NFS服務器地址path: /opt/public ? ? ? ? ? #showmount -e 看一下路徑- name: rbd-pvc ? ? ? ? ? ? ? ? #掛載PVC磁盤persistentVolumeClaim:claimName: rbd-pvc1 ? ? ? ? #掛載已經申請的pvc磁盤
三、企業應用案例
3.1 環境準備
創建my-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 3selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
創建訪問service my-blue-service.yaml
apiVersion: v1
kind: Service
metadata:name: service-blue
spec:selector:app: myapp-bluetype: NodePort ports:- port: 80nodePort: 30030targetPort: 80
提交對應的資源清單
[root@k8s-master01 ~]# kubectl apply -f my-blue.yaml
[root@k8s-master01 ~]# kubectl apply -f my-blue-service.yaml
#查看對應的資源
[root@k8s-master01 ~]# kubectl get pod
NAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? ? AGE
mydm-7755b9f55f-7h2nb ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
mydm-7755b9f55f-bj9gf ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
mydm-7755b9f55f-hjckc ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
mydm-7755b9f55f-lfvrd ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
mydm-7755b9f55f-lxzw4 ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
mydm-7755b9f55f-v74w8 ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 69s
[root@k8s-master01 ~]# kubectl get svc
NAME ? ? ? ? ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? ? ? ? AGE
service-blue ? ? ? ? NodePort ? ?10.10.157.201 ? <none> ? ? ? ?80:30030/TCP ? ? 87s
3.2 擴縮容
修改對應的yaml文件中的replicas的數量
apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 5selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
3.3 滾動更新
修改對應的yaml文件中的image信息
apiVersion: apps/v1
kind: Deployment
metadata:name: mydm
spec:replicas: 3selector:matchLabels:app: myapp-blue #匹配模板中labeltemplate:metadata:labels:app: myapp-bluespec:containers:- name: myapp-blueimage: janakiramm/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
3.4 回滾
查看歷史版本
[root@k8s-master01 ~]# kubectl rollout history deployment name
回滾操作
[root@k8s-master01 ~]# kubectl rollout undo deployment name --to-revision=1
四、自定義更新策略
4.1類型
-
maxSurge:和期望的副本數比,超過期望副本數最大比例(或最大值),這個值調的越大,副本更新速度越快。
-
maxUnavailable:和期望的副本數比,不可用副本數最大比例(或最大值),這個值越小,越能保證服務穩定,更新越平滑;
4.2 設置方式
-
按數量
-
maxUnavailable: [0, 副本數]
-
maxSurge: [0, 副本數]
-
注兩者不能同時為0。
-
按比例
-
maxUnavailable: [0%, 100%] 向下取整,比如10個副本,5%的話==0.5個,但計算按照0個;
-
maxSurge: [0%, 100%] 向上取整,比如10個副本,5%的話==0.5個,但計算按照1個;
-
兩者不能同時為0。
4.3 配置案例
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-v1
spec:replicas: 3selector:matchLabels:app: myappversion: v1strategy:rollingUpdate:maxSurge: 1maxUnavailable: 1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappimage: janakiramm/myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80
一、 DaemonSet 概述
? ? ?DaemonSet 控制器能夠確保 k8s 集群所有的節點都運行一個相同的 pod 副本,當向 k8s 集群中增加 node 節點時,這個 node 節點也會自動創建一個 pod 副本,當 node 節點從 集群移除,這些 pod 也會自動刪除;刪除 Daemonset 也會刪除它們創建的 pod
DaemonSet 工作原理
?daemonset 的控制器會監聽 kuberntes 的 daemonset 對象、pod 對象、node 對象,這些被監聽的對象之變動,就會觸發 syncLoop 循環讓 kubernetes 集群朝著 daemonset 對象描述的狀態進行演進。
Daemonset 典型的應用場景
在集群的每個節點上運行存儲,比如:glusterd 或 ceph。 在每個節點上運行日志收集組件,比如:flunentd 、 logstash、filebeat 等。 在每個節點上運行監控組件,比如:Prometheus、 Node Exporter 、collectd 等。
DaemonSet 與 Deployment 的區別
Deployment 部署的副本 Pod 會分布在各個 Node 上,每個 Node 都可能運行好幾個副本。
DaemonSet 的不同之處在于:每個 Node 上最多只能運行一個副本。
二、DaemonSet 資源清單文件編寫技巧
[root@k8s-master01 ~]# kubectl explain ds
字段 | 作用 |
---|---|
apiVersion | 當前資源使用的 api 版本,跟 VERSION: apps/v1 保持 一致 |
kind | 資源類型,跟 KIND: DaemonSet 保持一致 |
metadata | 元數據,定義 DaemonSet 名字的 |
spec | 定義容器的 |
status | 狀態信息,不能改 |
[root@k8s-master01 ~]# kubectl??explain ds.spec
字段 | 作用 |
---|---|
minReadySeconds | 當新的 pod 啟動幾秒種后,再 kill 掉舊的 pod。 |
revisionHistoryLimit | 歷史版本 |
selector -required- | 用于匹配 pod 的標簽選擇器 |
template -required- | 定義 Pod 的模板,基于這個模板定義的所有 pod 是一樣的 |
updateStrategy | daemonset 的升級策略 |
[root@k8s-master01 ~]# kubectl??explain ds.spec.template
字段 | 作用 |
---|---|
containers | 容器配置列表。每個元素都描述了一個要運行在Pod內的容器。 |
initContainers | 化容器配置列表。這些容器在主容器之前運行,用于設置環境或執行預備工作。 |
ephemeralContainers | 臨時容器配置列表。這些容器是臨時的,僅在Pod運行時存在。 |
restartPolicy | Pod的重啟策略。可以是Always、OnFailure或Never。 |
terminationGracePeriodSeconds | 優雅終止周期,以秒為單位。在強制終止Pod前,系統將等待此周期內的終止。 |
activeDeadlineSeconds | Pod活動的截止時間,超過此時間系統將殺死Pod。 |
dnsPolicy | Pod的DNS策略,可以是ClusterFirst、ClusterFirstWithHostNet、Default或None。 |
Context | Pod的安全上下文,用于設置Pod的安全相關屬性,如RBAC規則、SELinux標簽等。 |
schedulerName | 調度器名稱,用于指定用于調度Pod的特定調度器。 |
tolerations | Pod容忍的污點,用于允許Pod調度到有特定污點的節點上。 |
affinity | Pod的親和性設置,用于指定Pod偏好或必須運行的節點屬性。 |
hostNetwork | 如果設置為true,P將使用主機的網絡命名空間。 |
imagePullSecrets | 用于獲取鏡像的密鑰,這些密鑰會被注入到Pod中。 |
configMap | ConfigMap的名稱和鍵值對列表,用于注入配置數據到Pod |
secret | Secret的名稱和鍵值對列表,用于注入敏感數據到Pod。 |
volumeMounts | 卷掛載配置列表,用于指定Pod中容器如何掛載卷。 |
volumes | 卷配置列表,為Pod中的容器存儲卷。 |
清單模版
apiVersion: apps/v1
kind: DaemonSet
metadata:name: pod-controller ? ? ? ? ? ? ? ? ? ? ?# ds名稱 ? ? ? ? ? ? ? ? ? ? ?labels: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 給ds打標簽controller: daemonset
spec:revisionHistoryLimit: 3 ? ? ? ? ? ? ? ? ? # 保留歷史版本數量,默認為10updateStrategy: ? ? ? ? ? ? ? ? ? ? ? ? ? # Pod更新策略,默認是RollingUpdatetype: RollingUpdate ? ? ? ? ? ? ? ? ? ? # 滾動更新策略。另一種是OnDelete,其沒有子屬性配置參數 rollingUpdate: ? ? ? ? ? ? ? ? ? ? ? ? ?# 當type為RollingUpdate的時候生效,為其配置參數maxSurge: 25% ? ? ? ? ? ? ? ? ? ? ? ? # 升級過程中可以超過期望的Pod的最大數量,可以為百分比,也可以為整數。默認是25%maxUnavailable: 25% ? ? ? ? ? ? ? ? ? # 升級過程中最大不可用狀態的Pod數量,可以為百分比,也可以為整數。默認是25%selector: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 選擇器,通過該控制器管理哪些podmatchLabels: ? ? ? ? ? ? ? ? ? ? ? ? ? ?# Labels匹配規則。和matchExpressions類似app: nginx-pod ###或者matchExpressions: ? ? ? ? ? ? ? ? ? ? # Expressions匹配規則。和matchLabels類似 - {key: app, operator: 'In', values: ["nginx-pod"]} template: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # pod副本創建模板。屬性和Pod的屬性一樣metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCP
三、DaemonSet 使用案例
[root@k8s-master01 ~]# cat pod-controller.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: pod-controllerlabels:controller: daemonset
spec:selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:latestports:- name: nginx-portcontainerPort: 80protocol: TCP
##查看
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml
daemonset.apps/pod-controller created