【问题标题】:GKE Cannot pull image, even though imagesPullSecret is definedGKE 无法拉取图像,即使定义了 imagesPullSecret
【发布时间】:2019-07-10 13:46:44
【问题描述】:

在 Google Kubernetes Engine 中,我为我们公司创建了一个完美运行的 POC 集群。但是现在,当我尝试创建我们的生产环境时,我似乎无法让 imagesPullSecrets 工作,它与 POC 中完全相同的凭据、相同的 helm 图表和完全相同的 regcred yaml 文件。

但我一直在学习经典:

Back-off pulling image "registry.company.co/frontend/company-web/upload": ImagePullBackOff 
  • 在节点上手动拉取与我在 imagesPullSecret 中提供的凭据相同
  • 我尝试在图表级别和服务帐户上定义 imagesPullSecret
  • 我已经验证了秘密格式,并在尝试手动拉取时直接将凭据复制到那里
  • GKE 获取 recred 并将其显示在部署中

kubectl create secret docker-registry regcred --docker-server="registry.company.co" --docker-username="gitlab" --docker-password="[PASSWORD]"生成的Regcred

正规的秘密

kind: Secret
apiVersion: v1
metadata:
  name: regcred
  namespace: default
data:
  .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jb21wYW55LmNvIjp7InVzZXJuYW1lIjoiZ2l0bGFiIiwicGFzc3dvcmQiOiJbUkVEQUNURURdIiwiYXV0aCI6IloybDBiR0ZpT2x0QmJITnZJRkpsWkdGamRHVmtYUT09In19fQ==
type: kubernetes.io/dockerconfigjson

服务帐号

kind: ServiceAccount
apiVersion: v1
metadata:
  name: default
  namespace: default
secrets:
  - name: default-token-jktj5
imagePullSecrets:
  - name: regcred

部署.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: nfs-server
spec:
    replicas: 1
    selector:
        matchLabels:
            role: nfs-server
    template:
        metadata:
            labels:
                role: nfs-server
        spec:
            containers:
                - name: nfs-server
                  image: gcr.io/google_containers/volume-nfs:latest
                  ports:
                      - name: nfs
                        containerPort: 2049
                      - name: mountd
                        containerPort: 20048
                      - name: rpcbind
                        containerPort: 111
                  securityContext:
                      privileged: true
                  volumeMounts:
                      - mountPath: /exports
                        name: mypvc
            initContainers:
                - name: init-volume-perms
                  imagePullPolicy: Always
                  image: alpine
                  command: ["/bin/sh", "-c"]
                  args: ["mkdir /mnt/company-logos; mkdir /mnt/uploads; chown -R 1337:1337 /mnt"]
                  volumeMounts:
                      - mountPath: /mnt
                        name: mypvc
                - name: company-web-uploads
                  image: registry.company.co/frontend/company-web/uploads
                  imagePullPolicy: Always
                  volumeMounts:
                      - mountPath: /var/lib/company/web/uploads
                        subPath: uploads
                        name: mypvc
                - name: company-logos
                  image: registry.company.co/backend/pdf-service/company-logos
                  imagePullPolicy: Always
                  volumeMounts:
                      - mountPath: /var/lib/company/shared/company-logos
                        subPath: company-logos
                        name: mypvc
            volumes:
                - name: mypvc
                  gcePersistentDisk:
                      pdName: gke-nfs-disk
                      fsType: ext4

我环顾四周,从头开始遵循不同的指南,但没有成功。

所以我完全不知道该怎么做。

默认命名空间

【问题讨论】:

  • 我试图调查这个用例echo "eyJhdXRocyI6eyJyZWdpc3RyeS5jb21wYW55LmNvIjp7InVzZXJuYW1lIjoiZ2l0bGFiIiwicGFzc3dvcmQiOiJbUkVEQUNURURdIiwiYXV0aCI6IloybDBiR0ZpT2x0QmJITnZJRkpsWkdGamRHVmtYUT09In19fQ==" | base64 -D {"auths":{"registry.company.co":{"username":"gitlab","password":"[REDACTED]","auth":"Z2l0bGFiOltBbHNvIFJlZGFjdGVkXQ=="}}}% 这样看来,秘密是由某些代理提供的,可能 gitlab 将某些代理推送到集群。检查 prod 是否与 gitlab 集成?跨度>
  • 两种环境都没有与 gitlab 集成

标签: kubernetes google-kubernetes-engine kubernetes-helm docker-registry


【解决方案1】:

可能是因为命名空间问题。你能验证几件事吗

  1. 您是否在两个地方都使用默认命名空间?
  2. poc 和 prod 之间的 K8S 版本差异。
  3. 你能用kubectl get secret default-token-jktj5 -o yaml > imagepullsecret.yaml 之类的东西重新创建工作秘密吗?编辑 yaml 文件以删除修订和其他状态信息。对 prod 应用同样的方法
  4. 我在 GKE 中看到了这个问题,因为多行密钥转换为 base64。确保秘密在环境之间匹配。

【讨论】:

  • 感谢@MWZ,似乎 export 省略了无用的输出。但是 selfLink 和 uid 仍然存在。示例:kg po <pod> -o yaml --export | grep -E 'selfLink|uid' uid: 8bd7c7ab-a1ad-11e9-a95e-42010a80020d selfLink: /api/v1/namespaces/<namespace>/<pod name>。无论如何,我赞成你的回答:)
  • secret 和 sa 是 kubectl get secrets regcred --output="yaml" 的输出,所以 selflink 和 uid 不在 yaml 中。秘密是通过 kubectl 命令生成的(现在不记得了。我明天上班时会看到)我将使用 export 以供将来参考。谢谢@mwz
  • regcred secret 已正确创建我使用kubectl create secret docker-registry regcred --docker-server="registry.company.co" --docker-username="gitlab" --docker-password="[PASSWORD]" 创建它,所以我或多或少希望它在设计上是正确的。服务帐户也是自动创建的默认帐户。两个平台上相同的 k8s 版本,并且秘密是相同的。
  • 我在两种环境中都使用默认命名空间
  • 在检查 K8S 集群级别之前,我将从比较您的 helm 的两个版本(POC 和 PROD)开始,使用 'helm get {release_name} > out-release-1.txt' 和 diff util了解此问题的可能根本原因。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2021-09-30
  • 2020-06-18
  • 2023-04-06
  • 2021-03-08
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多