본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Calico 자동 레이블

원문 보기 위키 갱신

Calico가 리소스에 자동으로 붙이는 불변(immutable) 레이블 목록을 정리한 레퍼런스예요. 정책 규칙의 셀렉터로 활용하기 좋고, Kubernetes가 자동으로 붙이는 레이블과도 함께 동작해요. 네임스페이스를 이름으로 매칭하는 것처럼 흔한 방식으로 리소스를 매칭할 수 있게 도와줘요.

출처: 문서

본문

편의를 위해 Calico는 정책에서 셀렉터를 평가할 때 특정 리소스에 사용되는 불변 레이블을 제공하고, Kubernetes가 자동으로 적용하는 레이블과 함께 동작해요. 이 레이블들은 흔한 방식(예: 네임스페이스를 이름으로 매칭)으로 리소스를 매칭하기 쉽게 만들어 줘요.

네임스페이스 매칭용 레이블

Kubernetes는 네임스페이스 이름으로 kubernetes.io/metadata.name 레이블을 설정해요. 덕분에 namespaceSelector 필드를 사용할 때 네임스페이스를 이름으로 매칭할 수 있어요.

예를 들어 다음 GlobalNetworkPolicy는 "foo"와 "bar"라는 이름의 네임스페이스 안에서 color: red 레이블을 가진 워크로드에 적용되며, "baz"라는 이름의 세 번째 네임스페이스에 있는 모든 워크로드로부터 포트 8080으로 들어오는 ingress 트래픽을 허용해요:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: foo-and-bar
spec:
  namespaceSelector: kubernetes.io/metadata.name in {"foo", "bar"}
  selector: color == "red"
  types:
  - Ingress
  ingress:
  - action: Allow
    source:
      namespaceSelector: kubernetes.io/metadata.name == "baz"
    destination:
      ports:
      - 8080

NetworkPolicy와 GlobalNetworkPolicy에서 namespaceSelector의 기본값은 서로 다르다는 점에 유의하세요. 예를 들어:

네트워크 정책에서는,

namespaceSelector:  <empty>
selector: foo == "bar"

"foo == 'bar'에 매칭되는, 네트워크 정책과 같은 네임스페이스 안의 리소스"를 의미해요.

글로벌 네트워크 정책에서는,

namespaceSelector:  <empty>
selector: foo == "bar"

"foo == 'bar'에 매칭되는, 모든 네임스페이스의 리소스와 네임스페이스에 속하지 않는 리소스"를 의미해요.

또한,

namespaceSelector: kubernetes.io/metadata.name == "some-namespace"
selector: foo == "bar"

다음과 동일해요:

namespaceSelector: <empty>
selector: (foo == "bar") && (projectcalico.org/namespace == "some-namespace")

서비스 어카운트 매칭용 레이블

projectcalico.org/name 레이블은 ServiceAccount에 적용되며 serviceAccountSelector에서 이름으로 매칭할 수 있게 해줘요. Kubernetes에는 ServiceAccount를 위한 동등한 자동 레이블이 없으므로, 여기서는 projectcalico.org/name을 사용하세요.

네임스페이스를 위한 projectcalico.org/name 레이블

Calico는 네임스페이스 이름으로 projectcalico.org/name도 설정하며, 같은 방식으로 namespaceSelector에서 사용할 수 있어요. 이 레이블은 Kubernetes의 자동 레이블링보다 앞서 생긴 것이고, Calico가 네임스페이스를 읽을 때 파생시키는 값이지 객체에 저장하지는 않아서 kubectl get namespace --show-labels에는 표시되지 않아요. 네임스페이스 매칭에는 kubernetes.io/metadata.name을 우선 사용하세요.

워크로드 엔드포인트 매칭용 레이블

WorkloadEndpoints(Kubernetes에서는 Pod, OpenStack에서는 VM 인스턴스를 나타냄)는 여러 자동 레이블을 받아요:

  • projectcalico.org/orchestrator는 모든 WorkloadEndpoints에 적용되며, Kubernetes 파드를 OpenStack VM 인스턴스 및 HostEndpoints(이 레이블이 없음)와 구별할 수 있게 해줘요:

  • has(projectcalico.org/orchestrator)는 WorkloadEndpoints만 매칭해요

  • projectcalico.org/orchestrator == "k8s"는 Kubernetes 파드만 매칭해요

  • Kubernetes 파드를 나타내는 WorkloadEndpoints의 경우 projectcalico.org/namespace는 파드의 네임스페이스 이름을 담아요. projectcalico.org/namespace는 GlobalNetworkPolicy에 namespaceSelector 필드가 추가되기 전부터 존재했으며, namespaceSelector 필드에서 kubernetes.io/metadata.name을 매칭하는 것과 같은 목적을 수행해요. 다음 GlobalNetworkPolicy는 Namespaces 섹션에서 보여준 예시와 정확히 동일해요:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: foo-and-bar
spec:
  selector: projectcalico.org/namespace in {"foo", "bar"} && color == "red"
  types:
  - Ingress
  ingress:
  - action: Allow
    source:
      selector: projectcalico.org/namespace == "baz"
    destination:
      ports:
      - 8080

정책에서 레이블과 올바른 셀렉터 사용하기

Calico 레이블은 올바른 셀렉터와 함께 사용해야 해요. 그렇지 않으면 정책이 의도대로 동작하지 않고, 웹 콘솔이나 YAML 적용 시에도 오류 메시지가 나타나지 않아요.

레이블 사용 요구사항 이런 리소스에서 사용...
kubernetes.io/metadata.name namespaceSelector와 함께 사용하세요. - Network policy - Staged network policy 해당 네임스페이스 안의 workload endpoint 리소스에만 적용되는 네임스페이스 단위 리소스.
projectcalico.org/name serviceAccountSelector와 함께, 또는 namespaceSelector와 함께 사용하세요 (네임스페이스에는 kubernetes.io/metadata.name 권장). - Network policy - Staged network policy 해당 네임스페이스 안의 workload endpoint 리소스에만 적용되는 네임스페이스 단위 리소스.
projectcalico.org/namespace 셀렉터와만 사용하세요. 레이블을 레이블 이름으로 사용하고, 비교 대상 값으로 네임스페이스 이름을 사용하세요 (예: projectcalico.org/namespace == "default"). - Global network policy - Staged global network policy 모든 네임스페이스의 workload endpoint 리소스와 host endpoint 리소스에 적용되는 클러스터 전역(네임스페이스에 속하지 않는) 리소스.

더 알아보기 (Learn more)

자동 레이블은 정책 셀렉터 작성을 훨씬 단순하게 만들어 줘요. 네임스페이스 매칭에는 kubernetes.io/metadata.name을, ServiceAccount 매칭에는 projectcalico.org/name을 쓴다는 점만 기억하세요. projectcalico.org/namespace는 오직 셀렉터에서만 사용해야 하고, 잘못된 셀렉터 조합은 오류 없이 조용히 실패한다는 점도 주의하세요.