Эта статья участвовала в третьем этапе курса «High Yield Update» тренировочного лагеря для создателей Nuggets. Подробнее см.:Dig Li Project | Идет третий этап тренировочного лагеря создателя, «написание» личного влияния.
1 контраст
node-exporter
Он используется для сбора операционных индикаторов на уровне сервера, включая базовый мониторинг, такой как loadavg, файловая система и meminfo машины, аналогично zabbix-agent в традиционном измерении мониторинга хоста.
metric-server/heapster
Отapi-server
Он получает индикаторы мониторинга, такие как использование процессора и памяти, из Интернета и отправляет их в серверную часть хранилища, например, influxdb или облачным поставщикам.Его основные функции:Обеспечьте поддержку индикаторов принятия решений для таких компонентов, как HPA.
kube-state-metrics
Сосредоточьтесь на получении последнего статуса различных ресурсов k8s, таких как развертывание или набор демонов.
Например:
- Сколько реплик я планирую? Сколько доступно сейчас?
- Сколько подов работает/остановлено/завершено?
- Сколько раз Pod перезагружался?
- Сколько рабочих мест у меня работает
Эти показателиkube-state-metrics
поставка.
Почему неkube-state-metrics
включены вmetric-server
способность, потому что их интересы по своей сути различны.
-
metric-server
Просто извлечение, форматирование существующих данных, запись в определенное хранилище, по сути, система мониторинга. -
kube-state-metrics
Он делает снимок рабочего состояния k8s в памяти и получает новые индикаторы, но у него нет возможности экспортировать эти индикаторы.
2 Развернуть сервер метрик
Загрузите файл yaml, развернутый metric-server, на локальный
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
Перетащите зеркало metric-server на локальный
# docker pull zhaoqinchang/metrics-server:0.3.7
0.3.7: Pulling from zhaoqinchang/metrics-server
9ff2acc3204b: Pull complete
9d14b55ff9a0: Pull complete
Digest: sha256:c0efe772bb9e5c289db6cc4bc2002c268507d0226f2a3815f7213e00261c38e9
Status: Downloaded newer image for zhaoqinchang/metrics-server:0.3.7
docker.io/zhaoqinchang/metrics-server:0.3.7
Измените файл components.yaml следующим образом.
# cat components.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:aggregated-metrics-reader
labels:
rbac.authorization.k8s.io/aggregate-to-view: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
# mount in tmp so we can safely use from-scratch images and/or read-only containers
- name: tmp-dir
emptyDir: {}
containers:
- name: metrics-server
image: zhaoqinchang/metrics-server:0.3.7 #修改镜像为刚刚拉取下来的镜像
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
command: #添加以下三行command命令
- /metrics-server
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
ports:
- name: main-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- name: tmp-dir
mountPath: /tmp
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/name: "Metrics-server"
kubernetes.io/cluster-service: "true"
spec:
selector:
k8s-app: metrics-server
ports:
- port: 443
protocol: TCP
targetPort: main-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats
- namespaces
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
Развернуть метрический сервер
# kubectl apply -f components.yaml
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
Проверьте, отображается ли metric.k8s.io в списке групп API в кластере Kubernetes.
# kubectl api-versions | grep metrics
metrics.k8s.io/v1beta1
3 использовать
kubectl top
Команда может отображать информацию об использовании ресурсов узлов и объектов Pod, и она использует API метрик ресурсов в кластере для сбора различных данных метрик. Он содержит две подкоманды, node и pod, которые могут отображать показатели занятости ресурсов объектов Node и объектов Pod соответственно.
Формат синтаксиса команды для вывода списка занятости ресурсов узла: «kubectl top node [-l label | NAME]». Например, результат отображения состояния занятости ресурсов всех узлов ниже показывает совокупное время занятости ресурсов ЦП и процент каждого узла, а также заполняемость пространства содержимым и коэффициент заполнения. При необходимости вы также можете напрямую указать идентификатор конкретного узла для просмотра в команде и использовать селектор тегов для фильтрации узла.
[root@master metric]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 282m 14% 1902Mi 51%
node-02 70m 3% 1371Mi 37%
node-03 121m 1% 892Mi 11%
Использование занятости ресурса объекта Pod на уровне пространства имен немного отличается.При его использовании вы обычно должны указать пространство имен и использовать селектор тегов для фильтрации целевого объекта Pod. Например, следующее показываетkube-system
Использование ресурсов пода в пространстве имен:
[root@master metric]# kubectl top pods -n kube-system
NAME CPU(cores) MEMORY(bytes)
etcd-master 32m 300Mi
kube-apiserver-master 86m 342Mi
kube-controller-manager-master 30m 48Mi
kube-flannel-ds-l5ghn 5m 10Mi
kube-flannel-ds-rqlm2 4m 12Mi
kube-flannel-ds-v92r9 4m 14Mi
kube-proxy-7vjcv 18m 15Mi
kube-proxy-xrz8f 13m 21Mi
kube-proxy-zpwn6 1m 14Mi
kube-scheduler-master 7m 17Mi
metrics-server-5549c7694f-7vb66 2m 14Mi
Команда kubectl top предоставляет пользователям простой и быстрый интерфейс для получения состояния занятости системных ресурсов объектов Node и Pod.Это одна из часто используемых команд для работы и обслуживания кластера.