docker筆記34-容器資源需求、資源限制及HeapSter

czxin788發表於2018-10-15

容器的資源需求、資源限制

    request:需求,最低保障,在排程時,這個節點必須要滿足request需求的資源大小。

    limits:限制、硬限制。這個限制容器無論怎麼執行都不會超過limits的值。

    CPU:在k8s的一個cpu對應一顆宿主機邏輯cpu。一個邏輯cpu還可以劃分為1000個毫核(millcores)。所以500m=0.5個CPU,0.5m相當於二分之一的核心。

    記憶體的計量單位:E、P、T、G、M、K

[root@master scheduler]# kubectl explain pods.spec.containers.resources.requests
[root@master scheduler]# kubectl explain pods.spec.containers.resources.limits
[root@master metrics]# cat pod-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/stress-ng:v1
    command: ["/usr/bin/stress-ng", "-m 1", "-c 1", "--metrics-brief"] #-m 1表示啟動一個子程式對記憶體做壓測,-c 1表示啟動一個子程式對cpu做壓測.預設stress-ng的一個子程式使用256M記憶體
    resources:
      requests:
        cpu: "200m"
        memory: "128Mi"
      limits:
        cpu: "1" #沒有單位表示是1個cpu
        memory: "200Mi"

  

[root@master metrics]# kubectl apply -f pod-demo.yaml 
pod/pod-demo created
[root@master metrics]# kubectl get pods -o wide
NAME                READY     STATUS              RESTARTS   AGE       IP            NODE
pod-demo            1/1       Running             0          6m        10.244.2.48   node2
[root@master metrics]# kubectl exec -it pod-demo -- /bin/sh
/ # top
Mem: 3542328K used, 339484K free, 123156K shrd, 3140K buff, 1737252K cached
CPU:  21% usr   4% sys   0% nic  73% idle   0% io   0% irq   0% sirq
Load average: 1.31 1.00 0.74 4/968 1405
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    8     1 root     R     6884   0%   1  15% {stress-ng-cpu} /usr/bin/stress-ng -m 1 -c 1 --metrics-brief
 1404     9 root     R     262m   7%   3  12% {stress-ng-vm} /usr/bin/stress-ng -m 1 -c 1 --metrics-brief
    9     1 root     S     6244   0%   2   0% {stress-ng-vm} /usr/bin/stress-ng -m 1 -c 1 --metrics-brief
    1     0 root     S     6244   0%   0   0% /usr/bin/stress-ng -m 1 -c 1 --metrics-brief
 1202     0 root     S     1508   0%   0   0% /bin/sh
 1405  1202 root     R     1500   0%   0   0% top

    我們對容器分配了資源限制後,k8s會自動分配一個Qos,叫服務質量,透過kubectl describe pods xxx可以看到這個欄位。

    Qos可以分為三類:

        Guranteed:表示每個容器的cpu和記憶體資源設定了相同的requests和limits值,即cpu.requests=cpu.limits和memory.requests=memory.limits,Guranteed會確保這類pod有最高的優先順序,會被優先執行的,即使節點上的資源不夠用。

        Burstable:表示pod中至少有一個容器設定了cpu或記憶體資源的requests屬性,可能沒有定義limits屬性,那麼這類pod具有中等優先順序。

        BestEffort:指沒有任何一個容器設定了requests或者limits屬性,那麼這類pod是最低優先順序。當這類pod的資源不夠用時,BestEffort中的容器會被優先終止,以便騰出資源來,給另外兩類pod中的容器正常執行。

 HeapSter   

    HeapSter的作用是收集個節點pod的資源使用情況,然後以圖形介面展示給使用者。

    kubelet中的cAdvisor負責收集每個節點上的資源使用情況,然後把資訊儲存HeapSter中,HeapSter再把資料持久化的儲存在資料庫InfluxDB中。然後我們再透過非常優秀的Grafana來圖形化展示。

    一般我們監控的指標包括k8s叢集的系統指標、容器指標和應用指標。

    預設InfluxDB使用的是儲存卷是emptyDir,容器一關資料就沒了,所以我們生產要換成glusterfs等儲存卷才行。

    InfluxDB:

    [root@master metrics]# wget

[root@master metrics]# kubectl apply -f influxdb.yaml 
deployment.extensions/monitoring-influxdb created
service/monitoring-influxdb created
[root@master metrics]# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
monitoring-influxdb    ClusterIP   10.100.80.21   <none>        8086/TCP        17s
[root@master metrics]# kubectl get pods -n kube-system
NAME                                   READY     STATUS    RESTARTS   AGE
monitoring-influxdb-848b9b66f6-ks69q   1/1       Running   0          10m
[root@master metrics]# kubectl log monitoring-influxdb-848b9b66f6-ks69q -n kube-system

    這樣我們就部署好了influxdb。

    下面我們開始部署heapster,但heapster依賴rbac。

    所以我們先部署rbac,訪問

[root@master metrics]# kubectl apply -f 
clusterrolebinding.rbac.authorization.k8s.io/heapster created

   所以下面我就可以部署heapster了。

    訪問

[root@master ~]# kubectl apply -f 
serviceaccount/heapster created
deployment.extensions/heapster created
service/heapster created
[root@master ~]# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
heapster               ClusterIP   10.100.35.112   <none>        80/TCP          1m


[root@master ~]# kubectl get pods -n kube-system -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP             NODE
heapster-84c9bc48c4-8h6vf              1/1       Running   0          9m        10.244.1.63    node1
[root@master ~]# kubectl logs heapster-84c9bc48c4-8h6vf -n kube-system

    上面我們把heapster元件裝完了,下面我們再裝Grafana。

    訪問

    我們為了能在叢集外部訪問Grafana,所以我們需要定義NodePort,所以在granfana.yaml檔案最後一行加個type: NodePort

[root@master ~]# wget 
[root@master ~]# tail  grafana.yaml 
  # or through a public IP.
  # type: LoadBalancer
  # You could also use NodePort to expose the service at a randomly-generated port
  # type: NodePort
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
  type: NodePort
[root@master ~]# kubectl apply -f grafana.yaml 
deployment.extensions/monitoring-grafana created
service/monitoring-grafana created
[root@master ~]#  kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
heapster               ClusterIP   10.100.35.112   <none>        80/TCP          22m
kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   37d
kubernetes-dashboard   NodePort    10.104.8.78     <none>        443:31647/TCP   16d
monitoring-grafana     NodePort    10.96.150.141   <none>        80:30357/TCP    2m
monitoring-influxdb    ClusterIP   10.100.80.21    <none>        8086/TCP        11h
[root@master ~]#  kubectl get pods -n kube-system
NAME                                   READY     STATUS    RESTARTS   AGE
monitoring-grafana-555545f477-qhb28    1/1       Running   0          5m

    開啟瀏覽器,訪問宿主機ip:

    據說在v1.12中,已經完全拋棄了heapster。

root@master ~]# kubectl top nodes
[root@master ~]# kubectl top pod

    按理說執行上面的兩個命令可以出結果,但是k8s從v1.11後不能用了,也無可奈何。






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2216324/,如需轉載,請註明出處,否則將追究法律責任。

相關文章