K8S-資源配置清單詳解


服務健康檢查

檢測容器服務是否健康的手段,若不健康,會根據設置的重啟策略(restartPolicy)進行操作,兩種檢測機制可以分別單獨設置,若不設置,默認認為Pod是健康的。
兩種機制:

  • LivenessProbe探針
    存活性探測:用於判斷容器是否存活,即Pod是否為running狀態,如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,並根據容器的重啟策略是否重啟,如果一個容器不包含LivenessProbe探針,則Kubelet認為容器的LivenessProbe探針的返回值永遠成功。
 containers:
  - name: myblog
    image: 192.168.136.10:5000/myblog:v1
    livenessProbe:
      httpGet:
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10  # 容器啟動后第一次執行探測是需要等待多少秒
      periodSeconds: 10 	# 執行探測的頻率
      timeoutSeconds: 2		# 探測超時時間

  • ReadinessProbe探針
    可用性探測:用於判斷容器是否正常提供服務,即容器的Ready是否為True,是否可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將為False, Endpoint Controller 控制器將此Pod的Endpoint從對應的service的Endpoint列表中移除,不再將任何請求調度此Pod上,直到下次探測成功。(剔除此pod不參與接收請求不會將流量轉發給此Pod)。
  containers:
  - name: myblog
    image: 192.168.136.10:5000/myblog:v1
    readinessProbe: 
      httpGet: 
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10 
      timeoutSeconds: 2
      periodSeconds: 10

訪問分為三種類型:

  • exec:通過執行命令來檢查服務是否正常,返回值為0則表示容器健康
  • httpGet方式:通過發送http請求檢查服務是否正常,返回200-399狀態碼則表明容器健康
  • tcpSocket:通過容器的IP和Port執行TCP檢查,如果能夠建立TCP連接,則表明容器健康

上一個實例:

  containers:
  - name: myblog
    image: 192.168.136.10:5000/myblog:v1
    env:
    - name: MYSQL_HOST   #  指定root用戶的用戶名
      value: "127.0.0.1"
    - name: MYSQL_PASSWD
      value: "123456"
    ports:
    - containerPort: 8002
    livenessProbe:
      httpGet:
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10  # 容器啟動后第一次執行探測是需要等待多少秒
      periodSeconds: 10 	# 執行探測的頻率
      timeoutSeconds: 2		# 探測超時時間
    readinessProbe: 
      httpGet: 
        path: /blog/index/
        port: 8002
        scheme: HTTP
      initialDelaySeconds: 10 
      timeoutSeconds: 2
      periodSeconds: 10

參數詳解:

  • initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。
  • periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
  • timeoutSeconds:探測超時時間。默認1秒,最小1秒。
  • successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。
  • failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3,最小值是1。

K8S將在Pod開始啟動10s(initialDelaySeconds)后利用HTTP訪問8002端口的/blog/index/,如果超過2s或者返回碼不在200~399內,則健康檢查失敗

容器的重啟策略

Pod的重啟策略(RestartPolicy)應用於Pod內的所有容器,並且僅在Pod所處的Node上由kubelet進行判斷和重啟操作。當某個容器異常退出或者健康檢查失敗時,kubelet將根據RestartPolicy的設置來進行相應的操作。
Pod的重啟策略包括Always、OnFailure和Never,默認值為Always。

  • Always:當容器進程退出后,由kubelet自動重啟該容器;
  • OnFailure:當容器終止運行且退出碼不為0時,由kubelet自動重啟該容器;
  • Never:不論容器運行狀態如何,kubelet都不會重啟該容器。
  1. 使用默認的重啟策略,即 restartPolicy: Always ,無論容器是否是正常退出,都會自動重啟容器
  2. 使用OnFailure的策略時
    • 如果把exit 1,去掉,即讓容器的進程正常退出的話,則不會重啟
    • 只有非正常退出狀態才會重啟
  3. 使用Never時,退出了就不再重啟

我們一般都是選擇默認,只在個別情況下選擇其他
實例:

apiVersion: v1
kind: Pod
metadata:
  name: test-restart-policy
spec:
  restartPolicy: Always
  containers:
  - name: busybox
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 10

鏡像拉取策略

設置鏡像的拉取策略,默認為IfNotPresent

  • Always,總是拉取鏡像,即使本地有鏡像也從倉庫拉取
  • IfNotPresent ,本地有則使用本地鏡像,本地沒有則去倉庫拉取
  • Never,只使用本地鏡像,本地沒有則報錯
spec:
  containers:
  - name: test-one
    image: harbor.xxx.com/xxx/test:v1.1
    imagePullPolicy: IfNotPresent

Pod資源限制

為了保證充分利用集群資源,且確保重要容器在運行周期內能夠分配到足夠的資源穩定運行,因此平台需要具備

Pod的資源限制的能力。 對於一個pod來說,資源最基礎的2個的指標就是:CPU和內存。

Kubernetes提供了個采用requests和limits 兩種類型參數對資源進行預分配和使用限制。

  containers:
    ...
    resources:
      requests:
        memory: 100Mi
        cpu: 50m
      limits:
        memory: 500Mi
        cpu: 100m

requests:

  • 容器使用的最小資源需求,作用於schedule階段,作為容器調度時資源分配的判斷依賴
  • 只有當前節點上可分配的資源量 >= request 時才允許將容器調度到該節點
  • request參數不限制容器的最大可使用資源
  • requests.cpu被轉成docker的--cpu-shares參數,與cgroup cpu.shares功能相同 (無論宿主機有多少個cpu或者內核,--cpu-shares選項都會按照比例分配cpu資源)
  • requests.memory沒有對應的docker參數,僅作為k8s調度依據

limits:

  • 容器能使用資源的最大值
  • 設置為0表示對使用的資源不做限制, 可無限的使用
  • 當pod 內存超過limit時,會被oom
  • 當cpu超過limit時,不會被kill,但是會限制不超過limit值
  • limits.cpu會被轉換成docker的–cpu-quota參數。與cgroup cpu.cfs_quota_us功能相同
  • limits.memory會被轉換成docker的–memory參數。用來限制容器使用的最大內存
    對於 CPU,我們知道計算機里 CPU 的資源是按“時間片”的方式來進行分配的,系統里的每一個操作都需要 CPU 的處理,所以,哪個任務要是申請的 CPU 時間片越多,那么它得到的 CPU 資源就越多。

來一段比較完善的yaml:

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  namespace: luffy
  labels:
    component: mysql
spec:
  hostNetwork: true	# 聲明pod的網絡模式為host模式,效果同docker run --net=host
  volumes: 
  - name: mysql-data
    hostPath: 
      path: /opt/mysql/data
  nodeSelector:   # 使用節點選擇器將Pod調度到指定label的節點
    component: mysql
  containers:
  - name: mysql
    image: 192.168.136.10:5000/mysql:5.7-utf8
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    - name: MYSQL_DATABASE
      value: "myblog"
    resources:
      requests:
        memory: 100Mi
        cpu: 50m
      limits:
        memory: 500Mi
        cpu: 100m
    readinessProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 15
      periodSeconds: 20
    volumeMounts:
    - name: mysql-data
      mountPath: /var/lib/mysql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM