Istio에 설치
원본: https://grafana.com/docs/loki/latest/setup/install/istio/ (opens in a new tab)
Istio 서비스 메시에 Loki를 설치할 때는 몇 가지 추가 단계를 완료해야 합니다. 이러한 단계 없이는 인제스터, 쿼리어 등이 시작될 수 있지만 다음과 같은 로그가 표시됩니다.
loki level=debug ts=2021-11-24T11:33:37.352544925Z caller=broadcast.go:48 msg="Invalidating forwarded broadcast" key=collectors/distributor version=123 oldVersion=122 content=[loki-distributor-59c4896444-t9t6g[] oldContent=[loki-distributor-59c4896444-t9t6g[]
이는 파드가 링에 참여하지 못하고 있음을 의미합니다.
loki
를 Grafana
데이터 소스에 추가하려고 하면 다음과 같은 로그가 표시됩니다(empty ring
).
"loki level=warn ts=2021-11-24T08:02:42.08262122Z caller=logging.go:72 traceID=3fc821042d8ada1a orgID=fake msg=\"GET /loki/api/v1/labels?end=1637740962079859431&start=1637740361925000000 (500) 97.4µs Response: \\\"empty ring\\\\n\\\" ws: false; X-Scope-Orgid: fake; uber-trace-id: 3fc821042d8ada1a:1feed8872deea75c:1180f95a8235bb6c:0; \""
Loki가 실행 중인 네임스페이스에서 istio-injection을 활성화하면 Loki 서비스에 대한 구성도 수정해야 합니다. Istio는 파드가 IP 주소를 사용하여 다른 파드를 확인하는 것을 허용하지 않으므로 memberlist
서비스도 수정해야 합니다.
필요한 변경 사항
쿼리 프론트엔드 서비스
Loki 쿼리 프론트엔드 서비스용 파일을 다음과 같이 수정합니다.
grpc
포트의 이름을grpclb
로 변경합니다. 이는 SRV 레코드에 의존하는 grpc 로드 밸런싱 전략에서 사용됩니다. 그렇지 않으면querier
가query-frontend
에 도달할 수 없습니다. https://github.com/grafana/loki/blob/0116aa61c86fa983ddcbbd5e30a2141d2e89081a/production/ksonnet/loki/common.libsonnet#L19 (opens in a new tab) 및 https://grpc.github.io/grpc/core/md_doc_load-balancing.html (opens in a new tab)을 참조하세요.grpclb
의appProtocol
을tcp
로 설정합니다.publishNotReadyAddresses
를"true"
로 설정합니다.
apiVersion: v1
kind: Service
metadata:
labels:
app: loki-query-frontend
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-query-frontend
spec:
ports:
- appProtocol: http
name: http
port: 3100
protocol: TCP
targetPort: http
- appProtocol: tcp
name: grpclb
port: 9095
protocol: TCP
targetPort: grpc
publishNotReadyAddresses: true
selector:
app: loki-query-frontend
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-query-frontend
type: ClusterIP
쿼리어 서비스
Loki 쿼리어 서비스용 파일을 다음과 같이 수정합니다.
grpc
서비스의appProtocol
을tcp
로 설정합니다.
apiVersion: v1
kind: Service
metadata:
labels:
app: loki-querier
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-querier
name: loki-querier
namespace: observability
spec:
ports:
- appProtocol: http
name: http
port: 3100
protocol: TCP
targetPort: http
- appProtocol: tcp
name: grpc
port: 9095
protocol: TCP
targetPort: grpc
selector:
app: loki-querier
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-querier
type: ClusterIP
인제스터 서비스 및 인제스터 헤드리스 서비스
Loki 쿼리 인제스터 및 인제스터 헤드리스 서비스용 파일을 다음과 같이 수정합니다.
grpc
포트의appProtocol
을tcp
로 설정합니다.
apiVersion: v1
kind: Service
metadata:
labels:
app: loki-ingester-(headless)
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-ingester
name: loki-ingester-headless
spec:
clusterIP: None #(if headless)
ports:
- name: http
port: 3100
protocol: TCP
targetPort: http
- appProtocol: tcp
name: grpc
port: 9095
protocol: TCP
targetPort: grpc
selector:
app: loki-ingester
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-ingester
type: ClusterIP
디스트리뷰터 서비스
Loki 디스트리뷰터 서비스용 파일을 다음과 같이 수정합니다.
grpc
포트의appProtocol
을tcp
로 설정합니다.
apiVersion: v1
kind: Service
metadata:
labels:
app: loki-distributor
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-distributor
spec:
ports:
- name: http
port: 3100
protocol: TCP
targetPort: http
- name: grpc
port: 9095
protocol: TCP
targetPort: grpc
appProtocol: tcp
selector:
app: loki-distributor
app.kubernetes.io/instance: observability
app.kubernetes.io/name: loki-distributor
sessionAffinity: None
type: ClusterIP
멤버리스트 서비스
멤버리스트 서비스용 파일을 다음과 같이 수정합니다.
http
포트의appProtocol
을tcp
로 설정합니다.
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: observability
name: loki-memberlist
namespace: observability
spec:
clusterIP: None
ports:
- name: http
port: 7946
protocol: TCP
targetPort: 7946
appProtocol: tcp
selector:
app.kubernetes.io/instance: observability
app.kubernetes.io/part-of: memberlist