KubeSkoop란?
kubeskoop는 kubernetes 환경에서 네트워크를 추적하고 진단할 수 있는 도구로 특히 Calico를 포함한 다양한 CNI 플러그인과 쿠버네티스 네트워크를 진단하는데 잘 활용됩니다. 쿠버네티스 클러스터에 Pod의 네트워크 트래픽을 자동으로 구성하고, eBPF로 커널의 중요 경로를 모니터링하고 분석할 수 있습니다.
KubeSkoop의 특징
- 네트워크 진단
- Pod, Service, Node 간 클러스터 내 트래픽과 송수신 트래픽 진단
- CSP의 IaaS 네트워크 조사 지원 (다만 현재 alibaba 클라우드만 가능한 것으로 보입니다)
- 리눅스 네트워크 스택 전체 지원
- eBPF를 활용한 커널 모니터링
- 네트워크 이상 이벤트 감지
- Prometheus 메트릭 API 사용, Grafana Loki로 이벤트 발생
- 웹 콘솔 제공
kubeSkoop에서 지원되는 플러그인
공식문서에 따르면 Flannel과 Calico를 지원하고 있습니다.
Flannel의 경우 host-gw및 vxlan을 지원하고, Calico는 BGP 및 IPIP 모드에서 지원하고 있습니다.
KubeSkoop 도식화
자 이제 실제로 어떻게 역할을 하는지 설치해보면서 알아봅시다.
KubeSkoop 설치
공식문서에 따르면 네트워크 모니터링을 위해서 쿠버네티스 노드가 최소한 4.9.17 버전 이상의 커널 버전을 가지고 있어야 합니다.
KubeSkoop, Prometheus, Grafana, Loki 설치
https://github.com/alibaba/kubeskoop/blob/main/deploy/skoopbundle.yaml 를 통해서 kubeskoop를 설치합니다.
kubectl apply -f https://raw.githubusercontent.com/alibaba/kubeskoop/main/deploy/skoopbundle.yaml
설치되는 리소스
다음과 같이 네임스페이스, prometheus, grafana, controller, webconsole을 기본적으로 생성합니다.
웹 콘솔 접근
KubeSkoop에서는 자체 웹 콘솔을 제공하는데 기본적으로 ClusterIP로 열려있습니다.
저는 확인을 위해서 NodePort type으로 변경해서 사용하겠습니다.
실제로 운영한다면 EKS 상에서는 ELB-TargetgroupBinding을 사용하는 것을 추천드립니다.
# nodePort로 변경
kubectl patch svc webconsole -n kubeskoop -p '{"spec": {"type": "NodePort"}}'
# 서비스 조회
kubectl get svc -n kubeskoop webconsole
그림 다음과 같이 노드 포트 주소로 접속해 보겠습니다. 초기 username은 admin, password는 kubeskoop 입니다.
심화] kubeskoop 커스텀 설치
다음과 같이 helm을 통해서 설치가 가능합니다.
# kubeskoop repo 추가
helm repo add kubeskoop https://kubeskoop.io/
# helm repo 업그레이드
helm repo update
# kubeskoop 설치
helm install -n kubeskoop kubeskoop kubeskoop/kubeskoop
helm은 다음과 같이 values.yaml을 통해서 값을 커스텀 할 수 있습니다.
# values 확인
helm show values kubeskoop/kubeskoop
# values.yaml로 커스텀 적용
helm install -f values.yaml -n kubeskoop kubeskoop kubeskoop/kubeskoop
values.yaml에는 총 3가지의 다루게 됩니다.
- metricProbes에서는 네트워크 및 시스템 관련 메트릭을 수집하는 프로브들을 정의하게 됩니다.
- eventProbes에서는 시스템 이벤트를 모니터링하고 기록하는 프로브를 정의합니다. 주요 시스템 이벤트들을 실시간으로 수집합니다.
- eventsinks에서는 수집된 이벤트 데이터를 어디로 출력할지 정의합니다. 현재는 표준오류 출력(stderr)인데, 외부 서비스로 보낼 수도 있습니다.
지원되는 모든 config 정보는 https://kubeskoop.io/docs/reference/monitoring/probes-metrics-events 여기에서 확인할 수 있습니다.
# values.yaml
config:
metricProbes:
- name: conntrack
- name: qdisc
- name: netdev
- name: io
- name: sock
- name: tcpsummary
- name: tcp
- name: tcpext
- name: udp
- name: kernellatency
- name: packetloss
- name: flow
args:
enablePortInLabel: false
- name: tcpretrans
eventProbes:
- name: biolatency
- name: kernellatency
- name: packetloss
args:
enableStack: false
- name: tcpreset
- name: tcpretrans
eventSinks:
- name: stderr
실제로 이제 kubeskoop 상에서 가능한 기능들을 간단하게 보여드리겠습니다.
모니터링하기
앞서 yaml에서 본것처럼 기본적으로 prometheus와 grafana가 설치되기 때문에 Dashborad의 Monitoring 항목에 가면 그라파나 대시보드가 import되어 표현됩니다. 우리가 설정한 매트릭 프로브에 대해서 수집되고 있는 것을 확인할 수 있습니다.
해당 페이지는 그라파나이기 때문에 메뉴를 눌러보면 Data source를 확인해볼 수 있습니다. 다음과 같이 프로메테우스가 있는 것을 확인할 수 있습니다.
진단 활용해보기
패킷 캡처 기능
웹 콘솔에서 쉽게 패킷 캡처가 가능해졌습니다.
Diagnosis > Packet Capturing에서 가능합니다.
편의상 pod 2개를 배포하고, pod1 -> pod2로 ping을 쏘는 방식으로 진행해보겠습니다.
다음과 같이 pod가 2개가 준비되어 있으며, 각 노드 별로 있습니다.
Add +라는 버튼을 눌러서 패킷을 캡처할 타겟을 선택합니다.
타겟을 지정할때는 Node나 Pod가 가능하며, 네임스페이스나 Label 등 다양하게 지정할 수 있습니다.
뿐만아니라 Filter에는 icmp와 같이 프로토콜이나 다양한 필터를 사용할 수 있으며, Duration은 1초단위로 캡처 시간을 지정할 수 있습니다.
Submit Task 버튼을 누르게 되면 지금과 같이 Result 부분에 Running이라는 말과 함께 캡처를 시작합니다.
실제로 ping을 보내보겠습니다.
지정된 캡처 시간이 지나면 Download 버튼으로 변경됩니다.
다운로드를 하게되면 바로 이렇게 pcap 파일이 압축되어 나오게 됩니다.
실제로 이와 같이 wireshark에서 확인할 수 있게 됩니다. ICMP가 잘 잡힌것을 확인할 수 있네요.
Latency 측정
Diagnosis > Latency Detection 에서 Latency를 측정할 수 있습니다.
Source와 Destination의 Add 버튼을 통해 Source에는 pod1, destination에는 pod2를 지정해서 latency를 측정해보도록하겠습니다.
istio처럼 예쁜 그래프와 함께 트래픽 애니메이션도 확인할 수 있습니다. 저는 0.170ms의 latency를 보이네요.
이처럼 여러 개의 pod를 source 혹은 destination으로 지정할 수 있어서 서로 간의 latency 측정에 매우 유용합니다.
단순히 pod를 직접지정할 필요없이 label이나 node 단위로도 가능하기 때문에 유용할 것이라고 생각됩니다.