首页 > 解决方案 > .NET Core 控制台应用程序如何部署到 Kubernetes?

问题描述

我有一个控制台应用程序,它充当某个消息代理的侦听器。我已经将它容器化并成功作为本地 docker 运行。现在我想将它部署到 Kubernetes(特别是 AWS 上的 EKS)。

所以我创建了一个部署所需的 yaml 文件,但是,我对 yaml 文件中所需的端口感到困惑。根据部署 API 的经验,我知道端口应该与 Docker Image 暴露端口相同,但是,控制台应用程序不暴露任何端口,也不需要端口来运行。

所以我简单地放出一些端口并尝试部署。自然它不起作用。我已经从 ECR 中提取了图像并运行以确认它正在工作。只有部署到 EKS 不是。

我可以知道将 .NET Core 控制台应用程序部署到 Kubernetes 的正确方法吗?

下面是我的 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Listener/Listener.csproj", "Listener/"]
COPY ["Infra/Infra.csproj", "Infra/"]
RUN dotnet restore "Listener/Listener.csproj"
COPY . .
WORKDIR "/src/Listener"
RUN dotnet build "Listener.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Listener.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Listener.dll"]

以下是此控制台应用程序的 yaml 文件:

apiVersion: apps/v1
items:
- apiVersion: v1
  kind: Service
  metadata:
    annotations:
      Process: listener
    creationTimestamp: null
    labels:
      app: listener
    name: listener
  spec:
    type: LoadBalancer
    ports:
    - name: "5999"
      port: 5999
      targetPort: 5999
    selector:
      app: listener
  status:
    loadBalancer: {}
- apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      Process: listener
    creationTimestamp: null
    labels:
      app: listener
    name: listener
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: listener
    strategy: {}
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: listener
      spec:
        containers:
        - env:
          image: *****.dkr.ecr.<region>.amazonaws.com/listener:latest
          name: listener
          ports:
          - containerPort: 5999
          resources: {}
        restartPolicy: Always
  status: {}
kind: List
metadata: {}

如果有人能提供帮助,真的很感激!谢谢!

标签: c#dockerkubernetes.net-coreamazon-eks

解决方案


好吧,如果您的项目实际上没有监听任何端口,那么您不需要公开任何端口。您可以从部署中删除这些行

ports:
- containerPort: 5999

而且,由于服务被定义为“将在一组 Pod 上运行的应用程序公开为网络服务的抽象方式”,因此您实际上也不需要服务定义,这意味着您只需要部署即可。


推荐阅读