从私有人工注册表中提取所有Kubernetes集群映像
安全,快速,易于配置

使用JFrog Artifactory作为私有工具有很多好处码头工人注册表,允许您在单一的事实来源中存储,共享和部署二进制工件。
这篇博文将重点介绍在Kubernetes中使用Artifactory。具体来说,我们将介绍配置Kubernetes以从Artifactory提取图像的步骤,最重要的是-扩展!它还将描述如何启用整个集群范围的对Artifactory的身份验证访问幕后故事.
当Artifactory遇到Kubernetes时
一旦你有你的Artifactory全部设置和配置为私有码头工人注册表,把一些码头工人的图片从您最喜欢的CI工具导入到您的注册表中,现在一切都准备好部署到Kubernetes集群上了

1.为单个Kubernetes命名空间设置Artifactory
首先,我们将使用以下命令从一个Artifactory Docker注册表映像部署一些pod。
~ kubectl创建部署my-app-ns——image my-artifactory.jfrog.io/default-docker-virtual/my-app:1.0.1。apps/my-app created应寻求支持~ kubectl get pods -n my-app-ns NAME READY STATUS restart AGE my-app-6f6b796547-2ttcz 0/1 ErrImagePull 0 9s
ErrImagePull吗?让我们来看看为什么:
kubectl description pod -n my-app-ns my-app-6f6b796547-2ttcz…事件:类型原因时间来自消息------ ---------- ----------- ------------ Normal Scheduled 8m22s default-scheduler Successfully assigned my-app-ns/my-app-6f6b796547-2ttcz to ip-192-168-121-179.ec2.internal Normal pull 6m58s (x4 over 8m22s) kubelet pull image "my-artifactory.jfrog.io/default-docker-virtual/my-app:1.0.1": rpc错误:code =未知desc =从守护进程的错误响应:获取https://my-artifactory.jfrog.io/v2/default-docker-virtual/my-app/manifests/1.0.1:未知:需要身份验证警告失败6m58s (x4超过8m22s) kubelet错误:errimageppull警告失败6m33s (x6超过8m21s) kubelet错误:imagepulbackoff正常BackOff 3m11s (x21超过8m21s) kubelet BackOff拉映像"my-artifactory.jfrog.io/default-docker-virtual/my-app:1.0.1"
是的,我们需要使用私有Docker注册表进行身份验证。我们如何在Kubernetes中做到这一点?
2.使用私有Docker注册表对Kubernetes进行身份验证
我们现在创建一个Kubernetes秘密类型的docker-registry.Kubernetes secret必须创建在与我们部署的pod相同的命名空间中,并且需要包含凭据,以便根据Artifactory Docker注册表进行身份验证。
请寻求机会~ kubectl create secret docker-registry regcred \——docker-server=my-artifactory.jfrog。\——docker-password=my-super-secret-pass \——docker-email=johndoe@example.com \ -n my-app-ns secret/regcred已创建
现在,我们需要指示Kubernetes使用我们刚刚在这个命名空间中为pod提取图像时创建的秘密凭证。有两种选择:
- 添加一个imagePullSecrets章节,例如,
kubectl edit deploy my-app-n my-app-ns apiVersion: apps/v1 kind: deployment…规范:…- image: my-artifactory.jfrog.io/default-docker-virtual/my-app:1.0.1 imagePullSecrets: - name: recred . - 修补默认的服务帐户,使其包含imagePullSecrets部分。
默认情况下,为每个名称空间自动创建一个名为default的服务帐户,所有工作负载将自动使用它。您还可以修补自定义服务帐户,使其包含imagePullSecrets节和将您的工作负载配置为使用它默认的。求助于~ kubectl edit serviceaccount default -n my-app-ns apiVersion: v1 kind: serviceaccount imagePullSecrets: - name: recred…
的第二种选择通常是首选.这样,该名称空间中的所有工作负载的映像都可以从私有Docker注册表(例如my-artifactory.jfrog.io)中提取,而无需为每个工作负载显式配置imagePullSecrets。
在我们使用上面的一个选项配置了imagePullSecrets之后,让我们检查一下我们的部署:
寻求机会寻求支持~ kubectl get pods -n my-app-ns NAME READY STATUS重启AGE my-app-57db67b7d5-nr8db 1/1运行0 5m
更好的!我们发现了一个运行状态的新舱。
奖励点-扩展任何名称空间!

但是,如果我们计划使用我们的Artifactory Docker注册表只为pod提取可信的生产映像,该怎么办呢多个名称空间,甚至所有的名称空间?
这是否意味着我们需要在每个名称空间中重复创建密钥并使用该密钥更新默认服务帐户的相同过程?!
嗯,是的,但是听起来很乏味。我们能做得更好吗?是的,我们可以!
我们建议使用imagepullsecrets-patcher由泰坦软件创建的开源工具,它是一个简单的Kubernetes client-go应用程序,创建并修补imagePullSecrets到所有Kubernetes命名空间中的服务帐户,以允许集群范围内对私有容器注册表进行身份验证访问。"在他们的博客中阅读更多内容>
一次配置,到处运行
简而言之,使用imagepullsecrets-patcher工具,您将创建image-pull-secret-src秘密文件imagepullsecret-patcher名称空间和imagepullsecret-patcher部署设置CONFIG_ALLSERVICEACCOUNT环境变量为true。
使用这个环境变量将允许任何工作负载在任何名称空间使用任何服务帐户在我们的Kubernetes集群中,无需编辑我们的工作负载规范即可从Artifactory提取图像的能力。
请注意或者,从Kubernetes v1.20开始Kubelet可以使用exec插件动态检索容器映像注册表的凭据.如果不能接受将注册表凭据存储在磁盘或imagePullSecrets中,您可能会对使用此功能感兴趣,因此kubelet可以在运行时从外部服务提取这些凭据。该特性在最新的Kubernetes版本(目前是v1.23)中仍处于alpha状态。
