kubernetes之管理容器的計算資源


資源類型

CPU 和 memory 都是 資源類型。資源類型具有基本單位。CPU 的單位是 core,memory 的單位是 byte。這些都統稱為計算資源。

CPU含義:

 CPU 資源的限制和請求以cpu為單位

 Kubernetes 中的一個 cpu 等於一個core,就是邏輯CPU。1顆邏輯CPU等於1000millicores。500m=0.5顆cpu。

內存含義:

內存的限制和請求以字節為單位。您可以使用以下后綴之一作為平均整數或定點整數表示內存:E,P,T,G,M,K。您還可以使用兩個字母的等效的冪數:Ei,Pi,Ti ,Gi,Mi,Ki。

POD中的資源請求和資源限制

  • requests  資源請求   pod最低需求
  • limits   資源限制   pod最大的使用資源

測試

執行下面yaml的內容:

apiVersion: v1
kind: Pod
metadata:
  name: my-demo
  namespace: default
  labels:
    name: myapp
    tier: appfront
spec:
  containers:
  - name: myapp
    image: ikubernetes/stress-ng
    command: ["/usr/bin/stress-ng","-c 1","--metrics-brief"]
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "128Mi"
        cpu: "200m"
      limits:
        memory: "512Mi"
        cpu: "500m"

查看結果:

$ kubectl exec my-demo -- top
Mem: 3914044K used, 126532K free, 205252K shrd, 2176K buff, 2650160K cached
CPU:  21% usr   0% sys   0% nic  78% idle   0% io   0% irq   0% sirq
Load average: 0.12 0.08 0.09 3/694 17
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    5     1 root     R     6900   0%   0  25% {stress-ng-cpu} /usr/bin/stress-ng
   14     0 root     R     1512   0%   1   4% top
    1     0 root     S     6256   0%   1   0% /usr/bin/stress-ng -c 1 --metrics-
    6     0 root     S     1516   0%   1   0% top
   10     0 root     S     1516   0%   1   0% top

我們看到CPU占用是25%,為什么呢?因為我們的node是2個core。我們最大限制是0.5核。所以應該是1/4。

QoS(服務質量等級)

是作用在 Pod 上的一個配置,當 Kubernetes 創建一個 Pod 時,它就會給這個 Pod 分配一個 QoS 等級,可以是以下等級之一:

  • Guaranteed:同時設置了CPU和內存的requestslimits  而且值必須相等。(這類的pod是最高優先級)
  • Burstable:pod至少有一個容器設置了cpu或內存的requestslimits,且不滿足 Guarantee 等級的要求。即內存或CPU的值設置的不同。(中等優先級)
  • BestEffort:沒有任何一個容器設置了requestslimits的屬性。(最低優先級)

Guaranteed樣例:

apiVersion: v1
kind: Pod
metadata:
  name: my-demo
  namespace: default
  labels:
    name: myapp
    tier: appfront
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v2
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "500m"

結果:

$ kubectl describe pod my-demo
......
QoS Class:       Guaranteed
......

Burstable樣例:

apiVersion: v1
kind: Pod
metadata:
  name: my-demo02
  namespace: default
  labels:
    name: myapp
    tier: appfront
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v2
    ports:
    - name: http
      containerPort: 80
    resources:
      requests:
        memory: "256Mi"
        cpu: "200m"
      limits:
        memory: "512Mi"
        cpu: "500m"

結果:

$ kubectl describe pod my-demo02
....
QoS Class:       Burstable
....

BestEffort樣例:

apiVersion: v1
kind: Pod
metadata:
  name: my-demo03
  namespace: default
  labels:
    name: myapp
    tier: appfront
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v2
    ports:
    - name: http
      containerPort: 80

結果:

$ kubectl describe pod my-demo03
....
QoS Class:       BestEffort
....

HeapSter部署

Heapster可以收集Node節點上的cAdvisor數據,還可以按照kubernetes的資源類型來集合資源,比如Pod、Namespace域,可以分別獲取它們的CPU、內存、網絡和磁盤的metric。默認的metric數據聚合時間間隔是1分鍾。

部署Heapster的地址 https://github.com/kubernetes-retired/heapster/tree/master/deploy/kube-config

首先我們需要先部署一個influxdb,這里我們需要改動一下。把文件下載下來。https://raw.githubusercontent.com/kubernetes-retired/heapster/master/deploy/kube-config/influxdb/influxdb.yaml

修改完成后的:

kind: Deployment
metadata:
  name: monitoring-influxdb
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: influxdb
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: influxdb
    spec:
      containers:
      - name: influxdb
        image: k8s.gcr.io/heapster-influxdb-amd64:v1.5.2
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      volumes:
      - name: influxdb-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-influxdb
  name: monitoring-influxdb
  namespace: kube-system
spec:
  ports:
  - port: 8086
    targetPort: 8086
  selector:
    k8s-app: influxdb

$ kubectl apply -f influxdb.yaml
deployment.apps/monitoring-influxdb created
service/monitoring-influxdb created
$ kubectl get pod -n kube-system
monitoring-influxdb-848b9b66f6-rplh8    1/1       Running   0          3

創建角色權限

kubectl apply -f https://raw.githubusercontent.com/kubernetes-retired/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml

部署heapster

kubectl apply -f https://raw.githubusercontent.com/kubernetes-retired/heapster/master/deploy/kube-config/influxdb/heapster.yaml

部署 grafana

https://raw.githubusercontent.com/kubernetes-retired/heapster/master/deploy/kube-config/influxdb/grafana.yaml

 


免責聲明!

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



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