Sentinel Policy 참조
Sentinel Policy 참조
Enterprise
이 기능은 Nomad Enterprise(새 탭에서 열림)가 필요해요.
출처: 문서
본문
이 페이지는 Nomad Sentinel 정책 기능을 사용해 세밀한 정책(예: job이 언제 실행될 수 있는지 제한하거나 job이 특정 이미지를 사용하도록 보장)을 구현하는 방법에 대한 참조 정보를 제공해요.
Sentinel 정책 소개 (Introduction to Sentinel Policies)
Nomad Enterprise에서 운영자는 세밀한 정책 집행을 위해 Sentinel 정책을 만들 수 있어요. Sentinel 정책은 ACL 시스템 위에 구축되며, 운영자가 금요일에 프로덕션에 job을 제출하지 못하게 하거나 사전 승인된 Docker 이미지를 사용하는 job만 실행할 수 있게 하는 등의 정책을 정의할 수 있게 해줘요. Sentinel 정책은 코드로 정의되므로 운영자에게 규정 준수 요구 사항을 충족할 수 있는 상당한 유연성을 제공해요.
Sentinel 정책 배포에 대한 자세한 내용은 Nomad Sentinel 튜토리얼과 nomad sentinel 하위 명령 문서를 참고하세요.
Sentinel 정책 구조 (Sentinel Policy Structure)
Sentinel 정책은 Sentinel 언어로 지정돼요. 이 언어는 정책을 읽고 쓰는 사람이 이해할 수 있도록 설계되었으며, 평가가 빠른 상태를 유지해요. 정책이 얼마나 복잡해질 수 있는지에 대한 제한은 없지만 정책은 실행 경로에 있으므로 성능에 부정적 영향을 주지 않도록 주의해야 해요.
각 스코프(scope)에는 제출되는 job 같은, 내부 검사를 위해 사용 가능한 서로 다른 객체가 있어요. 정책은 이 객체들을 검사해 세밀한 정책을 적용할 수 있어요. Nomad는 job 등록을 위한 submit-job 스코프와 동적 호스트 볼륨 생성 또는 업데이트를 위한 submit-host-volume 스코프를 지원해요.
submit-job 스코프 (submit-job scope)
다음 최상위 객체들은 명시적인 import 없이도 submit-job 스코프의 정책에 자동으로 제공돼요.
job: 제출된 job. Sentinel Job 객체임.existing_job: job의 이전 버전.job_exists가 true이면 항상 nil이 아님. 이것도 Sentinel Job 객체임.job_exists: job의 이전 버전이 존재함을 나타내는 boolean 필드.nomad_acl_token: job이 제출된 ACL 토큰. Sentinel Nomad ACL Token 객체임.namespace: job이 있는 네임스페이스. Sentinel Nomad Namespace 객체임.
nomad_var import로 Nomad 변수도 가져올 수 있어요.
submit-host-volume 스코프 (submit-host-volume scope)
다음 최상위 객체들은 명시적인 import 없이도 submit-host-volume 스코프의 정책에 자동으로 제공돼요.
volume: 제출된 볼륨. Sentinel Dynamic Host Volume 객체임.existing_volume: 볼륨의 이전 버전.volume_exists가 true이면 항상 nil이 아님. 이것도 Sentinel Dynamic Host Volume 객체임.volume_exists: 볼륨의 이전 버전이 존재함을 나타내는 boolean 필드.nomad_acl_token: job이 제출된 ACL 토큰. Sentinel Nomad ACL Token 객체임.namespace: job이 있는 네임스페이스. Sentinel Nomad Namespace 객체임.node: 볼륨이 배치된 노드. Sentinel Node 객체임.node_pool: 볼륨이 배치된 노드의 노드 풀. Sentinel Node Pool 객체임.
nomad_var import로 Nomad 변수도 가져올 수 있어요.
submit-csi-volume 스코프 (submit-csi-volume scope)
다음 최상위 객체들은 명시적인 import 없이도 submit-csi-volume 스코프의 정책에 자동으로 제공돼요.
volume: 제출된 볼륨. Sentinel CSI Volume 객체임.existing_volume: 볼륨의 이전 버전.volume_exists가 true이면 항상 nil이 아님. 이것도 Sentinel CSI Volume 객체임.volume_exists: 볼륨의 이전 버전이 존재함을 나타내는 boolean 필드.nomad_acl_token: job이 제출된 ACL 토큰. Sentinel Nomad ACL Token 객체임.namespace: job이 있는 네임스페이스. Sentinel Nomad Namespace 객체임.
nomad_var import로 Nomad 변수도 가져올 수 있어요.
Sentinel은 식별자 관례로 소문자를 사용하고 밑줄로 구분해요. 객체의 모든 필드는 같은 이름으로 접근하며, 낙타 표기(camel case)를 소문자로 변환하고 밑줄로 구분해요.
Sentinel Job 객체 (Sentinel Job Objects)
job과 existing_job 객체는 JSON job 사양에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Job 필드 | Sentinel 접근자 |
|---|---|
job.ID |
job.id |
job.AllAtOnce |
job.all_at_once |
job.ParentID |
job.parent_id |
job.TaskGroups |
job.task_groups |
job.TaskGroups[0].EphemeralDisk.SizeMB |
job.task_groups[0].ephemeral_disk.size_mb |
Sentinel ACL Token 객체 (Sentinel ACL Token Objects)
nomad_acl_token 객체는 ACL 토큰에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Nomad ACL Token 필드 | Sentinel 접근자 |
|---|---|
nomad_acl_token.AccessorID |
nomad_acl_token.accessor_id |
nomad_acl_token.Policies[0] |
nomad_acl_token.policies[0] |
SecretID 필드는 자격 증명 누출을 방지하기 위해 항상 수정(redacted)된다는 점에 유의하세요.
Sentinel Namespace 객체 (Sentinel Namespace Objects)
namespace 객체는 Namespace에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Namespace 필드 | Sentinel 접근자 |
|---|---|
namespace.Description |
namespace.description |
namespace.NodePoolConfiguration.Allowed[0] |
namespace.node_pool_configuration.allowed[0] |
Sentinel Node 객체 (Sentinel Node Objects)
node 객체는 Node에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Node 필드 | Sentinel 접근자 |
|---|---|
node.Class |
node.class |
node.Meta["foo"] |
node.meta["foo"] |
Sentinel Node Pool 객체 (Sentinel Node Pool Objects)
node_pool 객체는 Node Pool에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Node Pool 필드 | Sentinel 접근자 |
|---|---|
node_pool.Description |
node_pool.description |
node_pool.SchedulerConfiguration.SchedulerAlgorithm |
node_pool.scheduler_configuration.scheduler_algorithm |
Sentinel Dynamic Host Volume 객체 (Sentinel Dynamic Host Volume Objects)
volume 객체는 Dynamic Host Volume에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| Dynamic Host Volume 필드 | Sentinel 접근자 |
|---|---|
volume.Name |
volume.name |
volume.RequestedCapabilities[0].AccessMode |
volume.requested_capabilities[0].access_mode |
Sentinel CSI Volume 객체 (Sentinel CSI Volume Objects)
volume 객체는 CSI Volume에 매핑되며, 필드는 Sentinel 관례로 변환돼요. 몇 가지 예는 다음과 같아요.
| CSI Volume 필드 | Sentinel 접근자 |
|---|---|
volume.Name |
volume.name |
volume.RequestedCapabilities[0].AccessMode |
volume.requested_capabilities[0].access_mode |
volume.Secrets 값과 volume.MountOptions.MountFlags는 자격 증명 누출을 방지하기 위해 항상 수정된다는 점에 유의하세요.
nomad_var로 Nomad 변수 가져오기 (Import Nomad variables with nomad_var)
nomad_var import는 Sentinel 정책 규칙에서 Nomad 변수를 사용할 수 있게 해줘요. 이 import는 Nomad 바이너리에 내장되어 있으며 Nomad가 자동으로 활성화해요. 정책 작성자는 어떤 네임스페이스에서든 nomad/sentinel 경로 아래의 모든 변수에 접근할 수 있어요.
nomad_var import는 단일 함수 get을 지원하는데, 이 함수는 변수 경로를 받아 변수 항목의 키-값 맵을 반환해요. 예를 들어 본문이 {"token": "xyzzy", "url": "http://validator.example.com"}인 변수가 nomad/sentinel/validator에 기록되어 있다면 다음과 같이 참조할 수 있어요.
import "nomad_var"
validator = nomad_var.get("nomad/sentinel/validator")
auth_token = validator.token
url = validator.url
경로는 @로 구분된 네임스페이스를 받아들여요. 따라서 앞의 예제를 "dev" 네임스페이스로 한정할 수 있어요.
import "nomad_var"
validator = nomad_var.get("nomad/sentinel/validator@dev")
auth_token = validator.token
url = validator.url
다른 Sentinel 값에서 온 경로의 일부를 이어 붙일 수도 있어요. 예를 들어 요청 네임스페이스를 사용해 경로를 그 네임스페이스로 한정할 수 있어요. 이렇게 하려면 사용하는 모든 네임스페이스에 nomad/sentinel/validator 변수를 추가해야 한다는 점에 유의하세요.
import "nomad_var"
validator = nomad_var.get("nomad/sentinel/validator@" + namespace.name)
auth_token = validator.token
url = validator.url
Nomad는 변수를 자동으로 복호화하지만 job 제출자나 워크로드에는 노출하지 않아요. 따라서 nomad_var는 http import와 함께 사용할 자격 증명을 가져올 때 특히 유용해요. 정책 작성자는 nomad_var로 복호화한 자격 증명을 노출하지 않도록 Sentinel의 print 또는 error 함수를 사용할 때 주의해야 해요.
더 알아보기 (Learn more)
- Sentinel 가이드를 확인해 보세요.