1. CronJob
在 k8s 中周期性運行計劃任務,與 linux 中的 crontab 相同
注意點:CronJob 執行的時間是 controller-manager 的時間,所以一定要確保 controller-manager 時間是準確的,另外 cronjobapiVersion: batch/v1
kind: CronJob
metadata:name: hello
spec:concurrencyPolicy: Allow # 并發調度策略:Allow 允許并發調度,Forbid:不允許并發執行,Replace:如果之前的任務還沒執行完,就直接執行新的,放棄上一個任務failedJobsHistoryLimit: 1 # 保留多少個失敗的任務successfulJobHistoryLimit: 3 # 保留多少個成功的任務suspend: false # 是否掛起任務,若為 true 則該任務不會執行
# startingDeadlineSeconds: 30 # 間隔多長時間檢測失敗的任務并重新執行,時間不能小于 10schedule: "* * * * *" # 調度策略jobTemplate:spec:template:spec:containers:- name: helloimage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure
2.?初始化容器 InitContainer
在真正的容器啟動之前,先啟動 InitContainer,在初始化容器中完成真實容器所需的初始化操作,完成后再啟動真實的容器。相對于 postStart 來說,首先 InitController 能夠保證一定在 EntryPoint 之前執行,而 postStart 不能,其次 postStart 更適合去執行一些命令操作,而 InitController 實際就是一個容器,可以在其他基礎容器環境下執行更復雜的初始化功能。在 pod 創建的模板中配置 initContainers 參數:
spec:initContainers:- image: nginximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "echo 'inited;' >> ~/.init"]name: init-test
3.污點和容忍
3.1 污點
污點:是標注在節點上的,當我們在一個節點上打上污點以后,k8s 會認為盡量不要將 pod 調度到該節點上,除非該 pod 上面表示可以容忍該污點,且一個節點可以打多個污點,此時則需要 pod 容忍所有污點才會被調度該節點。# 為節點打上污點
kubectl taint node k8s-master key=value:NoSchedule# 移除污點
kubectl taint node k8s-master key=value:NoSchedule-# 查看污點
kubectl describe no k8s-master污點的影響:
NoSchedule:不能容忍的 pod 不能被調度到該節點,但是已經存在的節點不會被驅逐
NoExecute:不能容忍的節點會被立即清除,能容忍且沒有配置 tolerationSeconds 屬性,則可以一直運行,設置了 tolerationSeconds: 3600 屬性,則該 pod 還能繼續在該節點運行 3600 秒
NoSchedule:如果不能容忍該污點,那么 Pod 就無法調度到該節點上NoExecute:?如果 Pod 不能忍受這類污點,Pod 會馬上被驅逐。
如果 Pod 能夠忍受這類污點,但是在容忍度定義中沒有指定 tolerationSeconds, 則 Pod 還會一直在這個節點上運行。
如果 Pod 能夠忍受這類污點,而且指定了 tolerationSeconds, 則 Pod 還能在這個節點上繼續運行這個指定的時間長度。
3.2 容忍
容忍:是標注在 pod 上的,當 pod 被調度時,如果沒有配置容忍,則該 pod 不會被調度到有污點的節點上,只有該 pod 上標注了滿足某個節點的所有污點,則會被調度到這些節點# pod 的 spec 下面配置容忍
tolerations:
- key: "污點的 key"value: "污點的 value"offect: "NoSchedule" # 污點產生的影響operator: "Equal" # 表是 value 與污點的 value 要相等,也可以設置為 Exists 表示存在 key 即可,此時可以不用配置 valueEqual:比較操作類型為 Equal,則意味著必須與污點值做匹配,key/value都必須相同,才表示能夠容忍該污點Exists:
容忍與污點的比較只比較 key,不比較 value,不關心 value 是什么東西,只要 key 存在,就表示可以容忍。
?4.親和力
4.1 節點親和力 NodeAffinity
節點親和力:進行 pod 調度時,優先調度到符合條件的親和力節點上
RequiredDuringSchedulingIgnoredDuringExecution:硬親和力,即支持必須部署在指定的節點上,也支持必須不部署在指定的節點上PreferredDuringSchedulingIgnoredDuringExecution:
軟親和力:盡量部署在滿足條件的節點上,或盡量不要部署在被匹配的節點上
4.1.1 應用
匹配類型: In、NotIn、Exists、DoesNotExist、Gt、Ltyaml配置文件:apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity: # 親和力配置nodeAffinity: # 節點親和力requiredDuringSchedulingIgnoredDuringExecution: # 節點必須匹配下方配置nodeSelectorTerms: # 選擇器- matchExpressions: # 匹配表達式- key: topology.kubernetes.io/zone # 匹配 label 的 keyoperator: In # 匹配方式,只要匹配成功下方的一個 value 即可values:- antarctica-east1 # 匹配的 value- antarctica-west1 # 匹配的 valuepreferredDuringSchedulingIgnoredDuringExecution: # 節點盡量匹配下方配置- weight: 1 # 權重[1,100],按照匹配規則對所有節點累加權重,最終之和會加入優先級評分,優先級越高被調度的可能性越高preference:matchExpressions: # 匹配表達式- key: another-node-label-key # label 的 keyoperator: In # 匹配方式,滿足一個即可values:- another-node-label-value # 匹配的 value
# - weight: 20......containers:- name: with-node-affinityimage: pause:2.0
4.2? PodAffinity?
Pod 親和力:將與指定 pod 親和力相匹配的 pod 部署在同一節點。
RequiredDuringSchedulingIgnoredDuringExecution:必須將應用部署在一塊PreferredDuringSchedulingIgnoredDuringExecution:盡量將應用部署在一塊yaml配置apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity
spec:affinity: # 親和力配置podAffinity: # pod 親和力配置requiredDuringSchedulingIgnoredDuringExecution: # 當前 pod 必須匹配到對應條件 pod 所在的 node 上- labelSelector: # 標簽選擇器matchExpressions: # 匹配表達式- key: security # 匹配的 keyoperator: In # 匹配方式values: # 匹配其中的一個 value- S1topologyKey: topology.kubernetes.io/zonepodAntiAffinity: # pod 反親和力配置preferredDuringSchedulingIgnoredDuringExecution: # 盡量不要將當前節點部署到匹配下列參數的 pod 所在的 node 上- weight: 100 # 權重podAffinityTerm: # pod 親和力配置條件labelSelector: # 標簽選擇器matchExpressions: # 匹配表達式- key: security # 匹配的 keyoperator: In # 匹配的方式values:- S2 # 匹配的 valuetopologyKey: topology.kubernetes.io/zonecontainers:- name: with-pod-affinityimage: pause:2.0
?4.3?PodAntiAffinity
Pod 反親和力:根據策略盡量部署或不部署到一塊
RequiredDuringSchedulingIgnoredDuringExecution:
不要將應用與之匹配的部署到一塊podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- S1topologyKey: topology.kubernetes.io/zonePreferredDuringSchedulingIgnoredDuringExecution: 盡量不要將應用部署到一塊
?4.4?身份認證與權限
未完待續...