Рубрики
Uncategorized

Упростить развертывание приложений Kubernetes с помощью облачных нативных сборок и Kapps

В последние годы волна Kubernetes забрала мир программного обеспечения штурмом. И не по уважительной причине. Кубер … Помечено Kubernetes, Ruby, CloudFoundry, DevOps.

В последние годы волна Kubernetes забрала мир программного обеспечения штурмом. И не по уважительной причине. Kubernetes позволяет разработчикам легко создавать надежные распределенные системы. Он обеспечивает мощные строительные блоки для развертывания и управления контейнерными рабочими нагрузками. Это делает его заманчивой платформой для обширного микросервиса «приложений» сегодня.

К сожалению, вся эта сила и гибкость несут в себе огромную сложность. Kubernetes — это не PaaS (платформа как услуга) как Хероку или Облачный литейный завод Анкет Он не строит ваше приложение из источника и не абстрагирует все песчаные детали. Это, однако, обеспечивает многие из необходимых примитивов для построения PAAS.

За последние три года я работал постоянным участником Cloud Foundry. За это время я стал оценить простоту cf push опыт.

Я полюбил необработанный исходный код и Использование BuildPacks Анкет Мне нравится простой создание и картирование маршрутов. Мне нравится, что мои журналы приложения — просто CF журналы прочь. То есть, если вы развертываете приложение для некамерного фактора. Если вы не — или даже если вам просто нужно немного уйти с рельсов вашего PAAS — платформа может помешать больше, чем помогает. Именно эти варианты использования сияют Kubernetes.

Однако вам не нужно полностью отказываться от опыта PAAS. В этом посте мы рассмотрим два инструмента: Пакет и Капп Это помогает принести некоторые из них, что Paas Goodness в Kubernetes.

Предварительные условия

Если вы хотите продолжить, вам понадобится следующее:

  1. Доступ к кластеру Kubernetes
  2. Установить kubectl и аутентификация с вашим кластером ( Следуйте этим документам )
  3. Установить Docker ( Установите сообщество издания )
  4. Установить пакет ( Инструкции по установке )
  5. Установить Капп ( Инструкции по установке )
  6. Проверьте приложение примера Sinatra-K8s-Sample

Конфигурация кластера

Я использовал недорогую однотропное управляемое кластер Kubernetes из цифрового океана. Он использует Цифровой балансировщик нагрузки океана И, в целом, я ожидаю, что это будет стоить около 20 долларов в месяц 1 Анкет У меня есть DNS, настроенные на прямой трафик на моем домене *.k8s.downey.dev на IP -адрес балансировщика нагрузки и сама LB указывают на сервер Nginx в кластере.

Я использую Ingress-nginx в качестве моего контроллера входа и установил его с помощью шагов установки GKE («Generic») Здесь Анкет

Поскольку я использую .dev Домен мне нужно иметь действительные сертификаты TLS, так как .dev Домены на Список предварительных нагрузков HSTS Для основных браузеров. Чтобы автоматизировать это, я использовал Cert-Manager со следующим Clusterissuer Анкет

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    email: email@example.com # replace with your own
    http01: {}
    privateKeySecretRef:
      name: letsencrypt-prod
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          class: nginx

Я свободно следовал этот пост в блоге Для контроллера контурного входа, чтобы настроить это.

1 20 долларов за кластер K8 по -прежнему нечего чихать, поэтому, если вы хотите помочь мне заплатить за его подписку с Эта реферальная ссылка 🤑

Наше приложение Belafonte

В этом посте мы будем развертывать простое приложение без гражданства под названием Belafonte Анкет Это названо в честь Belafonte , уважаемое исследовательское судно, под руководством океанографа Стива Зиссу, и оно будет благополучно перенести нас в наш путь к Кубернетам. Если вы хотите следовать, просто клонируйте приложение.

git clone https://github.com/tcdowney/sinatra-k8s-sample

Чтобы сделать вещи немного интереснее, Belafonte полагается на микросервис, чтобы подавать его Uuids для дисплея. Это немного надуманно, но это нормально. Мы будем развертывать небольшое приложение Python под названием httpbin чтобы служить этой цели.

В конце концов, навигация по приложению вернет простую веб -страницу, содержащую некоторую информацию о капсуле Kubernetes, на которой она развернута, а также на нашем ремесленном виде UUID.

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

Kubernetes — это платформа для запуска контейнеров. Это означает, что для запуска нашего приложения мы сначала должны создать для него изображение контейнера. Традиционно это означало бы создание Dockerfile Чтобы установить Ruby, загрузите все наши зависимости и многое другое. Для простых приложений это может привести к большому количеству накладных расходов и технического обслуживания. К счастью, есть еще один вариант.

Как я упоминал ранее, BuildPacks — одна из моих любимых функций PAASES. Просто подтолкните свой код и позвольте упаковке, что делает его заполненным. К счастью для нас, разработчики из Heroku и Cloud Foundry работали над облачным нативным вычислительным проектом под названием Cloud Native BuildPacks Это позволяет кому -либо иметь эту силу.

