Пожелания программистам микросервисов для kubernetes

00:00 — Введение
03:41 — Общие вопросы
06:53 — Конфигурация приложений
10:24 — Состояния
11:49 — Логи приложений
18:20 — Метрики
20:45 — Резервирование ресурсов приложений
21:53 — Пробы
26:09 — Контекст (location)
28:04 — Безопасность
28:34 — Пример

Файлы, используемые в видео.

Видео:

Getting metrics from logs in Elasticsearch

Мне по работе надо получать события когда в логах приложений (логи у нас попадают в elasticsearch) появляются определённые сообщения. Zabbix умеет делать запросы по http. Но у нас Victoriametrics (ибн Prometheus) и хотелось бы, что бы alertmanager генерировал алерты. Но для того, что бы он смог это сделать, нужно что бы соответствующая метрика появилась в victoriametrics. Грубо говоря, нужно что бы Prometheus (или что на него похожее — vmagent) обратился к elasticsearch с определённым запросом и создал метрику. Но он зараза такое не умеет :(.

Да, можно попросить программеров, что бы они сделали нужную нам метрику у приложения. Но это хорошо когда программеры рядом и идут на встречу. Если их нет или это какое то старое приложение то ФСЁ — приплыли и рядом с victoriametrics надо ставить zabbix или что то такое…

Я честно искал приложение, которое может посылать необходимые мне запросы в elasticsearch и генерить метрики Prometheus. Но не нашёл. Возможно я плохо искал?

Вобщем мне надоело искать и я вспомнил, что нормальный сисадмин должен уметь писать вспомогательные утилиты. Я же типа нормальный сисадмин? 🙂

Заодно решил подучить go. Учить язык надо на каком то живом задании. Собственно вот, задание:

  • Приложение должно уметь посылать запросы в elasticsearch и генерировать метрики в формате Prometheus.
  • Это должен быть контейнер.
  • Должна быть горизонтальная масштабируемость. Запросов ожидается много.
  • Мы должны легко жить в kubernetes.

Итого. Программисты, не бейте меня ногами. Вы такого не написали, а мне очень надо. Поэтому родилась вот такая утилита: https://github.com/BigKAA/metrics-from-logs

Это первая версия, написанная по быстрому, на коленке. Там ещё много чего надо дописывать. Научится нормально работать с Redis и много ещё чего.

Kubernetes, StatefulSet, Nexus

Хороший пример для объяснения зачем нужен StatefulSet. Начало серии видео по devops инструментам в кубернетес. Nexus внутри kubernetes, делаем свой docker registry.

  • 03:43 — Про Nexus, общие вопросы выбора технологии деплоймента.
  • 06:40 — StatefulSet — теория.
  • 10:54 — Namespace для nexus, LimitRange на namespace, проект в rancher.
  • 13:48 — Файлы деплоя nexus:
  • 14:20 — Headless service
  • 16:25 — StatefulSet
  • 21:09 — Service, ссылка на конкретный pod в StatefulSet. Вот оно!
  • 23:28 — Ingress.
  • 26:31 — Пароль админа nexus и первоначальная настройка nexus.
  • 27:49 — Настройка репозитория для хранения docker контейнеров. Пользователи и роли.
  • 32:00 — ssl порт и сертификат для репозитория.
  • 41-05 — пушим образы!

Файлы, используемые в видео: https://github.com/BigKAA/youtube/tree/master/nexus

Hibernate, Spring и имена таблиц, полей базы данных.

Эх, давно не брал я в руки шашку. (с) Василий Иванович

Пришлось и мне встать на тропу микросервисов. Поскольку java основной язык программирования, то в качестве платформы был выбран Spring. Начинаю потихоньку копать этот фреймворк.

Досталась мне в наследство базёнка, в которой имена таблиц и полей начинаются с большой буквы. Типа: Notes, NotesIndex и т.п.

Настраиваю spring JPA, все как в примере работы с MySQL. Только в отличии от примера использую готовую таблицу. Проверку опять же:

spring.jpa.hibernate.ddl-auto=validate

Описываю сущности. Причем понимаю, что название таблиц и полей нестандартное, явно указываю имена:

@Data
@Entity
@Table(name = "Notes")
public class Notes {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name="NoteIndex")
  private int noteIndex;

Запускаю приложение и ловлю ошибку:

nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [notes]

Вот засада! Я ведь явно указал имя таблицы. Долго копался в интернетах и нашел решение: необходимо явно определить стратегию именования, иначе не реагирует оно на мои имена таблиц.

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Не ожидал я такой засады от Java

Я, не то чтобы часто, но как минимум раз в полгода пишу всякие утилитки и приложения на java. В основном клиенты к BD на десктоп. В качестве основного инструмента пользуюсь JavaFX.

И вот, поменял себе железо, начал ставить софт, в том числе и IDE для разработки. Ну и заодно решил попробовать 11-ю (да и 12-ю) версию SDK. Открываю старый проект, дописать пару фишек. А он не работает. IDE подчеркивает красным все что связано с JavaFX.

Вобщем, пока я был в танке, они выпилили JavaFX из java! Не, ну С… (Стабильность).

Оно конечно есть проект Open JavaFX, продвигаемый достойной компанией. Но мне теперь придется кучу проектов переделывать, что бы все заработало! Ну не уроды эти Ораклы?

Так что, пока остаюсь на 8-й жабе. Но уже как то не уютно стало мне в этой среде.

MySQL и mariadb, строка подключения.

Нынче не все как вчера 🙂 MySQL не исключение.

На всякий случай оставлю тут, что бы каждый раз не искать по интернетам кошерные параметры подключения последних версий драйвера Connector/J.

jdbc:mysql://192.168.0.1/BaseName?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow&useSSL=false

Android и MySQL

Блин, ну что за карма такая? Хотел сделать приложение, которое когда находишься в домашней сети, обновляет локальный кеш из базы MySQL.

Ан нет, не поддерживается в роботе работа JDBC.

DriverManager.getConnection

Вызывает эксцепшены, мол нет классов

java.sql

И все, гудбай друг.

Предлагают через WEB приложения данные из базы качать 🙁 Из-за такой ерунды придется в глассфише посредника писать 🙁

Эмуляторы из Android studio и AMD Ryzen 2400G процессор

Решил тут с андроидом побаловаться. Поставил Андроид студио на Win10 и… у меня отказались работать все входящие в комплект поставки эмуляторы.

Стал разбираться в проблеме. Из заголовка понятно, что у меня не Intel процессор 🙂 Я от них отказался, после того как все мои Intel машины начали дико тормозить после патчей с исправлением проблем безопасности данных устройств. Купил не дорогой комплект на AMD Ryzen 2400G. Производительность для разработки и администрирования отличная. На нем даже играть можно без особых проблем. Во всяком случае мой игровой ноутбук на i5 gforce 760 тихо скулит в стороне.

Понятно, что х86 эмуляторы, требующие драйвера от компании Intel, работать не будут. Так-как этот драйвер на AMD не устанавливается. Но и эмуляторы arm не заработали! Крутил, вертел, так и не запустились. Пришлось железный телефон подключать.

Вот так и живем со шнурком в компутере 🙁

java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface javax.validation.constraints.

Описываю сущность. Код сгенерил сам NetBeans на основании таблицы базы данных.

@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = «login»)
private String login;

При каждом обращении к этой сущности ловлю:
Exception: java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface javax.validation.constraints.NotNull

Если закомментирую описание  @NotNull, получаю:
Exception: java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface javax.validation.constraints.Size

Оказывается, описание @Column дублирует эти описания и выдает исключение.
Теперь правильно писать так:

@Id
@Basic(optional = false)
@Column(name = «login», length = 100, nullable = false)
private String login;