В этой многоуровневой серии статей о Kubernetes я постараюсь поймаю, что я думаю, что все, кто хочет учиться и работать с Кубернетами, следует знать о.
Если вы предпочитаете формат PDF этой статьи (45 страниц), вы можете Скачать это здесь бесплатно Отказ
Если вы прочитали любой из моих Предыдущие статьи или Курсы Вы знаете, что я люблю учиться и учить практическими примерами. Насколько мне нравятся практические примеры, в Куберане много терминов и концепций, которые вам нужно понять. Но я обещаю вам, что когда вы пройдете через всю серию, вы поймете концепции и Быть в состоянии запустить приложение или услугу, которая использует базу данных внутри Kubernetes.
Если вы начинаете к облачному урожению, вы можете проверить мой Начинающие руководство по доке Статья, чтобы получить основное понимание докера. Но не волнуйтесь, даже если вы не знаете о Docker, вы сможете следовать.
Я охвачу следующие темы в этой первой части серии об изучении Kubernetes:
- Что такое оркестровка контейнера?
- Архитектура Куберанес
- Kubernetes Resources
- Подвигание
- Реплиссеты
- Развертывание
- Услуги
Прочитав эту статью и проходив через примеры, вы поймете, что такое Kubernetes и узнайте о строительных блоках Kubernetes и ресурсами, такие как стручки, развертывания и услуги.
С практической точки зрения вы сделаете следующее:
- Разверните приложение в Kubernetes
- Масштабировать приложение
- Доступ к приложению с использованием услуг Kubernetes
Эта статья представляет собой сочетание теории и практики. Вы получите максимум из этой статьи, если вы будете следовать вместе с практическими примерами. Для этого вам понадобятся следующие инструменты:
- Docker Desktop
- Доступ к кластеру Kubernetes. Посмотреть «Какие кластеры Kubernetes я должен использовать»
- Kubernetes CLI (
kubectl
)
Какие кластеры Kubernetes я должен использовать?
Есть несколько вариантов, с которыми вы можете пойти. Самый «реальный» вариант будет иметь кластер Kubernetes из одного из облачных поставщиков. Однако по нескольким причинам, причинами, которые не могут быть вариантом для всех.
Следующий лучший вариант — запустить кластер Kubernetes на вашем компьютере. Предполагая, что у вас есть некоторая память и CPU, чтобы посмотреть, вы можете использовать один из следующих инструментов для запуска кластера CUBERNETES Single-Node на вашем компьютере:
Если честно, вы могли бы пойти с любым из вышеперечисленных вариантов. Создание реплики Kubernetes, развертываемые и стручки работают на любом из них. Однако вы также можете создавать услуги Kubernetes, однако, все становится немного сложным, когда вы пытаетесь использовать тип службы LoadBalancer.
С помощью облачного кластера создание типа службы LoadBalancer создает фактический экземпляр балансировщика нагрузки, и вы получите внешний/публичный IP-адрес, который вы можете использовать для доступа к вашим услугам.
Одно решение из вышеуказанного списка, которая ближе всего к моделированию типа службы LoadBalancer, является Docker Desktop Отказ С Docker Desktop ваш сервис выставлен на внешний IP, локальный
. Вы можете получить доступ к этим сервисам, используя оба добрый и Миникуба Также, однако, это требует, чтобы вы запустили дополнительные команды.
Для этой цели я буду использовать Docker Desktop в этой статье. Вы можете следовать инструкциям по установке для всех вариантов с соответствующих веб-сайтов.
Кубернаны и контексты
После установки одного из этих инструментов убедитесь, что вы загружаете Kubernetes Cli Отказ Это один бинарный файл, называемый kubectl
И это позволяет вам запустить команды против вашего кластера. Чтобы убедиться, что все работает правильно, вы можете запустить Kubectl Получить узлы
Чтобы перечислить все узлы в кластере Kubernetes. Вы должны получить выход, похожий на этот:
$ kubectl get nodes NAME STATUS ROLES AGE VERSION docker-desktop Ready master 63d v1.16.6-beta.0
Вы также можете проверить, что контекст устанавливается правильно на Docker-Desktop
Отказ Kubernetes использует файл конфигурации под названием config
Чтобы найти информацию, которую необходимо подключить к кластеру. Этот файл находится в вашей домашней папке — например $ Home/.kube/config
. Контекст — это элемент внутри этого файла конфигурации, и он содержит ссылку на кластер, пространство имен и пользователю. Если вы обратитесь к или запуску одного кластера, у вас будет только один контекст в файле конфигурации. Тем не менее, вы можете иметь несколько контекстов, определенные точка на разных кластерах.
Используя Kubectl Config
Команда вы можете просматривать эти контексты и переключаться между ними. Вы можете запустить Текущий контекст
Команда для просмотра текущего контекста:
$ kubectl config current-context docker-desktop
Есть другие команды, такие как Использовать контекст
, Сборное контекст
, Конечные точки зрения
, и так далее. Я предпочитаю использовать инструмент под названием kubectx.
. Этот инструмент позволяет быстро переключаться между различными контекстами Kubernetes. Например, если у меня есть три кластера (контексты), установленные в файле конфигурации, работает kubectx
Выводит это:
$ kubectx docker-desktop peterj-cluster minikube
Выбранный в настоящее время выбранный контекст также выделен при запуске команды. Перейти на Миникуба
Контекст, я могу запустить: Kubectx Minikube
Отказ
Эквивалентные команды вы можете работать с kubectl
будет Kubectl Config Get-Contexts
Для просмотра всех контекстов и Kubectl Config use-context minikube
переключить контекст.
Прежде чем продолжить, убедитесь, что ваш контекст установлен на Docker-Desktop
Если вы используете Docker для Mac/Windows.
Давайте начнем с вашего путешествия в Кубернаны и облако-уроженец с оркестром контейнера!
Контейнеры везде в наши дни. Инструменты, такие как Докер Используются для упаковки чего-либо из приложений к базам данных. При растущей популярности архитектуры микросервиса и уходом из монолитных применений монолитное применение в настоящее время является коллекцией нескольких небольших услуг.
Управление единым приложением имеет свои собственные проблемы и проблемы, не говоря уже о управлении десятками меньших услуг, которые должны работать вместе. Вам нужен способ автоматизировать и управлять своими развертываниями, выяснить, как масштабировать отдельные услуги, как использовать сеть и подключить их и так далее.
Это где контейнеровочная оркестровка вступает в. Контейнерная оркестровка может помочь вам управлять жизненным словами ваших контейнеров. Использование системы оркестографии контейнера позволяет сделать следующее:
- Предоставление и развертывание контейнеров на основе имеющихся ресурсов
- Выполнить мониторинг здоровья на контейнерах
- Балансировка нагрузки и открытие услуг
- Распределяют ресурсы между разными контейнерами
- Масштабирование контейнеров вверх и вниз
Пара примеров контейнеров оркестраторов — Марафон , Докер Рой И тот, о котором я буду говорить сегодня, Кубернаны Отказ
Кубернаны Это проект с открытым исходным кодом и одним из популярных вариантов управления кластерами и планированием нагрузки на контейнерные нагрузки. Вы можете использовать Kubernetes, чтобы запустить контейнеры, делать развертывание с нулевым простояю, где вы можете обновить свое приложение, не влияя на своих пользователей, и куча других прохладных материалов.
Часто вы увидите, что Kubernetes называются «K8S». K8S — это Номерность для Кубера. Первый (k) и последние буквы (ы) сначала и последние буквы в Word kubernetes, а 8 — количество символов между этими двумя буквами. Другие популярные нуменонимы — «I18N» forinternationalization или «A11Y» для доступности.
Kubernetes vs. Docker?
Я видел вопрос о Кубернес против Докере и какова разница между обоими. Используя Docker, вы можете упаковать свое приложение. Этот пакет называется изображение или Docker Image . Вы можете думать о изображении как шаблон. Используя Docker, вы можете создать Контейнеры от ваших изображений. Например, если ваш Docker Image содержит бинарный бинарный или приложение Java, то контейнер является запущенным экземпляром этого приложения. Если вы хотите узнать больше о Docker, проверьте Начинающие руководство по доке Отказ
Kubernetes с другой стороны — это инструмент для оркестрации контейнера, который знает, как управлять контейнерами Docker (и других). Kubernetes использует конструкции более высокого уровня, такие как PODS, чтобы обернуть Docker (или другие) контейнеры и дает вам возможность управлять им.
Кубернаны против докера рой?
Docker Swarm — это инструмент для оркестрации контейнера, так же, как Kubernetes. Вы можете использовать его для управления контейнерами Docker. Используя рой, вы можете подключить несколько хостов докера на виртуальный хост. Затем вы можете использовать Docker CLI, чтобы сразу разговаривать с несколькими хостами и запустить контейнеры Docker на нем.
Кластер Kubernetes — это набор физических или виртуальных машин и других ресурсов инфраструктуры, необходимые для запуска ваших контейнерных приложений. Каждая машина в кластере Kubernetes называется Узел Отказ В каждом кластере Kubernetes есть два типа узла:
- Узел Master (ы): Этот узел ходит плоскость управления Kubernetes и управляет кластером
- Рабочий узел (ы): запускает ваши контейнерные приложения
Главный узел
Один из основных компонентов на главном узле называется API Server Отказ API Server является конечной точкой, к которой CLI CLI CLI ( Kubectl
), когда вы создаете ресурсы Kubernetes или управляете кластером.
Компонент планировщика Работает вместе с сервером API для планирования приложений или рабочих нагрузок на рабочие узлы. Он также знает о ресурсах, которые доступны на узлах, а также ресурсы, запрошенные рабочими нагрузками. Используя эту информацию, она может решить, какие узелки рабочие ваши рабочие нагрузки в конечном итоге.
Есть два типа менеджеров контроллеров, работающих на главных узлах.
Контроллер Kube Manager Запускает несколько процессов контроллера. Эти контроллеры наблюдают за состоянием кластера и попытаются согласовать текущее состояние кластера (например, «5 проработанных репликов рабочей нагрузки A») с желаемым состоянием (например, я хочу 10 запущенных репликов рабочей нагрузки A «). Контроллеры включают контроллер узла, контроллер репликации, контроллер конечных точек и учетную запись службы и контроллеры токена.
Менеджер контроллера облака Запускает контроллеры, которые специфичны для поставщика облака и могут управлять ресурсами за пределами вашего кластера. Этот контроллер работает только в том случае, если в облаке работает ваша кластер Kubernetes. Если вы используете кластер Kubernetes на своем компьютере, этот контроллер не будет запущен. Целью этого контроллера является кластер, чтобы разговаривать с облачными поставщиками для управления узлами, балансировщиками нагрузки или маршруты.
Наконец, etcd это распределенный магазин ключа-значений. Состояние кластера Kubernetes и объекты API хранятся в ETCD.
Рабочий узел
Также как на главном узле, рабочие узлы также имеют разные компоненты. Первый — это Кублет Отказ Эта услуга работает на каждом уземе работника, и его задание — управлять контейнером. Он гарантирует, что контейнеры работают и здоровы, и она соединяется обратно к плоскости управления. Кублет разговаривает с сервером API, и он отвечает за управление ресурсами на узле, на котором он работает.
Когда в кластере добавляется новый рабочий-узел, кублет вводит себя и предоставляет ресурсы, которые у него есть (например, «У меня есть X CPU и Y память»). Затем спросит ли какие-либо контейнеры. Вы можете думать о кублете как менеджер по узеру рабочего узла.
Kublet использует интерфейс выполнения контейнера (CRI), чтобы поговорить с временем выполнения контейнера. Время выполнения контейнера отвечает за работу с контейнерами. В дополнение к Docker, Kubernetes также поддерживает другие контейнеры, такие как Контейнер или CRI-O Отказ
Контейнеры работают внутри стручков, представленные синие прямоугольники в вышеупомянутой фигуре (контейнеры — красные прямоугольники внутри каждого POD). POD — самая маленькая развертываемая единица, которую можно создавать, расписание и управлять кластером Kubernetes. POD — это логическая коллекция контейнеров, которые составляют ваше приложение. Контейнеры, работающие внутри того же POD, также разделяют сеть и место для хранения.
Каждый узел работника также имеет прокси, который действует как сетевой прокси и балансировщик нагрузки для рабочих нагрузок, работающих на узлах рабочих. Запросы клиентов, которые проходят через внешний балансировщик нагрузки, перенаправляются в контейнеры, работающие внутри стручка через эти прокси.
API Kubernetes определяет множество объектов, которые называются ресурсами, такие как пространства имен, PODS, услуги, секреты, карты конфигурации, …
Конечно, вы также можете определить свои собственные пользовательские ресурсы, использующие пользовательское определение ресурсов или CRD.
После того, как вы настроили Kubernetes CLI и ваш кластер, вы должны попробовать и запустить kubectl API-ресурсы
команда. Он будет список всех определенных ресурсов — их будет много.
Ресурсы в Кубестерах могут быть определены с использованием YAML. YAML (YAML An’t’t Markup Language) обычно используется для файлов конфигурации и. Это суперс формата JSON, что означает, что вы также можете использовать JSON для описания ресурсов Kubernetes.
Каждый ресурс Kubernetes имеет авивение
и добрый
Поля Чтобы описать, какую версию API Kubernetes вы используете при создании ресурса (например, Apps/V1
) и какой ресурс вы создаете (например, Развертывание
, Стручок
, Сервис
, и т.д.).
метаданные
Включает в себя данные, которые могут помочь идентифицировать ресурс, который вы создаете. Обычно это включает в себя Имя
(например MyDeployment
) и пространство имен
где ресурс будет создан. Есть также другие поля, которые вы можете предоставить в метаданных, таких как ярлыки
и Аннотации
, и пара из них, которые добавляются после создания ресурса (например, CreateTTimestamp
Например).
Подвигание
Стручки, вероятно, являются одним из самых распространенных ресурсов в Куберане. Это коллекция одной или нескольких контейнеров. Контейнеры внутри POD имеют одну и ту же сеть и хранение. Это означает, что любые контейнеры в том же POD могут говорить друг с другом через localhost
Отказ
Стручки предназначены для эфемерных, что означает, что они вступают в течение очень короткого времени. Стручки могут быть перенесены, чтобы работать на разных узлах в любое время. Это означает, что в любое время ваш POD перезапускается, ваши контейнеры также будут перезапущены.
При создании каждый POD назначается уникальный IP-адрес. Контейнеры внутри вашего стручка могут слушать разные порты. Чтобы получить доступ к вашим контейнерам, вы можете использовать IP-адрес PODS. Используя пример с вышеуказанного рисунка, вы можете запустить Curl 10.1.0.1:3000
общаться с одним контейнером и Curl 10.1.0.1:5000
общаться с другой контейнером. Однако, если вы хотите поговорить между контейнерами — например, вызывая верхний контейнер от нижнего, вы можете использовать http://localhost: 3000
Отказ
Если ваш POD перезагружается, он получит другой IP-адрес. Поэтому вы не можете положиться на IP-адрес. Разговор с вашими стручками напрямую по IP не является правильным способом.
Абстракция под названием Service Kubernetes — это то, что вы можете общаться с вашими стручками. Услуга Kubernetes дает вам стабильный IP-адрес и DNS-имя. Я поговорю о услугах позже.
Масштабирование стручков
Все контейнеры внутри стручка получают масштабируемые вместе. На рисунке ниже показано, как будет выглядеть масштабирование из одного POD до четырех стручков. Обратите внимание, что вы не можете масштабировать отдельные контейнеры в рамках стручки. POD — это единица масштаба.
«Потрясающий! Я могу запустить свое приложение и базу данных в том же POD !! » Нет! Не делай этого.
Во-первых, в большинстве случаев ваша база данных не будет масштабироваться с той же скоростью, что и ваше приложение. Помните, что вы масштабируете стручок и все контейнеры внутри этого POD, а не только один контейнер.
Во-вторых, запуск загрузки загрузки в Kubernetes, таких как база данных, отличается от работы без гражданства нагрузка. Например, вам необходимо убедиться, что данные постоянно между POD перезапускаются и что перезапущенные стручки имеют ту же идентичность сети, что и перезапущенный POD. Таким образом, ресурсы, такие как настойчивые объемы и государственные наборы, могут быть использованы для достижения этого. Я расскажу больше о запуске готовных нагрузок в Кубейнетах позже.
Создание стручков
Обычно вы не должны создавать стручки вручную. Вы можете сделать это, но вы действительно не должны. Причина в том, что если POD вылетает или если он удаляется, он будет уходить навсегда.
Давайте посмотрим, как один POD может быть определен с помощью yaml.
apiVersion: v1 kind: Pod metadata: name: hello-pod labels: app: hello spec: containers: - name: hello-container image: busybox command: ['sh', '-c', 'echo Hello from my container! && sleep 3600']
В первой паре строк мы определяем тип ресурса ( POD
) и метаданные. Метаданные включают имя нашего POD ( Hello-Pod
) и набор меток, которые являются простыми парами клавишных элементов ( app = hello
).
В Спец
Раздел Мы описываем, как будет выглядеть POD. У нас будет один контейнер внутри этого POD, называемый Привет-контейнер
, и он будет запустить изображение под названием Busybox
Отказ Когда контейнер начал, команда определена в команда
поле будет выполнено.
Чтобы создать POD, вы можете сохранить вышеуказанный YAML в файл, называемый Pod.yaml
Например. Затем вы можете использовать Kubernetes CLI ( Kubectl
), чтобы создать POD:
$ kubectl create -f pod.yaml pod/hello-pod created
Kubernetes отвечает типом ресурса и названием, которое оно было создано. Вы можете использовать Kubectl Получить стручки
Чтобы получить список всех стручек, использующих по умолчанию
пространство имен кластера.
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-pod 1/1 Running 0 7s
Вы можете использовать журналы
Команда, чтобы увидеть вывод из контейнера, работающего внутри POD:
$ kubectl logs hello-pod Hello from my container!
Если у вас есть несколько контейнеров, работающих внутри того же POD, вы можете использовать -C
Флаг Чтобы указать имя контейнера, которое вы хотите получить журналы. Например: Kubectl Logs Hello-Pod -c Hello-Container
Если мы удалим этот POD, используя Kubectl Удалить Pod Hello-Pod
Стручок будет уходить навсегда. Нет ничего, что автоматически перезапустит POD. Если вы запустите Kubectl Получить стручки
Опять же, вы замечаете, что POD ушел:
$ kubectl get pods No resources found in default namespace.
Это противоположность поведения, которое вы хотите. Если у вас есть рабочая нагрузка, работающая в POD, вы бы хотели, чтобы она была автоматически перенесена и перезапущена, если что-то пойдет не так.
Чтобы убедиться, что разбитые стручки перезапускаются, вам нужен контроллер, который может управлять жизненным циклом PODS. Этот контроллер гарантирует, что ваш POD автоматически перенесен, если он удаляется или произойдет что-то плохое (узелки идут вниз, стручки должны быть выселены).
Реплиссеты
Работа репликета — поддержание стабильного количества копий или реплик POD. Контроллер реплизета гарантирует, что указанное количество идентичных стручков работает во все времена. Количество реплики контролируется реплики
поле в определении ресурса.
Если вы начнете с одного POD, и вы хотите масштабировать до 5 POD, контроллер реплизаза использует это текущее состояние (один POD) в кластере и проходит и создает еще четыре стручка для удовлетворения желаемого состояния (5 PODS). Реплиз также держит глаз на стручках, поэтому, если вы удалите одну или масштабируйте его вверх или вниз, он сделает необходимое для удовлетворения желаемого количества реплик. Чтобы создать стручки, реплиз использует шаблон POD, который является частью определения ресурса.
Но как ReplicaSet знает, какие стручки смотрят и контролируют?
Вот как вы можете определить реплиз:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: hello labels: app: hello spec: replicas: 5 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-container image: busybox command: ['sh', '-c', 'echo Hello from my container! && sleep 3600']
Каждый POD, созданный реплизете, может быть идентифицирован по Metadata.ownerReference
поле. Это поле указывает, какие реплизет принадлежит POD. Если какая-либо из стручков, принадлежащих реплизете, будет удален, реплизет сейчас об этом и действует соответственно (I.e. Re-Cretions POD).
Реплиз также использует селектор
объект и MatchLabel
Чтобы проверить наличие новых стручков, которые он может владеть. Если есть новый POD, который соответствует этикеткам селектора, реплизет, и у него нет ссылки на владельца, либо владелец не является контроллером (I.E. Если мы вручную создаем POD), реплиз будет заберет его и начать контролировать его.
Давайте сохраним вышеуказанное содержимое в Reppleaset.yaml
Файл и запустить:
$ kubectl create -f replicaset.yaml replicaset.apps/hello created
Вы можете просмотреть реплиз, запустив следующую команду:
$ kubectl get replicaset NAME DESIRED CURRENT READY AGE hello 5 5 5 30s
Команда покажет вам имя репликета и количества желаемых, текущих и готовых репликов POD. Если вы перечислите стручки, вы заметите, что запущены 5 POD:
$ kubectl get po NAME READY STATUS RESTARTS AGE hello-dwx89 1/1 Running 0 31s hello-fchvr 1/1 Running 0 31s hello-fl6hd 1/1 Running 0 31s hello-n667q 1/1 Running 0 31s hello-rftkf 1/1 Running 0 31s
Вы также можете перечислить стручки своими метками. Например, если вы запустите Kubectl Получить По
Вы получите все стручки, которые имеют приложение = привет
Набор этикетки. Это, на данный момент, одинаково 5 стручек, которые мы создали.
Давайте также посмотрим на справочное поле владельца. Мы можем использовать - Ямл
Флаг, чтобы получить представление YAML любого объекта в Кубернетах. Как только мы получим YAML, мы будем искать Suilreferences
нить:
$ kubectl get po hello-dwx89 -o yaml | grep -A5 ownerReferences ... ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: hello
В Suilreferences
Имя владельца установлено на Привет
И подобный вид установлен на реплиз. Это реплиз, который принадлежит POD.
Обратите внимание, как мы использовали Po
В команде, чтобы обратиться к стручкам? Некоторые ресурсы Kubernetes имеют короткие имена, которые можно использовать на месте «полного имени». Вы можете использовать показывать
Когда вы имеете в виду стручки
или Развертывание
Когда вы имеете в виду развертывание
. Чтобы получить полный список поддерживаемых коротких имен, вы можете запустить kubectl API-ресурсы
Отказ
Другая вещь, которую вы заметите, так это то, как подмываются стручки. Раньше, где мы создали один POD напрямую, название подвода было Hello-Pod
Потому что это то, что мы указали в Ямле. На этот раз при использовании реплизета PODS создается с использованием комбинации имени реплиз ( Hello
) и полурантрабанственная строка, такая как dwx89
, заманивать
и так далее.
Полуфадровый? Да, гласные и Числа 0,1, а 3 были удалены, чтобы избежать создания «плохих слов».
Давайте попробуем удалить один из стручков. Чтобы удалить ресурс из Kubernetes, вы используете Удалить
ключевое слово, а затем ресурс (например POD
) и имя ресурса Hello-dwx89
:
$ kubectl delete po hello-dwx89 pod "hello-dwx89" deleted
Как только вы удалили POD, вы можете запустить Kubectl Получить стручки
снова. Вы что-то замечали? Есть еще 5 стручек.
$ kubectl get po NAME READY STATUS RESTARTS AGE hello-fchvr 1/1 Running 0 14m hello-fl6hd 1/1 Running 0 14m hello-n667q 1/1 Running 0 14m hello-rftkf 1/1 Running 0 14m hello-vctkh 1/1 Running 0 48s
Если вы посмотрите на Возраст
Столбец Вы заметите четыре стручка, которые были созданы 14 минут назад, и тот, который был создан недавно. Это делает набор реплик. Когда мы удалили один POD, количество фактических реплик уменьшилось с 5 до 4. Контроллер набора реплики обнаружил это и создал новый POD для соответствия желаемому количеству реплик (5).
Давайте попробуем что-то другое сейчас. Мы вручную создаем POD, у которого есть этикетки, которые соответствуют этикеткам селектора реплиссеров ( app = hello
).
apiVersion: v1 kind: Pod metadata: name: stray-pod labels: app: hello spec: containers: - name: stray-pod-container image: busybox command: ['sh', '-c', 'echo Hello from stray pod! && sleep 3600']
Храните вышеуказанные YAML в stray-pod.yaml
Файл, затем создайте POD, запустив:
$ kubectl create -f stray-pod.yaml pod/stray-pod created
POD создан и все выглядит хорошо. Однако, если вы запустите Kubectl Получить стручки
Вы заметите, что stray-pod
нигде не видно. Что случилось?
Реплизует гарантирует, что запущены только пять реплик POD. Когда мы вручную создали stray-pod
С лейблом ( app = hello
) Соответствуя метку селектора на реплизке, реплиз на свой новый POD взял на себя этот новый POD. Помните, что вручную созданный стручок не было владельца. С помощью этого нового POD под управлением реплизгов количество реплик было шесть, а не пять, как указано в репликете. Следовательно, реплизует сделал то, что он должен делать, он удалил новый POD для поддержания пяти реплик.
Ноль-простоя обновления?
Я упомянул развертывание с нулевым простоя и обновления ранее. Как это можно сделать с помощью набора реплики? Ну, это не может быть сделано. По крайней мере, не в нулевом порядке.
Допустим, мы хотим изменить изображение Docker, используемое в исходной реплике, установленном из Busybox
к Busybox: 1.31.1
. Мы могли бы использовать Kubectl Редактировать RS Привет
Чтобы открыть реплику установить YAML в редакторе, затем обновите значение изображения.
Как только вы сохраните изменения — ничего не произойдет. Пять стручков все равно будут работать так, как будто ничего не произошло. Давайте проверим изображение, используемое одним из стручков:
$ kubectl describe po hello-fchvr | grep image Normal Pulling 14m kubelet, docker-desktop Pulling image "busybox" Normal Pulled 13m kubelet, docker-desktop Successfully pulled image "busybox"
Обратите внимание, что это ссылается на Busybox
изображение, но нет никаких признаков Bitebox: 1.31.1
в любом месте. Давайте посмотрим, что произойдет, если мы удалим этот же Pod:
$ kubectl delete po hello-fchvr pod "hello-fchvr" deleted
Из предыдущего теста мы сделали, мы уже знаем, что реплиз появит новый POD ( Hello-Q8FNL
В нашем случае) соответствовать желаемому количеству реплики. Если мы запустим Опишите
Против новый стручок, который поднялся, вы заметите, как изменено изображение на этот раз:
$ kubectl describe po hello-q8fnl | grep image Normal Pulling 74s kubelet, docker-desktop Pulling image "busybox:1.31" Normal Pulled 73s kubelet, docker-desktop Successfully pulled image "busybox:1.31"
Подобное произойдет, если мы удалим другие стручки, которые все еще используют старое изображение ( busybox
). Реплиз начнется новые стручки, и на этот раз стручки будут использовать новое изображение Busybox: 1.31.1
.
Существует еще один ресурс, который можно использовать для управления реплизетками и позволяет нам регулировать стручки. После изменения имени изображения он может запустить PODS, используя новые имена изображений в контролируемой манере. Этот ресурс называется Развертывание Отказ
Чтобы удалить все POD, вам нужно удалить реплиз, запустив: Kubectl Удалить Rs Hello
. RS
Является ли короткое имя для реплизет
. Если вы перечислите стручки ( KUBECTL Get PO
) Сразу после того, как вы издали команду «Удалить», вы увидите.
NAME READY STATUS RESTARTS AGE hello-fchvr 1/1 Terminating 0 18m hello-fl6hd 1/1 Terminating 0 18m hello-n667q 1/1 Terminating 0 18m hello-rftkf 1/1 Terminating 0 18m hello-vctkh 1/1 Terminating 0 7m39s
Как только реплика устанавливает все стручки, их исчезнут, и поэтому будет реплиз.
Развертывание
Ресурс развертывания — это обертка вокруг реплизета, который позволяет управлять обновлениями на ваши стручки. Например, если вы хотите обновить имена изображений для всех PODS, вы можете обновить шаблон POD, а контроллер развертывания будет воссоздать PODS с новым изображением.
Если мы продолжим с тем же примером, что и раньше, вот как будет выглядеть развертывание:
apiVersion: apps/v1 kind: Deployment metadata: name: hello labels: app: hello spec: replicas: 5 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-container image: busybox command: ['sh', '-c', 'echo Hello from my container! && sleep 3600']
ЯМЛ для развертывания Kubernetes выглядит почти так же, как для репликета. Существует значение реплики, этикетки селектора и шаблоны POD.
Сохранить вышеуказанное содержимое YAML в Развертывание.ямль
и создать развертывание:
$ kubectl create -f deployment.yaml --record deployment.apps/hello created
Почему --record
флаг? Используя этот флаг, мы рассказываем Kubernetes хранить команду, которую мы выполняли в аннотации под названием Kubernetes.io/change-cause.
. Это полезно отслеживать изменения или команды, которые были выполнены, когда развертывание было обновлено. Вы увидите это в действии позже, когда мы делаем развертывание.
Чтобы перечислить все развертывания, мы можем использовать Получить
команда:
$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE hello 5/5 5 5 2m8s
Выход такой же, как когда мы перечислили реплизетки. Когда мы создаем развертывание, также создано реплиз:
$ kubectl get rs NAME DESIRED CURRENT READY AGE hello-6fcbc8bc84 5 5 5 3m17s
Обратите внимание, как имя реплизет имеет случайную строку в конце. Наконец, давайте перечислим стручки:
$ kubectl get po NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-27s2s 1/1 Running 0 4m2s hello-6fcbc8bc84-49852 1/1 Running 0 4m1s hello-6fcbc8bc84-7tpvs 1/1 Running 0 4m2s hello-6fcbc8bc84-h7jwd 1/1 Running 0 4m1s hello-6fcbc8bc84-prvpq 1/1 Running 0 4m2s
Когда мы создаем реплиз ранее, стручки были названы так: Hello-FCHVR
. Однако на этот раз имена подвода немного дольше — HELLO-6FCBC8BC84-27S2S
Отказ Средний случайный раздел во имя 6FCBC8BC84.
Соответствует случайному разделу имени реплиз и имена POD создаются путем объединения имени развертывания, имя реплизета и случайной строки.
Как и раньше, если мы удалим одну из стручков, развертывание и реплиз, чтобы всегда сохранили количество желаемых реплик:
$ kubectl delete po hello-6fcbc8bc84-27s2s pod "hello-6fcbc8bc84-27s2s" deleted $ kubectl get po NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-49852 1/1 Running 0 46m hello-6fcbc8bc84-58q7l 1/1 Running 0 15s hello-6fcbc8bc84-7tpvs 1/1 Running 0 46m hello-6fcbc8bc84-h7jwd 1/1 Running 0 46m hello-6fcbc8bc84-prvpq 1/1 Running 0 46m
Как масштабировать стручки вверх или вниз?
Есть удобная команда в Кубейнете CLI называется масштаб
Отказ Используя эту команду, мы можем масштабировать (или вниз) количество стручков, управляемых развертыванием или реплизкой.
Давайте масштабируем стручки до 3 реплик:
$ kubectl scale deployment hello --replicas=3 deployment.apps/hello scaled $ kubectl get po NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-49852 1/1 Running 0 48m hello-6fcbc8bc84-7tpvs 1/1 Running 0 48m hello-6fcbc8bc84-h7jwd 1/1 Running 0 48m
Точно так же мы можем увеличить количество реплик, обратно к пяти, и ReplicaSet создаст стручки.
$ kubectl scale deployment hello --replicas=5 deployment.apps/hello scaled $ kubectl get po NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-49852 1/1 Running 0 49m hello-6fcbc8bc84-7tpvs 1/1 Running 0 49m hello-6fcbc8bc84-h7jwd 1/1 Running 0 49m hello-6fcbc8bc84-kmmzh 1/1 Running 0 6s hello-6fcbc8bc84-wfh8c 1/1 Running 0 6s
Обновление шаблонов POD
Когда мы использовали реплиз, мы заметили, что PODS не было автоматически перезапущено, когда мы обновили имя изображения, например. Это то, что развертывание может сделать для нас.
Давайте использовать Установить изображение
Команда обновить изображение в шаблонах POD из Busybox
к Bitebox: 1.31.1
Отказ
Команда Установить
Может использоваться для обновления деталей шаблона POD, таких как имя изображения, переменные среды, ресурсы и пару других.
$ kubectl set image deployment hello hello-container=busybox:1.31.1 --record deployment.apps/hello image updated
Если вы запустите Kubectl Получить стручки
Сразу после того, как вы выполняете Установить
Команда, вы можете увидеть что-то вроде этого:
$ kubectl get po NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-49852 1/1 Terminating 0 57m hello-6fcbc8bc84-7tpvs 0/1 Terminating 0 57m hello-6fcbc8bc84-h7jwd 1/1 Terminating 0 57m hello-6fcbc8bc84-kmmzh 0/1 Terminating 0 7m15s hello-84f59c54cd-8khwj 1/1 Running 0 36s hello-84f59c54cd-fzcf2 1/1 Running 0 32s hello-84f59c54cd-k947l 1/1 Running 0 33s hello-84f59c54cd-r8cv7 1/1 Running 0 36s hello-84f59c54cd-xd4hb 1/1 Running 0 35s
Захватываются четыре стручка (одна уже была прекращена в то время, когда я выполнил команду), а бегать пять новых стручков. Обратите внимание на что-то еще в именах стручка? Разделы реплизет выглядят разными, верно? Это связано с тем, что развертывание масштабируется по стручкам, управляемым предыдущим реплизкой, и создать новый реплиз, который использует новый образ, который мы определены.
Помните, что --record
Флаг мы установили? Теперь мы можем использовать История развертывания
Команда для просмотра предыдущих разводов.
$ kubectl rollout history deploy hello deployment.apps/hello REVISION CHANGE-CAUSE 1 kubectl create --filename=deployment.yaml --record=true 2 kubectl set image deployment hello hello-container=busybox:1.31.1 --record=true
История покажет нам все изменения, которые были сделаны в развертывание. Первая редакция — это когда мы изначально создали ресурс, а второй — это когда мы обновили изображение.
Допустим, мы развернули эту новую версию изображения, но по какой-то причине мы хотим вернуться к предыдущему государству. Используя посадочная дистанция
Команда мы также можем откатиться к предыдущему пересмотре ресурса.
Это можно сделать с помощью развертывать отменить
Команда, как это:
$ kubectl rollout undo deploy hello deployment.apps/hello rolled back
С помощью команды Undo мы откатились от изменений в предыдущей ревизии, что является исходным состоянием, в котором мы находились до того, как мы обновили изображение:
$ kubectl rollout history deploy hello deployment.apps/hello REVISION CHANGE-CAUSE 2 kubectl set image deployment hello hello-container=busybox:1.31.1 --record=true 3 kubectl create --filename=deployment.yaml --record=true
Давайте удалим развертывание бегом:
$ kubectl delete deploy hello deployment.apps "hello" deleted
Стратегии развертывания
Возможно, вы пообщались, какая логика или стратегия использовались для подведения новых стручков или прекращения старых, когда мы увеличили развертывание вверх и вниз, и когда мы обновили имена изображений.
Существует две разные стратегии, используемые развертыванием для замены старых стручков новыми. Воссоздать Стратегия и Rollingupdate Стратегия. Последнее — это стратегия по умолчанию.
Вот способ объяснить различия между двумя стратегиями. Представьте, что вы работаете в банке, и ваша работа — это управлять кассирами и гарантировать, что всегда есть кто-то работает, который может обрабатывать запросы на клиента. Поскольку это воображаемый банк, скажем, у вас есть в общей сложности 10 лет, и на данный момент работает пять кассиров.
Время для изменения смены! Текущие кассира должны оставить свои столы и позволить новую смену прийти, чтобы воспользоваться.
Один из способов можно сделать то, чтобы рассказать нынешним кассирам прекратить работу. Они поставит «закрытый» знак в их кабине, упаковывают свои вещи, соберуйте свои сиденья и уходят. Только как только все они оставили свои места, новые кассира могут прийти, садиться, распаковать их вещи и начать работать.
Использование этой стратегии будет простоя, где вы не сможете служить любым клиентам. Как показано на рисунке выше, у вас может быть один кассир, работающий, и как только он упаковывает, потребуется для новых кассиров, чтобы сесть и начать свою работу. Вот как Воссоздать Стратегия работает.
Воссоздать Стратегия завершает все существующие (старые) стручки (происходит смещение изменений) и только тогда, когда все они прекращены (они оставляют свои стенды), он начинает создавать новые (входит в новую смену).
Используя другую стратегию, вы можете продолжать обслуживать всех ваших клиентов, пока смена меняется. Вместо того, чтобы ждать всех кассиров, чтобы перестать работать в первую очередь, вы можете использовать пустые киоски и поставить свой новый сдвиг работать сразу. Это означает, что у вас могут быть более 5 стенд, работающих одновременно во время изменения смены.
Как только у вас есть 7 кассиров, работающих на примере (5 из старого сдвига, 2 из новой смены), больше кассиров от старого сдвига могут начать упаковку вверх, а новые кассира могут начать заменять их. Вы также можете сказать, что вы всегда хотите, по крайней мере, 3 прокалы, работающие во время изменения переключения, и вы также можете разместить более чем на 5 кассиров, работающих одновременно.
Вот как Rollingupdate Стратегия работает, где maxunavailable
и MaxSurge
Настройки Укажите максимальное количество стручков, которые могут быть недоступны и максимальное количество старых и новых стручков, которые могут одновременно работать одновременно.
Воссоздать стратегию
Давайте создадим развертывание, которое использует стратегию воссоздания — обратите внимание на выделенные линии показывают, где мы указываем стратегию.
apiVersion: apps/v1 kind: Deployment metadata: name: hello labels: app: hello spec: replicas: 5 strategy: type: Recreate selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-container image: busybox command: ['sh', '-c', 'echo Hello from my container! && sleep 3600']
Скопируйте вышеуказанные YAML в Развертывание - воссоздание.yaml
Файл и создать это:
kubectl create -f deployment-recreate.yaml
Чтобы увидеть стратегию воссозданной стратегии в действии, нам понадобится способ просмотреть изменения, которые происходят с PODS, как мы обновляем версию изображения.
Вы можете открыть второе окно терминала и использовать - Учет
Флаг при перечислении всех стручков — - Учет
Флаг сохранит работу команды, и любые изменения в стручках будут выводиться на экран.
kubectl get pods --watch
С первого окна терминала давайте обновим образа докера от Busybox
к Bitebox: 1.31.1
Бежать:
kubectl set image deployment hello hello-container=busybox:1.31.1
Выход из второго окна терминала, в котором мы смотрим, как мы должны выглядеть следующим образом. Обратите внимание, что я добавил разрывы линии между группами.
NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-jpm64 1/1 Running 0 54m hello-6fcbc8bc84-wsw6s 1/1 Running 0 54m hello-6fcbc8bc84-wwpk2 1/1 Running 0 54m hello-6fcbc8bc84-z2dqv 1/1 Running 0 54m hello-6fcbc8bc84-zpc5q 1/1 Running 0 54m hello-6fcbc8bc84-z2dqv 1/1 Terminating 0 56m hello-6fcbc8bc84-wwpk2 1/1 Terminating 0 56m hello-6fcbc8bc84-wsw6s 1/1 Terminating 0 56m hello-6fcbc8bc84-jpm64 1/1 Terminating 0 56m hello-6fcbc8bc84-zpc5q 1/1 Terminating 0 56m hello-6fcbc8bc84-wsw6s 0/1 Terminating 0 56m hello-6fcbc8bc84-z2dqv 0/1 Terminating 0 56m hello-6fcbc8bc84-zpc5q 0/1 Terminating 0 56m hello-6fcbc8bc84-jpm64 0/1 Terminating 0 56m hello-6fcbc8bc84-wwpk2 0/1 Terminating 0 56m hello-6fcbc8bc84-z2dqv 0/1 Terminating 0 56m hello-84f59c54cd-77hpt 0/1 Pending 0 0s hello-84f59c54cd-77hpt 0/1 Pending 0 0s hello-84f59c54cd-9st7n 0/1 Pending 0 0s hello-84f59c54cd-lxqrn 0/1 Pending 0 0s hello-84f59c54cd-9st7n 0/1 Pending 0 0s hello-84f59c54cd-lxqrn 0/1 Pending 0 0s hello-84f59c54cd-z9s5s 0/1 Pending 0 0s hello-84f59c54cd-8f2pt 0/1 Pending 0 0s hello-84f59c54cd-77hpt 0/1 ContainerCreating 0 0s hello-84f59c54cd-z9s5s 0/1 Pending 0 0s hello-84f59c54cd-8f2pt 0/1 Pending 0 0s hello-84f59c54cd-9st7n 0/1 ContainerCreating 0 1s hello-84f59c54cd-lxqrn 0/1 ContainerCreating 0 1s hello-84f59c54cd-z9s5s 0/1 ContainerCreating 0 1s hello-84f59c54cd-8f2pt 0/1 ContainerCreating 0 1s hello-84f59c54cd-77hpt 1/1 Running 0 3s hello-84f59c54cd-lxqrn 1/1 Running 0 4s hello-84f59c54cd-9st7n 1/1 Running 0 5s hello-84f59c54cd-8f2pt 1/1 Running 0 6s hello-84f59c54cd-z9s5s 1/1 Running 0 7s
Первая пара линий показывает все пять стручков. Прямо на первой пустой линии выше (я добавил, что для ясности) мы запустили команду set Image. Это вызвало прекращение всех образов первым. Как только они были прекращены (вторая пустая линия на выходе выше), созданы новые стручки.
Четкий недостаток этой стратегии заключается в том, что когда-то старые стручки заканчиваются, и начинаются новые, нет беговых стручков для обработки любого трафика, что означает, что будут простоя. Убедитесь, что вы удалите развертывание Kubectl Удалить развертывание Привет
прежде чем продолжить. Вы также можете нажать Ctrl + C, чтобы перестать работать - Учет
Команда из второго окна терминала (держите окно открытым, так как мы будем использовать его снова).
Стратегия обновления Rolling
Вторая стратегия называется Rollingupdate Делает развертывание более контролируемым образом. Существует два настройки, которые вы можете настроить для управления процессом: maxunavailable
и MaxSurge
Отказ Обе эти настройки необязательны и имеют набор значений по умолчанию — 25% для обоих настроек.
maxunavailable
Настройка Указывает максимальное количество стручков, которые могут быть недоступны во время процесса развертывания. Вы можете установить его на фактическое число или процент от нужных образовок.
Допустим, maxunavailable
установлен на 40%. Когда запускается обновление, старый реплизет масштабируется до 60%. Как только новые стручки начинаются и готовы, старый реплиз снова уменьшается, а новый реплиз расширился. Это происходит таким образом, что общее количество доступных стручков (старого и нового, поскольку мы масштабируемся вверх и вниз), всегда не менее 60%.
MaxSurge
Настройка указывает максимальное количество стручков, которые могут быть созданы над желаемое количество стручков. Если мы используем тот же процент, что и раньше (40%), новый реплиз раскручивается сразу, когда выпускается. Новый реплизет будет масштабироваться таким образом, что он не превышает 140% желаемых стручков. Поскольку старые подмышки убивают, новый реплизет снова расширяется, убедившись, что он никогда не проходит через 140% желаемых стручков.
Давайте снова создадим развертывание, но на этот раз мы будем использовать Rollingupdate
Стратегия.
apiVersion: apps/v1 kind: Deployment metadata: name: hello labels: app: hello spec: replicas: 10 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 40% maxSurge: 40% selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-container image: busybox command: ['sh', '-c', 'echo Hello from my container! && sleep 3600']
Сохранить содержимое в Развертывание - Rolling.yaml.
и создать развертывание:
$ kubectl create -f deployment-rolling.yaml deployment.apps/hello created
Давайте сделаем то же самое, что сделали раньше, запустите Kubectl Получить Po --watch
от второго оконного окна, чтобы начать наблюдать за стручками.
kubectl set image deployment hello hello-container=busybox:1.31.1
На этот раз вы заметите, что новый реплизмент сразу уменьшается, а старый реплиз масштабируется одновременно:
$ kubectl get po --watch NAME READY STATUS RESTARTS AGE hello-6fcbc8bc84-4xnt7 1/1 Running 0 37s hello-6fcbc8bc84-bpsxj 1/1 Running 0 37s hello-6fcbc8bc84-dx4cg 1/1 Running 0 37s hello-6fcbc8bc84-fx7ll 1/1 Running 0 37s hello-6fcbc8bc84-fxsp5 1/1 Running 0 37s hello-6fcbc8bc84-jhb29 1/1 Running 0 37s hello-6fcbc8bc84-k8dh9 1/1 Running 0 37s hello-6fcbc8bc84-qlt2q 1/1 Running 0 37s hello-6fcbc8bc84-wx4v7 1/1 Running 0 37s hello-6fcbc8bc84-xkr4x 1/1 Running 0 37s hello-84f59c54cd-ztfg4 0/1 Pending 0 0s hello-84f59c54cd-ztfg4 0/1 Pending 0 0s hello-84f59c54cd-mtwcc 0/1 Pending 0 0s hello-84f59c54cd-x7rww 0/1 Pending 0 0s hello-6fcbc8bc84-dx4cg 1/1 Terminating 0 46s hello-6fcbc8bc84-fx7ll 1/1 Terminating 0 46s hello-6fcbc8bc84-bpsxj 1/1 Terminating 0 46s hello-6fcbc8bc84-jhb29 1/1 Terminating 0 46s ...
Используя стратегию Rollingge, вы можете поддерживать процент прогулочных кадров, пока вы делаете обновления. Это означает, что для ваших пользователей не будет простоя для ваших пользователей.
Убедитесь, что вы удалите развертывание перед продолжением:
kubectl delete deploy hello
Услуги
Стручки должны быть эфемерными или недолгими. После того, как они уходят, они ушли, и реплизует обеспечивает поднять новое образование для поддержания желаемого количества реплик.
Допустим, мы запускаем веб-интерфейс в контейнере в рамках. Каждый POD получает уникальный IP-адрес, однако из-за своей эфемерной природы мы не можем положиться на этот IP-адрес.
Давайте создадим развертывание, которое запускает веб-интерфейс:
apiVersion: apps/v1 kind: Deployment metadata: name: web-frontend labels: app: web-frontend spec: replicas: 1 selector: matchLabels: app: web-frontend template: metadata: labels: app: web-frontend spec: containers: - name: web-frontend-container image: learncloudnative/helloworld:0.1.0 ports: - containerPort: 3000
Сравнивая это развертывание до предыдущего, вы заметите, что изменили имена ресурсов и изображение, которое мы используем.
Одна новая вещь, которую мы добавили в развертывание, это Порты
раздел. Используя Контейнеровоз
Поле Мы можем установить номер порта, на нашем сервере веб-сайта прослушивают. Узначный класса/HellowOrld: 0.1.0
это простое приложение Express Node.js.
Сохранить вышеуказанный YAML в Web-Frontend.yaml
и создать развертывание:
$ kubectl create -f web-frontend.yaml deployment.apps/web-frontend created
Беги Kubectl Получить стручки
Чтобы обеспечить работу POD и запустить, а затем получить журналы из контейнера:
$ kubectl get po NAME READY STATUS RESTARTS AGE web-frontend-68f784d855-rdt97 1/1 Running 0 65s $ kubectl logs web-frontend-68f784d855-rdt97 > helloworld@1.0.0 start /app > node server.js Listening on port 3000
Из журналов вы заметите, что контейнер слушает порт 3000
Отказ Если мы устанавливаем выходной флаг, чтобы отказаться от широкого выхода ( -O широкий
), вы заметите IP-адрес стручка — 10.244.0.170
:
$ kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-frontend-68f784d855-rdt97 1/1 Running 0 65s 10.244.0.170 docker-desktop
Если мы удалим этот POD, новый займет новое место, и он также получит новый IP-адрес:
$ kubectl delete po web-frontend-68f784d855-rdt97 pod "web-frontend-68f784d855-rdt97" deleted $ kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-frontend-68f784d855-8c76m 1/1 Running 0 7s 10.244.0.171 docker-desktop
Точно так же, если мы масштабируем развертывание до 4 PODS, мы сделаем четыре разных IP-адреса:
$ kubectl scale deploy web-frontend --replicas=4 deployment.apps/web-frontend scaled $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-frontend-68f784d855-8c76m 1/1 Running 0 5m23s 10.244.0.171 docker-desktopweb-frontend-68f784d855-jrqq4 1/1 Running 0 18s 10.244.0.172 docker-desktop web-frontend-68f784d855-mftl6 1/1 Running 0 18s 10.244.0.173 docker-desktop web-frontend-68f784d855-stfqj 1/1 Running 0 18s 10.244.0.174 docker-desktop
Как получить доступ к стручкам без сервиса?
Если вы попытаетесь отправить запрос на один из этих IP-адресов, он не собирается работать:
$ curl -v 10.244.0.173:3000 * Trying 10.244.0.173... * TCP_NODELAY set * Connection failed * connect to 10.244.0.173 port 3000 failed: Network is unreachable * Failed to connect to 10.244.0.173 port 3000: Network is unreachable * Closing connection 0 curl: (7) Failed to connect to 10.244.0.173 port 3000: Network is unreachable
Стручки работают в кластере, и этот IP-адрес доступен только из кластера.
Одна вещь, которую мы можем сделать для целей тестирования, состоит в том, чтобы запустить стручок внутри кластера, а затем получить доступ для оболочки к этому POD. Да, это возможно!
RadialBusyBoxPlus: Curl
Является ли изображение, которое я часто бегаю внутри кластера в случае, если мне нужно что-то проверять или отлаживать вещи. Используя -Я
и --Тти
Флаги, которые мы хотим выделить терминал ( tty
) и что мы хотим интерактивную сеанс, поэтому мы можем запустить команды непосредственно внутри контейнера.
Я обычно называю этот стручок скручивание
, Но вы можете назвать это, что вам нравится:
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty If you don't see a command prompt, try pressing enter. [root@curl:/]$
Теперь, когда у нас есть доступ к терминалу, запущенному внутри контейнера, который «внутри кластера мы можем запустить одну и ту же команду CURL, что и раньше:
[root@curl:/]$ curl -v 10.244.0.173:3000 > GET / HTTP/1.1 > User-Agent: curl/7.35.0 > Host: 10.244.0.173:3000 > Accept: */* > < HTTP/1.1 200 OK < X-Powered-By: Express < Content-Type: text/html; charset=utf-8 < Content-Length: 111 < ETag: W/"6f-U4ut6Q03D1uC/sbzBDyZfMqFSh0" < Date: Wed, 20 May 2020 22:10:49 GMT < Connection: keep-alive <Hello World![root@curl:/]$
На этот раз мы получаем ответ от стручка! Убедитесь, что вы запустите Выход
вернуться к вашему терминалу. Curl
POD будет продолжать работать и получить доступ снова, вы можете использовать прикрепить
команда:
kubectl attach curl -c curl -i -t
Обратите внимание, что вы можете получить сеанс терминала для любого контейнера, запущенного внутри кластера, используя команду прикрепления.
Доступ к стручкам с использованием сервиса
Служба Kubernetes — это абстракция, которая дает нам способ надежно достичь IP-адреса POD.
Контроллер услуг (аналогичный контроллеру реплизаза) поддерживает список конечных точек или IP-адресов POD. Контроллер использует селектор и этикетки для просмотра стручков. Всякий раз, когда POD, который соответствует селектору, создается или удален, контроллер добавляет или удаляет IP-адрес Pods из списка конечных точек.
Давайте посмотрим, как будет выглядеть услугу для нашего веб-сайта:
kind: Service apiVersion: v1 metadata: name: web-frontend labels: app: web-frontend spec: selector: app: web-frontend ports: - port: 80 name: http targetPort: 3000
Верхняя часть YAML должна выглядеть знакомой — кроме добрый
Поле, то же самое, что мы видели с стручками, реплиссерами, развертыванием.
Выделенный селектор
Раздел — это то, где мы определяем этикетки, которые обслуживают, чтобы запросить стручки. Если вы вернетесь к развертыванию YAML, вы заметите, что набор PODS имеет эту точную набор меток.
Наконец, под Порты
поле мы определяем порт, где обслуживание будет доступна на ( 80
) и с Цельюпорт
Мы говорим службу, на который он может получить доступ к стручкам. Цельюпорт
Значение соответствует Контейнеровоз
Значение в развертывании YAML.
Сохраните сервис YAML сверху на Web-Frontend-Service.yaml
Файл и развернуть его:
$ kubectl create -f web-frontend-service.yaml service/web-frontend created
Чтобы увидеть созданный сервис, вы можете запустить Получить сервис
команда:
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 7d web-frontend ClusterIP 10.100.221.29 80/TCP 24s
Интернет-интерфейс
Услуга имеет IP-адрес, который не изменится (при условии, что вы не удалите службу) и можно использовать для надежного доступа к базовым подводам.
Давайте прикрепим к Curl
Контейнер, который мы начали раньше, и попытайтесь получить доступ к стручкам через службу:
$ kubectl attach curl -c curl -i -t If you don't see a command prompt, try pressing enter. [root@curl:/]$
Поскольку мы устанавливаем сервисный порт для 80
Мы можем скрутить непосредственно на IP-адрес сервиса, и мы вернемся тем же ответом, что и ранее:
[root@curl:/]$ curl 10.100.221.29Hello World!
Несмотря на то, что IP-адрес сервиса стабилен, и он не изменится, было бы намного лучше, если бы мы могли бы использовать имя товарищества для доступа к услуге. Каждая услуга, которую вы создаете в Kubernetes, получает имя DNS, назначенное в соответствии с этим форматом Service-name.namepace.svc.Cluster-domain.sample
Отказ
До сих пор мы развернули все до по умолчанию
пространство имен и кластерная домен — Cluster.local
Мы можем получить доступ к сервису, используя web-frontend.default.svc.cluster.local
:
[root@curl:/]$ curl web-frontend.default.svc.cluster.localHello World!
В дополнение к использованию полного имени вы также можете использовать только имя службы или имени службы и имя пространства имен:
Предполагается, что вы всегда используете имя службы и имя пространства имен при проведении запросов.
Используя прокси Kubernetes
Еще один способ доступа к услугам, которые доступны только внутри кластера, проходит через прокси. Kubectl Proxy
Команда создает шлюз между локальным компьютером (Localhost) и сервером API Kubernetes.
Это позволяет вам получить доступ к API Kubernetes, а также получить доступ к услугам Kubernetes. Обратите внимание, что вы должны Никогда Используйте этот прокси, чтобы открыть ваш сервис общественности. Это следует использовать только для отладки или устранения неполадок.
Давайте откроем отдельное окно терминала и запустите следующую команду, чтобы запустить прокси-сервер, который будет прокси-запросы от localhost: 8080
к API Kubernetes внутри кластера:
kubectl proxy --port=8080
Если вы откроете http://localhost: 8080/
В вашем браузере вы увидите список всех API из прокси API Kubernetes:
{ "paths": [ "/api", "/api/v1", "/apis", "/apis/", "/apis/admissionregistration.k8s.io", "/apis/admissionregistration.k8s.io/v1", "/apis/admissionregistration.k8s.io/v1beta1", ...
Например, если вы хотите увидеть все Pods, работающие в кластере, вы можете перейти к http://localhost: 8080/API/V1/Pods
или перейдите к http://localhost: 8080/API/V1/пространства имен
Чтобы увидеть все пространства имен.
Использование этого прокси, мы также можем получить доступ к Интернет-интерфейс
Сервис, которую мы развернули. Итак, вместо того, чтобы запустить POD внутри кластера и сделать CURL-запросы на сервис или PODS, вы можете создать прокси-сервер и использовать следующий URL для доступа к службе:
http://localhost:8080/api/v1/namespaces/default/services/web-frontend:80/proxy/
Формат URL для доступа к сервису — http://localhost: [PORT]/API/V1/пространства имен/[пространство имен]/Услуги/[SERVICE_NAME]: [SERVICE_PORT]/PROXY
Отказ В дополнение к использованию сервисного порта (например, 80
) Вы также можете назвать ваши порты использовать имя порта (например, http
).
Просмотр на URL выше приведен список простых HTML сайта с Здравствуйте, мир
сообщение.
Чтобы остановить прокси, вы можете нажать Ctrl + C в окне терминала.
Просмотр информации о обслуживании
Используя Опишите
Команда, вы можете описать объект в Кубернетах и посмотреть на его свойства. Например, давайте посмотрим на детали Интернет-интерфейс
Сервис, которую мы развернули:
$ kubectl describe svc web-frontend Name: web-frontend Namespace: default Labels: app=web-frontend Annotations: Selector: app=web-frontend Type: ClusterIP IP: 10.100.221.29 Port: http 80/TCP TargetPort: 3000/TCP Endpoints: 10.244.0.171:3000,10.244.0.172:3000,10.244.0.173:3000 + 1 more... Session Affinity: None Events:
Этот взгляд дает нам больше информации, чем Получить
Команда делает — это показывает этикетки, селектор, тип обслуживания, IP и порты. Кроме того, вы также заметите Конечные точки
Отказ Эти IP-адреса соответствуют IP-адресам стручков.
Вы также можете просматривать конечные точки, используя Получить конечные точки
команда:
$ kubectl get endpoints NAME ENDPOINTS AGE kubernetes 172.18.0.2:6443 8d web-frontend 10.244.0.171:3000,10.244.0.172:3000,10.244.0.173:3000 + 1 more... 41h
Чтобы увидеть контроллер, который управляет этими конечными точками в действии, вы можете использовать - Учет
Флаг, чтобы посмотреть конечные точки, как это:
$ kubectl get endpoints --watch
Затем в отдельном окне терминала давайте масштабируем развертывание на один POD:
$ kubectl scale deploy web-frontend --replicas=1 deployment.apps/web-frontend scaled
Как только развертывание масштабируется, вы заметите, как конечные точки автоматически обновляются. Например, вот как вывод выглядит, когда развертывание масштабируется:
$ kubectl get endpoints -w NAME ENDPOINTS AGE kubernetes 172.18.0.2:6443 8d web-frontend 10.244.0.171:3000,10.244.0.172:3000,10.244.0.173:3000 + 1 more... 41h web-frontend 10.244.0.171:3000,10.244.0.172:3000 41h web-frontend 10.244.0.171:3000 41h
Обратите внимание, как он пошел от четырех стручков, затем до двух и, наконец, к одному. Если вы масштабируете развертывание обратно на четыре стручка, вы увидите список конечных точек, заполненные новыми IPS.
Kubernetes Service Типы
С помощью Описание сервиса Вывод мы увидели ранее, вы могли бы заметить эту строку:
Type: ClusterIP
Каждая служба Kubernetes имеет тип. Если вы не предоставляете тип услуг, Clusterip Получается по умолчанию. В дополнение к Clusterip в Kubernetes есть три других типа услуг. Это Нотепорт , LoadBalancer и Внешнее имя .
Давайте объясним, какие различия между этими типами являются.
Кластера
Clusterip Тип обслуживания используется для доступа к стручкам из кластера через IP-адрес кластера. В большинстве случаев вы будете использовать этот тип услуг для ваших приложений, работающих внутри кластера. Использование типа Clusterip Вы можете определить порт, который вы хотите, чтобы ваша услуга прослушивала через Порты
Раздел в файле yaml.
Kubernetes назначает кластер IP на службу. Затем вы можете получить доступ к службе с помощью IP-адреса кластера и порта, который вы указали в YAML.
Нотепорт
В какой-то момент вы захотите раскрыть ваши услуги общественности и разрешите внешний трафик ввести свой кластер. NodePort Тип обслуживания открывает определенный порт на каждом узере работника в вашем кластере. Любой трафик, который отправляется на IP-код и номер порта, будет перенаправлен на службу и ваши стручки.
Например, если вы используете IP-код и порт 30000
Как показано на рисунке выше, вы сможете получить доступ к сервису и стручкам.
Чтобы создать службу NODEPORT, вам необходимо указать тип сервиса, как показано в списке ниже.
kind: Service apiVersion: v1 metadata: name: web-frontend labels: app: web-frontend spec: type: NodePort selector: app: web-frontend ports: - port: 80 name: http targetPort: 3000
Есть дополнительное поле под названием NodePort
которые могут быть установлены под порты
раздел. Тем не менее, это лучшая практика, чтобы оставить его и позволить Kubernetes выбрать порт, который будет доступен на всех узлах в кластере. По умолчанию порт узла будет выделен от 30000 до 32767 (это настраивается на сервере API).
Вы можете использовать тип NodePort, когда вы хотите контролировать, как выполняется балансировка нагрузки. Вы можете разоблачить ваши услуги через NodePort, а затем настроить балансировщик нагрузки, чтобы использовать IPS и узлы узла IPS и узла. Еще один сценарий, в котором вы можете использовать это, если вы используете существующее решение для Kubernetes, например. В этом случае вы, вероятно, уже имеете существующий балансировщик нагрузки, и вы можете добавить узел IPS и узловые порты на балансировку нагрузки.
Давайте удалим предыдущий Интернет-интерфейс
Сервис и создать тот, который использует NodePort
Отказ Чтобы удалить предыдущую услугу, запустите kubectl Удалить SVC Web-Frestend
Отказ Затем скопируйте содержимое YAML выше к Web-Frontend-NodePort.yaml
Файл и запустить Kubectl Создать -F Web-Frontend-NodePort.yaml
Или (если вы находитесь в Mac/Linux), запустите следующую команду, чтобы создать ресурс непосредственно из командной строки:
cat <
Как только служба создана, запустите Kubectl Получить SVC.
— Вы заметите, что тип службы изменился, и номер порта также является случайным:
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 8d web-frontend NodePort 10.99.15.20 80:31361/TCP 48m
Сейчас мы используем локальные кластеры Kubernetes (Route, Minikube или Docker для Mac/Windows), демонстрируя узлы NODEPORTS немного неловко. У нас есть один узел, и узел IPS также являются частными. При использовании кластера, управляемого облаками, вы можете настроить балансировщик нагрузки, чтобы иметь доступ к той же виртуальной сети, где ваши узлы. Затем вы можете настроить его для доступа к IPS узла через порта узла.
Давайте получим внутренний узел IP:
$ kubectl describe node | grep InternalIP InternalIP: 172.18.0.2
Вооружен этим IP, мы можем прикрепить к CURL POD, который мы все еще работали, а затем свернувшись на внутренний IP-IP узлов и порта узла ( 31361
):
$ kubectl attach curl -c curl -i -t If you don't see a command prompt, try pressing enter. [root@curl:/]$ curl 172.18.0.2:31361Hello World!
Поскольку мы используем Docker для рабочего стола, мы можем использовать localhost
в качестве адреса узла и порта узла для доступа к сервису. Если вы откроете http://localhost: 31361
В вашем браузере вы сможете получить доступ к Интернет-интерфейс
услуга.
Погрузчик
Тип службы LoadBalancer — это способ выставить услуги Kubernetes на внешний трафик. Если вы управляете облачным кластером и создаете службу типа LoadBancer, контроллер облака Kubernetes создает фактический балансировщик нагрузки в вашей облачной учетной записи.
Давайте удалим предыдущий сервис NodePort с Kubectl Удалить SVC Web-Frestend
И создайте сервис, использующий тип LoadBalancer:
cat <
Если мы посмотрим на сервис сейчас, вы заметите, что тип изменился на LoadBalancer, и мы получили внешний IP-адрес:
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP 59d web-frontend LoadBalancer 10.102.131.150 localhost 80:30832/TCP 2s
При использовании кластера CUBERNETES, управляемого облаками, внешний IP будет публичным, внешний IP-адрес, который вы могли бы использовать для доступа к службе.
Если вы откроете http://localhost
или http://127.0.0.1
В вашем браузере вы будете доставлены на сайт, запущенный внутри кластера.
Внешнее имя
Внешнее имя Тип обслуживания — это специальный тип сервиса, который не использует селекторы. Вместо этого он использует DNS-имена.
Используя внешнее имя, вы можете сопоставить службу Kubernetes в DNS-имя. Когда вы делаете запрос на сервис, он вернет запись CNAME со значением внешнее имя
Поле, а не кластер IP службы.
Вот пример того, как будет выглядеть сервис ExternalName:
kind: Service apiVersion: v1 metadata: name: my-database spec: type: ExternalName externalName: mydatabase.example.com
Вы можете использовать тип службы ExternalName при миграции рабочих нагрузок в Kubernetes, например. Вы могли бы сохранить вашу базу данных за пределами кластера, но затем используйте моя база данных
Сервис для доступа к этому из рабочих нагрузок работает внутри вашего кластера.
Одна вещь, которая остается без ответа: Что, если я запускаю несколько приложений или веб-сайтов, которые я хочу разоблачить публику? Я использую ли я тип LoadBalancer для каждого из этих услуг?
Ответ — вероятно, не Отказ Помните, что при запуске настоящего кластера эти балансировщики нагрузки будут стоить вам реальных денег.
Тем не менее, есть ресурс под названием Вход Это позволяет использовать один балансировщик нагрузки (один IP) для прямого трафика для нескольких услуг, работающих внутри кластера.
Во второй части этой статьи я расскажу о ресурсе входа и покажу вам, как разоблачить несколько приложений через единый балансировщик нагрузки — мы будем развернуть несколько веб-сайтов в том же кластере, см. На том, какой вход можно использовать для маршрута трафика к ним. Мы также коснемся субъекта конфигурации и секретов приложения и пространствам Kubernetes.
Вопросы и комментарии
Я всегда хочу услышать ваши вопросы и комментарии. Вы можете связаться со мной на Twitter Или оставить комментарий или вопрос в соответствии с этой статьей.
Если вы заинтересованы в большем количестве статей и тем, таких как этот, убедитесь, что вы зарегистрируетесь на мой рассылка Отказ
Оригинал: «https://dev.to/peterj/getting-started-with-kubernetes-part-1-13pp»