Что такое Kubernetes? Запуск .NET приложения в Kubernetes

Kubernetes (K8s) — это платформа оркестрации контейнеров, которая автоматизирует развертывание, управление и масштабирование контейнеризированных приложений. Она позволяет эффективно управлять кластерами контейнеров и обеспечивает высокую доступность приложений.

Основные компоненты Kubernetes

Узлы (Nodes)

Узел (Node) — это физический или виртуальный сервер, который выполняет контейнерные приложения. Существует два типа узлов:

  • Master Node — управляет кластером, распределяет нагрузки и контролирует состояние приложений.
  • Worker Node — выполняет контейнеры и управляется Master Node.

Под (Pod)

Под — это минимальная единица развертывания в Kubernetes. Он может содержать один или несколько контейнеров, которые совместно используют ресурсы и сетевое пространство.

Контроллеры

Контроллеры управляют состоянием объектов в кластере. Основные виды контроллеров:

  • Deployment — управляет обновлением и масштабированием подов.
  • ReplicaSet — обеспечивает нужное количество работающих подов.
  • StatefulSet — предназначен для работы с состоянием приложений.

Сервис (Service)

Сервис предоставляет единый точку доступа к набору подов и обеспечивает балансировку нагрузки.

Ingress

Ingress управляет входящими HTTP/HTTPS-запросами и маршрутизирует их к нужным сервисам.

Запуск .NET-приложения в Kubernetes

Создание Docker-образа

Перед развертыванием в Kubernetes необходимо создать Docker-образ .NET-приложения:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

Сборка и загрузка образа в Docker Registry:

docker build -t myapp:latest .
docker tag myapp:latest myregistry/myapp:latest
docker push myregistry/myapp:latest

Создание манифеста для Kubernetes

Файл deployment.yaml описывает развертывание .NET-приложения в Kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myregistry/myapp:latest
        ports:
        - containerPort: 80

Применение манифеста:

kubectl apply -f deployment.yaml

Создание сервиса для доступа к приложению

Файл service.yaml для публикации приложения:

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Применение:

kubectl apply -f service.yaml