K8S裡CPU和MEMORY的計算單位

如何獲取和讀取 K8s 的資源利用率指標

在K8S裡面我們可以對資源做resource isolation,限制pod所使用的資源或者設立HPA去決定何時要自動擴展/縮小

所以要了解一下K8S裡面所用的度量單位的意義

使用kubectl下指令讀取pod內資源使用狀況

會得到下面的回應

確認Pod裡面不同的Container所使用的資源

會得到以下回應

取得Node資訊

會得到以下回應

了解指標所代表的意思 – CPU

其中設定的單位是 m,每 1000m = 1 vCore,也可以使用分數,因此設定的方式可以是:

  • 1 (相當於 1000m)
  • 0.5 (相當於 500m)
  • 300m (相當於 0.3)

從上面取得node的直可以看到CPU的資訊是

代表總共有4000m = 4 Core CPU
PS:設定 1m 是不被允許的,官方建議最低從 100m 開始

了解指標所代表的意思 – Memory

Memory 設定的單位最低則是從 byte 開始,而使用的單位可以是單一字母的 E, P, T, G, M, K,也可以是雙字母的 Ei, Pi, Ti, Gi, Mi, Ki(比較常見),以下是幾個設定範例:

  • 104857600 (相當於 100 MB = 10010241024)
  • 100M
  • 100Mi

128974848 = 129e6 = 129M = 123Mi
123Mi * 1024 * 1024 = 128974848 bytes
129 MB * 1000 * 1000 = 128974848 bytes
怎麼將Mi轉成Mb?
3713Mi * 1024 * 1024 / 1000 / 1000 = 3893MB

docker pull時的錯誤:failed to register layer

錯誤訊息

有時在下docker pull時會出現如下的錯誤:

解決方案

這是因為有時docker弄亂了其工作空間,可能就是原因。您可以嘗試以下方法:

  • 停止所有(java)容器,刪除它們,刪除Java映像(或所有映像),然後重新拉動並運行。
  • 如果這沒有幫助,則也重新啟動Docker引擎。
  • 如果仍然不能解決問題,請停止docker引擎,刪除docker工作目錄,然後重新啟動docker引擎。

以我的經驗,這可以解決所有類似OP的問題。

相關討論串: Docker error when pulling Java 8 image – “failed to register layer”

docker初探

  1. 安裝docker(於centos7)
  1. 測試用指令
  • 顯示 docker 的資訊
    $ docker info

  • 顯示 docker 的版本
    $ docker version

  • 取得一個指定版本的 image

  • 如果不指定 image 版本該版本則為 latest
    $ docker pull [Image 名稱]:[Image 版本]

  • ex:
    $ docker pull hello-world
    $ docker pull ubuntu
    $ docker pull ubuntu:14.04

  • 顯示 docker 的 images 清單
    $ docker images

  • 透過 iamge 執行並產生一個新的 container
    $ docker run [Image 名稱]:[Image 版本] [執行指令]

  • ex:
    $ docker run hello-world
    $ docker run ubuntu /bin/echo “example 1 – ubuntu”
    $ docker run ubuntu:14.04 /bin/echo “example 2 – ubuntu:14.04”

*********** 我是分隔線 ***********

  • [OPTIONS]:
  • -i, –interactive (互動模式)
  • -t, –tty (配置一個終端機)
  • -d, –detach (在背景執行)

$ docker run [OPTIONS] [Image 名稱]:[Image 版本] [執行指令]

  • ex:
    $ docker run -i -t ubuntu:14.04 bash
    $ exit

  • 查看正在執行的 containers
    $ docker ps

  • 查看所有的 containers
    $ docker ps -a

  • 對正在執行的 container 下執指令

  • [OPTIONS]:

  • -i, –interactive (互動模式)

  • -t, –tty (配置一個終端機)

  • docker exec [OPTIONS] [Container ID] [執行指令]

  • ex:

  • 產生一個 container 在背景執行
    $ docker run -i -t -d ubuntu:14.04 bash

  • 查詢正在執行的 container
    $ docker ps
    $ docker exec -i -t [Container ID] bash
    $ exit

  • 總結

  • 啟動 docker container
    $ docker start [Container ID]

  • 停止 docker container
    $ docker stop [Container ID]

  • 重新啟動 docker container
    $ docker restart [Container ID]

  • ex:

  • 產生一個 container 在背景執行
    $ docker run -i -t -d ubuntu bash

$ docker ps
$ docker stop [Container ID]

$ docker ps
$ docker start [Container ID]

$ docker ps
$ docker restart [Container ID]

  • 刪除 container
    $ docker rm [Container ID]

  • ex:
    $ docker ps
    $ docker stop [Container ID]

$ docker rm [Container ID]
$ docker ps -a

  • 刪除 image

  • 刪除 image 前必需將透過該 image 所產生的 container 移除
    $ docker rmi [Image ID]

  • ex:

  • 移除 hello-world image 所產生的 container
    $ docker ps -a
    $ docker rm [Container ID]
    $ docker ps -a

  • 移除 hello-world image
    $ docker images
    $ docker rmi [Image ID]
    $ docker images


** 小技巧 **************************


  • 停止所有的 containers
    $ docker stop $(docker ps -a -q)

  • 刪除所有的 containers
    $ docker rm $(docker ps -a -q)

  • 刪除所有的 images
    $ docker rmi $(docker images -a -q)

  • 運行容器並掛載主機捲
    Docker容器不會保存它們產生的數據。該過程完成後,容器將停止運行,並且容器中的所有物品都將被移走。

如果要在容器停止後仍要存儲持久性數據,則需要啟用共享存儲卷。

對於安裝卷,請使用-v屬性以及要在其中保存數據的目錄的指定位置,然後是該數據在容器內的位置。

-v [/host/volume/location]:[/container/storage]
整個docker container run命令是:

docker container run -v [/host/volume/location]:[/container/storage] [docker_image]

docker build -t fmsdocker . –no-cache

  • docker file 寫法 / run寫法
    https://docs.docker.com/engine/reference/run/

  • entrypoint
    docker run –entrypoint=/bin/hostname test

  • ENV
    ENV HOSTNAME testhost
    export today=Wednesday
    docker run -e “deep=purple” -e today –rm alpine env

  • HEALTHCHECK
    docker run –name=test -d
    –health-cmd=‘stat /etc/passwd || exit 1’
    –health-interval=2s
    busybox sleep 1d

HEALTHCHECK –interval=5s –timeout=3s
CMD curl ${HOSTNAME}:1111/admin/getServerStats?auser=admin&apswd=pass.123 || exit 1