В этом руководстве представлено пошаговое руководство по установке сервера метрик Kubernetes в кластере Kubernetes. Сервер метрик Kubernetes играет жизненно важную роль в мониторинге кластера Kubernetes, собирая данные об использовании ресурсов, таких как использование ЦП и памяти, от различных компонентов. Он предоставляет ценную информацию о работоспособности и производительности приложений, узлов и модулей pod, что позволяет эффективно масштабировать ресурсы, выявлять узкие места и оперативно устранять неполадки.
Пошаговая инструкция: установка сервера метрик в кластере Kubernetes
В чем польза сервера метрик Kubernetes?
Сервер Kubernetes Metrics может быть использован в кластере Kubernetes для:
- Horizontal Scaling: это также известно как scaling out, оно включает в себя увеличение или уменьшение количества реплик (экземпляров) приложения или службы в зависимости от использования ЦП или памяти. При горизонтальном масштабировании дополнительные модули pod (контейнеры) добавляются или удаляются динамически для распределения рабочей нагрузки между несколькими экземплярами. Такой подход позволяет лучше использовать ресурсы и повысить производительность приложений по мере равномерного распределения нагрузки. В основном используется для приложений без отслеживания состояния, которые можно масштабировать без ущерба для согласованности данных.
- Vertical Scaling: Это также известно как scaling up or down и включает в себя настройку ресурсов (ЦП, памяти), выделенных для отдельных экземпляров приложения или службы. При вертикальном масштабировании вы увеличиваете или уменьшаете емкость каждого экземпляра, изменяя его ограничения ресурсов. В основном используется для приложений с отслеживанием состояния, которые могут поддерживать собственное состояние или данные. Вертикальное масштабирование имеет ограничения, продиктованные емкостью базовой инфраструктуры.
Установка сервера метрик Kubernetes в кластере Kubernetes
Установка и настройка кластера Kubernetes
Прежде чем вы продолжите, мы предполагаем, что у вас уже есть кластер K8s, работающий и работающий.
Вы можете ознакомиться с нашим предыдущим руководством о том, как установить и настроить кластер Kubernetes;
Существует два способа установки сервера Metrics;
- через components manifest file компонентов сервера Metric, доступный в репозитории Github
- Через официальный Helm Chart repository.
В этом руководстве мы будем использовать файл манифестов компонентов для установки сервера метрик.
Скачивание манифестов сервера метрик
Если вы хотите обновить конфигурации манифеста, такие как ограничения ресурсов или другие параметры в соответствии с вашими требованиями, лучше всего загрузить его в плоскость управления для редактирования.
Таким образом, вы можете скачать последний файл манифеста компонентов сервера Metrics с помощью команды ниже;
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Вот как выглядит стандартный файл манифеста серверных компонентов Metrics;
cat components.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
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: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
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: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
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
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.k8s.io/metrics-server/metrics-server:v0.6.3
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 4443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100
Установка сервера метрик Kubernetes
Прежде чем продолжить, следует отметить, что сервер Metrics будет взаимодействовать со следующими компонентами кластера:
- Control Plane API server: это основной способ взаимодействия с кластером Kubernetes, и метрики, собранные из компонентов кластера сервером метрик, предоставляются через этот API для использования такими инструментами, как панель мониторинга Kubernetes.
- Kubelet — это агент, который работает на каждом рабочем узле в кластере. Он предоставляет конечную точку API, через которую сервер метрик будет очищать метрики использования ресурсов подов и контейнеров.
Сервер метрик настроен для взаимодействия с этими конечными точками с помощью сертификата TLS, который должен быть подписан центром сертификации кластера. Таким образом, в демонстрационных целях вы можете отключить проверку SSL/TLS между сервером Metrics и указанными выше конечными точками, используя опцию --kubelet-insecure-tls.
Кроме того, файл манифеста компонентов по умолчанию определяет порт контейнера как 10250/tcp. Этот порт уже используется kubelet в кластере;
sudo ss -atlnp | grep 10250
LISTEN 0 4096 *:10250 *:* users:(("kubelet",pid=1185141,fd=20))
Следовательно, давайте изменим это на свободный порт, например, 4443.
vim components.yaml
...
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls ...
name: metrics-server
ports:
- containerPort: 4443 name: https
protocol: TCP
Кроме того, чтобы избежать ситуации, когда статус доступности Metric-сервера становится False с "FailedDiscoveryCheck", вам необходимо настроить Pods, созданные Metric server Deployment, на использование сетевого пространства имен хоста (hostNetwork: true). Служба API сервера метрик не работает непосредственно в сети виртуального кластера (оверлейной сети, используемой модулями pods для связи), поэтому используется именно эта сеть узла.
...
spec:
hostNetwork: true containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls ...
name: metrics-server
ports:
- containerPort: 4443 name: https
protocol: TCP
Аналогично, чтобы решить эту "панику: невозможно загрузить configmap на основе request-header-client-ca-file: Get "...": наберите tcp ... Тайм-аут ввода-вывода", вам необходимо обновить роли, чтобы разрешить доступ к ресурсам ConfigMaps.
...
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
- configmaps verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
- configmaps verbs:
- get
- list
- watch
В общем, вот такая у нас обновленная конфигурация.
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
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: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
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: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
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
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
hostNetwork: true
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: registry.k8s.io/metrics-server/metrics-server:v0.7.1
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 4443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100
Откройте порт сервера метрик на брандмауэре на всех узлах кластера.
При использовании FIREWALLD
sudo firewall-cmd --zone=public --permanent --add-port=4443/tcp
firewall-cmd --reload
Если вы используете что-то другое, а не ufw, откройте порт соответствующим образом.
Теперь вы можете установить сервер метрик, применив файл конфигурации манифеста компонентов сервера метрик с помощью приведенной ниже команды.
kubectl apply -f components.yaml
Аналогичным образом, если вы хотите напрямую установить сервер Metrics без изменения конфигураций по умолчанию, вы можете выполнить следующую команду;
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Проверка установки сервера метрик Kubernetes
Теперь вы можете проверить установку сервера Metric в Kubernetes.
На основе приведенной выше конфигурации манифеста компонентов будет создано развертывание с именем metrics-server в пространстве имен kube-system.
Чтобы получить сведения о развертывании сервера Metrics, выполните следующую команду:
kubectl get deployment metrics-server -n kube-system
Образец вывода;
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 8m16s
Также создается Pod;
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
...
metrics-server-7b4c4d4bfd-rdz8t 1/1 Running 0 9m21s
Ознакомьтесь с API-сервисами;
kubectl get apiservices
...
v1beta1.metrics.k8s.io kube-system/metrics-server True 11m
Проверка использования процессора и памяти подов/узлов Kubernetes
После установки сервер метрик начнет собирать информацию об использовании ресурсов из кластера.
Давайте выполним команду top для проверки использования CPU и памяти Pods в пространстве имен по умолчанию;
kubectl top pods
NAME CPU(cores) MEMORY(bytes)
nagios-core-deployment-694b75b55b-845mh 2m 32Mi
nagios-core-deployment-694b75b55b-8lflz 2m 32Mi
nagios-core-deployment-694b75b55b-hrw4n 3m 31Mi
Отображение метрик для всех подов в заданном пространстве имен;
kubectl top pod --namespace=NAMESPACE
Отображение метрик для данного пода и его контейнеров;
kubectl top pod POD_NAME --containers
Проверка узлов;
kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
kube-apiserver.kalyuzhnyy.ru 449m 22% 1516Mi 39%
k8smas1.kalyuzhnyy.ru 120m 6% 1022Mi 26%
k8swor1.kalyuzhnyy.ru 46m 2% 1035Mi 27%
k8swor2.kalyuzhnyy.ru 76m 3% 812Mi 21%
Просмотр метрик на панели управления Kubernetes
Вы можете установить дашборд Kubernetes и использовать его для просмотра метрик подов/контейнеров;
Если у вас есть какие-либо мысли или вопросы по этой теме, пожалуйста, не стесняйтесь оставить комментарий или отправить мне сообщение. Я хотел бы продолжить дискуссию и услышать вашу точку зрения.
А также вы всегда можете поддержать меня зайдя на сайт и подписаться https://dzen.ru/kalyuzhnyy.ru и найти больше статей на моих ресурсах https://kalyuzhnyy.ru и https://dev.kalyuzhnyy.ru