簡體   English   中英

OPA/Rego:確保 Helm chart 中的每一個 Service 都有一個匹配的 Pod

[英]OPA/Rego: Ensure that every Service in Helm chart has exactly one matching Pod

我想檢查渲染的 Helm 圖表中的每個服務是否都有一個匹配的Pod

當服務規范選擇spec.selector中指定的每個條目都反映在 Pod metadata.labels中時,存在 Pod 到服務關聯。

以下策略使用 Conftest 通過運行conftest test --combine {YAML_FILE}進行測試,並檢查每個 Service 是否至少有一個匹配的 Pod。 完全不確定如何轉換它,以便它檢查一個匹配的 Pod。

package main

import future.keywords.every

in_set(e, s) { s[e] }

get_pod(resource) := pod {
  in_set(resource.kind, {"Deployment", "StatefulSet", "Job"})
  pod := resource.spec.template
}

# ensure that every service has at least one matching pod
# TODO: ensure that every service has exactly one matching pod
deny_service_without_matching_pod[msg] {
  service := input[_].contents
  service.kind == "Service"
  selector := object.get(service, ["spec", "selector"], {})
  pods := { p | p := get_pod(input[_].contents) }
  every pod in pods {
    labels := object.get(pod, ["metadata", "labels"], {})
    matches := { key | some key; labels[key] == selector[key] }
    count(matches) != count(selector)
  }
  msg := sprintf("service %s has no matching pod", [service.metadata.name])
}

邊注: get_pod function 不會檢索 Helm 圖表中可能出現的所有 PodTemplates。 還進行了其他檢查以保持 Helm 圖表的 Kubernetes API 表面較小 - 因此在這種情況下,Pod 只能出現在 Deployment、StatefulSet 和 Job 中。

也許這里有 rego 專家可以插話並提供幫助。 那將不勝感激!

由於沒有提供示例數據,因此這是未經測試的代碼。 應該可以工作:)

package main

pods := {pod | 
  resource := input[_].contents
  resource.kind in {"Deployment", "StatefulSet", "Job"})
  pod := resource.spec.template
}

services := {service |
  service := input[_].contents
  service.kind == "Service"
}

pods_matching_selector(selector) := {pod |
  selector != {}
  some pod in pods
  labels := pod.metadata.labels
  some key
  labels[key] == selector[key]
}

deny_service_without_one_matching_pod[msg] {
  some service in services
  selector := object.get(service, ["spec", "selector"], {})
  matching_pods := count(pods_matching_selector(selector))
  matching_pods != 1
  msg := sprintf(
    "service %s has %d matching pods, must have exactly one",
    [service.metadata.name, matching_pods]
  )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM