Мониторинг кластера kubernetes: общий обзор и знакомство с prometheus

Шаг 7 — Запуск приложения на кластере

Теперь вы можете развернуть на кластере любое приложение в контейнере. Для удобства мы развернем Nginx с помощью Deployments и Services и посмотрим, как можно развернуть это приложение на кластере. Вы можете использовать приведенные ниже команды для других приложений в контейнерах, если вы измените имя образа Docker и дополнительные параметры (такие как и ).

Запустите на главном узле следующую команду для создания развертывания с именем :

Развертывание — это тип объекта Kubernetes, обеспечивающий постоянную работу определенного количества подов на основе заданного шаблона, даже в случае неисправности пода в течение срока службы кластера. Вышеуказанное развертывание создаст под с одним контейнером из образа Nginx Docker в реестре Docker.

Запустите следующую команду, чтобы создать службу , которая сделает приложение общедоступным. Для этого используется схема NodePort, которая делает под доступным на произвольном порту, который открывается на каждом узле кластера:

Службы — это еще один тип объектов Kubernetes, который открывает внутренние службы кластера для внутренних и внешних клиентов. Они поддерживают запросы балансировки нагрузки на разные поды и являются неотъемлемым компонентом Kubernetes, который часто взаимодействует с другими компонентами.

Запустите следующую команду:

Будет выведен текст следующего вида:

В третьей сроке результатов указан номер порта, на котором запущен Nginx. Kubernetes автоматически назначает случайный порт с номером выше и при этом проверяет, не занят ли этот порт другой службой.

Чтобы убедиться в работе всех элементов, откройте адрес или в браузере на локальном компьютере. Вы увидите знакомую начальную страницу Nginx.

Если вы захотите удалить приложение Nginx, предварительно удалите службу с главного узла:

Запустите следующую команду, чтобы проверить удаление службы:

Результат будет выглядеть следующим образом:

Затем удалите развертывание:

Запустите следующую команду для проверки успешности выполнения:

Кому нужен Kubernetes

Теперь порассуждаем о том, кому может пригодиться Kubernetes. В первую очередь это крупные компании со своими разработками в ИТ и командами программистов, для которых нужна большая производственная среда. Кластер Кубера добавляет серьезные накладные расходы на свое содержание, поэтому в небольших проектах выгоды от него не будет. Нет смысла объединить 5 маленьких виртуалок в кластер и эксплуатировать его. Если только для тестов. Или если вы точно уверены, что у проекта будет серьезный рост в ближайшее время. Под небольшую структуру и нагрузки лучше подыскать решения попроще, чем кубернетис.

Kubernetes накладывает серьезные требования к приложениям, которые в нем работают. Они должны быть изначально спроектированы и написаны по принципу микросервисов. У вас не получится взять и перенести в кластер сайт на wordpress или bitrix, даже если они очень большие и нагруженные. Вернее, перенести то вы их сможете, но вряд ли вам от этого будет проще и удобнее. Основное преимущество кластера — гибкость в разработке, деплое приложения, а так же в распределении ресурсов.

Примерная схема работы с кластером кубернетис на пальцах будет такая:

  1. Разработчики какого-то одного сервиса проекта выпускают обновление, запушив его в репозиторий.
  2. Система сборки формирует докер контейнер с этими изменениями и кладет в registry.
  3. Контейнер уезжает на тесты и если все в порядке, выкатывается в продакшн кластер kubernetes.

Это я очень просто и условно описал. Все процессы после пуша кода в репозиторий могут быть автоматизированы. Команд разработчиков, как и микросервисов, может быть десятки. Они могут условно независимо друг от друга выкатывать обновления. У каждого сервиса могут быть свои языки программирования, свои системные требования, свои файловые хранилища и базы данных. Все эти сущности отдельно описываются в конфигурациях кластера. Каждый микросервис получает то, что ему нужно для работы.

Теперь смотрим на Bitrix или WordPress. Они являются монолитными приложениями, написанными на php с использованием базы Mysql. В них нет микросервисов. Вам нужно либо как-то разбивать их на части, либо постоянно выкатывать все целиком. Но в этом случае смысл кластера кубернетис теряется, его гибкость настроек и выделения ресурсов под потребности не используются. Вам проще поставить обычный балансер на вход, сделать несколько нод для обработки php и за ними кластер БД.

Setting up our project

Create a folder called and within that folder, run the following command:

This will set you up with all the necessary files to get started. You’ll be greeted with the following folder structure:

Of course, you can name the folder whatever you want, accordingly, it will generate different file names for your project. But for the sake of simplicity, I’m just sticking with throughout this post.

Setting the env

The first thing we want to do before we start writing our stack is creating some constants that we will use. Create a file and add the following constants:

The first constant is our AWS env. We create an interface for it for type safety, since we are using TypeScript here. You’d probably want to move that into a separate file and import it, but for simplicity’s sake, I’ll keep it like this.

The constant is needed to do a Route53 lookup later on in the code. You need to specify account/region at stack level otherwise it will throw an error.

You can either do that by configuring «env» with explicit account and region when you define your stack, or use the environment variables and to inherit environment information from the CLI.

Replace the account number with your AWS account number, and change the region to the region in which you want to deploy your cluster.

Then within import and add it to the stack, like so:

Defining the other constants

The next constant is our hosted Route53 zone. Make sure you add this through the AWS console before continuing!

The second one will be our namespace on the Kubernetes cluster where we will install all of our Traefik resources. I named it , however, some prefer to add them to to for example, so I defined it as a variable.

The last constant we will define is our basic auth name plus hashed password. This will allow us to make the Traefik dashboard publicly accessible, but protected through a username and password. We will set this as an Secret in Kubernetes, so it expects it to be encoded. To create this string, run (replacing user & password):

Alright, that’s done. Let’s start building our stack!

Deployments

Развертывания позволяют управлять экземплярами подов. С их помощью контролируется их восстановление, а также балансировка нагрузки. Рассмотрим пример использования Deployments в Kubernetes.

Создание

Deployment создаем командой со следующим синтаксисом:

kubectl create deploy <название для развертывания> —image <образ, который должен использоваться>

Например:

kubectl create deploy web-set —image nginx:latest

* данной командой мы создадим deployment с именем web-set; в качестве образа будем использовать nginx:latest.

Просмотр

Посмотреть список развертываний можно командой:

kubectl get deploy

Подробное описание для конкретного развертывания мы можем посмотреть так:

kubectl describe deploy web-set

* в данном примере мы посмотрим описание deployment с названием web-set.

Scaling

Как было написано выше, deployment может балансировать нагрузкой. Это контролируется параметром scaling:

kubectl scale deploy web-set —replicas 3

* в данном примере мы указываем для нашего созданного ранее deployment использовать 3 реплики — то есть Kubernetes создаст 3 экземпляра контейнеров.

Также мы можем настроить автоматическую балансировку:

kubectl autoscale deploy web-set —min=5 —max=10 —cpu-percent=75

В данном примере Kubernetes будет создавать от 5 до 10 экземпляров контейнеров — добавление нового экземпляра будет происходить при превышении нагрузки на процессор до 75% и более.

Посмотреть созданные параметры балансировки можно командой:

kubectl get hpa

Редактирование

Для нашего развертывания мы можем изменить используемый образ, например:

kubectl set image deploy/web-set nginx=httpd:latest —record

* данной командой для deployment web-set мы заменим образ nginx на httpd; ключ record позволит нам записать действие в историю изменений.

Если мы использовали ключ record, то историю изменений можно посмотреть командой:

kubectl rollout history deploy/web-set

Перезапустить deployment можно командой:

kubectl rollout restart deploy web-set

Манифест

Как в случае с подами, для создания развертываний мы можем использовать манифесты. Попробуем рассмотреть конкретный пример.

Создаем новый файл:

vi manifest_deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
  labels:
    app: web_server
    owner: dmosk
    description: web_server_for_site
spec:
  replicas: 5
  selector:
    matchLabels:
      project: myweb
  template:
    metadata:
      labels:
        project: myweb
        owner: dmosk
        description: web_server_pod
    spec:
      containers:
        — name: myweb-httpd
          image: httpd:latest
          ports:
            — containerPort: 80
            — containerPort: 443
            

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: web-deploy-autoscaling
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myweb-autoscaling
  minReplicas: 5
  maxReplicas: 10
  metrics:
  — type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 75
  — type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

* в данном манифесте мы создадим deployment и autoscaling. Итого, мы получим 5 экземпляров подов для развертывания web-deploy, которые могут быть расширены до 10 экземпляров. Добавление нового будет происходить при превышении нагрузки на процессор более чем на 75% или потреблением оперативной памяти более чем на 80%.

Чтобы создать объекты с помощью нашего манифеста вводим:

kubectl apply -f manifest_deploy.yaml

Мы должны увидеть:

deployment.apps/web-deploy created
horizontalpodautoscaler.autoscaling/web-deploy-autoscaling created

Объекты web-deploy и web-deploy-autoscaling созданы.

Удаление

Для удаления конкретного развертывания используем команду:

kubectl delete deploy web-set

Для удаления всех развертываний вместо названия deployment указываем ключ —all:

kubectl delete deploy —all

Удалить критерии autoscaling для конкретного развертывания можно командой:

kubectl delete hpa web-set

Удалить все критерии autoscaling можно командой:

kubectl delete hpa —all

Удалить объекты, созданные с помощью манифеста можно командой:

kubectl delete -f manifest_deploy.yaml

ALB Ingress ServiceAccount

Create a ServiceAccount named alb-ingress-controller in the kube-system namespace, add and named alb-ingress-controller with access rules:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/rbac-role.yamlclusterrole.rbac.authorization.k8s.io/alb-ingress-controller createdclusterrolebinding.rbac.authorization.k8s.io/alb-ingress-controller createdserviceaccount/alb-ingress-controller created

Check:

$ kubectl -n kube-system get serviceaccounts | grep albalb-ingress-controller 1 32s

Service Meshes

Istio

The default installation should work out of the box with Instana. If however you deploy Istio with a default deny policy (). To work effectively with this configuration it is necessary to enable Instana’s service mesh by-pass. This can be enabled with the following agent configuration:

The setting will bypass blocked network connectivity in 2 different ways:

  • Allow outgoing traffic from the application pod to the agent (on all ipv4 addresses the agent listens on, all ports).
  • Allow incoming traffic to the application pod from the agent for JVM applications (from all ipv4 addresses the agent listens on, all ports).

Debugging the Mesh By-pass

There are a couple of steps that can be taken to debug the service mesh by-pass.

  1. verify it is enabled.
  2. verify the iptable rules are applied to the container.

Verify Enabled

To verify the service mesh by-pass is enabled you can check in the Instana Agent
logs with the following command:

If it is enabled you should find log lines that look similar to the following
which indicate an inboud & output by-pass entry has been written for the denoted process:

and

Verify iptable Rules

The easiest way to verify the iptable rules is to shell into the instana agent
and listing the target containers iptables rules as follows. Replace with the process pid:

If the chains have been applied the command should have an output similar to the following:

To support bi-directional communication between the instana agent and your JVM processes also check the following:

with a result similar to this:

Depending on when the rules were applied it can take a few minutes for the process
to be instrumented and data to be visible in Instana’s dashboards.

Health Rules

Built-in

