image

Kubernetes Objects — это различные типы сущностей, предоставляемые Kubernetes для развертывания, обслуживания и масштабирования приложений в облачной или локальной инфраструктуре. В этом посте мы рассмотрим различные объекты Kubernetes, которые будем использовать при развертывании нашего приложения.

Модули (Pods)


Модуль — это самый простой объект, который вы можете создать в кластере Kubernetes. Обычно он содержит один или несколько запущенных контейнеров. Контейнеры в модуле используют одну и ту же сеть, хранилище и жизненный цикл. Это означает, что они могут связываться друг с другом напрямую, а останавливаться и запускаться будут одновременно.

Определение модуля

apiVersion: v1
kind: Pod
metadata:
  name: my-first-pod
  labels:
    name: my-first-pod
    app: nginx-app
spec:
  containers:
     - image: nginx
        name: nginx-app
        ports:
           - containerPort: 80


Давайте разберем определение yaml, которое мы только что использовали, поскольку мы будем использовать подобное определение и в других определениях объектов. А так же попытаемся понять определение, выполняемое файлом.

apiVersion: Эта строка определяет, какую версию Kubernetes API вы используете для создания этого объекта. Существует несколько версий API, и в каждой из них представлено несколько объектов. Вот наиболее распространенные из них: v1, apps/v1 и extensions/v1beta1.

image

Kind: Эта строка определяет тип объекта Kubernetes. В этом примере мы создаем модуль. (тобишь Pod)

Metadata: Строка хранит информацию об объекте. Метаданные обычно содержат имя, которое вы хотите присвоить объекту, метки и т. д. При записи строки вы можете поставить столько меток, сколько хотите. Например, имя, приложение, владелец, группа, уровень и т. д.

Spec: В строке spec вы определяете спецификации вашего объекта (желаемое состояние объекта). В случае модуля, вы описываете состояние своего контейнера. Вот некоторые из параметров, которые вы можете указать в разделе спецификации:

Container: Здесь вы указываете:

  • Изображение, которое вы хотите запустить в своем модуле.
  • Имя контейнера, который вы запускаете в своем модуле.
  • Порты.

Давайте создадим модуль с файлом pod-definition.yaml:

Вам необходимо перейти в свой терминал и убедиться, что вы находитесь в каталоге, в котором и был создан файл.

kubectl apply -f pod-definition.yaml


Приведенная выше команда создаст модуль с изображением nginx, как указано в файле. Вы можете просматривать модули с помощью kubectl get pods.

ReplicaSet


ReplicaSet используется для создания нескольких копий одного и того же модуля в кластере Kubernetes. Он гарантирует, что необходимое количество модулей работает в любой момент времени.

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

Определение ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
    tier: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx-app
        image: nginx


Чтобы создать ReplicaSet, перейдите в свой личный терминал и выполните следующую команду с файлом определения yaml.

kubectl apply -f ReplicaSet-definition.yaml


Как только ReplicatSet заработает, вы можете проверить его статус, используя kubectl get replicaset .

Деплойменты (Deployments)


Деплойменты — это объекты Kubernetes, используемые для управления модулями. Первое, что делает деплоймент при его создании, — это создание набора replicaset. Набор replicaset создает модули в соответствии с номером, указанным в параметре replicaset. Если вы посмотрите на определение yaml для деплоймента ниже, вы заметите, что раздел спецификаций для него выглядит точно так же, как определение для набора replicaset.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: mongo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongo
        image: mongo


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

kubectl apply -f Deployment-definition.yaml


Вы можете просмотреть деплойменты с помощью kubectl get deployments.

Пространство имен (SpaceName)


Пространства имен используются для организации объектов в кластере Kubernetes. Они позволяют группировать ресурсы и манипулировать ими.

Чтобы просмотреть все пространства имен в вашей среде, используйте kubectl get namespaces.

Создать пространство имен можно с помощью одной команды. Если вы хотите создать пространство имен под названием testing, вы должны запустить:

kubectl create namespace testing


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

apiVersion: v1
kind: Namespace
metadata:
  name: testing


После того, как пространство имен было создано, нам необходимо создать в нем объекты. Для этого нужно указать пространство имен в файле/команде определения.

apiVersion: v1
kind: Pod
metadata:
  name: myPod
  namespace: testing
  labels:
    name: namespaced-pod
spec:
    containers:
      - image: hello-world
         name: firstpod


Службы (Service)


Kubernetes Services используются для предоставления доступа к приложениям, развернутым в наборах модулей с использованием одной конечной точки. Сервис обеспечивает сетевой доступ к наборам модулей в Kubernetes.

Службу в Kubernetes можно создать с помощью запроса API, передав определение службы, например:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376


В этом примере служба называется my-service и будет нацелена на TCP-порт 9376 на любом модуле с меткой метаданных «app=MyApp». Kubernetes постоянно оценивает селектор меток службы, чтобы в любой момент определить, какие модули включены в службу. Это означает, что новый сервис может включать в себя существующие модули, которые уже соответствуют селектору меток.

Типы сервисов


Самый простой тип службы по умолчанию — ClusterIP. Он предоставляет кластеру Kubernetes внутренний адрес ClusterIP службы.

NodePort — предоставляет сервис на указанном номере порта на всех узлах в кластере Kubernetes. Это означает, что входящий запрос к IP-адресу узла на указанном порту будет перенаправлен на ClusterIP сервиса.

LoadBalancer — служба предоставляется, как и в NodePort, но создает балансировщик нагрузки в облаке, где работает Kubernetes (если поддерживается облачным провайдером), который получает внешние запросы к службе. Затем он распределяет их между узлами кластера с помощью NodePort. Чтобы указать этот тип, добавьте эту строку в спецификацию:

type: LoadBalancer


Комментарии (3)


  1. maxout
    15.04.2022 14:23
    +1

    Кубернета, really? %)


    1. maxout
      15.04.2022 14:30

      впрочем, "модули", "Пространство имен (SpaceName)" и "Службы" тоже звучат недурно


      1. dmitry_dvp
        15.04.2022 15:26

        Не говоря уж про "Изображения" (image) =)