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

如何,k8s,集群,范围,使用,imagepullsecret · 浏览次数 : 327

小编点评

**使用 imagePullSecrets 对私有容器注册表进行身份验证** **步骤:** 1. **创建 secret:** - 创建一个名为 `image-pull-secret` 的 secret,包含所有必要的镜像库地址和认证信息。 - 使用 `kubectl create secret docker-registry image-pull-secret` 命令创建 secret。 2. **更新默认 Service Account:** - 使用 `kubectl edit serviceaccount` 命令更改默认 Service Account 的 `imagePullSecrets`。 - 指定 `image-pull-secret` 的路径。 3. **验证身份验证:** - 使用 `kubectl exec -it bash` 等命令进入容器,检查是否可以访问镜像库。 - 确保 `docker pull` 命令正常成功执行。 **注意:** - `image-pull-secret` 的存储空间可能比较大,因此确保您有足够的存储空间。 - `imagePullSecrets` 的值是一个列表,包含所有要使用的镜像库地址。 - 您可以在 `yaml` 或 `json` 格式中定义 `imagePullSecrets`。 **示例:** ```yaml apiVersion: v1 kind: Secret metadata: name: image-pull-secret namespace: my-namespace data: imagePullSecrets: - name: my-image-repo.com value: my-image-url ``` **结论:** 使用 `imagePullSecrets` 对私有容器注册表进行身份验证,需要创建 secret 并更新默认 Service Account 的 `imagePullSecrets`。这确保了容器可以从指定的镜像库中获取所需镜像。

正文

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

imagePullSecrets 简介

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

{% note warning %}
⚠️ 警告

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

kubectl create secret docker-registry image-pull-secret \
  -n <your-namespace> \
  --docker-server=<your-registry-server> \
  --docker-username=<your-name> \
  --docker-password=<your-password> \
  --docker-email=<your-email>

例如配置 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

{% note info %}
ℹ️ 信息

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

现在我们可以在一个 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

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

kubectl patch serviceaccount default \
  -p "{\"imagePullSecrets\": [{\"name\": \"image-pull-secret\"}]}" \
  -n <your-namespace>

在 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

编辑下载的文件,一般需要修改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. 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": ""
        }
    }
}

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

apiVersion: v1
kind: Secret
metadata:
  name: image-pull-secret-src
  namespace: imagepullsecret-patcher
data:
  .dockerconfigjson: >-
    eyJhdXRocyI6eyJkb2NrZXIuaW8iOnsidXNlcm5hbWUiOiJjYXNleWN1aSIsInB.............................................IiwiZW1haWwiOiIifX19
type: kubernetes.io/dockerconfigjson

启动后的 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]"

今后我们只需要更新 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

与如何在 K8S 集群范围使用 imagePullSecret?相似的内容:

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

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

运行在容器中Postgres数据库数据损坏后如何恢复?

前言 在使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss, 我介绍了将 RssHub + Tiny Tiny RSS 部署到 K8s 集群中的方案. 其中 TTRSS 会用到 Postgres 存储数据, 也一并部署到 K8s 容器中. 但是最近, 由于

Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

前情提要 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 IoT 边缘集群基于 Kubernetes Events 的告警通知实现(二):进一步配置 概述 在分析 K8S 集群问题时,Kubernetes Events 是超级有用的。 Kubernetes Events 可

五分钟k8s入门到实战-应用配置

背景 在前面三节中已经讲到如何将我们的应用部署到 k8s 集群并提供对外访问的能力,x现在可以满足基本的应用开发需求了。 现在我们需要更进一步,使用 k8s 提供的一些其他对象来标准化我的应用开发。 首先就是 ConfigMap,从它的名字也可以看出这是用于管理配置的对象。 ConfigMap 不管

[转帖]k8s部署-22-yaml文件怎么写,规则是什么,在k8s中分别有什么含义

https://www.jianshu.com/p/ba5e3d9ecc1e 在前面的文章中,我们使用了较多的yaml文件,例如测试kubespary方式搭建的集群可用性,亦或者前文中我们搭建ingress-nginx的时候也是用了yaml文件,那么k8s中的yaml文件到底该如何来写,针对k8s中

如何通过 kubectl 进入 node shell

概述 假设这样一个场景: 生产环境中,Node 都需要通过堡垒机登录,但是 kubectl 是可以直接在个人电脑上登录的。 这种场景下,我想要通过 kubectl 登录到 K8S 集群里的 Node,可以实现吗? 可以的! 本质上是利用容器(runC)的弱隔离(共享内核,Cgruop 等实现进程隔离

DHorse日志收集原理

实现原理 基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar。两种方式各有优缺点,目前DHorse是基于daemoset实现的。如图1所示: 图1 在每个k8s集群中启动一个daemoset组件,即Filebeat的服务,监控/var/log/container

重新初始化k8s集群

##### 执行如下命令,所有节点都执行 ```shell kubeadm reset ``` ##### 初始化集群,仅在master(centos01)上执行 ```shell [root@centos01 opt]# kubeadm init --apiserver-advertise-add

[转帖]记一次flannel网络调整

https://www.jianshu.com/p/a772e4b951f2 背景 最近给一个子公司部署一套k8s集群,集群搭建完之后有几个新需求需要新增几个node节点,在新增节点时发现添加失败,经过查询发现是网络规划问题导致。 flannel启动失败,报错信息如下:Error registeri

k8s安装prometheus

##### 安装 在目标集群上,执行如下命令: ```shell kubectl apply -f https://github.com/512team/dhorse/raw/main/conf/kubernetes-prometheus.yml ``` ##### 使用 1.在浏览器访问地址:ht