Identity 관련 라벨 제한하기

Identity 관련 라벨 제한하기 (Limiting Identity-Relevant Labels)

더 큰 환경의 운영자라면 보안 identity를 자주 새로 만드는 것을 피하기 위해 identity 관련 라벨 집합을 제한하는 것을 권장해요. 많은 Kubernetes 라벨은 정책 적용이나 가시성에 유용하지 않은 경우가 많습니다. 이 문서에서는 포함·제외 라벨 패턴을 구성하는 방법을 다룹니다.

출처: Limiting Identity-Relevant Labels

본문

더 큰 환경을 운영하는 경우, 보안 identity가 자주 새로 만들어지는 것을 피하기 위해 identity 관련 라벨 집합을 제한하는 것을 권장해요. 많은 Kubernetes 라벨은 정책 적용이나 가시성에 유용하지 않습니다. 타임스탬프나 해시 같은 라벨이 좋은 예시예요. 이런 라벨들이 평가에 포함되면, Cilium은 서비스나 애플리케이션을 구성하는 모든 파드에 대해 단일 identity를 만드는 대신 각 파드마다 고유한 identity를 생성하게 됩니다.

기본적으로 Cilium은 다음 예외를 제외하고 모든 라벨을 identity에 관련된 것으로 간주해요:

| 라벨 | 설명 | | !io\.kubernetes | 모든 io.kubernetes 라벨 무시 | | !kubernetes\.io | 다른 모든 kubernetes.io 라벨 무시 | | !statefulset\.kubernetes\.io/pod-name | statefulset.kubernetes.io/pod-name 라벨 무시 | | !apps\.kubernetes\.io/pod-index | apps.kubernetes.io/pod-index 라벨 무시 | | !batch\.kubernetes\.io/job-completion-index | batch.kubernetes.io/job-completion-index 라벨 무시 | | !batch\.kubernetes\.io/controller-uid | batch.kubernetes.io/controller-uid 라벨 무시 | | !beta\.kubernetes\.io | 모든 beta.kubernetes.io 라벨 무시 | | !k8s\.io | 모든 k8s.io 라벨 무시 | | !pod-template-generation | 모든 pod-template-generation 라벨 무시 | | !pod-template-hash | 모든 pod-template-hash 라벨 무시 | | !controller-revision-hash | 모든 controller-revision-hash 라벨 무시 | | !annotation.* | 모든 annotation 라벨 무시 | | !controller-uid | 모든 controller-uid 라벨 무시 | | !etcd_node | 모든 etcd_node 라벨 무시 | | !topology\.kubernetes\.io | 모든 topology.kubernetes.io 라벨 무시 |

위 라벨 패턴은 모두 *포괄 제외 패턴(exclusive label patterns)*입니다. 즉, 어떤 라벨 키를 무시할지 정의해요. 이는 ! 문자가 있으면 식별됩니다.

! 문자가 없는 라벨 구성은 *포괄 포함 패턴(inclusive label patterns)*이에요. 포함 패턴이 하나 이상 추가되면, 포함 라벨 구성과 일치하는 라벨만 identity에 관련된 것으로 간주될 수 있습니다. 또한 포함 패턴이 하나 이상 구성되면 다음 포함 패턴이 자동으로 구성에 추가됩니다:

| 라벨 | 설명 | | reserved:.* | 모든 reserved: 라벨 포함 | | io\.kubernetes\.pod\.namespace | 모든 io.kubernetes.pod.namespace 라벨 포함 | | io\.cilium\.k8s\.namespace\.labels | 모든 io.cilium.k8s.namespace.labels 라벨 포함 | | io\.cilium\.k8s\.policy\.cluster | 모든 io.cilium.k8s.policy.cluster 라벨 포함 | | io\.cilium\.k8s\.policy\.serviceaccount | 모든 io.cilium.k8s.policy.serviceaccount 라벨 포함 | | app\.kubernetes\.io | 모든 app.kubernetes.io 라벨 포함 |

Identity 관련 라벨 구성하기

Cilium identity 평가에 사용되는 라벨을 제한하려면 kubectl edit cm -n kube-system cilium-config로 Cilium ConfigMap 오브젝트를 편집하고, 포함하거나 제외할 라벨 패턴을 정의하는 줄을 추가하세요. 또는 helm 옵션 --set labels=<values>로 이 속성을 설정할 수도 있어요.

apiVersion: v1
data:
# ...
  kube-proxy-replacement: "true"
  labels:  "io\\.kubernetes\\.pod\\.namespace k8s-app app name"
  enable-ipv4-masquerade: "true"
  monitor-aggregation: medium
