В последние годы волна Kubernetes забрала мир программного обеспечения штурмом. И не по уважительной причине. Kubernetes позволяет разработчикам легко создавать надежные распределенные системы. Он обеспечивает мощные строительные блоки для развертывания и управления контейнерными рабочими нагрузками. Это делает его заманчивой платформой для обширного микросервиса «приложений» сегодня.
К сожалению, вся эта сила и гибкость несут в себе огромную сложность. Kubernetes — это не PaaS (платформа как услуга) как Хероку или Облачный литейный завод Анкет Он не строит ваше приложение из источника и не абстрагирует все песчаные детали. Это, однако, обеспечивает многие из необходимых примитивов для построения PAAS.
За последние три года я работал постоянным участником Cloud Foundry. За это время я стал оценить простоту cf push
опыт.
Я полюбил необработанный исходный код и Использование BuildPacks Анкет Мне нравится простой создание и картирование маршрутов. Мне нравится, что мои журналы приложения — просто CF журналы
прочь. То есть, если вы развертываете приложение для некамерного фактора. Если вы не — или даже если вам просто нужно немного уйти с рельсов вашего PAAS — платформа может помешать больше, чем помогает. Именно эти варианты использования сияют Kubernetes.
Однако вам не нужно полностью отказываться от опыта PAAS. В этом посте мы рассмотрим два инструмента: Пакет
и Капп
Это помогает принести некоторые из них, что Paas Goodness в Kubernetes.
Предварительные условия
Если вы хотите продолжить, вам понадобится следующее:
- Доступ к кластеру Kubernetes
- Установить
kubectl
и аутентификация с вашим кластером ( Следуйте этим документам ) - Установить
Docker
( Установите сообщество издания ) - Установить
пакет
( Инструкции по установке ) - Установить
Капп
( Инструкции по установке ) - Проверьте приложение примера
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
Пространство имен для них для всех, чтобы жить.
В частности, внутри Развертывание/Белафонте
ты найдешь:
Развертывание. YAML
Service.yaml
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.608080/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, эти инструменты определенно стоит посмотреть. Если вы заинтересованы в изучении большего, я рекомендую проверить следующие ресурсы:
- Heroku Post на создании изображений Docker с облачными нативными BuildPacks
- Tgi Kubernetes 079 — Ytt и Kapp
Счастливого парусного спорта! ⛵
Оригинал: «https://dev.to/downey/simplify-kubernetes-app-deployments-with-cloud-native-buildpacks-and-kapp-339b»