Деплой C# на Kubernetes: базовое руководство для разработчиков

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Деплой C# на Kubernetes: базовое руководство

Kubernetes (K8s) стал стандартом де-факто для оркестрации контейнерных приложений. Если вы разрабатываете на C# (.NET), рано или поздно встанет вопрос: как упаковать ваше приложение и запустить его в облаке или на собственном кластере. В этом руководстве мы разберем полный цикл — от создания простого веб-API на ASP.NET Core до его развертывания в Kubernetes.

Статья ориентирована на разработчиков, которые уже знакомы с основами C# и Docker, но только начинают работать с Kubernetes.

1. Подготовка .NET приложения и Docker-образа

Прежде чем деплоить приложение в Kubernetes, его нужно упаковать в контейнер. Создадим минимальный веб-API на C#.

  1. Создайте новый проект:
    dotnet new webapi -n MyK8sApp
    cd MyK8sApp
  2. Убедитесь, что приложение слушает порт 80. В файле Program.cs (или appsettings.json) укажите:
    builder.WebHost.UseUrls("http://0.0.0.0:80");
  3. Создайте файл Dockerfile в корне проекта:
    FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
    WORKDIR /app
    EXPOSE 80
    
    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    WORKDIR /src
    COPY ["MyK8sApp.csproj", "."]
    RUN dotnet restore "./MyK8sApp.csproj"
    COPY . .
    RUN dotnet build "MyK8sApp.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "MyK8sApp.csproj" -c Release -o /app/publish
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "MyK8sApp.dll"]
  4. Соберите образ и отправьте его в реестр (например, Docker Hub):
    docker build -t yourdockerhub/my-k8s-app:v1 .
    docker push yourdockerhub/my-k8s-app:v1

Важно: Замените yourdockerhub на актуальное имя пользователя. Для локального тестирования можно использовать minikube и не публиковать образ — достаточно собрать его локально.

2. Создание манифестов Kubernetes

Kubernetes использует декларативные YAML-файлы для описания желаемого состояния кластера. Нам понадобятся два основных объекта: Deployment (управление подом) и Service (сетевой доступ).

2.1. Deployment (развертывание)

Создайте файл deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-k8s-app-deployment
  labels:
    app: my-k8s-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-k8s-app
  template:
    metadata:
      labels:
        app: my-k8s-app
    spec:
      containers:
      - name: my-k8s-app
        image: yourdockerhub/my-k8s-app:v1
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 5

В этом манифесте мы указываем:

  • replicas: 2 — два экземпляра приложения для отказоустойчивости.
  • resources — ограничения по CPU и памяти (важно для стабильной работы кластера).
  • livenessProbe и readinessProbe — проверки здоровья. Добавьте в ваш контроллер эндпоинты /health и /ready.

2.2. Service (сервис)

Создайте файл service.yaml:

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

Примечание: type: LoadBalancer работает в облачных кластерах (AWS, GKE, AKS). Для локального тестирования используйте NodePort или ClusterIP + kubectl port-forward.

3. Деплой и проверка приложения

Теперь применим манифесты к кластеру. Убедитесь, что kubectl настроен на ваш кластер (например, minikube start для локального теста).

  1. Примените Deployment:
    kubectl apply -f deployment.yaml
  2. Примените Service:
    kubectl apply -f service.yaml
  3. Проверьте статус подов:
    kubectl get pods
    Вы должны увидеть два пода в статусе Running.
  4. Получите доступ к приложению. Для Minikube:
    minikube service my-k8s-app-service
    Для облачного кластера — используйте внешний IP, полученный командой:
    kubectl get svc my-k8s-app-service

Откройте браузер по полученному адресу. Если приложение отвечает — деплой прошел успешно.

4. Полезные советы и типичные ошибки

Вот несколько рекомендаций, которые помогут избежать проблем при деплое C# на Kubernetes:

  • Логирование. Включите структурированные логи (например, через Serilog) — это упростит отладку в распределенной среде.
  • Конфигурация. Используйте ConfigMap и Secrets для хранения настроек,

Блоги

Рекомендаций по книгам