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

초대형 연결 워크로드 활성화하기

원문 보기 위키 갱신

초대형 연결 워크로드는 동시 연결 수가 극단적으로 많아서 리눅스 conntrack 추적 한도를 초과할 수 있어요. 이 문서는 Calico 네트워크 정책 규칙으로 그런 워크로드의 트래픽에 대해 conntrack을 우회하는 방법을 다뤄요. doNotTrack 정책의 동작 방식과 함께 예시를 살펴봐요.

출처: 문서

본문

큰 그림

극단적으로 많은 연결을 경험하는 워크로드로 향하는 트래픽에 대해, Calico 네트워크 정책 규칙으로 리눅스 conntrack을 우회해요.

이런 점이 좋아요

노드에서의 연결 수가 리눅스 conntrack이 추적할 수 있는 연결 수를 초과하면, 연결이 거부되거나 드랍될 수 있어요. Calico 네트워크 정책을 사용하면 이런 유형의 워크로드와 주고받는 트래픽에 대해 리눅스 conntrack을 선택적으로 우회할 수 있어요.

개념

리눅스 conntrack

커넥션 트래킹("conntrack")은 리눅스 커널 네트워킹 스택의 핵심 기능이에요. 커널이 모든 논리적 네트워크 연결 또는 플로우를 추적하고, 그 덕분에 각 플로우를 이루는 모든 패킷을 식별해서 함께 일관되게 처리할 수 있어요. conntrack은 메인라인 리눅스 네트워크 처리 파이프라인의 필수 부분으로, 보통은 성능을 높이고 NAT와 상태 기반 접근 제어를 가능하게 해줘요.

초대형 연결 워크로드

동시 연결 수가 극단적으로 많거나, 수명이 아주 짧은 연결이 매우 높은 비율로 발생하는 일부 틈새 워크로드는 리눅스 conntrack이 추적할 수 있는 최대 연결 수를 초과할 수 있어요. 이런 워크로드의 실제 사례로는 초당 5만 개 이상의 연결을 처리하는 초대규모 memcached 서버가 있어요.

Calico doNotTrack 네트워크 정책

Calico 글로벌 네트워크 정책 옵션인 doNotTrack은 커넥션 트래킹 이전에 정책의 규칙을 적용하고, 이 규칙들이 허용한 패킷은 추적하지 않아야 함을 나타내요. 이 정책은 일반 네트워크 정책 규칙보다 앞서, 리눅스 패킷 처리 파이프라인의 이른 시점에, policy order 필드와 무관하게 적용돼요.

일반 네트워크 정책 규칙과 달리, doNotTrack 네트워크 정책 규칙은 stateless라서, conntrack이 보통 자동으로 허용해 줄 되돌아오는 트래픽을 허용하는 규칙을 명시적으로 지정해야 해요. 예를 들어 포트 999의 서버라면, 정책에 포트 999로 들어오는 인바운드 트래픽을 허용하는 인그레스 규칙과, 포트 999에서 나가는 아웃바운드 트래픽을 허용하는 이그레스 규칙이 모두 있어야 해요.

doNotTrack 정책에서:

  • 인그레스 규칙은 트래픽이 어디로 가는지와 무관하게, 호스트 엔드포인트를 통과하는 모든 들어오는 트래픽에 적용돼요
  • 이그레스 규칙은 (로컬 워크로드가 아니라) 호스트 엔드포인트에서 보내지는 트래픽에만 적용돼요

마지막으로, doNotTrack 정책이 동작하려면 applyOnForward: true 표현식을 추가해야 해요.

시작하기 전에...

doNotTrack 네트워크 정책을 만들기 전에, 사용 사례와 장점, 트레이드오프를 이해하려면 이 블로그를 읽어 보세요.

방법

고연결 서버를 위한 연결 트래픽 우회하기

다음 예시에서는 hostNetwork: true인 memcached 서버 파드가 memcached-node-1 노드에 스케줄됐어요. 노드에 대해 HostEndpoint를 만들어요. 그다음, doNotTrack과 applyOnForward를 true로 설정한, 인그레스와 이그레스가 대칭인 GlobalNetworkPolicy를 만들어요.

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: memcached-node-1-eth0
  labels:
    memcached: server
spec:
  interfaceName: eth0
  node: memcached-node-1
  expectedIPs:
    - 10.128.0.162
---
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: memcached-server
spec:
  selector: memcached == 'server'
  applyOnForward: true
  doNotTrack: true
  ingress:
    - action: Allow
      protocol: TCP
      source:
        selector: memcached == 'client'
      destination:
        ports:
          - 12211
  egress:
    - action: Allow
      protocol: TCP
      source:
        ports:
          - 12211
      destination:
        selector: memcached == 'client'

추가 리소스

더 알아보기 (Learn more)

doNotTrack 정책은 stateless라서 되돌아오는 트래픽까지 규칙으로 명시해야 해요. applyOnForward: true가 없으면 동작하지 않는다는 점도 꼭 기억하세요. 도입 전에 conntrack 우회의 트레이드오프를 담은 블로그 글을 읽어 보는 걸 권해요.