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

Calico 노드 상태

원문 보기 위키 갱신

Calico 노드 상태 (Calico node status)

CalicoNodeStatus 리소스는 노드별 상태 정보를 보고해 주는 리소스로, 문제를 해결할 때 활용할 수 있어요. 검사하려는 노드에 대해 CalicoNodeStatus 리소스를 만들면 Calico가 주기적으로 수집한 정보를 리소스의 status 필드에 기록해 줘요. BGP 에이전트, BGP 세션, BGP 에이전트에 노출된 라우트 상태는 Linux 노드에서만 수집되며, 현재는 Windows 노드를 지원하지 않아요. 이 리소스는 Calico BGP 네트워킹을 사용 중일 때만 유효해요.

출처: 문서

본문

주의 사항 (Notes)

CalicoNodeStatus를 업데이트하면 노드의 CPU와 메모리 사용량에 약간의 성능 영향이 있고, Kubernetes API 서버에도 부하를 더해요.

10노드 풀 메시(full mesh) 클러스터에서 테스트한 결과, 업데이트 주기를 10초로 설정해 각 노드에 CalicoNodeStatus 리소스를 하나씩 만들었을 때 노드마다 CPU 사용량이 vCPU의 5%씩, 메모리는 4MB씩 늘어났어요. 컨트롤 플레인 노드에서는 이 10개 노드 때문에 CPU 사용량이 vCPU의 5% 증가했어요.

경고 (WARNING): CalicoNodeStatus 구현은 소수의 노드(10개 미만 권장)가 같은 시점에 상태를 보고하는 상황을 다루도록 설계됐어요. 많은 노드에 짧은 업데이트 주기로 CalicoNodeStatus를 만들면 Kubernetes API 서버가 느려지고 반응성이 떨어질 수 있어요. 따라서 관심 있는 노드에만, 디버깅 목적으로만 CalicoNodeStatus를 만들어야 해요. 디버깅이 끝나면 CalicoNodeStatus 리소스는 반드시 삭제하세요.

샘플 YAML

이 기능을 사용하려면 노드에 대해 CalicoNodeStatus 객체를 만들면서 수집할 정보와 수집 주기를 지정하면 돼요. 다음 예제는 노드 "my-kadm-node-0"에 대해 업데이트 주기 10초로 정보를 수집하는 예시예요.

kubectl apply -f -<<EOF
apiVersion: projectcalico.org/v3
kind: CalicoNodeStatus
metadata:
  name: my-caliconodestatus-1
spec:
  classes:
    - Agent
    - BGP
    - Routes
  node: my-kadm-node-0
  updatePeriodSeconds: 10
EOF

그다음 kubectl get caliconodestatus my-caliconodestatus-1 -o yaml 명령으로 같은 리소스를 다시 읽으면, 수집된 정보를 status 필드에서 확인할 수 있어요. 예를 들면 다음과 같아요.

apiVersion: projectcalico.org/v3
kind: CalicoNodeStatus
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"crd.projectcalico.org/v1","kind":"CalicoNodeStatus","metadata":{"annotations":{},"name":"my-caliconodestatus-1"},"spec":{"classes":["Agent","BGP","Routes"],"node":"my-kadm-node-0","updatePeriodSeconds":10}}
    projectcalico.org/metadata: '{"uid":"6e3b676b-546a-41db-aeda-ad44f25ff73f","generation":2,"creationTimestamp":"2021-10-18T10:30:43Z","managedFields":[{"manager":"kubectl-client-side-apply","operation":"Update","apiVersion":"projectcalico.org/v3","time":"2021-10-18T10:30:43Z","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}}},"f:spec":{".":{},"f:node":{},"f:updatePeriodSeconds":{}}}},{"manager":"kubectl-edit","operation":"Update","apiVersion":"crd.projectcalico.org/v1","time":"2021-10-18T12:59:25Z","fieldsType":"FieldsV1","fieldsV1":{"f:spec":{"f:classes":{}}}}]}'
  creationTimestamp: '2021-10-18T10:30:43Z'
  generation: 139
  name: my-caliconodestatus-1
  resourceVersion: '203255'
  uid: 6e3b676b-546a-41db-aeda-ad44f25ff73f
spec:
  classes:
    - Agent
    - BGP
    - Routes
  node: my-kadm-node-0
  updatePeriodSeconds: 10
status:
  agent:
    birdV4:
      lastBootTime: '2021-10-18 09:23:19'
      lastReconfigurationTime: '2021-10-18 09:23:19'
      routerID: 10.128.0.240
      state: Ready
      version: v0.3.3+birdv1.6.8
    birdV6:
      lastBootTime: '2021-10-18 09:23:19'
      lastReconfigurationTime: '2021-10-18 09:23:19'
      routerID: 10.128.0.240
      state: Ready
      version: v0.3.3+birdv1.6.8
  bgp:
    numberEstablishedV4: 2
    numberEstablishedV6: 0
    numberNotEstablishedV4: 1
    numberNotEstablishedV6: 0
    peersV4:
      - peerIP: 10.128.0.242
        since: '09:23:22'
        state: Established
        type: NodeMesh
      - peerIP: 10.128.0.200
        since: '09:23:21'
        state: Established
        type: NodeMesh
      - peerIP: 10.128.0.241
        since: '09:23:22'
        state: OpenSent
        type: NodeMesh
  lastUpdated: '2021-10-18T13:22:03Z'
  routes:
    routesV4:
      - destination: 0.0.0.0/0
        gateway: 172.18.0.1
        interface: eth0
        learnedFrom:
          sourceType: Kernel
        type: FIB
      - destination: 192.168.82.0/26
        gateway: 10.128.0.200
        interface: eth0
        learnedFrom:
          peerIP: 10.128.0.200
          sourceType: NodeMesh
        type: FIB
      - destination: 192.168.36.0/26
        gateway: 10.128.0.242
        interface: eth0
        learnedFrom:
          peerIP: 10.128.0.242
          sourceType: NodeMesh
        type: FIB
      - destination: 10.128.0.5/16
        gateway: N/A
        interface: eth0
        learnedFrom:
          sourceType: Direct
        type: FIB

Calico 노드 상태 정의

메타데이터 (Metadata)

필드 설명 허용 값 스키마
name 이 CalicoNodeStatus 리소스의 이름이에요. 반드시 지정해야 해요. ., _, -를 선택적으로 포함하는 영숫자 문자열 string

스펙 (Spec)

필드 설명 허용 값 스키마
classes 이 노드에서 모니터링할 정보 유형을 선언하는 클래스 목록으로, 특정 정보 하위 집합에 대해 선택적으로 상태를 보고할 수 있게 해줘요. 반드시 지정해야 해요. Classes 목록 list of string
node 노드 상태를 수집할 Calico 노드 인스턴스를 식별하는 노드 이름이에요. 반드시 지정해야 해요. 유효한 Kubernetes 노드 이름 string
updatePeriodSeconds CalicoNodeStatus를 업데이트하는 주기(초)예요. 0으로 설정하면 CalicoNodeStatus 새로 고침이 꺼져요. 최대 업데이트 주기는 하루예요. 반드시 지정해야 해요. 0 - 86400 int

상태 (Status)

필드 설명 값
lastUpdated CalicoNodeStatus 객체가 마지막으로 업데이트된 서버 시각을 나타내는 타임스탬프예요. RFC3339 형식의 UTC로 표현돼요.
agent 노드의 BGP 데몬 상태 목록이에요. 'birdV4'는 IPv4 bird 데몬 상태를, 'birdV6'는 IPv6 bird 데몬 상태를 담고 있어요
bgp 노드의 BGP 상태 목록이에요. 'peersV4'는 IPv4 BGP 피어 상태를, 'peersV6'는 IPv6 BGP 피어 상태를 담고 있어요
routes 노드의 BGP 데몬이 학습한 라우트 상태 목록이에요. 'routesV4'는 IPv4 라우트 상태를, 'routesV6'는 IPv6 라우트 상태를 담고 있어요

클래스 (Classes)

허용 값 설명
Agent BGP 데몬 에이전트 상태
BGP BGP 세션 상태
Routes BGP 데몬에 노출된 라우트 상태

BGPDaemonStatus

필드 설명 스키마 가능한 값
state BGP 데몬의 상태예요. string Ready, NotReady
version BGP 데몬의 버전이에요. string
routerID BGP 데몬이 사용하는 라우터 ID예요. string
lastBootTime BGP 데몬의 마지막 부팅 시각이에요. string
lastReconfigurationTime BGP 데몬의 마지막 재구성 시각이에요. string

BGPStatus

필드 설명 스키마
numberEstablishedV4 IPv4 established BGP 세션의 총 개수예요. int
numberNotEstablishedV4 IPv4 non-established BGP 세션의 총 개수예요. int
numberEstablishedV6 IPv6 established BGP 세션의 총 개수예요. int
numberNotEstablishedV6 IPv6 non-established BGP 세션의 총 개수예요. int
peersV4 노드의 IPv4 BGP 피어 상태예요. BGP 피어 목록
peersV6 노드의 IPv6 BGP 피어 상태예요. BGP 피어 목록

RouteStatus

필드 설명 스키마
routesV4 노드의 BGP 데몬이 학습한 IPv4 라우트예요. 라우트 목록
routesV6 노드의 BGP 데몬이 학습한 IPv6 라우트예요. 라우트 목록

BGPPeer

필드 설명 스키마 가능한 값
peerIP 상태를 보고하는 피어의 IP 주소예요. ip
type 이 피어가 노드 간 메시로 구성됐는지, 아니면 명시적인 전역 또는 노드별 BGPPeer 객체로 구성됐는지 나타내요. string NodeMesh, NodePeer, GlobalPeer
state BGP 세션 상태예요. 빈 문자열은 BGP 세션 상태를 알 수 없음을 의미해요. string Idle, Connect, Active, OpenSent, OpenConfirm, Established, Close
since 마지막 BGP 세션 상태 변경의 타임스탬프예요. time

Route

필드 설명 스키마 가능한 값
type 이 라우트가 포워딩에 사용 중인지 나타내요. string FIB, RIB
destination 라우트의 목적지 IP예요. ip
gateway 라우트의 게이트웨이 IP예요. 직접 연결(direct) 라우트처럼 게이트웨이가 없는 라우트라면 값은 N/A예요. ip 또는 N/A
interface 목적지의 네트워크 인터페이스예요. 블랙홀 라우트라면 값은 blackhole, 도달 불가(unreachable) 라우트라면 unreachable이에요. string
learnedFrom 이 라우트가 어디서 왔는지에 대한 정보예요. learned from

LearnedFrom

필드 설명 스키마 가능한 값
sourceType 라우트를 학습한 소스의 유형이에요. string Kernel, Static, Direct, NodeMesh, BGPPeer
peerIP sourceType이 NodeMesh 또는 BGPPeer라면, 이 라우트를 보내준 라우터의 IP 주소예요. ip

더 알아보기 (Learn more)

CalicoNodeStatus는 BGP 문제를 디버깅할 때 노드 상태를 한눈에 보게 해주는 진단용 리소스예요. 소수의 노드에만, 짧지 않은 업데이트 주기로 사용하고 디버깅이 끝나면 삭제하는 것이 좋아요. Windows 노드에서는 지원되지 않는다는 점도 기억해 두세요.