본문 바로가기
개발/docker, k8s, CNCF

cert-manager, jaeger operator를 이용한 jaeger 설치

by 앗가 2023. 10. 29.
728x90
반응형

jaeger는 분산 트레이싱을 위한 CNCF 프로젝트입니다. 분산 트레이싱은 MSA의 여러 서비스의 흐름을 추적하고 분석하는 것을 지원합니다. jaeger를 이용하면 요청이 여러 서비스를 거쳐 처리된 시간과 해당 트레이스 데이터가 포함하는 데이터 확인 및 다른 트레이스 데이터와의 비교 분석을 진행할 수 있습니다. 
 
jaeger를 kubernetes위에 설치하는 방법은 여러 가지가 있겠지만 이번 포스팅에서는 권장되는 방법 중 하나인 helm jaeger operator를 이용하여 jaeger를 kubernetes위에 설치해 보겠습니다. helm에서 jaeger operator를 이용하여 설치하기 위해서 cert manager를 이용해야 합니다. 해당 개념을 간단히 알아보고 jaeger 설치를 진행해 봅시다. 이전 포스트인 openTelemetry의 backend를 jaeger로 선택하면 트레이스 데이터를 jaeger를 이용하여 확인할 수 있습니다. 
 
다음과 같이 프로젝트를 진행하겠습니다. 

.
├── cert-manager.yaml
├── create-cluster.sh
├── grafana.yaml
├── jaeger-operator.yaml
└── makefile

 
사용하는 기술은 다음과 같습니다. 
- makefile
- docker, kubernetes, kind
- cert-manager
- jaeger
다음 링크에서 코드를 확인할 수 있습니다. 
https://github.com/atgane/jaeger-operator-install-test

 

GitHub - atgane/jaeger-operator-install-test: jaeger를 kind환경에서 jaeger operator를 이용하여 설치합니다.

jaeger를 kind환경에서 jaeger operator를 이용하여 설치합니다. . Contribute to atgane/jaeger-operator-install-test development by creating an account on GitHub.

github.com


1. makefile 및 kind cluster 설정

먼저 makefile을 다음과 같이 작성합니다. 

create-cluster:
	@./create-cluster.sh

delete-cluster:
	@kind delete cluster -n jaeger-test

그리고 create-cluster.sh을 다음과 같이 작성합니다. kind로 cluster를 여러 node를 같이 묶고 local registry를 등록해서 자체 이미지를 등록할 수 있는(이 기능은 여기서 사용하진 않습니다) 스크립트입니다.

#!/bin/sh

# create-kind-cluster.sh
set -o errexit

# create registry container unless it already exists
reg_name='kind-registry'
reg_port='5001'
if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then
  docker run \
    -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \
    registry:2
fi

# create a cluster with the local registry enabled in containerd
cluster_name='jaeger-test'
cat <<EOF | kind create cluster -n ${cluster_name} --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"]
    endpoint = ["http://${reg_name}:5000"]
nodes:
- role: control-plane
- role: worker
- role: worker
EOF

# connect the registry to the cluster network if not already connected
if [ "$(docker inspect -f='{{json .NetworkSettings.Networks.kind}}' "${reg_name}")" = 'null' ]; then
  docker network connect "kind" "${reg_name}"
fi

# Document the local registry
# https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:${reg_port}"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

다음 명령을 입력합니다. 

make create-cluster

2. cert-manager

cert-manager에서 설정을 해줘야 할 부분은 크게 없습니다. cert-manager에서 사용하는 개념을 간단히 알아보고 배포해봅시다. 
 
cert-manager에서 알아볼 개념은 issuer와 certificate입니다. 
- issuer: 인증서를 생성하는 CA를 kubernetes 리소스로 추상화한 대상입니다. issuer 설정에 대한 자세한 설명은 https://cert-manager.io/docs/configuration/에서 확인할 수 있습니다. 
- certificate: 인증서가 kubernetes 리소스로 추상화된 대상입니다. certificate 설정에 대한 설명은 https://cert-manager.io/docs/usage/certificate/에서 확인할 수 있습니다. 
 
다음과 같이 makefile에 스크립트를 추가합니다. 

deploy-cert-manager:
	@helm install \
		cert-manager jetstack/cert-manager \
		--namespace cert-manager \
		--create-namespace \
		-f cert-manager.yaml

cert-manager.yaml에는 다음과 같이 추가합니다. CRDs 생성만 하도록 합니다. jaeger 설치에는 이 옵션만 켜주면 됩니다. 

installCRDs: true

다음 명령을 입력합니다. 

make deploy-cert-manager

3. jaeger operator를 이용한 jaeger 설치

분산 트레이싱을 위한 jaeger설치 방법에는 여러 가지가 있지만 jaeger operator를 이용하여 설치하는 방법을 권장하고 있습니다. helm으로 jaeger operator를 이용하여 jaeger 설치를 진행합니다. 
 
jaeger-operator.yaml파일을 다음과 같이 작성합니다. spec 부분에는 https://www.jaegertracing.io/docs/1.50/cli/문서에 존재하는 속성을 정의하여 사용할 수 있습니다. cert-manager에서 secret을 생성하기 위해 다음과 같이 certs 옵션을 설정하였습니다. 

certs:
  issuer:
    create: true
    name: "jaeger"
  certificate:
    create: true
    namespace: "default"
    secretName: "jaeger"
    # Specify the cert-manager issuer kind to use an existing cert-manager
    # issuer; typically Issuer or ClusterIssuer
    # This field will be ignored if issuer.create is true
    issuerKind: Issuer

jaeger:
  # Specifies whether Jaeger instance should be created
  create: true
  # namespace where Jaeger resource should be created default to .Release.Namespace
  namespace:
  spec:

makefile에 다음 명령을 추가합니다. 

deploy-jaeger-operator:
	@helm install \
		jaeger-operator jaegertracing/jaeger-operator \
		-f jaeger-operator.yaml

다음 명령을 입력합니다. 

make deploy-jaeger-operator

jaeger-operator가 배포되면서 jaeger가 설치된 것을 확인할 수 있습니다. 또한 secret을 조회해보면 cert-manager로 생성한 secret을 확인할 수 있습니다. 이후 jaeger:16686 서비스를 포트 포워딩하면 다음의 화면이 출력되는 것을 볼 수 있습니다. 

 

728x90

댓글