如何在 K8S 集群范围使用 imagePullSecret?
创始人
2024-02-29 10:28:16
0

在这篇文章中,我将向你展示如何在 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=

例如配置 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,创建链接在这里:账号 -> 安全 {% endnote %}

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

apiVersion: v1
kind: Pod
metadata:name: busyboxnamespace: private-registry-test
spec:containers:- name: my-appimage: my-private-registry.infra/busybox:v1imagePullSecrets:- name: image-pull-secret

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

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

在 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.yamlkubectl 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-srcnamespace: 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: falserules:- name: sync-image-pull-secretmatch:resources:kinds:- Namespacegenerate:kind: Secretname: image-pull-secretnamespace: "{{request.object.metadata.name}}"synchronize: trueclone:namespace: defaultname: image-pull-secret
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:name: mutate-imagepullsecret
spec:rules:- name: mutate-imagepullsecretmatch:resources:kinds:- Podmutate:patchStrategicMerge:spec:imagePullSecrets:- name: image-pull-secret  ## imagePullSecret that you created with docker hub pro account(containers):- (image): "*" ## match all container images

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

相关内容

热门资讯

尚德教育的老师教的怎么样? 尚德教育的老师教的怎么样?尚德教育机构有他们独有的教育方式,直播课程可以互动,没听懂的可以看回放反复...
真三赵云龙之心怎么合成 真三赵云龙之心怎么合成真三赵云龙之心怎么合成杀黄龙掉出来的。不过杀黄龙需要一些装备建议在单人模式下练...
小冰 和 小兵 的英文分别怎么... 小冰 和 小兵 的英文分别怎么写?拜托了各位 谢谢little ice little solder ...
进监狱为什么会被其他的犯人打? 进监狱为什么会被其他的犯人打?为什么呢?因为他们和大家一样相信弱肉强食的丛林法则!!!让你看看他们有...
有一本小说女主角叫林小溪男主角... 有一本小说女主角叫林小溪男主角叫李什么琛一不小心爱上总裁作者:聿天使主角:林小溪,李聿旻你问错地方了
百万新娘之爱无悔英杰是敏君亲生... 百万新娘之爱无悔英杰是敏君亲生的吗王英杰是林敏君跟王绍华的儿子,五十九集说了:王英杰是:林敏君、王绍...
女人在恋爱中通常有哪些误区?如... 女人在恋爱中通常有哪些误区?如何避免?女人在恋爱中误区有付出的多少与爱的程度为正比,如果你总觉得如果...
俩人去马尔代夫旅行结婚需要多少... 俩人去马尔代夫旅行结婚需要多少钱?从天津到马尔代夫旅行结婚需要多少钱 什么时候去合适 待上7天左右 ...
人是不是年龄越大越不敢动感情? 人是不是年龄越大越不敢动感情?人并不是年龄越大越不敢动感情,而是因为年龄越大就看透了这世间所有的感情...
说男主重生如何开加盟鞋店如何赚... 说男主重生如何开加盟鞋店如何赚钱的过程的小说。小说重生之超级商业帝国重生之最强富翁重生1978重生1...
拔萝卜儿歌改编歌曲 拔萝卜儿歌改编歌曲儿歌拔萝卜 拔萝卜. 嗨吆嗨吆,拔萝卜,嗨吆嗨吆,拔不动, 老太婆,快快来,快来帮...
为啥所有的付出再他就是一文不值... 为啥所有的付出再他就是一文不值你人与人之间"心已走远"。。。那就不在付出了,既然看透了,那就没必要付...
贝利亚奥特曼 贝利亚奥特曼贝利亚奥特曼有什么故事?他的性格很不好吗?赛罗奥特曼VS黑暗独眼巨人赛罗大怪兽大战!超银...
找一部日剧~~ 找一部日剧~~之前看到有人推荐过一部日剧,前两个字是“非常”后面几个字我忘了,请问有谁知道吗?应该是...
“一往如初”是什么意思? “一往如初”是什么意思?一往如初是什么意思还是像以前一样。一往:一直,始终。如:像。初:以前那样,一...
闲情倩意后面能连个什么句 闲情倩意后面能连个什么句连词后面也可以加有动词的句子. recoveries accrued to...
世界上最( )的( )... 世界上最( )的( )是世界上最(奇妙)的(感觉)是你爱上一个人的时候.世界上最(舒服)的(...
备胎说车:打蜡 封釉 镀膜 镀... 备胎说车:打蜡 封釉 镀膜 镀晶哪个好常规的保养漆面的方法有打蜡封釉,保持时间长久,和提升漆面的硬度...
下背痛的诊断 下背痛的诊断下背痛的诊断
金鼎猜一个数字 金鼎猜一个数字不知道啊啊啊啊金鼎猜一个数字是9