# ...

Note

\\.의 이중 백슬래시는 YAML 문자열에서 슬래시를 이스케이프해 정규식이 \.를 포함하도록 하는 데 필요해요.

라벨 패턴은 라벨 시작 부분에 암시적으로 고정(anchor)되는 정규식이에요. 예를 들어 example\.com은 example.com으로 시작하는 라벨과 일치하고, .*example\.com은 example.com을 어디에든 포함하는 라벨과 일치합니다. 도메인 이름에서 마침표를 이스케이프해서 패턴이 너무 광범위하게 일치해 너무 많은 라벨을 포함하거나 제외하지 않도록 주의하세요.

라벨 패턴은 정규식을 사용해요. 따라서 kind$나 ^kind$를 사용하면 라벨 키 kind만 정확히 일치시킬 수 있으며, 접두사만 일치하는 것이 아닙니다.

ConfigMap에서 커스텀 라벨 패턴 목록을 정의하면 Cilium은 제공된 라벨 패턴 목록을 기본 라벨 패턴 목록에 추가해요. ConfigMap을 저장한 후, Operator가 identity를 관리한다면(Identity Management Mode) 새 라벨 패턴 설정을 적용하기 위해 Cilium Operator와 Agent를 모두 재시작하세요. Agent가 identity를 관리한다면 새 라벨 패턴을 적용하기 위해 Cilium Agent를 재시작하세요.

kubectl rollout restart -n kube-system ds/cilium

Note

labels Helm 값으로 라벨 패턴을 구성해도 기본 라벨 패턴 집합을 덮어쓰지는 않아요. 즉, 이 구성은 위에 나열된 기본값에 라벨 구성 목록을 추가(append)한다고 생각하면 됩니다.

워크로드 보안 identity 결정에 고려될 정확한 라벨 접두사 집합을 선언적으로 구성하려면 대신 label-prefix-file 구성 플래그를 사용하세요.

이 새 구성의 결과로 기존 identity는 변경되지 않아요. 새 라벨 패턴 설정을 기존 identity에 적용하려면 워크로드가 실행되는 노드의 해당 Cilium 파드를 재시작하세요. 재시작하면 새 identity가 생성됩니다. 이전 identity는 더 이상 어떤 Cilium 엔드포인트도 사용하지 않게 되면 Cilium Operator가 가비지 컬렉션합니다.

평가할 라벨 패턴을 여러 개 지정할 때는 라벨 목록을 공백으로 구분된 문자열로 제공하세요.

라벨 포함하기 (Including Labels)

라벨은 포함할 라벨 목록으로 정의할 수 있어요. 지정된 라벨과 기본 포함 라벨만 Cilium identity 평가에 사용됩니다:

labels: "io\\.kubernetes\\.pod\\.namespace k8s-app app name kind$ other$"

위 구성은 Cilium identity 평가에 다음 라벨 키만 포함해요:

  • k8s-app
  • app
  • name
  • kind
  • other
  • reserved:.*
  • io.kubernetes.pod.namespace
  • io.cilium.k8s.namespace.labels
  • io.cilium.k8s.policy.cluster
  • io.cilium.k8s.policy.serviceaccount
  • app.kubernetes.io

참고로 io.kubernetes.pod.namespace는 이미 기본 라벨 io.kubernetes.pod.namespace에 포함되어 있어요.

구성에 정의된 접두사와 같은 접두사를 가진 라벨도 고려됩니다. Cilium identity에도 평가될 라벨 키 예시:

  • k8s-app-team
  • app-production
  • name-defined

라벨 키 kind$와 other$에 $가 있으므로, 정확히 kind와 other를 사용하는 라벨 키만 Cilium에서 평가됩니다.

필터에 단일 포함 라벨이 추가되면 기본 목록에 정의되지 않은 모든 라벨은 제외돼요. 예를 들어 보안 라벨 team=team-1, env=prod로 실행되는 파드는 Cilium이 team 필터로 시작하면 env=prod 라벨이 무시됩니다.

라벨 제외하기 (Excluding Labels)

라벨 패턴은 제외 목록으로도 지정할 수 있어요. 접두사와 패턴을 구분하는 콜론 뒤에 느낌표를 넣어 라벨을 제외하세요. 제외 목록으로 정의하면 Cilium은 기본 라벨 집합을 포함하되, Cilium identity 평가 시 제공된 목록과 일치하는 것은 제외합니다:

labels: "!controller-uid !job-name"

제공된 예제는 Cilium이 다음 라벨 일치를 제외하게 합니다:

  • controller-uid
  • job-name

더 알아보기 (Learn more)