Миграция с

Docker Swarm на Kubernetes

Денис Катаев

О себе

А что за проект?

История проекта

  • Альберт делает типичный ML проект
  • Проект начинает рости очень быстро
  • Альберт постоянно помогает всем подряд

Docker Swarm?

Неизвестно почему был выбран именно он

Дано:

  • 5 виртуальных серверов
  • Банковская NFS шара
  • Банковский PostgreSQL
  • Банковский TeamCity

Архитектурные мины

:latest

Только тут оно :test и :prod

Простые сервисы имеют state

Сервису нужна модель с NFS

Балансировщика нет

И большинство проблем из-за этого

Homemade

porno^W balancer

Типичное расследование

  1. Есть путь урла /kek/lol
  2. Идешь в одну репку ищешь в nginx location и на  какой порт он проксирует
  3. Идешь в swarm и смотришь что за сервис за этим портом
  4. Гадаешь по image name что это за репозиторий в stash
  5. Идешь читаешь код сервиса что понять что происходит

Я

Portainer

Docker swarm GUI на основе docker rest api

Результат

Надо чистить вилкой:

docker system prune

Страшно медленный

Логи?

Несколько контейнеров?

Получи логи со случайного контейнера!

Поведение кластера

Нет логов поведения кластера

Replacate: 4 — Runned: 0

  • Контейнер умер или убит? А почему?
  • Контейнер не стартует
  • Restart: always? А мне пофиг!
  • Почему не запускаются сервисы?

Open terminal

Контейнер живет если закрыть вкладку без disconnect

Named volumes

Выводы

Анти CI/CD

Медленные сборки

  • Нет кеша сборок т.к собирается на разных машинах кластера teamcity
  • Привет от alpine и python: нет прекомпиленных образов (python wheels)
  • Меняем 1 строку = 15-30 минут сборки
  • ...
  • Fail

Прямой push в registry

Прямо с машины разработчика

Вишенка на торте

Деплой через ssh + git pull + docker stask deply

Вторая вишенка

Deploy через update service + pull image (спасибо :latest)

Как это чинить?

Ускоряем сборку

Базовый образ

По сути это просто cache

Нормальные теги

image:{DATE}-{branch}-{git-hash}

Нормальный кластер

Два стула

  1. Банковский rancher v1.4.*
  2. Банковский kubernetes

Всё готовенькое

Чем же он так хорош?

И зачем он вам нужен?

Предметная область

Оркестрация разложена на сущности

Пример с автобусами

Что то вроде 3 нормальной формы базы данных

Наш зоопарк

  • Deployment
  • Service
  • Ingress

 

Весь statefull пометили как legacy

Что получили

  • пустой кластер
  • балансировщики
  • стабильную работу
  • логи о работе кластера (replicaset)
  • ...
  • ждем DevOps'а чтоб настроил деплой из CI

Что еще?

...
 spec:
   containers:
     - name: front-end
       image: nginx
       ports:
         - containerPort: 80
     - name: rss-reader
 ...
  • Пакетный менеджер
  • Шаблонизатор

HELM

HELM

YAML программист

{{- range $service := .Values.services }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $service.name }}
  labels:
    app: {{ $service.name }}
    release: {{ $.Release.Name }}
spec:
  replicas: {{ $.Values.service.replicas }}
  selector:
    matchLabels:
      app: {{ $service.name }}
      release: {{ $.Release.Name }}
  template:
    metadata:
      labels:
        app: {{ $service.name }}
        release: {{ $.Release.Name }}
    spec:
      containers:
      - name: {{ $service.name }}
        image: {{ $service.image | default $.Values.service.image }}:{{ $service.tag | default $.Values.service.tag | default "latest"}}
        pullPolicy: {{ $.Values.service.pullPolicy }}
        command:
...

Произвольная структура

services:
  - name: kek
    port: 5000
    args: ['/bin/kek']

  - name: dialog-platform
    port: 5000
    args: ['/bin/admin']

service:
  image: registry.url.ru:5050/some/dialog-platform
  tag: '2019-08-01-admin-ee7c649'

  env:
    - name: KEK_URL
      value: "http://1.1.1.1:5000/some/shit"
    - name: LOL_URL
      value: "http://qwerty.url.ru:7899"
    - name: KEKLOL_URL
      value: "https://other.url.ru"
    - name: LOLKEK_URL
      value: "http://some-qa.url.ru:8087"

  secret_env:
    - name: DB_URL
      from: db_url

Templates

Values

Обновление сервисов

Где попробывать

https://www.katacoda.com/

Что почитать

https://www.devopsweekly.com/

Заключение

Спасибо

kataev

mr_apt

denis.a.kataev@gmail.com

Swarm or Kubernetes?

By Denis Kataev

Swarm or Kubernetes?

  • 1,096