k8s 部署Deployment YAML 文件大總結

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需要在集羣中手動創建
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章