我想用一个存在于'eu.gcr.io'(相同项目)上的新映像来更新我在kubernetes上的部署,我之前已经做过。但是现在,吊舱无法拉动图像,因为它们无权这样做。这是我们在pod日志中得到的错误。
Failed to pull image "eu.gcr.io/my-gcp-project/my-image:v1.009":
rpc error: code = Unknown desc = Error response from daemon:
unauthorized: You don't have the needed permissions to perform this operation,
and you may have invalid credentials.
Run Code Online (Sandbox Code Playgroud)
群集上的服务帐户具有kubernetes admin和storage admin角色,这应该足够。但是,即使我制作了服务帐户项目编辑器(出于调试目的),它仍然不起作用(相同的错误)。
我也尝试过创建一个新的新集群(默认设置)并在那里应用我的部署,但是随后出现了完全相同的问题。
我不确定我可以尝试什么。
任何帮助或建议,我们将不胜感激。
编辑:
我只是发现我仍然可以拉出并部署旧映像。但是,我创建的每个新映像都不能被kubernetes容器所吸引。
google-cloud-platform kubernetes google-kubernetes-engine google-container-registry google-iam
我们在 GKE(谷歌 kubernetes 引擎)上运行 API 服务器。我们使用 Google Cloud Endpoints 和 API 密钥处理我们的授权。我们将每个 API 密钥的某些 IP 地址列入白名单。为了完成这项工作,我们必须从负载均衡器转换为入口控制器,以暴露我们的 API 服务器。IP 白名单不适用于负载均衡器服务。现在我们有一个类似于这样的入口设置:
apiVersion: v1
kind: Service
metadata:
name: echo-app-nodeport
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: esp-echo
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-app-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "RESERVED_IP"
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- secretName: SECRET_NAME
backend:
serviceName: echo-app-nodeport
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
此设置运行良好,IP 白名单工作正常。现在我关心的主要是 NodePort,它似乎需要让入口控制器工作。我阅读了多个来源[1] [2],强烈建议不要使用 NodePorts 来公开您的应用程序。然而,我发现的大多数示例都使用了这个 NodePort + Ingress 组合。我们可以安全地使用此设置还是应该迁移到其他入口控制器(NGINX、Traefik 等)?