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

CNI 플러그인

원문 보기 위키 갱신

CNI 플러그인 (CNI Plugin)

Linkerd 데이터 플레인은 메시에 포함된 모든 파드와 그 파드 사이의 모든 TCP 트래픽을 투명하게 프록시로 라우팅하는 방식으로 동작해요. (Architecture 문서를 참고하세요.) 이를 통해 Linkerd는 애플리케이션이 인식하지 못하는 사이에서 동작할 수 있어요.

기본적으로 이 리와이어링(rewiring) 작업은 파드 시작 시점에 iptables로 라우팅 규칙을 설치하는 Init Container를 사용해서 수행돼요. 하지만 이 방식에는 CAP_NET_ADMIN 권한이 필요하며, 일부 클러스터에서는 파드에 이 권한이 부여되지 않아요.

이를 해결하기 위해 Linkerd는 이 iptables 규칙을 Init Container 대신 CNI 플러그인에서 선택적으로 실행할 수 있어요. 이렇게 하면 CAP_NET_ADMIN 권한이 필요 없어져요.

참고

Linkerd의 CNI 플러그인은 CNI 체이닝(chaining) 을 사용해 기존 CNI 플러그인과 함께 실행되도록 설계됐어요. Linkerd 전용 구성만 처리하며 기존 CNI 플러그인의 필요성을 대체하지는 않아요.

참고

Cilium 위에 Linkerd CNI 플러그인을 설치한다면, Cilium이 CNI 구성 디렉터리를 독점하지 않고 다른 플러그인이 구성을 배포할 수 있도록 cni.exclusive=false 옵션으로 Cilium을 설치하세요.

출처: Linkerd CNI Plugin

본문

설치 (Installation)

Linkerd CNI 플러그인을 사용하려면 Linkerd 컨트롤 플레인을 설치하기 전에 linkerd-cni DaemonSet을 클러스터에 먼저 성공적으로 설치해야 해요.

CLI 사용하기

linkerd-cni DaemonSet을 설치하려면 다음을 실행하세요:

`linkerd install-cni | kubectl apply -f -
`

DaemonSet이 준비되면 메시에 포함된 파드는 더 이상 linkerd-init Init Container를 사용하지 않아야 해요. 이를 위해 컨트롤 플레인을 설치할 때 --linkerd-cni-enabled 플래그를 사용하세요:

`linkerd install --linkerd-cni-enabled | kubectl apply -f -
`

이 옵션을 사용하면 linkerd-config ConfigMap에 cniEnabled 플래그가 설정돼요. 프록시 주입은 이 필드를 읽고 linkerd-init Init Container를 생략해요.

Helm 사용하기

먼저 Helm 로컬 캐시가 업데이트됐는지 확인하세요:

`helm repo update
helm search repo linkerd2-cni
`

CNI DaemonSet을 설치하세요:

`# install the CNI plugin first
helm install linkerd-cni -n linkerd-cni --create-namespace linkerd/linkerd2-cni

# ensure the plugin is installed and ready
linkerd check --pre --linkerd-cni-enabled
`

이제 CNI를 활성화한 상태로 Linkerd를 설치할 준비가 됐어요. Installing Linkerd with Helm 지침을 따르세요.

추가 구성 (Additional configuration)

linkerd install-cni 명령에는 설치를 커스터마이즈할 수 있는 추가 플래그가 있어요. 자세한 내용은 linkerd install-cni --help를 참고하세요. 많은 플래그가 linkerd inject를 실행할 때 프록시를 구성하는 데 쓰이는 플래그와 비슷하다는 점을 참고하세요. linkerd install-cni를 실행할 때 기본값을 변경했다면, linkerd inject를 실행할 때도 그에 맞는 변경을 해 주는 것이 좋아요.

가장 중요한 플래그는 다음과 같아요:

  • --dest-cni-net-dir: 노드에서 CNI 구성이 위치한 디렉터리예요. 기본값은 /etc/cni/net.d 예요.
  • --dest-cni-bin-dir: 노드에서 CNI 플러그인 바이너리가 위치한 디렉터리예요. 기본값은 /opt/cni/bin 예요.
  • --cni-log-level: 이 값을 debug로 설정하면 더 상세한 로그를 볼 수 있어요. CNI 플러그인 로그를 보려면 kubelet 로그를 볼 수 있어야 해요. 한 가지 방법은 노드에 로그인해서 journalctl -t kubelet을 사용하는 거예요. linkerd-cni: 문자열로 검색하면 플러그인 로그 출력을 찾을 수 있어요.

initContainer 네트워킹 허용하기

Linkerd CNI 플러그인을 사용하면 필수 iptables 규칙이 파드가 스케줄링되기 전에 적용돼요. Linkerd 2.20부터 프록시는 기본적으로 네이티브 사이드카 컨테이너로 실행되어 애플리케이션의 initContainers보다 먼저 시작되므로, 그 컨테이너들은 네트워크에 접근할 수 있고 추가 구성이 필요 없어요.

하지만 네이티브 사이드카를 비활성화했다면 linkerd-proxy는 모든 initContainers가 끝난 뒤에야 시작돼요. 즉 어떤 initContainer도 네트워크에 접근할 수 없는데, 그 이유는 해당 패킷이 iptables에 걸리기 때문이고 linkerd-proxy는 아직 준비되지 않았기 때문이에요.

이 iptables 규칙을 우회하려면 initContainer를 프록시의 UID(기본값 2102)로 실행하면 돼요. 이 UID로 실행되는 프로세스는 iptables에서 건너뛰며 직접 네트워크 연결이 가능해져요. 이 네트워크 연결은 메시에 포함되지 않아요.

다음은 CNI 플러그인을 사용하면서 메시에 포함되지 않은 네트워킹을 허용하도록 구성된 initContainer 스니펫이에요:

`initContainers:
  - name: example
    image: example
    securityContext:
      runAsUser: 2102 # Allows skipping iptables rules
`

CNI 플러그인 업그레이드하기

CNI 플러그인은 기본적으로 무상태(stateless)이기 때문에 별도의 upgrade 명령이 필요 없어요. CLI로 CNI 플러그인을 업그레이드한다면 그냥 다음을 실행하면 돼요:

`linkerd install-cni | kubectl apply --prune -l linkerd.io/cni-resource=true -f -
`

더 알아보기 (Learn more)