【问题标题】:k3s pods are not mounting secrets defined in helm deployment's imagePullSecretsk3s pod 没有安装在 helm 部署的 imagePullSecrets 中定义的秘密
【发布时间】:2021-03-07 08:01:35
【问题描述】:

我正在 circlci 中创建一个部署,将我的容器化应用程序部署到我设置的 k3s 服务器。我已经使用here 找到的命令设置了一个秘密。

秘密是使用命令创建的:

kubectl create secret docker-registry regkeyname --docker-server=https://index.docker.io/v1/ \
 --docker-username=username  \
 --docker-password=password  \
 --docker-email=my@email.com \
 --namespace=external

运行kubectl get secret regkeyname --namespace=external --output=yaml时我的秘诀如下:

apiVersion: v1
data:
  .dockerconfigjson: secretbase64stuff
kind: Secret
metadata:
  creationTimestamp: "2020-11-24T13:11:07Z"
  managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:data:
          .: {}
          f:.dockerconfigjson: {}
        f:type: {}
      manager: kubectl
      operation: Update
      time: "2020-11-24T13:11:07Z"
  name: regkeyname
  namespace: external
  resourceVersion: "16929381"
  selfLink: /api/v1/namespaces/external/secrets/regkeyname
  uid: 51b87508-9cf2-490b-b871-0b5a342ab64c
type: kubernetes.io/dockerconfigjson

我正在使用 helm 部署我的应用程序,部署如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.labels.app }}
  labels:
    app: {{ .Values.labels.app }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.labels.app }}
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: {{ .Values.labels.app }}
        env: {{ .Values.labels.env }}
    spec:
      imagePullSecrets:
        - name: regkeyname
      containers:
        - name: my-service
          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
          imagePullPolicy: {{ .Values.image.imagePullPolicy }}
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 10
            failureThreshold: 5
            successThreshold: 1

然而,在部署之后,图像无法拉取,并且似乎我的秘密“regkeyname”没有使用/安装在 pod 中。结果如下:

Name:           my-service-856454c6cd-qcp7w
Namespace:      external
Priority:       0
Node:           worker-2/192.168.1.13
Start Time:     Tue, 24 Nov 2020 07:20:08 -0600
Labels: app=my-service
  env=development
  pod-template-hash=856454c6cd
Annotations:    <none>
Status:         Pending
IP:             10.42.2.196
Controlled By:  ReplicaSet/my-service-856454c6cd
Containers:
  auth-service:
    Container ID:
    Image:          my-repo/my-service:latest
    Image ID:
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ImagePullBackOff
    Ready:          False
    Restart Count:  0
    Readiness:      http-get http://:8080/health delay=10s timeout=1s period=10s #success=1 #failure=5
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-l9b4k (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  default-token-l9b4k:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-l9b4k
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
  node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason     Age                    From                  Message
  ----     ------     ----                   ----                  -------
  Normal   Scheduled  <unknown>              default-scheduler     Successfully assigned external/auth-service-856454c6cd-qcp7w to worker-2
  Normal   Pulling    32m (x4 over 34m)      kubelet, worker-2  Pulling image "my-repo/my-service:latest"
  Warning  Failed     32m (x4 over 34m)      kubelet, worker-2  Failed to pull image "my-repo/my-service:latest": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/my-repo/my-service:latest": failed to resolve reference "docker.io/my-repo/my-service:latest": failed to do request: Head https://registry-1.docker.io/v2/my-repo/my-service/manifests/latest: dial tcp: lookup registry-1.docker.io: Try again
  Warning  Failed     32m (x4 over 34m)      kubelet, worker-2  Error: ErrImagePull
  Warning  Failed     31m (x6 over 34m)      kubelet, worker-2  Error: ImagePullBackOff
  Normal   BackOff    3m54s (x127 over 34m)  kubelet, worker-2  Back-off pulling image "my-repo/my-service:latest"

我在使用 kubernetes 在本地运行时有这个工作,所以我假设这个问题一定与 k3s 或现在服务器是远程而不是本地的事实有关。任何见解将不胜感激。提前致谢!

【问题讨论】:

    标签: docker kubernetes kubernetes-helm kubernetes-secrets k3s


    【解决方案1】:

    控制器正在尝试从官方 docker 注册表中拉取镜像:

    未能解析参考“docker.io/my-repo/my-service:latest”

    在创建 imagePullSecret 时,请确保输入正确的 URL(即私有注册表的 URL)以执行身份验证和提取图像。

    $ cat ~/.docker/config.json 
    {
        "auths": {
            "https://index.docker.io/v1/": { # <------ change here
                "auth": "..........="
            }
        },
        "HttpHeaders": {
            "User-Agent": "Docker-Client/19.03.5 (linux)"
        }
    
    

    【讨论】:

    • 仓库在 dockerhub 上是私有的。这是否意味着我需要将 docker-server 更改为index.docker.io/v1/my-repo?我对 ~/.docker/config.json 有点困惑。我认为应该使用秘密而不是 docker 配置,这不是 imagePullSecrets 的工作方式吗?
    • 是的,将使用秘密,但错误是说,注册表在my-repo 存储库中没有名为my-servic 的图像。 my-repo 应替换为您的 docker 用户名,如果它是 dockerhub 的帐户。
    • 这是我主要困惑的来源。我可以在本地运行 docker pull my-repo/my-service:latest 并且没有问题:它成功提取并打印:“状态:为 my-repo/my-service:latest 下载了更新的图像”和“docker.io/ my-repo/my-service:latest" 表示 repo 存在并且在本地找到没有问题。为什么说它只能从 k3s 中找到 repo?
    • @MarcusRuddick 这是因为您已经使用repo/name 构建了映像。它在本地找到图像,这就是它从不从远程服务器拉取图像的原因。尝试从本地机器中删除(即 docker rmi )图像,您也会在那里发现相同的错误。
    猜你喜欢
    • 2019-06-04
    • 2021-12-28
    • 1970-01-01
    • 2020-04-26
    • 2019-12-26
    • 1970-01-01
    • 2019-06-28
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多