Мы можем использовать Пакет CLI, чтобы запустить наш код против Native Buildpack Ruby Cloud’s Ruby Cloud со следующей командой (вам может потребоваться Docker Login Сначала для публикации).

pack build downey/sinatra-k8s-sample --builder heroku/buildpacks --buildpack heroku/ruby --publish

Это создаст изображение контейнера OCI и опубликует его в Dockerhub (или реестр контейнеров по вашему выбору). Ух ты!

Обратите внимание, что, по крайней мере, для Ruby BuildPack, который я использовал, я не получил команду по умолчанию для изображения, которое сработало из коробки. Чтобы заставить его работать на Kubernetes, мне пришлось сначала вызвать нативную пусковую установку Cloud BuildPack ( /CNB/Lifecycle/Launcher ), чтобы загрузить необходимую среду (добавление rackup , bundler и т. Д. к пути $ ). Команда, которую я в итоге использовал на Kubernetes для запуска изображения, выглядела так:

command: ["/cnb/lifecycle/launcher", "rackup -p 8080"]

Конфигурация YAML

Рабочие нагрузки обычно развернуты в Kubernetes через файлы конфигурации YAML. В пределах развернуть каталог Sinatra-K8S-Samples Вы найдете необходимые файлы для развертывания Belafonte Приложение, httpbin «Микросервис» это зависит от, и файл, объявляющий Belafonte Пространство имен для них для всех, чтобы жить.

В частности, внутри Развертывание/Белафонте ты найдешь:

  1. Развертывание. YAML
  2. Service.yaml
  3. Ingress.yaml

Развертывание. YAML

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

...

containers:
- name: belafonte
  image: docker.io/downey/sinatra-k8s-sample:latest
  env:
  - name: POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: POD_IP
    valueFrom:
      fieldRef:
        fieldPath: status.podIP
  - name: UUID_SERVICE_NAME
    value: httpbin
  ports:
  - containerPort: 8080
    name: http
  command: ["/cnb/lifecycle/launcher", "rackup -p 8080"]

...

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

Service.yaml

Service.yaml Файл содержит конфигурацию для настройки Kubernetes Service Анкет Он скажет Kubernetes выделять нам внутренний IP -адрес кластера и порт, которые можно использовать для достижения нашего приложения.

Вы можете просматривать сервисы с помощью Kubectl Get Services Анкет Как только мы развертываем наше приложение, мы увидим следующие сервисы в Belafonte Пространство имен.

kubectl -n belafonte get services
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
belafonte   ClusterIP   10.245.30.60             8080/TCP   3d3h
httpbin     ClusterIP   10.245.157.166           8080/TCP   3d3h

Ingress.yaml

Поскольку в нашем кластере установлен контроллер входа ( ingress-nginx ), мы можем определить Вход через Ingress.yaml Анкет

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: belafonte
  annotations:
    kubernetes.io/tls-acme: "true"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
  namespace: belafonte
spec:
  tls:
  - secretName: belafonte
    hosts:
    - belafonte.k8s.downey.dev
  rules:
  - host: belafonte.k8s.downey.dev
    http:
      paths:
      - backend:
          serviceName: belafonte
          servicePort: 8080

По своей основе, эта конфигурация инструктирует Ingress nginx направлять трафик, предназначенный для belafonte.k8s.downey.dev к Belafonte Сервис определяется Service.yaml Анкет Поскольку мы используем Cert-Manager , аннотации на нем обучают Cert-Manager и LetsEncrypt-Prod Clusterissuer для выпуска и обслуживания LetsEncrypt TLS Certs для этого домена. Эта часть требуется только в том случае, если вы хотите поддержать https , Но это достаточно просто, поэтому я бы порекомендовал.

Подобный конфигурация YAML существует для httpbin в развертывание/httpbin каталог (за исключением входа, так как мы не хотим, чтобы он извне был доступен).

Установка приложения с помощью KAPP

Все это Yaml декларитивно представляет желаемое состояние, в котором мы хотим, чтобы наши приложения были в. Если ты просто kubectl Apply -f Каждый файл в этом развернуть каталог Вы получите бег Belafonte Приложение и httpbin Микросервис, чтобы поддержать его. К сожалению, kubectl применить Может быть довольно тупой инструмент. Трудно сказать, что это произойдет, не осматривая каждый файл YAML. Варианты, такие как -Dry-Run и команды как Kubectl diff Существуют, чтобы помочь улучшить вещи, но они привыкли делать git push heroku или cf push может по -прежнему желать более хорошего UX.

Вот где Kubernetes Управление приложениями инструмент , или Капп , приходит в. Мне нравится Капп Потому что это обеспечивает что -то немного ближе к этому опыту Пааса и Вам не нужно устанавливать что -то особенное в кластере K8S.

Развертывание

