Linkerd 2.10를 활용한 서비스 메시 구성 가이드

서비스가 Linkerd의 이점을 활용하려면, 서비스의 Pod에 Linkerd의 데이터 평면 프록시를 주입하여 서비스를 메시화해야 합니다. 서비스를 메시화하는 과정은 Kubernetes 리소스에 특정 어노테이션을 추가하는 것만큼 간단할 수 있습니다. 하지만 시작 시 즉시 네트워크 호출을 수행하는 서비스는 시작 경쟁 조건을 처리해야 할 수 있으며, MySQL, SMTP, Memcache 등의 프로토콜을 사용하는 서비스는 서버 우선 프로토콜 관련 문제를 해결해야 할 수도 있습니다.

어노테이션을 사용한 서비스 메시화

Kubernetes 리소스를 메시화하는 일반적인 방법은 `linkerd.io/inject: enabled`라는 어노테이션을 사용하여 해당 리소스 또는 네임스페이스에 주석을 추가하는 것입니다. 이 어노테이션은 리소스가 생성되거나 업데이트될 때 자동으로 프록시 주입을 트리거합니다. Linkerd는 `linkerd inject` 명령을 제공하여 지정된 Kubernetes 매니페스트에 이러한 어노테이션을 쉽게 추가할 수 있습니다. 기존 Pod를 자동으로 메시화하려면 어노테이션을 설정한 후 리소스를 재생성하거나 업데이트해야 합니다 (예: `kubectl rollout restart` 사용).

예제

다음 명령어를 통해 Kubernetes 매니페스트에 정의된 서비스에 Linkerd의 데이터 평면 프록시를 추가할 수 있습니다:
cat deployment.yaml | linkerd inject - | kubectl apply -f -
이 예제에서는 `deployment.yaml` 파일을 수정하여 올바른 위치에 주입 어노테이션을 추가하고 클러스터에 적용합니다.

데이터 평면 Pod 주입 확인

서비스가 메시에 성공적으로 추가되었는지 확인하려면 다음 명령어를 사용하여 Pod 내부의 컨테이너 목록을 조회하고 프록시가 리스트에 포함되어 있는지 확인할 수 있습니다:
kubectl -n MYNAMESPACE get po -o jsonpath='{.items[0].spec.containers[*].name}'
예를 들어, `emojivoto` 애플리케이션에 대한 정보를 확인할 수 있습니다:
kubectl -n emojivoto get po -o jsonpath='{.items[0].spec.containers[*].name}'
정상적으로 작동하면 출력에서 `linkerd-proxy`를 볼 수 있습니다:
linkerd-proxy emoji-service

시작 경쟁 조건에 대한 주의 사항

프록시는 매우 빠르게 시작되지만, Kubernetes는 컨테이너의 시작 순서를 보장하지 않으므로 애플리케이션 컨테이너는 프록시가 준비되기 전에 시작될 수 있습니다. 이를 해결하기 위해 애플리케이션 컨테이너의 시작을 프록시가 준비될 때까지 지연시키는 `linkerd-await` 도구를 사용하거나, `skip-outbound-ports`를 설정하여 일부 연결을 프록시 없이 통과시킬 수 있습니다.

서버 우선 프로토콜에 대한 주의 사항

Linkerd의 프로토콜 검출은 초기 바이트를 분석하여 연결의 프로토콜을 결정합니다. 그러나 MySQL, SMTP와 같은 서버 우선 프로토콜은 초기 바이트를 보내지 않으므로, 이 경우 추가 설정이 필요할 수 있습니다.

태그: kubernetes Linkerd ServiceMesh DataPlane ControlPlane

7월 1일 23:07에 게시됨