1.爲什麼要總結k8s yaml
1.k8s 環境部署應用後因爲缺少某種配置參數導致應用出現不穩定問題
2.yaml配置項多而雜亂每一個參數在什麼場景中使用都未知.
3.發佈應用統一使用YAML模板
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ops-nginx-api # Deployment 對象的名稱,與應用名稱保持一致
namespace: default #命名空間
labels:
appName: ops-nginx-api # 應用名稱
spec:
selector:
matchLabels:
app: ops-nginx-api #app 標籤名稱
replicas: 5 #Pod
strategy: #部署策略更多策略 1.https://www.qikqiak.com/post/k8s-deployment-strategies/
type: RollingUpdate #其他類型如下 1.重建(Recreate) 開發環境使用 2.RollingUpdate(滾動更新)
rollingUpdate:
maxSurge: 25% #一次可以添加多少個Pod
maxUnavailable: 25% #滾動更新期間最大多少個Pod不可用
template:
metadata:
labels:
app: 'ops-nginx-api'
spec:
terminationGracePeriodSeconds: 120 #優雅關閉時間,這個時間內優雅關閉未結束,k8s 強制 kill
affinity:
podAntiAffinity: # pod反親和性,儘量避免同一個應用調度到相同node
preferredDuringSchedulingIgnoredDuringExecution: #硬需求 1.preferredDuringSchedulingIgnoredDuringExecution 軟需求
- weight: 100
#weight 字段值的 範圍是 1-100。 對於每個符合所有調度要求(資源請求、RequiredDuringScheduling 親和性表達式等) 的節點,調度器將遍歷該字段的元素來計算總和,並且如果節點匹配對應的 MatchExpressions,則添加“權重”到總和。 然後將這個評分與該節點的其他優先級函數的評分進行組合。 總分最高的節點是最優選的。
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ops-nginx-api
topologyKey: "kubernetes.io/hostname"
initContainers: #初始化容器
- name: sidecar-sre #init 容器名稱
image: breaklinux/sidecar-sre:201210129 #docker hup倉庫鏡像
imagePullPolicy: IfNotPresent #鏡像拉取策略 1.IfNotPresent如果本地存在鏡像就優先使用本地鏡像。2.Never直接不再去拉取鏡像了,使用本地的.如果本地不存在就報異常了。
#3.imagePullPolicy 未被定義爲特定的值,默認值設置爲 Always 本地是否存在都會去倉庫拉取鏡像.
env:
#Downward API官網示例 https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/
- name: CHJ_NODE_IP
valueFrom:
fieldRef: #這兩種呈現 Pod 和 Container 字段的方式統稱爲 Downward API。
fieldPath: status.hostIP #獲取pod 所在node IP地址設置爲CHJ_NODE_IP
- name: CHJ_POD_IP #變量名稱
valueFrom:
fieldRef:
fieldPath: status.podIP #獲取pod自身ip地址設置爲CHJ_POD_IP變量名稱
- name: CHJ_APP_NAME #應用名稱EVN
value: 'ops-nginx-api' #環境變量值
command: ["/bin/sh","-c"] #shell 執行
args: ["mkdir -p /scratch/.sidecar-sre && cp /sidecar/post-start.sh /scratch/.sidecar-sre/post-start.sh && /scratch/.sidecar-sre/post-start.sh"]
volumeMounts: #掛載日誌卷和存在的空鏡像
- name: log-volume
mountPath: /tmp/data/log/ops-nginx-api #容器內掛載鏡像路徑
- name: sidecar-sre
mountPath: /scratch #空鏡像
resources: #qos 設置
limits:
cpu: 100m #pod 佔單核cpu 1/10
memory: 100Mi #內存100M
#hostPath 卷能將主機節點文件系統上的文件或目錄掛載到你的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它爲一些應用程序提供了強大的逃生艙。
volumes:
- name: log-volume #卷名稱
hostPath: #卷類型詳細見:https://kubernetes.io/zh/docs/concepts/storage/volumes/
path: /data/logs/prod/ops-nginx-api #宿主機存在的目錄路徑
type: DirectoryOrCreate #如果在給定路徑上什麼都不存在,那麼將根據需要創建空目錄,權限設置爲 0755,具有與 kubelet 相同的組和屬主信息
- name: sidecar-sre #
emptyDir: {} #emptyDir 卷的存儲介質(磁盤、SSD 等)是由保存 kubelet 數據的根目錄 (通常是 /var/lib/kubelet)的文件系統的介質確定。
containers:
- name: ops-nginx-api # 容器名稱,與應用名稱保持一致
image: breaklinux/op-flask-api:v1 #遵守鏡像命名規範
imagePullPolicy: Always #鏡像拉取策略 1.IfNotPresent如果本地存在鏡像就優先使用本地鏡像。2.Never直接不再去拉取鏡像了,使用本地的.如果本地不存在就報異常了。
#3.imagePullPolicy 未被定義爲特定的值,默認值設置爲 Always 本地是否存在都會去倉庫拉取鏡像.
lifecycle: #Kubernetes 支持 postStart 和 preStop 事件。 當一個容器啓動後,Kubernetes 將立即發送 postStart 事件;在容器被終結之前, Kubernetes 將發送一個 preStop 事件。
postStart: #容器創建成功後,運行前的任務,用於資源部署、環境準備等。
exec:
command:
- /bin/sh
- -c
- echo 'Hello from the postStart handler' >> /var/log/nginx/message
preStop: #在容器被終止前的任務,用於優雅關閉應用程序、通知其他系統等等
exec:
command:
- sh
- -c
- sleep 30
livenessProbe: #存活探針器配置
failureThreshold: 3 #處於成功時狀態時,探測操作至少連續多少次的失敗才被視爲檢測不通過,顯示爲#failure屬性.默認值爲3,最小值爲 1,存活探測情況下的放棄就意味着重新啓動容器。
httpGet: #1.存活探針器三種方式 1.cmd命令方式進行探測 2.http 狀態碼方式 3.基於tcp端口探測
path: /healthy #k8s源碼中healthz 實現 https://github.com/kubernetes/kubernetes/blob/master/test/images/agnhost/liveness/server.go
port: 8080 #應用程序監聽端口
initialDelaySeconds: 600 #存活性探測延遲時長,即容器啓動多久之後再開始第一次探測操作,顯示爲delay屬性.默認值爲0,即容器啓動後立刻便開始進行探測.
periodSeconds: 10 #執行探測的時間間隔(單位是秒)。默認是 10 秒。最小值是 1秒,過高的頻率會對Pod對象帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時.
successThreshold: 1 #處於失敗狀態時,探測操作至少連續多少次的成功才被人爲是通過檢測,顯示爲#success屬性,默認值爲1,最小值也是1
timeoutSeconds: 3 #存活性探測的超時時長,顯示爲timeout屬性,默認值1s,最小值也是1s
readinessProbe: #定義就緒探測器
failureThreshold: 3 #處於成功時狀態時,探測操作至少連續多少次的失敗才被視爲檢測不通過,顯示爲#failure屬性.默認值爲3,最小值爲 就緒探測情況下的放棄 Pod 會被打上未就緒的標籤.
tcpSocket: # 1.就緒探針三種方式 1.cmd命令方式進行探測 2.http 狀態碼方式 3.基於tcp端口探測
port: 8080 #應用程序監聽端口
initialDelaySeconds: 10 #執行探測的時間間隔(單位是秒)。默認是 10 秒。最小值是 1秒,過高的頻率會對Pod對象帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時.
periodSeconds: 10 #執行探測的時間間隔(單位是秒)。默認是 10 秒。最小值是 1秒,過高的頻率會對Pod對象帶來較大的額外開銷,而過低的頻率又會使得對錯誤的反應不及時
successThreshold: 1 #處於失敗狀態時,探測操作至少連續多少次的成功才被人爲是通過檢測,顯示爲#success屬性,默認值爲1,最小值也是1
timeoutSeconds: 3 #存活性探測的超時時長,顯示爲timeout屬性,默認值1s,最小值也是1s
ports:
- containerPort: 19201 #應用監聽的端口
protocol: TCP #協議 tcp和 udp
env: #應用配置中心環境變量
- name: ENV
value: test
- name: apollo.meta
value: http://saos-apollo-config-service:8080
- name: CHJ_APP_NAME
value: 'ops-nginx-api'
- name: LOG_BASE
value: '/chj/data/log'
- name: RUNTIME_CLUSTER
value: 'default'
#Request: 容器使用的最小資源需求,作爲容器調度時資源分配的判斷依賴。只有當節點上可分配資源量>=容器資源請求數時才允許將容器調度到該節點。但Request參數不限制容器的最大可使用資源。
#Limit: 容器能使用資源的資源的最大值,設置爲0表示使用資源無上限。
resources: #qos限制 1.QoS 主要分爲Guaranteed、Burstable 和 Best-Effort三類,優先級從高到低
requests:
memory: 4096Mi #內存4G
cpu: 500m #cpu 0.5
limits:
memory: 4096Mi
cpu: 500m
volumeMounts: #掛載蘇宿主機目錄到制定
- name: log-volume # sidecar-sre
mountPath: /tmp/data/log/ops-nginx-api #該目錄作爲程序日誌sidecar路徑收集
- name: sidecar-sre
mountPath: /chj/data #蘇主機掛載目錄
imagePullSecrets: #在 Pod 中設置 ImagePullSecrets 只有提供自己密鑰的 Pod 才能訪問私有倉庫
- name: lixiang-images-pull #鏡像Secrets需要在集羣中手動創建