Kubernetes和不安全的注册表

时间:2018-09-11 21:15:48

标签: kubernetes docker-registry

我想知道它是否可以工作。

我们有服务FOO和BAR,它们使用Docker Registry在同一集群中运行。让我们想象一下这个集群是用于生产,而不是用于开发

我们有 CI / CD系统,该系统负责构建映像并将其推送到docker Registry。

Docker注册表仅用于kubernetes专用网络,我们不会将图像推送或拉出集群,因为...我为什么要这样做?

+-----------------------------------------------+
|                                               |
|                           KUBERNETES          |
|    +-------+                                  |
|    | VCS   |          +----------+            |
|    |       <----------+          |            |
|    |       |          | CI/CD    |            |
|    +-------+  +-------+          |            |
|               |       +----------+            |
|               |                               |
|               |             +-----+           |
|      +--------v-----+ <-----+FOO  |           |
|      | INSECURE     |       +-----+           |
|      | DOCKER       |           +-------+     |
|      | REGISTRY     | <---------+BAR    |     |
|      +--------------+           +-------+     |
+-----------------------------------------------+
                                      ^
                                      |
                                      |
                                      +
                                  USERS

是否可以使用自签名证书创建docker注册表,并设置kubernetes信任此注册表?

或者这是开销,最好使用良好的证书并通过公共网络?

您将生产准备就绪的docker映像存储在哪里以及暂存的位置?

2 个答案:

答案 0 :(得分:2)

嗯,这似乎是一个非常理论性的问题。唯一可以明确回答的问题是:

  

是否可以使用自签名证书创建Docker注册表,   并设置kubernetes信任此注册表?

当然,您可以部署自己的Docker注册表,例如Artifactory或其他名称。您绝对可以使用它来创建自签名证书,也可以使用由证书颁发机构之一颁发的证书。 (请注意,它可能是免费的,例如通过Let's Encrypt) 继续前进,是否信任注册表-这不是Kubernetes的任务。这是运行时的任务,例如DockerRkt。因此,如果要使用私有注册表,则无论是否安全,都必须配置运行时的客户端以与您的注册表一起使用。

所有其他事情都不像我们想象的那么清晰。我唯一要说的是:实践表明,如果您要做某事,则必须按照自己的方式做

答案 1 :(得分:1)

  

您将生产准备就绪的docker映像存储在哪里以及在何处进行登台?

通常,对于登台和制作,图像应相同。没有理由单独存储它们。

  

或者这是开销,最好使用良好的证书并通过公共网络?

从使用角度看,内部PKI证书或公共服务(如Verisign,Symantec等)之间没有太大区别。主要区别在于发布服务的安全性和可靠性。

  

是否可以使用自签名证书创建docker注册表,并设置kubernetes信任此注册表?

根据Kubernetes documentation

  

Kubernetes集群使用docker-registry类型的Secret来   通过容器注册表进行身份验证以提取私有映像。

     

创建此机密并将其命名为 regcred

kubectl create secret docker-registry regcred --docker-server=your-registry-server --docker-username=your-name --docker-password=your-pword --docker-email=your-email
     

其中:

     
      
  • 您的注册服务器是您的Private Docker Registry FQDN。 (https://index.docker.io/v1/用于DockerHub)
  •   
  • 您的姓名是您的Docker用户名。
  •   
  • 您的密码是您的Docker密码。
  •   
  • 您的电子邮件是您的Docker电子邮件。
  •   
     

您已成功将集群中的Docker凭据设置为   秘密叫做 regcred

     

要了解您刚刚创建的regcred Secret的内容,   首先查看YAML格式的秘密:

     

kubectl get secret regcred --output=yaml

     

要了解.dockerconfigjson字段中的内容,请转换   机密数据转换为可读格式:

     

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

     

创建一个使用您的秘密的Pod:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

有用的文章:

下面的文章中介绍了一些不同的方法。它可以保护Ingress而不是注册表本身。