• 如何在 K8S 集群范围使用 imagePullSecret?


    在这篇文章中,我将向你展示如何在 Kubernetes 中使用 imagePullSecrets。

    imagePullSecrets 简介

    Kubernetes 在每个 Pod 或每个 Namespace 的基础上使用 imagePullSecrets 对私有容器注册表进行身份验证。要做到这一点,你需要创建一个秘密与凭据:

    {% note warning %} ⚠️ 警告

    现在随着公共镜像仓库(如:docker.io 等)开始对匿名用户进行限流,配置公共仓库的身份认证也变得有必要。 {% endnote %}

    kubectl create secret docker-registry image-pull-secret \
      -n  \
      --docker-server= \
      --docker-username= \
      --docker-password= \
      --docker-email=
    • 1
    • 2
    • 3
    • 4
    • 5

    例如配置 docker.io 的 pull secret:

    kubectl create secret docker-registry image-pull-secret-src \
            -n imagepullsecret-patcher \
            --docker-server=docker.io \
            --docker-username=caseycui \
            --docker-password=c874d654-xxxx-40c6-xxxx-xxxxxxxx89c2 \
            --docker-email=cuikaidong@foxmail.com
    • 1
    • 2
    • 3
    • 4
    • 5

    {% note info %} ℹ️ 信息

    如果 docker.io 启用了「2 阶段认证」,可能需要创建 Access Token(对应上面的 docker-password,创建链接在这里:账号 -> 安全 {% endnote %}

    现在我们可以在一个 pod 中使用这个 secret 来下载 docker 镜像:

    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
      namespace: private-registry-test
    spec:
      containers:
        - name: my-app
          image: my-private-registry.infra/busybox:v1
      imagePullSecrets:
        - name: image-pull-secret
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    另一种方法是将它添加到命名空间的默认 ServiceAccount 中:

    kubectl patch serviceaccount default \
      -p "{\"imagePullSecrets\": [{\"name\": \"image-pull-secret\"}]}" \
      -n 
    • 1
    • 2

    K8S 集群范围使用 imagePullSecrets

    我找到了一个叫做 imagepullsecret-patch 的工具,它可以在你所有的命名空间上做这个:

    wget https://raw.githubusercontent.com/titansoft-pte-ltd/imagepullsecret-patcher/185aec934bd01fa9b6ade2c44624e5f2023e2784/deploy-example/kubernetes-manifest/1_rbac.yaml
    wget https://raw.githubusercontent.com/titansoft-pte-ltd/imagepullsecret-patcher/master/deploy-example/kubernetes-manifest/2_deployment.yaml
    
    kubectl create ns imagepullsecret-patcher
    • 1
    • 2
    • 3

    编辑下载的文件,一般需要修改image-pull-secret-src的内容,这个 pull secret 就会应用到 K8S 集群范围。

    nano 1_rbac.yaml
    nano 2_deployment.yaml
    kubectl apply -f 1_rbac.yaml
    kubectl apply -f 2_deployment.yaml
    • 1
    • 2
    • 3

    这里背后创建的资源有:

    1. NameSpace
    2. RBAC 权限相关:
      1. imagepullsecret-patcher ServiceAccount
      2. imagepullsecret-patcher ClusterRole,具有对 service account 和 secret 的所有权限
      3. imagepullsecret-patcher ClusterRoleBinding,为 imagepullsecret-patcher ServiceAccount 赋予 imagepullsecret-patcher ClusterRole 的权限。
    3. 全局 pull secret image-pull-secret-src,里面是你的 K8S 全局包含的所有的镜像库地址和认证信息。
    4. Deployment imagepullsecret-patcher,指定 ServiceAccount 是 imagepullsecret-patcher 就有了操作 service account 和 secret 的所有权限,并将上面的 secret 挂载到 Deployment pod 内。

    可以包含多个镜像库地址和认证信息,如:

    {
        "auths": {
            "docker.io": {
                "username": "caseycui",
                "password": "c874xxxxxxxxxxxxxxxx1f89c2",
                "email": "cuikaidong@foxmail.com",
                "auth": "Y2FzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWMy"
            },
            "quay.io": {
                "auth": "ZWFzdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlXWmpNPQ==",
                "email": ""
            }
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    base64 编码后写到 secret 的 .dockerconfigjson 字段即可:

    apiVersion: v1
    kind: Secret
    metadata:
      name: image-pull-secret-src
      namespace: imagepullsecret-patcher
    data:
      .dockerconfigjson: >-
        eyJhdXRocyI6eyJkb2NrZXIuaW8iOnsidXNlcm5hbWUiOiJjYXNleWN1aSIsInB.............................................IiwiZW1haWwiOiIifX19
    type: kubernetes.io/dockerconfigjson
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    启动后的 pod 会在所有 NameSpace 下创建 image-pull-secret secret(内容来自于image-pull-secret-src) 并把它 patch 到 default service account 及该 K8S 集群的所有 ServiceAccount 里,日志如下:

    time="2022-01-12T16:07:30Z" level=info msg="Application started"
    time="2022-01-12T16:07:30Z" level=info msg="[default] Created secret"
    time="2022-01-12T16:07:30Z" level=info msg="[default] Patched imagePullSecrets to service account [default]"
    time="2022-01-12T16:07:30Z" level=info msg="[kube-system] Created secret"
    time="2022-01-12T16:07:31Z" level=info msg="[kube-system] Patched imagePullSecrets to service account [node-controller]"
    ...
    time="2022-01-12T16:07:37Z" level=info msg="[kube-public] Created secret"
    time="2022-01-12T16:07:37Z" level=info msg="[kube-public] Patched imagePullSecrets to service account [default]"
    time="2022-01-12T16:07:38Z" level=info msg="[kube-node-lease] Created secret"
    time="2022-01-12T16:07:38Z" level=info msg="[kube-node-lease] Patched imagePullSecrets to service account [default]"
    time="2022-01-12T16:07:38Z" level=info msg="[prometheus] Created secret"
    time="2022-01-12T16:07:39Z" level=info msg="[prometheus] Patched imagePullSecrets to service account [default]"
    ...
    time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Created secret"
    time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Patched imagePullSecrets to service account [default]"
    time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Patched imagePullSecrets to service account [imagepullsecret-patcher]"
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    今后我们只需要更新 image-pull-secret-src 这一个即可了。👍️👍️👍️

    Kyverno policy

    Kyverno policy 可以实现同样的效果:

    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: sync-secret
    spec:
      background: false
      rules:
      - name: sync-image-pull-secret
        match:
          resources:
            kinds:
            - Namespace
        generate:
          kind: Secret
          name: image-pull-secret
          namespace: "{{request.object.metadata.name}}"
          synchronize: true
          clone:
            namespace: default
            name: image-pull-secret
    ---
    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: mutate-imagepullsecret
    spec:
      rules:
        - name: mutate-imagepullsecret
          match:
            resources:
              kinds:
              - Pod
          mutate:
            patchStrategicMerge:
              spec:
                imagePullSecrets:
                - name: image-pull-secret  ## imagePullSecret that you created with docker hub pro account
                (containers):
                - (image): "*" ## match all container images
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    本文由东风微鸣技术博客 EWhisper.cn 编写!

  • 相关阅读:
    ApkScan-PKID 查壳工具下载使用以及相关技术介绍
    组原必备知识点
    亿道信息新品EM-T195轻薄型工业平板,隆重登场!
    pyechart练习三:黑色星期五用户画像
    《C++ Core Guidelines解析》:揭示现代C++最佳实践的深层原理
    视频二维码的制作方法,支持内容修改编辑
    Git的常用操作命令有哪些
    QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)
    SpringCloud之Eureka注册中心解读
    nRF5340(入门篇)之1.4 浅谈双核系统
  • 原文地址:https://blog.csdn.net/east4ming/article/details/128092502