如何拒绝 kubernetes 中的 docker 注册表?

Kon*_*tin 4 docker kubernetes docker-registry

我想拒绝除我自己的所有 docker 注册表之外的所有 docker 注册表。我正在为 docker 注册表及其映像寻找某种策略。

例如我的注册表名称是registry.my.com. 我想让 kubernetes 只从 拉/运行图像registry.my.com,所以:

image: prometheus:2.6.1
Run Code Online (Sandbox Code Playgroud)

或任何其他应被拒绝,同时:

image: registry.my.com/prometheus:2.6.1
Run Code Online (Sandbox Code Playgroud)

不应该。

有没有办法做到这一点?

Die*_*des 6

准入控制器是您正在寻找的。

准入控制器拦截操作以验证在 api 服务器提交操作之前应该发生什么。

一个例子是ImagePolicyWebhook,它是一个准入控制器,它拦截 Image 操作以验证它是否应该被允许或拒绝。

它将使用如下有效负载调用 REST 端点:

{  
  "apiVersion":"imagepolicy.k8s.io/v1alpha1",
  "kind":"ImageReview",
  "spec":{  
    "containers":[  
      {  
        "image":"myrepo/myimage:v1"
      },
      {  
        "image":"myrepo/myimage@sha256:beb6bd6a68f114c1dc2ea4b28db81bdf91de202a9014972bec5e4d9171d90ed"
      }
    ],
    "annotations":[  
      "mycluster.image-policy.k8s.io/ticket-1234": "break-glass"
    ],
    "namespace":"mynamespace"
  }
}
Run Code Online (Sandbox Code Playgroud)

和 API 回答Allowed

{
  "apiVersion": "imagepolicy.k8s.io/v1alpha1",
  "kind": "ImageReview",
  "status": {
    "allowed": true
  }
}
Run Code Online (Sandbox Code Playgroud)

或被拒绝

{
  "apiVersion": "imagepolicy.k8s.io/v1alpha1",
  "kind": "ImageReview",
  "status": {
    "allowed": false,
    "reason": "image currently blacklisted"
  }
}
Run Code Online (Sandbox Code Playgroud)

端点可以是 Lambda 函数或在集群中运行的容器。

这个 github repo github.com/flavio/kube-image-bouncer实现了一个使用ImagePolicyWebhook拒绝使用标签“最新”的容器的示例。

还有一个选项是registry-whitelist在启动时使用该标志来传递一个逗号分隔的允许注册表列表,ValidatingAdmissionWebhook将使用它来验证注册表是否被列入白名单。

.

另一种选择是项目Open Policy Agent [OPA]。

OPA 是一个灵活的引擎,用于根据规则创建策略以匹配资源并根据这些表达式的结果做出决策。它是一个变异和验证 webhook,被上述准入控制器调用以匹配 Kubernetes API 服务器请求。总之,该操作的工作方式与上述类似,唯一的区别是规则是作为配置而不是代码编写的。上面重写器使用 OPA 的相同示例与此类似:

package admission

import data.k8s.matches

deny[{
    "id": "container-image-whitelist",  # identifies type of violation
    "resource": {
        "kind": "pods",                 # identifies kind of resource
        "namespace": namespace,         # identifies namespace of resource
        "name": name                    # identifies name of resource
    },
    "resolution": {"message": msg},     # provides human-readable message to display
}] {
    matches[["pods", namespace, name, matched_pod]]
    container = matched_pod.spec.containers[_]
    not re_match("^registry.acmecorp.com/.+$", container.image) # The actual validation
    msg := sprintf("invalid container registry image %q", [container.image])
}
Run Code Online (Sandbox Code Playgroud)

以上转化为:拒绝任何容器镜像与以下注册表不匹配的 podregistry.acmecorp.com