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 스코프의 정책에 자동으로 제공돼요.

nomad_var import로 Nomad 변수도 가져올 수 있어요.

submit-host-volume 스코프 (submit-host-volume scope)

다음 최상위 객체들은 명시적인 import 없이도 submit-host-volume 스코프의 정책에 자동으로 제공돼요.

nomad_var import로 Nomad 변수도 가져올 수 있어요.

submit-csi-volume 스코프 (submit-csi-volume scope)

다음 최상위 객체들은 명시적인 import 없이도 submit-csi-volume 스코프의 정책에 자동으로 제공돼요.

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)