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

打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

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

Kubernetes 在每个 Pod 或每个 Namespace 的基础上使用 imagePullSecrets 对私有容器注册表进行身份验证。要做到这一点,你需要创建一个秘密与凭据:
{% note warning %}
⚠️ 警告
现在随着公共镜像仓库(如:docker.io 等)开始对匿名用户进行限流,配置公共仓库的身份认证也变得有必要。
{% endnote %}
  1. kubectl create secret docker-registry image-pull-secret \
  2.   -n <your-namespace> \
  3.   --docker-server=<your-registry-server> \
  4.   --docker-username=<your-name> \
  5.   --docker-password=<your-password> \
  6.   --docker-email=<your-email>
复制代码
例如配置 docker.io 的 pull secret:
  1. kubectl create secret docker-registry image-pull-secret-src \
  2.         -n imagepullsecret-patcher \
  3.         --docker-server=docker.io \
  4.         --docker-username=caseycui \
  5.         --docker-password=c874d654-xxxx-40c6-xxxx-xxxxxxxx89c2 \
  6.         --docker-email=cuikaidong@foxmail.com
复制代码
{% note info %}
ℹ️ 信息
如果 docker.io 启用了「2 阶段认证」,可能需要创建 Access Token(对应上面的 docker-password,创建链接在这里:账号 -> 安全
{% endnote %}
现在我们可以在一个 pod 中使用这个 secret 来下载 docker 镜像:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: busybox
  5.   namespace: private-registry-test
  6. spec:
  7.   containers:
  8.     - name: my-app
  9.       image: my-private-registry.infra/busybox:v1
  10.   imagePullSecrets:
  11.     - name: image-pull-secret
复制代码
另一种方法是将它添加到命名空间的默认 ServiceAccount 中:
  1. kubectl patch serviceaccount default \
  2.   -p "{"imagePullSecrets": [{"name": "image-pull-secret"}]}" \
  3.   -n <your-namespace>
复制代码
在 K8S 集群范围使用 imagePullSecrets

我找到了一个叫做 imagepullsecret-patch 的工具,它可以在你所有的命名空间上做这个:
  1. wget https://raw.githubusercontent.com/titansoft-pte-ltd/imagepullsecret-patcher/185aec934bd01fa9b6ade2c44624e5f2023e2784/deploy-example/kubernetes-manifest/1_rbac.yaml
  2. wget https://raw.githubusercontent.com/titansoft-pte-ltd/imagepullsecret-patcher/master/deploy-example/kubernetes-manifest/2_deployment.yaml
  3. kubectl create ns imagepullsecret-patcher
复制代码
编辑下载的文件,一般需要修改image-pull-secret-src的内容,这个 pull secret 就会应用到 K8S 集群范围。
  1. nano 1_rbac.yaml
  2. nano 2_deployment.yaml
  3. kubectl apply -f 1_rbac.yaml
  4. kubectl apply -f 2_deployment.yaml
复制代码
这里背后创建的资源有:

  • NameSpace
  • RBAC 权限相关:

    • imagepullsecret-patcher ServiceAccount
    • imagepullsecret-patcher ClusterRole,具有对 service account 和 secret 的所有权限
    • imagepullsecret-patcher ClusterRoleBinding,为 imagepullsecret-patcher ServiceAccount 赋予 imagepullsecret-patcher ClusterRole 的权限。

  • 全局 pull secret image-pull-secret-src,里面是你的 K8S 全局包含的所有的镜像库地址和认证信息。
  • Deployment imagepullsecret-patcher,指定 ServiceAccount 是 imagepullsecret-patcher 就有了操作 service account 和 secret 的所有权限,并将上面的 secret 挂载到 Deployment pod 内。
可以包含多个镜像库地址和认证信息,如:
  1. {
  2.     "auths": {
  3.         "docker.io": {
  4.             "username": "caseycui",
  5.             "password": "c874xxxxxxxxxxxxxxxx1f89c2",
  6.             "email": "cuikaidong@foxmail.com",
  7.             "auth": "Y2FzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxWMy"
  8.         },
  9.         "quay.io": {
  10.             "auth": "ZWFzdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlXWmpNPQ==",
  11.             "email": ""
  12.         }
  13.     }
  14. }
复制代码
base64 编码后写到 secret 的 .dockerconfigjson 字段即可:
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: image-pull-secret-src
  5.   namespace: imagepullsecret-patcher
  6. data:
  7.   .dockerconfigjson: >-
  8.     eyJhdXRocyI6eyJkb2NrZXIuaW8iOnsidXNlcm5hbWUiOiJjYXNleWN1aSIsInB.............................................IiwiZW1haWwiOiIifX19
  9. type: kubernetes.io/dockerconfigjson
复制代码
启动后的 pod 会在所有 NameSpace 下创建 image-pull-secret secret(内容来自于image-pull-secret-src) 并把它 patch 到 default service account 及该 K8S 集群的所有 ServiceAccount 里,日志如下:
  1. time="2022-01-12T16:07:30Z" level=info msg="Application started"
  2. time="2022-01-12T16:07:30Z" level=info msg="[default] Created secret"
  3. time="2022-01-12T16:07:30Z" level=info msg="[default] Patched imagePullSecrets to service account [default]"
  4. time="2022-01-12T16:07:30Z" level=info msg="[kube-system] Created secret"
  5. time="2022-01-12T16:07:31Z" level=info msg="[kube-system] Patched imagePullSecrets to service account [node-controller]"
  6. ...
  7. time="2022-01-12T16:07:37Z" level=info msg="[kube-public] Created secret"
  8. time="2022-01-12T16:07:37Z" level=info msg="[kube-public] Patched imagePullSecrets to service account [default]"
  9. time="2022-01-12T16:07:38Z" level=info msg="[kube-node-lease] Created secret"
  10. time="2022-01-12T16:07:38Z" level=info msg="[kube-node-lease] Patched imagePullSecrets to service account [default]"
  11. time="2022-01-12T16:07:38Z" level=info msg="[prometheus] Created secret"
  12. time="2022-01-12T16:07:39Z" level=info msg="[prometheus] Patched imagePullSecrets to service account [default]"
  13. ...
  14. time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Created secret"
  15. time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Patched imagePullSecrets to service account [default]"
  16. time="2022-01-12T16:07:41Z" level=info msg="[imagepullsecret-patcher] Patched imagePullSecrets to service account [imagepullsecret-patcher]"
复制代码
今后我们只需要更新 image-pull-secret-src 这一个即可了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表