소개
Server와 ServerAuthorization는 Linkerd 서비스 메시에서
메시 애플리케이션에 대한 인바운드 접근을 제어하는 두 가지 정책 리소스입니다.
Linkerd 설치 시 policyController.defaultAllowPolicy 필드는
Server가 Pod를 선택하지 않을 때의 기본 정책을 지정하는 데 사용됩니다.
이 필드는 다음 중 하나일 수 있습니다:
all-unauthenticated: 모든 요청을 허용합니다. 기본 설정입니다.all-authenticated: 동일 또는 다른 클러스터(멀티 클러스터 사용 시)의 메시 클라이언트 요청을 허용합니다.cluster-authenticated: 동일 클러스터의 메시 클라이언트 요청을 허용합니다.cluster-unauthenticated: 동일 클러스터의 메시 및 비메시 클라이언트 요청을 허용합니다.deny: 모든 요청이 거부됩니다. (그런 다음 서비스 간 특정 통신을 허용하기 위해Policy리소스를 생성해야 합니다).
pod spec 또는 해당 네임스페이스에 주석
config.linkerd.io/default-inbound-policy를 설정하여 이 기본값을 재정의할 수 있습니다.
Pod 및 포트에 대한 Server를 구성한 후 기본 동작은 트래픽을 *거부*하는 것이며,
ServerAuthorization 리소스를 생성하여 Server에서 트래픽을 허용해야 합니다.
Server
Server는 동일한 네임스페이스의 Pod 세트에서 포트를 선택합니다.
일반적으로 Pod의 단일 포트를 선택하지만, 포트를 이름으로 참조할 때 여러 포트를 선택할 수도 있습니다
(예: admin-http). Server 리소스는 Kubernetes의 Service와 유사하지만,
여러 Server 인스턴스가 겹칠 수 없다는 제한이 추가되었습니다: 동일한 pod/port 쌍을
선택할 수 없습니다. Linkerd에는 중복된 server 생성을 방지하려는
admission controller가 함께 제공됩니다.
서버가 포트를 선택하면 기본적으로 트래픽이 거부되며,
ServerAuthorization을 사용하여 Server에서 선택한 포트의 트래픽을 승인해야 합니다.
사양(Spec)
Server 사양에는 다음과 같은 최상위 필드가 포함될 수 있습니다:
| 필드 | 값 |
|---|---|
podSelector |
podSelector는 동일한 네임스페이스의 Pod를 선택합니다. |
port |
포트 이름 또는 번호. pod spec의 ports에 있는 포트만 고려됩니다. |
proxyProtocol |
인바운드 연결에 대한 프로토콜 검색을 구성합니다.
config.linkerd.io/opaque-ports 주석을 대체합니다.
unknown, HTTP/1, HTTP/2, gRPC,
opaque, TLS 중 하나여야 합니다. 설정되지 않은 경우 기본값은 unknown입니다. |
podSelector
이것은 Kubernetes의 labelSelector 필드와 동일합니다. 이 선택기에 속하는 모든 Pod는
Server 그룹에 속하게 됩니다. podSelector 객체는 다음 필드 중 정확히 하나를 포함해야 합니다:
| 필드 | 값 |
|---|---|
matchExpressions |
matchExpressions는 label selector 요구 사항의 목록입니다.
요구 사항은 AND 조합입니다. |
matchLabels |
matchLabels는 {key,value} 쌍의 매핑입니다. |
자세한 내용은 Kubernetes LabelSelector 참조를 확인하세요.
Server 예시
특정 레이블이 있는 Pod를 선택하고 gRPC를 proxyProtocol로 사용하는 Server:
apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
namespace: payment-system
name: payment-grpc
spec:
podSelector:
matchLabels:
app: payment-service
port: grpc
proxyProtocol: gRPC
matchExpressions가 있는 Pod를 선택하고 HTTP/2를 proxyProtocol로 사용하며,
9090 포트에서 실행되는 Server:
apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
namespace: payment-system
name: backend-services
spec:
podSelector:
matchExpressions:
- {key: app, operator: In, values: [order-svc, payment-svc]}
- {key: environment, operator: NotIn, values: [test]}
port: 9090
proxyProtocol: "HTTP/2"
ServerAuthorization
ServerAuthorization는 하나 이상의 Server에 트래픽을 승인하는 방법을 제공합니다.
사양(Spec)
ServerAuthorization 사양에는 다음과 같은 최상위 필드가 포함되어야 합니다:
| 필드 | 값 |
|---|---|
client |
client는 서버에 대한 접근 권한을 가진 클라이언트를 설명합니다. |
server |
server는 이 승인이 적용되는 동일한 네임스페이스에서 Servers를 식별합니다. |
Server
Server 객체는 다음 필드 중 하나를 포함해야 합니다:
| 필드 | 값 |
|---|---|
name |
Server 인스턴스를 이름으로 참조합니다. |
selector |
selector는 동일한 네임스페이스에서 이 승인을 적용할 server를 선택합니다. |
selector
이것은 Kubernetes의 labelSelector 필드와 동일합니다. 이 선택기에 속하는 모든 서버에
이 승인이 적용됩니다. selector 객체는 다음 필드 중 정확히 하나를 포함해야 합니다:
| 필드 | 값 |
|---|---|
matchExpressions |
matchExpressions는 label selector 요구 사항의 목록입니다.
요구 사항은 AND 조합입니다. |
matchLabels |
matchLabels는 {key,value} 쌍의 매핑입니다. |
client
client 객체는 다음 필드 중 하나를 포함해야 합니다:
| 필드 | 값 |
|---|---|
meshTLS |
meshTLS는 메시 클라이언트의 서버 접근을 승인하는 데 사용됩니다. |
unauthenticated |
서버에 대한 인증되지 않은 클라이언트 접근을 승인하는 부울 값입니다. |
또한 networks 필드를 포함할 수도 있습니다:
| 필드 | 값 |
|---|---|
networks |
이 승인이 적용되는 클라이언트 IP 주소를 제한합니다. 설정되지 않은 경우, 서버는 기본값(일반적으로 모든 IP 또는 클러스터의 Pod 네트워크)을 선택합니다. |
meshTLS
meshTLS 객체는 다음 필드 중 정확히 하나를 포함해야 합니다:
| 필드 | 값 |
|---|---|
unauthenticatedTLS |
클라이언트 ID가 필요하지 않은 통신을 나타내는 부울 값입니다. 이것은 아직 인증서가 없는 클라이언트로부터의 TLS 연결을 종료해야 하는 ID 컨트롤러에 중요합니다. |
identities |
승인된 프록시 ID 문자열 목록(MTLS를 통해 제공됨).
* 접두사는 도메인의 모든 ID와 일치하는 데 사용될 수 있습니다.
* ID 문자열은 모든 인증 클라이언트가 승인되었음을 나타냅니다. |
serviceAccounts |
클라이언트 serviceAccount 목록(MTLS를 통해 제공됨). |
serviceAccount
serviceAccount 필드에는 다음과 같은 최상위 필드가 포함됩니다:
| 필드 | 값 |
|---|---|
name |
ServiceAccount의 이름입니다. |
namespace |
ServiceAccount의 네임스페이스입니다. 설정되지 않은 경우, 승인된 네임스페이스가 사용됩니다. |
ServerAuthorization 예시
ServerAuthorization는 *.payment-system.serviceaccount.identity.linkerd.cluster.local
프록시 ID, 즉 payment-system 네임스페이스의 모든 서비스 계정을 사용하는 메시 클라이언트를 허용합니다:
apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: payment-system
name: payment-grpc
spec:
# 모든 인증된 클라이언트가 (읽기 전용) 결제 서비스에 접근하도록 허용합니다.
server:
selector:
matchLabels:
app: payment-service
client:
meshTLS:
identities:
- "*.payment-system.serviceaccount.identity.linkerd.cluster.local"
어떤 인증되지 않은 클라이언트도 허용하는 ServerAuthorization:
apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: payment-system
name: web-public
spec:
server:
name: web-http
# 인증 상관없이 모든 클라이언트가 웹 HTTP 포트에 접근하도록 허용합니다.
# 인증되지 않은 연결이 허용되는 경우, 인증된 클라이언트를 설명할 필요가 없습니다.
client:
unauthenticated: true
networks:
- cidr: 0.0.0.0/0
- cidr: ::/0
특정 서비스 계정을 가진 메시 클라이언트를 허용하는 ServerAuthorization:
apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
namespace: payment-system
name: prometheus-access
spec:
server:
name: metrics
client:
meshTLS:
serviceAccounts:
- namespace: monitoring
name: prometheus