错误,仅限 ECR 镜像,回退重新启动失败的容器。

huangapple go评论58阅读模式
英文:

Error with only ECR image Back-off restarting failed container

问题

我是中文翻译,以下是您提供的内容的翻译部分:

我是新手使用 Kubernetes,使用 EKS 和 ECR 部署了一个简单的 Nginx 部署。问题只出现在我使用 ECR 镜像时,使用 Docker Hub 上的 Nginx 公共镜像时没有问题。
这是我的部署文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
        - name: *-ecr-registry
      containers:
        - name: nginx
          # image: nginx:latest
          image: *.dkr.ecr.*.amazonaws.com/nginx:dev

这是一个 Pod 的输出。

Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  12s                default-scheduler  已成功分配给 *
  Normal   Pulled     10s (x2 over 12s)  kubelet            容器镜像 * 已经存在于机器上
  Normal   Created    10s (x2 over 12s)  kubelet            已创建容器 nginx
  Normal   Started    10s (x2 over 11s)  kubelet            已启动容器 nginx
  Warning  BackOff    8s (x2 over 9s)    kubelet            退避重新启动失败的容器

这是 Pod 的结果日志。

exec /docker-entrypoint.sh: exec format error

我还在本地机器上使用 Docker 运行了 ECR 镜像,没有出现任何错误。
有人能否给我一些提示,如何解决这个问题,提前感谢。

英文:

I'm new with k8s and I've deployed a simple nginx deployment using eks and ecr. The problem only present when I'm using ecr image, it's not happens with nginx public image from docker hub.
Here is my deployment file.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
        - name: *-ecr-registry
      containers:
        - name: nginx
          # image: nginx:latest
          image: *.dkr.ecr.*.amazonaws.com/nginx:dev

Here is output of a pod.

Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  12s                default-scheduler  Successfully assigned *
  Normal   Pulled     10s (x2 over 12s)  kubelet            Container image * already present on machine
  Normal   Created    10s (x2 over 12s)  kubelet            Created container nginx
  Normal   Started    10s (x2 over 11s)  kubelet            Started container nginx
  Warning  BackOff    8s (x2 over 9s)    kubelet            Back-off restarting failed container

Here is result log of the pod

exec /docker-entrypoint.sh: exec format error

I also ran the ecr image with docker in my local machine without any error.
Can someone give me some hints, how can I overcome this issue, thanks in advance.

答案1

得分: 2

> 请求的镜像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配,并且未请求特定的平台

这是因为您在 ARM M1 芯片上的 Mac 上构建了 Docker 镜像,然后尝试在 AMD 上运行,或者反过来,因此出现了错误。

您可以通过传递参数 --platform 再次构建 Docker 镜像

--platform linux/amd64

或者您还可以设置环境变量 export DOCKER_DEFAULT_PLATFORM=linux/amd64

您可以在 Dockerfile 中的 FROM 中传递参数

FROM --platform=linux/amd64 node

使用构建命令时的 ARG

docker build -t <image-name> --platform linux/amd64

参考文档: https://docs.docker.com/engine/reference/builder/#from

您还可以像这样使用 Docker 运行镜像

docker run --platform linux/amd64 node
英文:

> The requested image's platform (linux/amd64) does not match the
> detected host platform (linux/arm64/v8) and no specific platform was
> requested

it's due to you have built the Docker image on an ARM M1 chip either on Mac and try to run it on AMD or the opposite due to that it's throwing an error.

You can build the docker image again by passing ARG --platform

--platform linux/amd64

Or you can also set the Environment variable export DOCKER_DEFAULT_PLATFORM=linux/amd64

You can pass ARG with FROM in Dockerfile or while running command docker build --platform

Dockerfile

FROM --platform=linux/amd64 node

ARG with build command

docker build -t <image-name> --platform linux/amd64

ref doc: https://docs.docker.com/engine/reference/builder/#from

You can also run the image with docker like

docker run --platform linux/amd64 node

答案2

得分: 0

经过多次尝试,我意识到我正在使用的基础镜像keymetrics/pm2:18-alpine 只支持 amd64 内核。即使我尝试在 arm64 中重新构建我的镜像,也无法在具有 arm64 内核类型的工作节点上正常工作。所以我看到解决这个问题的两种方法是:

  • 重新创建我的 eks 集群,使用 amd64 工作节点。
  • 或者切换到其他支持 arm64 和 amd64 内核的基础镜像,如node:18.14-alpine
英文:

After hours of trying many ways, I realize that I'm using base-image keymetrics/pm2:18-alpine only supports amd64 kernel. Even I tried to rebuild my image in arm64, that doesn't not work in my work nodes with arm64 kernel type. So I see 2 ways to overcome this issue is:

  • recreate my eks cluster using amd64 worker nodes.
  • Or switch to other base-image like node:18.14-alpine that supports both arm64 and amd64 kernel.

huangapple
  • 本文由 发表于 2023年2月10日 11:55:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/75406776.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定