There are a couple of built-in health rules that will trigger an issue for Kubernetes entities

  • Cluster

    Kubernetes reports a Master-Component (api-server, scheduler, controller manager) is unhealthy. Note that due to
    a bug in Kubernetes the health is not always reported
    reliably. We try to filter these out, not causing an alert but only showing up on the Cluster detail page.

  • Node

    • Requested CPU is approaching max capacity (requested CPU / CPU capacity ratio is greater than 80%).
    • Requested Memory is approaching max capacity (requested memory / memory capacity ratio is greater than 80%).
  • Namespace

    • Requested CPU is approaching max capacity (requested CPU / CPU capacity ratio is greater than 80%).
    • Requested Memory is approaching max capacity (requested memory / memory capacity ratio is greater than 80%)
  • Deployment

    Available replicas less than desired replicas.

  • Pod

    A pod is not ready for more than one minute, and the reason is not that it’s completed. (PodCondition=Ready, Status=False, Reason != PodCompleted). See Kubernetes docs for details on all pod conditions.

Custom

In addition to the built-in rules, you can also create custom rules on metrics of a cluster, namespace, deployment, and pod. E.g. if the threshold for node capacity warnings is too high you can disable them and create a custom rule with a lower threshold. See Events & Incidents configuration for details.

Kubernetes Concepts Covered

S.No Kubernetes Concept Name
1. Kubernetes Architecture
2. Pods
3. ReplicaSets
4. Deployments
5. Services — Node Port Service
6. Services — Cluster IP Service
7. Services — External Name Service
8. Services — Ingress Service
9. Services — Ingress SSL & SSL Redirect
10. Services — Ingress & External DNS
11. Imperative — with kubectl
12. Declarative — Declarative with YAML
13. Secrets
14. Init Containers
15. Liveness & Readiness Probes
16. Requests & Limits
17. Namespaces — Imperative
18. Namespaces — Limit Range
19. Namespaces — Resource Quota
20. Storage Classes
21. Persistent Volumes
22. Persistent Volume Claims
23. Services — Load Balancers
24. Annotations
25. Canary Deployments
26. HPA — Horizontal Pod Autoscaler
27. VPA — Vertical Pod Autoscaler
28. CA — Cluster Autoscaler
29. DaemonSets
30. DaemonSets — Fluentd for logs
31. Config Maps

Начало работы

Вопрос. Как зарегистрироваться в сервисе AWS Elastic Beanstalk?

Чтобы зарегистрироваться в сервисе AWS Elastic Beanstalk, нажмите кнопку «Зарегистрироваться» на странице описания Elastic Beanstalk. Чтобы получить доступ к этому сервису, требуется аккаунт Amazon Web Services. Если его еще нет, вам будет предложено создать его в начале процесса регистрации в сервисе AWS Elastic Beanstalk. После регистрации ознакомьтесь с Руководством по началу работы с AWS Elastic Beanstalk.

Вопрос: Почему при регистрации в сервисе AWS Elastic Beanstalk меня просят подтвердить номер телефона?

Для регистрации в сервисе AWS Elastic Beanstalk должен быть указан действительный номер телефона и адрес электронной почты (на случай, если нам потребуется связаться с вами). Процедура подтверждения номера телефона занимает всего несколько минут: на указанный номер поступит звонок, после чего потребуется ввести PIN‑код с помощью кнопок своего телефона.

Вопрос. Как после регистрации приступить к работе?

Для скорейшего начала работы с AWS Elastic Beanstalk воспользуйтесь руководством по началу работы с AWS Elastic Beanstalk, которое входит в техническую документацию. Уже через несколько минут можно будет выполнить развертывание образца приложения и приступить к его использованию или загрузить собственное приложение.

Основные компоненты

Схема взаимодействия основных компонентов K8s

Node (Нода)

Ноды или узлы — виртуальные или физические машины, на которых разворачивают и запускают контейнеры. Совокупность нод образует кластер Kubernetes.

