Posted on

使用 Prometheus自定義指標為 Kubernetes 做 HPA 縮放

使用套件

  1. Prometheus
  2. Prometheus Operator
  3. K8S
  4. Rancher

步驟一、設定自訂義指標

1. 設定Exporter,這邊有許多官方提供的函式庫
https://prometheus.io/docs/instrumenting/clientlibs/
2. 設定該export的service名為my-export

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-export
  name: my-export
  namespace: default
spec:
  clusterIP: None
  clusterIPs:
  - None
  ports:
  - name: my-export
    port: 7979
    protocol: TCP
    targetPort: 7979
  selector:
    prometheus-customized-metrix: my-export
  type: ClusterIP

設定Service Monitors

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: my-export
  name: my-export
  namespace: default
spec:
  endpoints:
  - interval: 30s
    params:
      module:
      - default
      target:
      - http://127.0.0.1:1985/api/v1/streams/
    path: /probe
    port: my-export
  jobLabel: jobLabel
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: my-export

步驟二、設定自訂義規則

增加Prometheus Rules

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    app: rancher-monitoring
    app.kubernetes.io/instance: rancher-monitoring
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/part-of: rancher-monitoring
    app.kubernetes.io/version: 16.6.1_up16.6.0
    chart: rancher-monitoring-16.6.1_up16.6.0
    heritage: Helm
    release: rancher-monitoring
  name: my-data
  namespace: default
spec:
  groups:
  - name: my-data
    rules:
    - expr: sum(mydata{container="my-container", name=~".+",namespace=~"default"})
        by (pod)
      labels:
        namespace: default
        service: eventqueue
      record: mydata

設定HPA

在HorizontalPodAutoscaler增加一個設定如下

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: default
spec:
  behavior:
    scaleDown:
      policies:
      - periodSeconds: 60
        type: Pods
        value: 1
      selectPolicy: Max
      stabilizationWindowSeconds: 300
    scaleUp:
      policies:
      - periodSeconds: 60
        type: Pods
        value: 1
      selectPolicy: Max
      stabilizationWindowSeconds: 300
  maxReplicas: 2
  metrics:
  - object:
      describedObject:
        apiVersion: v1
        kind: Service
        name: eventqueue
      metric:
        name: mydata
      target:
        type: Value
        value: 1k
    type: Object
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-container

參考資料

  1. https://docs.openshift.com/container-platform/4.9/nodes/pods/nodes-pods-autoscaling.html
  2. https://www.padok.fr/en/blog/scaling-prometheus-rabbitmq
Posted on

K8S裡CPU和MEMORY的計算單位

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

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

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

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

kubectl top pod srs-core1-dbbb776bd-5s9rz -n srs3
會得到下面的回應
NAME CPU(cores) MEMORY(bytes)
srs-core1-dbbb776bd-5s9rz 3m 73Mi

確認Pod裡面不同的Container所使用的資源
kubectl top pod srs-core1-dbbb776bd-5s9rz -n srs3 –containers
會得到以下回應
POD NAME CPU(cores) MEMORY(bytes)
srs-core1-dbbb776bd-5s9rz filebeat 1m 60Mi
srs-core1-dbbb776bd-5s9rz json-exporter 2m 7Mi
srs-core1-dbbb776bd-5s9rz logrotate 1m 0Mi
srs-core1-dbbb776bd-5s9rz srs-core1 1m 5Mi

取得Node資訊

kubectl top node qatk8sworker01 -n srs3
會得到以下回應
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
qatk8sworker01 1280m 32% 3713Mi 48%

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

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

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

從上面取得node的直可以看到CPU的資訊是
1280m 32%
代表總共有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

Posted on

在CentOS7安裝docker與kubernates失敗

出現了下面的錯誤,原因是yum的源頭連結找不到所需要的安裝程式,錯誤訊息如下
Loading mirror speeds from cached hostfile

解決方法:修改yum源頭

cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.backup
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo CentOS-Base.repo
yum clean all

參考:https://www.codeprj.com/blog/b99d5a1.html

接著又出現以下錯誤
kube-apiserver.service holdoff time over, scheduling restart.

原來是有其他程式占用了8080 port
參考:https://www.cnblogs.com/minseo/p/12936878.html

Posted on

docker pull時的錯誤:failed to register layer

錯誤訊息

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

> docker -v
Docker version 1.10.0, build 590d5108
> docker-machine -v
docker-machine version 0.6.0, build e27fb87
> docker pull java:8
8: Pulling from library/java
03e1855d4f31: Extracting [==================================================>] 51.36 MB/51.36 MB
a3ed95caeb02: Download complete
9269ba3950bb: Download complete
6ecee6444751: Download complete
5b865d39f77d: Download complete
e7e5c0273866: Download complete
6a4effbc4451: Download complete
4b6cb08bb4bc: Download complete
7b07ad270e2c: Download complete
failed to register layer: rename /mnt/sda1/var/lib/docker/image/aufs/layerdb/tmp/layer-273420626 /mnt/sda1/var/lib/docker/image/aufs/layerdb/sha256/78dbfa5b7cbc2bd94ccbdba52e71be39b359ed7eac43972891b136334f5ce181: directory not empty

解決方案

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

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

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

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

Posted on

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