С капп Мы можем Капп развернут Весь наш каталог развертывания и развернуть приложение за один раз. Если вы следите за этим, продолжайте и бегите Капп развернут -A Belafonte -f Deploy И проверьте это!

$ kapp deploy -a belafonte -f deploy


Changes

Namespace  Name       Kind        Conds.  Age  Op      Wait to    Rs  Ri
(cluster)  belafonte  Namespace   -       -    create  reconcile  -   -
belafonte  belafonte  Deployment  -       -    create  reconcile  -   -
^          belafonte  Ingress     -       -    create  reconcile  -   -
^          belafonte  Service     -       -    create  reconcile  -   -
^          httpbin    Deployment  -       -    create  reconcile  -   -
^          httpbin    Service     -       -    create  reconcile  -   -

Op:      6 create, 0 delete, 0 update, 0 noop
Wait to: 6 reconcile, 0 delete, 0 noop

Continue? [yN]:

Он покажет, какие изменения он ожидает, и сначала подскажет, прежде чем подавать заявку. Затем он применяет изменения, отслеживает все ресурсы, которые были созданы как часть этого «приложения» (как указано в соответствии с флага -a ), и будет ждать, пока все не будет запущено (проверка статуса ресурсов) перед выходом. Он даже осведомлен о некоторых типичных требованиях к заказу конфигурации. Например, он достаточно умный, чтобы создать Пространства имен и CRD перед применением конфигурации, которая может зависеть от них. Он хранит это логическое определение «приложения» в Configmap Таким образом, определение приложения сохраняется на API Kubernetes. Вы можете переключать компьютеры или возвращаться через несколько дней и Капп все еще узнает ваше приложение.

Извлечение журналов

Чтобы быть справедливым, получение журналов с kubectl не так уж и сложно. Просто kubectl -n belafonte logs -l -f И мы можем выпустить их для стручков с app = belafonte этикетка. Однако по мере того, как количество приложений, которые вы хотите транслировать журналы, растет, этот селектор метки может стать громоздким. Потоковые журналы немного дружелюбнее с капп . Просто беги Капп журналы -a belafonte -f И вы транслируете журналы из каждого стручка, который Капп развернуто. В нашем случае это оба httpbin и Belafonte Анкет

$ kapp logs -a belafonte -f


# starting tailing 'httpbin-57c4c9f6c6-662rh > httpbin' logs
# starting tailing 'belafonte-ccc57688b-pqbkj > belafonte' logs
httpbin-57c4c9f6c6-662rh > httpbin | [2019-11-07 05:22:13 +0000] [1] [INFO] Starting gunicorn 19.9.0
httpbin-57c4c9f6c6-662rh > httpbin | [2019-11-07 05:22:13 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
httpbin-57c4c9f6c6-662rh > httpbin | [2019-11-07 05:22:13 +0000] [1] [INFO] Using worker: sync
httpbin-57c4c9f6c6-662rh > httpbin | [2019-11-07 05:22:13 +0000] [8] [INFO] Booting worker with pid: 8
# ending tailing 'httpbin-57c4c9f6c6-662rh > httpbin' logs
belafonte-ccc57688b-pqbkj > belafonte | [2019-11-07 05:22:15] INFO  WEBrick 1.4.2
belafonte-ccc57688b-pqbkj > belafonte | [2019-11-07 05:22:15] INFO  ruby 2.5.5 (2019-03-15) [x86_64-linux]
belafonte-ccc57688b-pqbkj > belafonte | [2019-11-07 05:22:15] INFO  WEBrick::HTTPServer#start: pid=1 port=8080

Удаление приложений

Когда вы закончите экспериментировать, Капп делает очистку удобной. Просто запустите следующее, чтобы удалить все, что было развернуто.

$ kapp delete -a belafonte


Changes

Namespace  Name       Kind        Conds.  Age  Op      Wait to  Rs  Ri
belafonte  belafonte  Deployment  2/2 t   22s  delete  delete   ok  -
^          httpbin    Deployment  2/2 t   22s  delete  delete   ok  -

Op:      0 create, 2 delete, 0 update, 0 noop
Wait to: 0 reconcile, 2 delete, 0 noop

Continue? [yN]:

Один из них, однако, в случае с сертификатами letsEncrypt, которые Cert-Manager предоставляется для нас. LetsEncrypt Ограничивает запросы на сертификат на конкретный домен до 50 в месяц. Если вы планируете неоднократно вздрогнуть эти сертификаты (как я это делал во время написания этого поста), вы быстро достигнете этих пределов. К счастью Капп Поддерживает фильтры, чтобы вы могли сделать что -то вроде Капп DEDETE -A Belafonte только удалить развертывание и оставить Вход Определения (и связанные с ними СЕРТ) вокруг.

Завершая

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

Счастливого парусного спорта! ⛵

Оригинал: «https://dev.to/downey/simplify-kubernetes-app-deployments-with-cloud-native-buildpacks-and-kapp-339b»