資源類型
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和內存的
requests
和limits
而且值必須相等。(這類的pod是最高優先級) - Burstable:pod至少有一個容器設置了cpu或內存的
requests
和limits,且不滿足 Guarantee 等級的要求。即內存或CPU的值設置的不同。(中等優先級)
- BestEffort:沒有任何一個容器設置了
requests
或limits的屬性。(最低優先級)
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
首先我們需要先部署一個
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