엔드포인트 생명주기

엔드포인트 생명주기 (Endpoint Lifecycle)

Cilium 엔드포인트가 시작부터 삭제까지 거치는 상태와 생명주기를 설명하는 문서예요. 초기 식별자(Init Identity)와 잠금 모드(Lockdown Mode)도 함께 다뤄요.

출처: Endpoint Lifecycle

본문

이 섹션은 Cilium 엔드포인트의 생명주기를 설명해요. Cilium의 모든 엔드포인트는 다음 상태 중 하나에 있어요.

  • restoring: 엔드포인트가 Cilium 시작 전에 시작됐으며, Cilium이 네트워킹 구성을 복원 중이에요.
  • waiting-for-identity: Cilium이 엔드포인트에 고유한 식별자를 할당 중이에요.
  • waiting-to-regenerate: 엔드포인트가 식별자를 받았고 네트워킹 구성이 (재)생성되기를 기다리고 있어요.
  • regenerating: 엔드포인트의 네트워킹 구성이 (재)생성되는 중이에요. 해당 엔드포인트에 대한 eBPF 프로그래밍이 포함돼요.
  • ready: 엔드포인트의 네트워킹 구성이 성공적으로 (재)생성됐어요.
  • disconnecting: 엔드포인트가 삭제되는 중이에요.
  • disconnected: 엔드포인트가 삭제됐어요.

엔드포인트의 상태는 cilium-dbg endpoint list와 cilium-dbg endpoint get CLI 명령으로 조회할 수 있어요.

엔드포인트가 실행되는 동안 waiting-for-identity, waiting-to-regenerate, regenerating, ready 상태 사이를 전환해요. waiting-for-identity 상태로의 전환은 엔드포인트의 식별자가 변경됐음을 나타내요. waiting-to-regenerate 또는 regenerating 상태로의 전환은 식별자, 정책, 구성 변경 때문에 엔드포인트에 시행할 정책이 변경됐음을 나타내요.

엔드포인트가 현재 상태와 무관하게 삭제될 때 disconnecting 상태로 전환돼요.

초기 식별자 (Init Identity)

어떤 상황에서는 Cilium이 엔드포인트가 생성될 때 그 라벨을 즉시 결정하지 못하므로 그 시점에 식별자를 할당할 수 없어요. 엔드포인트의 라벨을 알기 전까지 Cilium은 특별한 단일 라벨 reserved:init을 엔드포인트에 일시적으로 연결해요. 엔드포인트의 라벨을 알게 되면 Cilium은 그 특별한 라벨을 엔드포인트의 라벨로 교체하고 엔드포인트에 적절한 식별자를 할당해요.

이것은 다음 경우에 엔드포인트 생성 중 발생할 수 있어요.

  • libnetwork를 통해 docker와 함께 Cilium을 실행할 때
  • Kubernetes에서 Kubernetes API 서버를 사용할 수 없을 때
  • etcd 모드에서 해당 kvstore를 사용할 수 없을 때

초기화 중인 엔드포인트로/로부터의 트래픽을 허용하려면 reserved:init 라벨을 선택하는 정책 규칙 및/또는 특별한 init entity로/로부터의 트래픽을 허용하는 규칙을 만들 수 있어요.

예를 들어 모든 초기화 엔드포인트가 호스트로부터의 연결을 받고 DNS 쿼리를 수행하도록 허용하는 규칙은 다음과 같이 작성할 수 있어요.

apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: init
specs:
  - endpointSelector:
      matchLabels:
        "reserved:init": ""
    ingress:
    - fromEntities:
      - host
    egress:
    - toEntities:
      - all
      toPorts:
      - ports:
        - port: "53"
          protocol: UDP

마찬가지로 엔드포인트가 초기화 엔드포인트로부터 DNS 쿼리를 받도록 허용하는 규칙은 다음과 같이 작성할 수 있어요.

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "from-init"
spec:
  endpointSelector:
    matchLabels:
      app: myService
  ingress:
    - fromEntities:
      - init
    - toPorts:
      - ports:
        - port: "53"
          protocol: UDP

어떤 ingress(각각 egress) 정책 규칙이 reserved:init 라벨을 선택하면, 초기화 엔드포인트로(로부터) 향하는 모든 ingress(각각 egress) 트래픽 중 그 규칙에 의해 명시적으로 허용되지 않은 것은 버려져요. 그렇지 않고 정책 시행 모드가 never 또는 default이면 초기화 엔드포인트로(로부터)의 모든 ingress(각각 egress) 트래픽이 허용돼요. 그렇지 않으면 모든 ingress(각각 egress) 트래픽이 버려져요.

잠금 모드 (Lockdown Mode)

Cilium 에이전트 옵션 enable-lockdown-endpoint-on-policy-overflow가 "true"로 설정되면, 정책 맵이 필요한 정책 맵 항목을 모두 수용할 수 없을 때(즉, 엔드포인트의 정책 맵이 오버플로우) Cilium이 엔드포인트를 "lockdown" 상태로 만들 거예요. Cilium은 정책 맵이 더 이상 오버플로우하지 않는다는 것을 감지하면 엔드포인트를 "lockdown"에서 해제해요. 엔드포인트가 잠기면 egress와 ingress 모두 모든 네트워크 트래픽이 버려져요. Cilium은 엔드포인트가 잠겼다는 경고를 기록해요.

이 옵션이 활성화되면 클러스터 운영자는 cilium_policy_* 맵의 bpf map pressure 메트릭을 면밀히 모니터링해야 해요. Policymap pressure and overflow에서 자세한 내용을 확인하세요. 이 메트릭으로 정책 맵의 메모리 압력 증가에 대한 알림과, enable-lockdown-endpoint-on-policy-overflow가 "true"로 설정된 경우 lockdown에 대한 알림(bpf_map_pressure가 1.0 초과)을 만들 수 있어요.

더 알아보기 (Learn more)