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.
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
maxout
Кубернета, really? %)
maxout
впрочем, "модули", "Пространство имен (SpaceName)" и "Службы" тоже звучат недурно
dmitry_dvp
Не говоря уж про "Изображения" (image) =)