Деплой C# на Kubernetes: базовое руководство
Kubernetes (K8s) стал стандартом де-факто для оркестрации контейнерных приложений. Если вы разрабатываете на C# (.NET), рано или поздно встанет вопрос: как упаковать ваше приложение и запустить его в облаке или на собственном кластере. В этом руководстве мы разберем полный цикл — от создания простого веб-API на ASP.NET Core до его развертывания в Kubernetes.
Статья ориентирована на разработчиков, которые уже знакомы с основами C# и Docker, но только начинают работать с Kubernetes.
1. Подготовка .NET приложения и Docker-образа
Прежде чем деплоить приложение в Kubernetes, его нужно упаковать в контейнер. Создадим минимальный веб-API на C#.
- Создайте новый проект:
dotnet new webapi -n MyK8sApp cd MyK8sApp - Убедитесь, что приложение слушает порт 80. В файле
Program.cs(илиappsettings.json) укажите:builder.WebHost.UseUrls("http://0.0.0.0:80"); - Создайте файл
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"] - Соберите образ и отправьте его в реестр (например, 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 для локального теста).
- Примените Deployment:
kubectl apply -f deployment.yaml - Примените Service:
kubectl apply -f service.yaml - Проверьте статус подов:
Вы должны увидеть два пода в статусеkubectl get podsRunning. - Получите доступ к приложению. Для Minikube:
Для облачного кластера — используйте внешний IP, полученный командой:minikube service my-k8s-app-servicekubectl get svc my-k8s-app-service
Откройте браузер по полученному адресу. Если приложение отвечает — деплой прошел успешно.
4. Полезные советы и типичные ошибки
Вот несколько рекомендаций, которые помогут избежать проблем при деплое C# на Kubernetes:
- Логирование. Включите структурированные логи (например, через Serilog) — это упростит отладку в распределенной среде.
- Конфигурация. Используйте ConfigMap и Secrets для хранения настроек,