一、資源監控及資源指標
資源監控系統是容器編排系統必不可少的組件,它爲用戶提供了快速瞭解系統資源分配和利用狀態的有效途徑,同時也是系統編排賴以實現的基礎要件。
1、資源監控及Heapster
Kubernetes有多個數據指標需要採集相關的數據,而這些指標大體上由監控集羣本身和監控Pod對象兩部分組成,監控集羣需要監控節點資源狀態、節點數量、運行的pod數量;監控Pod資源對象需要監控kubernetes指標,容器指標和應用程序指標。
Kubernetes系統與kubelet程序中集成相關的工具程序cAdisor用於對節點上的資源及容器進行實時監控及指標數據採集,這類監控的實現方式有Heapster。從kubernetes1.11開始Heapster被廢棄不在使用,metrics-server 替代了heapster
2、新一代的監控架構
新一代的kubernetes監控系統架構主要由核心指標流水線和監控指標流水線協同組成。核心指標流水線由kubelet、資源評估器、metrics-server及API server提供的API羣組組成,可用於爲kubernetes系統提供核心指標從而能夠了解其內部組件和核心程序。監控指標流水線用於從系統收集各種指標數據並提供給終端用戶、存儲系統及HPA控制器使用。
資源指標API主流的實現是metrics-server,自定義指標API以構建在監控系統Prometheus之上到k8s-prometheus-adapter使用最爲廣泛。
二、資源指標及應用
1、部署metrics server
Metrics server是集羣級別的資源利用率數據的聚合器。Metrics server通過kubernetes聚合器(kube-aggregator)註冊到主API server之上,然後基於kubelet的summary api收集每個節點上的指標數據,並將它們存儲於內存中然後以指標API格式提供。Metrics server的部署步驟如下:
# 拉取資源
]# git clone https://github.com/kubernetes-incubator/metrics-server
# 替換metrics-server/deploy/1.8+/metrics-server-deployment.yaml的鏡像地址爲deploy/1.8+/metrics-server-deployment.yaml
]# sed -i "s#k8s.gcr.io/metrics-server-amd64:v0.3.3#mirrorgooglecontainers/metrics-server-amd64:v0.3.1#g" /tmp/metrics-server/deploy/1.8+/metrics-server-deployment.yaml
由於metrics-server默認使用節點hostname通過kubelet 10250端口獲取數據,但是coredns裏面沒有該數據無法解析,所以可在metrics server啓動命令添加參數 --kubelet-preferred-address-types=InternalIP 直接使用節點IP地址獲取數據;同時由於kubelet 的10250端口使用的是https協議,連接需要驗證tls證書。可以在metrics server啓動命令添加參數--kubelet-insecure-tls不驗證客戶端證書。
# 在配置文件metrics-server/deploy/1.8+/metrics-server-deployment.yaml添加啓動參數
command:
- /metrics-server
- --metric-resolution=30s
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
# 創建資源
]# kubectl create -f metrics-server/deploy/1.8+/metrics-server-deployment.yaml
serviceaccount/metrics-server created
deployment.extensions/metrics-server created
# 查看相關pod資源狀態
]# kubectl get pods -n kube-system -l k8s-app=metrics-server -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
metrics-server-8445cfc4db-m4nff 1/1 Running 0 6m47s 10.244.2.63 node02.dayi123.com <none> <none>
# 檢查資源的可用性
]# kubectl proxy --port=8080
Starting to serve on 127.0.0.1:8080
# 另開一個窗口檢查node節點可用性
]# curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes
{
"kind": "NodeMetricsList",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
},
"items": [
{
"metadata": {
"name": "master01.dayi123.com",
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/master01.dayi123.com",
"creationTimestamp": "2019-06-13T11:02:57Z"
},
"timestamp": "2019-06-13T11:03:19Z",
"window": "30s",
"usage": {
"cpu": "222451436n",
"memory": "1129748Ki"
}
. . . . . .
# 獲取集羣上所有pod對象的相關資源消耗數據
]# curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/pods
2、kubecto top命令
Metrics-server正常安裝完成後就可以使用kubectl top命令顯示節點和pod對象的資源使用信息。
# 顯示各節點的資源使用信息
]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master01.dayi123.com 200m 10% 1106Mi 64%
node01.dayi123.com 44m 4% 649Mi 46%
node02.dayi123.com 84m 4% 929Mi 54%
# 顯示符合條件的pod的資源使用信息
]# kubectl top pods -n kube-system -l k8s-app=kubernetes-dashboard
NAME CPU(cores) MEMORY(bytes)
kubernetes-dashboard-76479d66bb-9xhkf 1m 20Mi
三、Prometheus
1、Prometheus
Prometheus是一個開源的服務監控系統和時序數據庫,由社交音樂平臺SoundClound在2012年開發,目前已成爲kubernetes生態圈中的核心監控系統。
2、部署Prometheus監控系統
Kubernetes源代碼的集羣附件目錄中統一提供了Prometheus、Alertmanager、node_exporter和kube-state-metrics相關的配置清單,路勁爲cluster/addons/Prometheus。
# 將kubernetes源碼下載至本地
]# wget https://github.com/kubernetes/kubernetes/releases/download/v1.13.2/kubernetes.tar.gz
]# tar -xf kubernetes.tar.gz
(1)生成集羣資源狀態指標
Kube-state-metrics能夠從Kubernete API Server上收集各大多數資源對象的狀態信息並將其轉化爲指標數據,它工作於HTTP的/metrics接口,通過prometheus客戶端暴露於外。Kube-state-metric主要負責爲Cronjob、deployment、persistentvolumeclaim等各類型的資源對象生成指標數據。
# 修改鏡像地址
]# cd kubernetes/cluster/addons/prometheus/
]# sed -i "s#k8s.gcr.io/addon-resizer:1.8.4#googlecontainer/addon-resizer:1.8.4#g" kube-state-metrics-deployment.yaml
# 部署安裝kube-state-metrices
]# kubectl apply -f kube-state-metrics-rbac.yaml
]# kubectl create -f kube-state-metrics-deployment.yaml
]# kubectl create -f kube-state-metrics-service.yaml
# 查看相關pod的運行狀況
]# kubectl get pods -n kube-system -l k8s-app=kube-state-metrics
NAME READY STATUS RESTARTS AGE
kube-state-metrics-7f8bd888d9-cph86 2/2 Running 0 3m25s
# 創建一個客戶端去測試
]# kubectl run client-$RANDOM --image=cirros -it --rm -- sh
/ # curl -s kube-state-metrics.kube-system:8080/metrics | tail
kube_service_spec_type{namespace="default",service="glusterfs-dynamic-d4149b1c-7ad2-11e9-8957-000c29063a23",type="ClusterIP"} 1
kube_service_spec_type{namespace="default",service="kubernetes",type="ClusterIP"} 1
(2)Exporter及Node Exporter
Prometheus通過HTTP週期性的抓取指標數據,監控目標上用於接收並響應數據抓取請求的組件統稱爲exporter。在監控系統上exporter將收集到的數據轉化爲文本格式,並通過HTTP對外暴露相應的接口。
Prometheus爲監控類UNIX操作系統提供了一個專用的node_exporter程序。Node_exporter運行爲守護進程監聽在節點的9100端口,通過URL路勁/metrics提供指標數據。
# 安裝node_exporter
# kubectl create -f node-exporter-ds.yml
]# kubectl create -f node-exporter-service.yaml
# 查看創建的node_exporter
]# kubectl get pods -n kube-system -l k8s-app=node-exporter
NAME READY STATUS RESTARTS AGE
node-exporter-9pz7b 1/1 Running 0 15s
node-exporter-q9449 1/1 Running 0 15s
# 測試node_exporter
]# curl node01:9100/metrics | more
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 6.5346e-05
go_gc_duration_seconds{quantile="0.25"} 6.5346e-05
go_gc_duration_seconds{quantile="0.5"} 6.5346e-05
(3)告警系統Alertmanager
Prometheus的告警功能由兩個步驟實現,首先是Prometheus服務器根據告警規則將告警信息發送給Alertmanager,然後由Alertmanager對收到的告警信息進行處理。
# 查看可供使用的pv
]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
alert-pv01 2Gi RWO Retain Available
由於使用靜態pv供給,在創建pvc前先將alertmanager-pvc.yaml中”storageClassName: nfs”註釋掉,否則無法綁定合適的pv。
# 創建pvc並查看創建的pvc
]# sed -i “s@storageClassName: nfs@#storageClassName: nfs @g”
]# kubectl apply -f alertmanager-pvc.yaml
]# kubectl get pvc -n kube-system
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
alertmanager Bound alert-pv01 2Gi RWO 11m
# 創建其他資源
]# kubectl apply -f alertmanager-configmap.yaml
]# kubectl apply -f alertmanager-deployment.yaml
# 創建service時先修改service類型爲NodePort
]# sed -i "s#ClusterIP#NodePort#g" alertmanager-service.yaml
]# sed -i "s#ClusterIP#NodePort#g" alertmanager-service.yaml
# 查看創建的svc
]# kubectl get svc -n kube-system -l kubernetes.io/name=Alertmanager
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager NodePort 10.106.61.11 <none> 80:32442/TCP 2m51s
Alertmanager安裝後的界面如下:
(4)部署Prometheus服務器
Prometheus服務器是整個監控系統的核心,它通過各exporter週期性的採集指標數據,存儲於本地的TSDB後端存儲系統中,並通過PromQL向客戶端提供查詢接口。
# 先創建configmap和rbac
]# kubectl apply -f prometheus-rbac.yaml
serviceaccount/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
]# kubectl apply -f prometheus-configmap.yaml
在kubernetes項目提供的附件配置清單中,Prometheus使用StatefulSet配置對象,pod對象通過volumeClaimTemplate對象對象動態申請使用存儲卷,在部署前,要確保能爲其提供使用的存儲卷。
# 創建statefulset控制器前先查看可使用的存儲類
]# kubectl get StorageClass
NAME PROVISIONER AGE
glusterfs kubernetes.io/glusterfs 24d
# 修改alertmanager-service.yaml中存儲供給如下
volumeClaimTemplates:
- metadata:
name: prometheus-data
spec:
storageClassName: glusterfs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "5Gi"
# 創建該資源
]# kubectl create -f prometheus-statefulset.yaml
]# kubectl get pods -n kube-system -l k8s-app=prometheus
NAME READY STATUS RESTARTS AGE
prometheus-0 2/2 Running 0 7m44s
# 修改service類型爲NodePort
]# cat prometheus-service.yaml | tail -1
type: "NodePort"
# 創建service並查看
]# kubectl create -f prometheus-service.yaml
]# kubectl get svc -n kube-system -l kubernetes.io/name=Prometheus
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus NodePort 10.111.119.52 <none> 9090:30143/TCP 48s
service資源創建完成後,通過瀏覽器打開如圖所示:
四、HPA控制器
由於手動調整各Pod控制器的副本數量存在一定的滯後性,對此,kubernetes提供了多種彈性的伸縮工具。主要的工具有HPA、CA、VPA、AR。
1、HPA
HPA可作爲KubernetesAPI資源的控制實現,它基於採集到得資源指標數據來調整控制器的行爲,HPA獲取資源指標數據是通過Heapster和REST客戶端接口獲取。目前HPA有兩個版本分別是HPA和HPA v1。
2、HPA(v1)控制器
HPA也是標準的Kubernetes API資源,它的創建方式可通過資源配置清單的方式創建或者通過”kubectl autoscale”命令創建。
# 先創建一個deployment控制器
]# kubectl run mynginx --image=nginx:1.12 --replicas=2 --requests='cpu=5m,memory=128Mi' --limits='cpu=50m,memory=128Mi' --labels='app=mynginx' --expose --port=80
# 創建HPA控制器自動管控Pod副本
]# kubectl autoscale deploy mynginx --min=2 --max=5 --cpu-percent=60
3、HPA(v2)控制器
HPA(v1)只能基於cpu實現自動彈性伸縮,HPA(v2)控制器基支持基於核心指標CPU和內存資源及基於任意自定義指標資源佔用狀態實現規模的彈性伸縮,它從metrics-service中請求查看核心指標。
基於前面創建的mynginx的deployment控制器定義一個基於內存和cpu的hpa控制器資源配置清單如下:
]# cat hpav2-mynginx.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: mynginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: mynginx
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
- type: Resource
resource:
name: memory
targetAverageValue: 50Mi
spec中嵌套的個字段的說明如下:
(1)minReplicas:自動伸縮pod副本數下限
(2)maxReplicas:自動伸縮可擴展至Pod副本數的上限
(3)scaleTargetRef:要伸縮的目標資源
(4)metrics:用於計算所需的Pod副本數量的指標列表
(5)external:用於應用非附屬於任何對象的全局指標
(6)object:應用描述集羣中某單一對象的特定指標
(7)pods:應用被彈性伸縮的pod對象的特定指標
(8)resource:應用資源指標,即當前被彈性伸縮的pod對象中容器的requests和limits中定義的指標。
(9)type:標識指標源的類型