从私有Artifactory注册表中提取所有Kubernetes集群映像

安全,快速,易于配置

与Kubernetes & JFrog Artifactory一起扩大规模

与JFrog Artifactory合作有很多好处码头工人注册表,允许您存储,共享和部署您的二进制工件在一个单一的真相来源。

本文将重点介绍在Kubernetes中使用Artifactory。具体来说,我们将详细介绍配置Kubernetes以从Artifactory提取图像的步骤,最重要的是—扩展!它还将描述如何启用整个集群范围的对Artifactory的身份验证访问幕后故事

当Artifactory遇到Kubernetes

一旦您将Artifactory全部设置并配置为私有码头工人注册表,把一些码头工人的图片从您最喜欢的CI工具到您的注册表,现在一切都准备好部署到您的Kubernetes集群

没有使用Artifactory作为Docker注册表?查看我们的docker2artifactoryGitHub工具,以简化从第三方V2 Docker注册表到JFrog Artifactory的过渡。
注册JFrog Academy,学习更多关于在JFrog中构建Docker应用程序的知识JFrog管道

JFrog Artifactory +码头工人

1.为单个Kubernetes命名空间设置Artifactory

我们将首先使用以下命令从我们的Artifactory Docker注册表映像部署一些pod。

➜~ kubectl create namespace my-app-ns namespace/my-app-ns created➜~ kubectl create deploy my-app-n my-app-ns——image my-artifactory. j青蛙.io/default-docker-virtual/my-app:1.0.1 deploy . shapps/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 describe pod -n my-app-ns my-app-6f6b796547-2ttcz…事件:Type Reason Age From Message ------ ---------- ----------- ------------ 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" Warning Failed 6m58s (x4 over 8m22s) kubelet Failed to pull image "my-artifactory.jfrog.io/default-docker-virtual/my-app:1.0.1": rpc error:code = Unknown desc = Error response from daemon: Get https://my-artifactory.jfrog.io/v2/default-docker-virtual/my-app/manifests/1.0.1: Unknown: Authentication is required Warning Failed 6m58s (x4 over 8m22s) kubelet Error: ErrImagePull Warning Failed 6m33s (x6 over 8m21s) kubelet Error: ImagePullBackOff Normal BackOff 3m11s (x21 over 8m21s) kubelet Back-off pull image "my-artifact .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。IO \——docker-username=read-only \——docker-password=my-super-secret-pass \——docker-email=johndoe@example.com \ -n my-app-ns secret/regcred created

现在我们需要指示Kubernetes使用我们在这个名称空间中为我们的pod提取图像时创建的秘密凭据。有两个选项可以做到这一点:

  1. 添加一个imagePullSecrets部分的pod规范。例如,
    ➜~ kubectl编辑部署my-app-n my-app-ns apiVersion: apps/v1 kind:部署…规范:…template: spec: containers:—image: my-artifact .jfrog.io/default-docker-virtual/my-app:1.0.1 imagpullsecrets:—name: regcredit .io/default-docker-virtual/my-app:1.0.1
  2. 补丁默认服务帐户以包含imagePullSecrets部分。
    默认情况下,每个名称空间都会自动创建一个名为default的服务帐户,所有工作负载都会自动使用它。您还可以为自定义服务帐户打补丁,以包括imagePullSecrets部分和配置您的工作负载以使用它的默认值。

    ➜~ kubectl编辑serviceaccount default -n my-app-ns apiVersion: v1 kind: serviceaccount imagePullSecrets: - name: regcred…

第二种选择通常是首选.通过这种方式,该名称空间中的所有工作负载都可以从私有Docker注册中心(例如my-artifact .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由Titansoft创建的开源工具,它是“一个简单的Kubernetes客户端应用程序,创建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状态。

了解更多

开始免费试用并亲自尝试JFrog DevOps平台,或加入我们的每周小组演示看看它是怎么运作的。