ExternalWorkload
Linkerd의 메시 확장(mesh expansion) 기능을 쓰면 Kubernetes 밖의 워크로드도 메시에 합류시킬 수 있어요.
본문
핵심적으로 이 동작은 ExternalWorkload 리소스로 제어돼요. Linkerd는 이 리소스를 사용해서 Kubernetes 밖에 사는 워크로드를 디스커버리와 정책용으로 기술해요. 이 리소스에는 워크로드의 아이덴티티, 구체적인 IP 주소, 이 워크로드가 연결을 받는 포트 같은 정보가 담겨요.
ExternalWorkloads
ExternalWorkload는 포트 집합과 메시 안에서 도달 가능한 IP 주소를 정의하는 네임스페이스 리소스예요. Linkerd는 이 정보를 EndpointSlice로 변환해서 Service 객체에 붙여요.
Spec
- meshTLS (필수) — 이 워크로드에 암호화된 연결을 맺는 데 Linkerd가 요구하는 아이덴티티 정보를 지정해요.
- workloadIPs (필수, 최대 1개) — 이 워크로드에 도달 가능한 IP 주소예요.
- ports — 워크로드가 노출하는 포트 정의 목록이에요.
MeshTLS
- identity (필수) — 워크로드의 TLS 아이덴티티예요. 프록시는 이 값이 있어야 워크로드와 TLS 연결을 맺을 수 있어요.
- serverName (필수) — 다른 피어가 TLS 연결을 시작하려고 할 때 워크로드의 프록시가 ClientHello SNI TLS 확장에서 기대하는 값이에요.
Port
- name — ports 집합 안에서 고유해야 해요. 각 이름 붙은 포트는 서비스가 참조할 수 있어요.
- port (필수) — 워크로드가 리슨하고 있는 포트 번호예요.
- protocol — 포트가 노출하는 프로토콜이에요.
Status
- conditions — 조건(condition) 객체들의 목록이에요.
Condition
- lastProbeTime — 헬스체크 엔드포인트가 마지막으로 프로브된 시각이에요.
- lastTransitionTime — 조건이 한 상태에서 다른 상태로 전환된 마지막 시각이에요.
- status — 조건의 상태예요 (True, False, Unknown 중 하나).
- type — 조건의 유형이에요 (Ready는 디스커버리 가능 여부를 나타내는 데 쓰여요).
- reason — 조건의 마지막 전환 이유를 나타내는 프로그램 식별자예요.
- message — 전환에 대한 세부 사항을 나타내는 사람이 읽을 수 있는 메시지예요.
예제
다음은 여러 포트를 지정하고 서비스가 선택하는 ExternalWorkload 리소스의 예시예요.
apiVersion: workload.linkerd.io/v1beta1
kind: ExternalWorkload
metadata:
name: external-workload
namespace: mixed-env
labels:
location: vm
workload_name: external-workload
spec:
meshTLS:
identity: "spiffe://root.linkerd.cluster.local/external-workload"
serverName: "external-workload.cluster.local"
workloadIPs:
- ip: 193.1.4.11
ports:
- port: 80
name: http
- port: 9980
name: admin
status:
conditions:
- type: Ready
status: "True"
---
apiVersion: v1
kind: Service
metadata:
name: external-workload
namespace: mixed-env
spec:
type: ClusterIP
selector:
workload_name: external-workload
ports:
- port: 80
protocol: TCP
name: http
- port: 9980
protocol: TCP
name: admin