Первая запущенная нода или мастер-нода непосредственно управляет кластером, используя для этого менеджер контроллеров (controller manager) и планировщик (scheduler). Она ответственна за интерфейс взаимодействия с пользователями через сервер API и содержит в себе хранилище «etcd» с конфигурацией кластера, метаданными и статусами объектов.

Namespace (Пространство имен)

Объект, предназначенный для разграничения ресурсов кластера между командами и проектами. Пространства имен — несколько виртуальных кластеров, запущенные на одном физическом.

Pod (Под)

Первичный объект развертывания и основной логический юнит в K8s. Поды — набор из одного и более контейнеров для совместного развертывания на ноде.

Группировка контейнеров разных типов требуется в том случае, когда они взаимозависимы и должны запускаться в одной ноде. Это позволяет увеличить скорость отклика во время взаимодействия. Например, это могут быть контейнеры, хранящие веб-приложение и сервис для его кэширования.

ReplicaSet (Набор реплик)

Объект, отвечающий за описание и контроль за несколькими экземплярами (репликами) подов, созданных на кластере. Наличие более одной реплики позволяет повысить устойчивость от отказов и масштабирование приложение. На практике ReplicaSet создается с использованием Deployment.

ReplicaSet является более продвинутой версией предыдущего способа организации создания реплик (репликации) в K8s – Replication Controller.

Deployment (Развертывание)

Объект, в котором хранится описание подов, количество реплик и алгоритм их замены в случае изменения параметров. Контроллер развертывания позволяет выполнять декларативные обновления (с помощью описания нужного состояния) на таких объектах, как ноды и наборы реплик.

StatefulSet (Набор состояния)

Как и другие объекты, например — ReplicaSet или Deployment, Statefulset позволяет развертывать и управлять одним или несколькими подами. Но в отличие от них, идентификаторы подов имеют предсказуемые и сохраняемые при перезапуске значения.

DaemonSet (Набор даемона)

Объект, который отвечает за то, чтобы на каждой отдельной ноде (или ряде выбранных) запускался один экземпляр выбранного пода.

Job/CronJob (Задания/Задания по расписанию)

Объекты для регулировки однократного или регулярного запуска выбранных подов и контроля завершения их работы. Контроллер Job отвечает за однократный запуск, CronJob — за запуск нескольких заданий по расписанию.

Label/Selector (Метки/Селекторы)

Метки предназначены для маркировки ресурсов. Позволяют упростить групповые манипуляции с ними. Селекторы позволяют выбирать/фильтровать объекты на основе значения меток.

По факту, метки и селекторы не являются самостоятельными объектами Kubernetes, но без них система не сможет полноценно функционировать.

Service (Сервис)

Средство для публикации приложения как сетевого сервиса. Используется, в том числе, для балансировки трафика/нагрузки между подами.

Работа с кластером

Kubectl

Команда создает под именем «minikube».
Этот контекст содержит конфигурацию для взаимодействия с кластером Minikube.

Minikube автоматически устанавливает этот контекст, но если вам потребуется явно использовать его в будущем, выполните команду ниже:

Либо передайте контекст при выполнении команды следующим образом: .

Панель управления

Чтобы получить доступ к веб-панели управления Kubernetes, запустите эту команду в командной оболочке после запуска Minikube, чтобы получить адрес:

Сервисы

Чтобы получить доступ к сервису, открытой через порт узла, выполните команду в командной оболочке после запуска Minikube, чтобы получить адрес:

Монтирование конфигов через ConfigMap

Абстракция kubernetes configmap придумана для того, чтобы отвязать конфиги контейнеров docker от deployment, чтобы не раздувать их размер. К примеру, нам нужно во все контейнеры с nginx положить конфиг default.conf. Мы для этого создаем configmap, в нем настраиваем желаемый конфиг и потом подключаем его в deployment. Показываю на примере. Создаем файл configmap.yaml.

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-nginx
data:
  default.conf: |
    server {
        listen       80 default_server;
        server_name  _;

        default_type text/plain;

        location / {
            return 200 '$hostname\n';
        }
    }

