目录
一、前端页面显示 503 Service Temporarily Unavailable
时间:2023-04-19 k8s 版本:v1.18.4
问题背景
Kubernetes 中的前端项目 Pod 运行正常,但访问通过 Ingress 代理的域名时页面出现“503 Service Temporarily Unavailable”的错误,查看 log 日志也无报错信息。
解决方案
我最初是 service.yaml 和 ingress.yaml 里的 name 名称为 gtp,然后我又修改为 gpt,在修改前没 kubectl delete 原来的资源,当我删除原来的为 gtp 名称的 ingress 和 service 资源后,前端页面就可以正常访问了。
原理
问题出在修改资源名称时未删除旧资源。当我将名称从 gtp
修改为 gpt
时,应该首先使用 kubectl delete
删除旧的资源(即原先的 Ingress 和 Service),然后再应用新的资源配置。如果没有删除旧资源,可能会导致以下问题:
-
Ingress 混淆:如果旧的 Ingress 和新的 Ingress 都存在,它们可能会争夺同一个域名和路径。这可能导致 Ingress 控制器在处理请求时混淆,从而选择错误的后端服务。当你删除了旧的 Ingress 资源后,Ingress 控制器开始将流量正确路由到新的后端服务。
-
后端服务冲突:类似地,如果旧的 Service 和新的 Service 都存在且监听相同的端口,可能会导致端口冲突或 Kubernetes 无法正确将流量路由到预期的后端服务。删除旧的 Service 资源后,Ingress 控制器可以将流量路由到正确的后端服务。
总之,当你修改资源名称时,务必确保先删除旧资源,以避免出现混淆和冲突。在应用新的资源配置之前,使用 kubectl delete
删除旧资源,然后再使用 kubectl apply
应用新资源配置。这样可以确保 Ingress 控制器将流量正确路由到新的后端服务。
二、Dockfile 构建镜像失败:When using COPY with more than one source file, the destination must be a directory and end with a /
问题背景
COPY 根据通配符 * 匹配到多个多个文件,所以语法错误,镜像构建不成功,push 到镜像仓库失败。
解决方案
在 COPY 最后面加个 / 即可。
原理
COPY
指令的语法是 COPY <src> <dest>
,其中 <src>
是要复制的源文件或目录,<dest>
是目标路径。在这个例子中,.
表示当前目录,所以 COPY . .
的含义是将构建上下文的当前目录中的所有文件和目录复制到容器的工作目录(由 WORKDIR
指令设置)。
与 COPY target/*.jar .
有以下几点区别:
-
COPY . .
是将整个构建上下文的当前目录的内容复制到容器的工作目录。而COPY target/*.jar .
仅复制target
目录下所有的.jar
文件到容器的工作目录。 -
COPY . .
不需要指定目标路径以/
结尾,因为它是在将整个目录复制到另一个目录。而COPY target/*.jar .
复制多个文件时需要以/
结尾,表示目标是一个目录。
使用哪种 COPY
取决于您的需求。如果您需要将整个构建上下文的所有文件复制到容器中,可以使用 COPY . .
。如果您只需要复制特定的文件或目录,可以使用类似 COPY target/*.jar .
的语法。