【问题标题】:Container image runs in Docker Swarm but not in Kubernetes容器镜像在 Docker Swarm 中运行,但不在 Kubernetes 中
【发布时间】:2021-09-29 15:44:20
【问题描述】:

我有一个 Docker Swarm 使用我们的自定义代码(Linux 上的 .net core 3.1)运行一个容器,没有任何问题。我刚刚使用 Microk8s 设置了一个测试 4 节点 Kubernetes 集群。当我将图像加载到 Kubernetes 时,它似乎运行良好,但容器启动然后立即停止,并出现错误“Back-off restarting failed container”。查看来自 pod 的错误,我得到“找不到任何已安装的 .NET Core SDK。您的意思是运行 .NET Core SDK 命令吗?从以下位置安装 .NET Core SDK:https://aka.ms/dotnet-download"

图像与 Swarm 中运行的图像相同。我的搜索使我发现 ENTRYPOINT 可能是构建 dockerfile 中的问题,但我对对此的更改没有任何运气。我已经把我的 dockerfile 放在下面,以防它与这个问题有关。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

# tzdata for timzone
RUN apt-get update -y
RUN apt-get install -y tzdata

ARG REPO_TAG
ENV TZ UTC
ENV ApiVersion=$REPO_TAG

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /src
COPY ["WebAPI/WebAPI.csproj", "WebAPI/"]
COPY ["Domain/Domain.csproj", "Domain/"]
COPY ["Infrastructure/Infrastructure.csproj", "Infrastructure/"]
COPY ["Application/Application.csproj", "Application/"]
COPY ["Lib/*", "Lib/"]
RUN dotnet restore "WebAPI/WebAPI.csproj"
COPY . .
WORKDIR "/src/WebAPI"
RUN dotnet build "WebAPI.csproj" -c Release -o /app/build

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

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

非常感谢任何帮助。

编辑:

kubectl describe pod 的输出:

Name:         v5api-945c4f96c-925dp
Namespace:    default
Priority:     0
Node:         kube2/192.168.5.202
Start Time:   Wed, 29 Sep 2021 14:46:20 +0000
Labels:       app=v5api
              io.portainer.kubernetes.application.name=stepsv5api
              pod-template-hash=945c4f96c
Annotations:  cni.projectcalico.org/podIP: 10.1.2.82/32
              cni.projectcalico.org/podIPs: 10.1.2.82/32
Status:       Running
IP:           10.1.2.82
IPs:
  IP:           10.1.2.82
Controlled By:  ReplicaSet/v5api-945c4f96c
Containers:
  v5api:
    Container ID:   containerd://5a8af38a90eb0e82c2760849d2d2be6418cd90581d7f4b4b97f01e91142ba019
    Image:          docker.io/privaterepo/v5api:latest
    Image ID:       docker.io/privaterepo/v5api@sha256:3d09dd399ea2a3252605cb32474d6d9f46a3b4f314f7e514597ed3421151ac20
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    145
      Started:      Wed, 29 Sep 2021 17:46:13 +0000
      Finished:     Wed, 29 Sep 2021 17:46:13 +0000
    Ready:          False
    Restart Count:  40
    Environment:
      TZ:                  Europe/London
    Mounts:
      /app from config-v5api-871dbe27-9933-416a-9830-ef1ec93a82e9 (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9sqch (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  config-v5api-871dbe27-9933-416a-9830-ef1ec93a82e9:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      appsettings-conf-v1
    Optional:  false
  kube-api-access-9sqch:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason   Age                     From     Message
  ----     ------   ----                    ----     -------
  Warning  BackOff  3m55s (x829 over 3h4m)  kubelet  Back-off restarting failed container

来自 kubectl 日志的错误:

"It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

【问题讨论】:

  • “不适用于 kubernetes”是什么意思,使用此映像时您的 pod 的状态是什么,describe pod 输出是什么? kubect logs 命令的输出是什么?
  • @P.... 我已将日志的输出和描述 pod 添加到原始帖子中。 pod 的状态是由于容器错误而终止:“无法找到任何已安装的 .NET Core SDK。您的意思是运行 .NET Core SDK 命令吗?从以下位置安装 .NET Core SDK:@ 987654322@".
  • 尝试在您的 pod 中设置 dnsPolicy: Default。您共享的错误说 kube2 的名称解析失败,这显然是您的节点名称。
  • 抱歉,DNS 没有配置,现在解决了。我已经更新了日志的错误

标签: docker kubernetes asp.net-web-api dockerfile


【解决方案1】:
Mounts:
  /app from config-v5api-871dbe27-9933-416a-9830-ef1ec93a82e9 (rw)

您似乎已将应包含您的应用程序的整个 /app 目录替换为安装到 ConfigMap 的卷。因此,容器内没有可运行的应用程序。

【讨论】:

  • 是的,我刚刚登录并发表评论说我解决了问题,您确实是正确的。我将配置映射视为会覆盖单个文件,而不是使用我要覆盖的单个文件挂载新目录。据我了解,如果我使用子路径,它只会覆盖单个文件,但对 configmap 的更改不会自动传递给容器。不过感谢您的帮助。
  • @dadinthemiddle 很高兴这有帮助。如果问题已解决,请务必点击答案旁边的复选标记,以免它在网站上仍显示为打开状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2019-01-13
  • 2021-02-18
  • 2017-03-24
相关资源
最近更新 更多