В данном случае это простейший конфиг для nginx, который при обращении к серверу будет отдавать 200-й код ответа и имя сервера. Теперь подключаем его к нашему deployment из предыдущих примеров.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-nginx
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - image: nginx:1.16
        name: nginx
        ports:
        - containerPort: 80
        readinessProbe:
          failureThreshold: 5
          httpGet:
            path: /
            port: 80
          periodSeconds: 10
          successThreshold: 2
          timeoutSeconds: 3
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /
            port: 80
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 3
          initialDelaySeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 256Mi
          limits:
            cpu: 300m
            memory: 512Mi
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
      volumes:
      - name: config
        configMap:
          name: configmap-nginx

Мы создаем монтирование с именем config по пути /etc/nginx/conf.d/ и связываем это монтирование с configmap, который ранее создали. Теперь применяем сначала configmap, а затем deployment.

# kubectl apply -f configmap.yaml 
configmap/configmap-nginx created
# kubectl apply -f deployment-nginx-confmap.yaml 
deployment.apps/deployment-nginx configured

Проверяем, что получилось. Я подключусь к одному из подов и прочитаю там конфигурацию nginx.

Видим, что применился наш configmap. На втором поде будет то же самое.

Заключение

Если у вас нет возможности или желания настраивать кластер Kubernetes самостоятельно на своем железе, можете купить его в готовом виде как сервис в облаке Mail.ru Cloud Solutions.

На этом начальную статью по Kubernetes заканчиваю. На выходе у нас получился рабочий кластер из трех мастер нод, двух рабочих нод и ingress контроллера. В последующих статьях я расскажу об основных сущностях kubernetes, как деплоить приложения в кластер с помощью Helm, как добавлять различные стореджи, как мониторить кластер и т.д. Да и в целом, хочу много о чем написать, но не знаю, как со временем будет.

В планах и git, и ansible, и prometeus, и teamcity, и кластер elasticsearch. К сожалению, доход с сайта не оправдывает временных затрат на написание статей, поэтому приходится писать их либо редко, либо поверхностно. Основное время уходит на текущие задачи по настройке и сопровождению.

Заключение

Я рассмотрел основные абстракции kubernetes, которые нужны для того, чтобы на нем хоть что-то запустить и начать работать. Кластер в таком виде уже способен принимать запросы из вне. Для полноты картины не хватает одного объемного раздела — фаловые хранилища. Эта отдельная большая тема, поэтому я решил ее не затрагивать здесь, а вынести в отдельную статью, которая будет следующей в этом цикле. В таком виде, как описано здесь, используются локальные диски нод кластера, где запущены контейнеры docker.

Если вам подходит такой формат работы — пользуйтесь. По большому счету, он вполне жизнеспособен, если у вас все полезные данные, к примеру, хранятся в самих контейнерах в реджистри и в базе данных, которая работает не в кластере, а медиаконтент на внешних CDN. В таком случае kubernetes будет работать как масштабируемый вычислительный кластер.

Для автоматического деплоя приложений в кластер k8s можно использовать helm. Я рассмотрел этот вопрос в отдельной статье — Работа с Helm 3 в Kubernetes.

Напоминаю, что подробно, с примерами и практическими заданиями изучить кластер kubernetes можно на обучении Слёрм, которое я прошел лично и могу рекомендовать, как хороший и эффективный курс.

Онлайн курс по Kubernetes

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Если вы ответите «да» хотя бы на один вопрос, то это ваш курс:

  • устали тратить время на автоматизацию?
  • хотите единообразные окружения?;
  • хотите развиваться и использовать современные инструменты?
  • небезразлична надежность инфраструктуры?
  • приходится масштабировать инфраструктуру под растущие потребности бизнеса?
  • хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?

Сдавайте вступительный тест по и присоединяйтесь к новому набору!.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: