본문 바로가기

트러블슈팅[쿠버네티스] 클라우드 상에서 쿠버네티스 Calico IPIP 모드

쿠버네티스의 경우 CNI 플러그인을 사용하여 네트워크 솔루션을 갖는다. 여기엔 다양한 CNI 플러그인이 존재하지만 이번 포스팅에선 calico 네트워킹에 대해 다룬다.

발견

같은 pod에서 동일한 service로 콜을 날리게 되면 간헐적으로 통신이 안되는 현상이 있었다.

이유를 알아보기 위해 서비스의 end point인 pod들을 모두 모니터링 하며 콜을 날려봤다.

같은 노드에 존재하는 pod로 통신이 가는경우에는 통신이 잘 이루어지지만, 다른 노드에 있는 pod로 갈경우 통신이 이루어지지 않음. 

다음 그림과 같이 Pod A, Pod B가 Service A로 묶여있고, Test Pod에서는 Service A로 통신을 진행한다.

요청이 Service A가 지정한 라우팅 테이블을 따라 Pod A로 갈 경우에는 통신이 이루어 지지만, Pod B로 갈 경우에는 통신이 이루어지지 않음.

테스트 상황

calico인터페이스에 대한 tcpdump와, 노드의 인터페이스에 대한 tcpdump 진행해본 결과 패킷이 calico 인터페이스를 지나, 노드의 인터페이스까지 나가는것을 확인할 수 있었다. 

 

즉 나가는 패킷까지는 정상적으로 됐지만, 패킷이 목적지 노드로 들어가지 못하는 상황.

 

원인

calico는 다양한 네트워크 모드를 지원한다.

모드에는 크게 IPIP, VXLan, Direct 세가지가 존재한다.

 

IPIP 모드는 IP캡슐화를 통해 노드간 통신이 이루어 진다. 

VXLan 모드는 UDP 캡슐화을 통해 노드간 통신이 이루어진다.

Direct 모드는 수신지의 라우팅 테이블을 통해 다이렉트로 패킷을 전송합니다.

그리고 특별히 설정을 만지지 않으면 calico는 IPIP모드로 동작하게 된다.

 

클라우드 상에서 쿠버네티스 클러스터를 구축할경우 IPIP모드가 제대로 동작하지 않을 수 있다.

대게 보안 정책의 경우 특정 프로토콜의 패킷만을 통과시키고 나머지 패킷은 전부 드랍시키는 정책이 사용된다. 

TCP, UDP, ICMP와 같은 대중적인 패킷에 대해서는 통과 정책을 세울 수 있지만, 나머지 패킷에 대해서는 세울 수 없는 경우가 많다.

 

특히 calico IPIP모드의 경우 IPIP 캡슐화 프로토콜을 사용하여 통신이 이루어 지게 된다.

IPIP 프로토콜

 

해결

3계층 프로토콜에 대해 정책을 설정할 수 없는 클라우드 서비스의 경우 해당 패킷을 무조건 드랍하게 된다.

IPIP캡슐화가 된 패킷은 모두 드랍.

이런 경우 네트워크 모드를 VXLan 모드로 변경하는 수밖에 없다. (실제 문의해도 해결책이 이럼)

VXLan모드로 변경된 통신

변경 방법은 다음과 같다.

calico 설치시 사용된 calico.yml 파일을 수정한다.

 

1. 13줄에 있는 calico_backend => "vxlan"으로 변경

2. 4414, 4417 줄에 있는 CALICO_IPV4POOL_IPIP, VXLAN  변경

IPIP => Never로

VXLAN => Always로

3. 4471 line -bird-live 삭제

4, 4481 line -bird-ready 삭제

 

이후 변경된 파일로 calico 설치를 진행하면 VXLan 모드로 동작하게 된다.