설치하기
사전 준비 사항
설치 전 아래 두 가지를 준비합니다.
- Agent 이미지 업로드 —
exem-k8s-agent,exem-container-agent이미지를 고객사 환경의 Container Registry에 미리 업로드합니다. - Namespace 생성 — 설치할 Namespace를 직접 생성합니다.
설치 스크립트가 Namespace를 자동으로 생성하지 않는 이유는, 삭제 시 Namespace에 속한 모든 리소스가 함께 삭제될 위험이 있기 때문입니다. 직접 생성한 Namespace에서 동작하도록 의도적으로 설계되어 있습니다.
화면으로 설치하기
엑셈원 웹 UI에서 YAML을 생성·다운로드한 뒤 클러스터에 배포합니다.
- 좌측 하단 계정 메뉴에서 [설정]으로 이동합니다.

- [플랫폼 > 쿠버네티스]를 클릭합니다.
- [Install Agent]를 클릭해 YAML 파일 내보내기 화면을 엽니다.

- Agent 구성과 설정 항목을 확인합니다. 각 항목의 설명은 Description을 참고합니다.

- 내용을 확인하고 필요한 경우 YAML 파일을 수정합니다.

- [다운로드] 버튼을 클릭해 YAML 파일을 저장합니다.

화면에 표시된 명령어로 클러스터에 배포합니다.
kubectl apply -f <다운로드한-yaml-파일>
Helm으로 설치하기
Helm Chart를 사용해 Agent를 설치할 수 있습니다. 설치 방법은 제품기술팀에 문의하세요.
배포 버전 확인하기
클러스터에 배포된 Agent 이미지 버전을 아래 명령어로 확인합니다.
# exem-k8s-agent 버전 확인
kubectl get deployments -n exem-one exem-k8s-agent -o jsonpath="{..image}"
# exem-container-agent 버전 확인
kubectl get daemonsets -n exem-one exem-container-agent -o jsonpath="{..image}"
문제 해결
Container Registry ImagePull 실패 시
고객사 Container Registry 접근 권한이 없어 이미지를 가져오지 못하는 경우입니다.
담당자에게 접근 권한을 요청하거나, 접근 가능한 Secret만 제공받은 경우 아래 절차를 따릅니다.
Secret 이름을 확인합니다.
kubectl get secret -n <NAMESPACE>다운로드한 YAML 파일의 Deployment와 DaemonSet 각각
spec.template.spec에 아래 내용을 추가합니다.imagePullSecrets:
- name: <SECRET_NAME>적용 예시:
# Deployment (exem-k8s-agent)
apiVersion: apps/v1
kind: Deployment
metadata:
name: exem-k8s-agent
namespace: {{xm_conf.namespace}}
spec:
template:
spec:
imagePullSecrets:
- name: <SECRET_NAME>
# DaemonSet (exem-container-agent)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: exem-container-agent
namespace: {{xm_conf.namespace}}
spec:
template:
spec:
imagePullSecrets:
- name: <SECRET_NAME>수정한 YAML로 Agent를 배포합니다.
Docker Container Registry 권한을 K8s에 적용해야 하는 경우
https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/ 위의 kubernetes 정식 문서 참고하여 secret을 직접 생성
이미 Docker가 Registry에 로그인되어 있는 경우:
kubectl create secret -n <NAMESPACE> generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
Container Registry 접속 계정을 받은 경우:
kubectl create secret docker-registry regcred \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-pword> \
--docker-email=<your-email> \
-n <NAMESPACE>
Secret 생성 후 위의 Container Registry ImagePull 실패 시 절차를 따릅니다.
Docker Registry에 직접 이미지를 push 해야 하는 경우
배포된 이미지 tar 파일을 Docker 명령어를 사용할 수 있는 서버에 업로드합니다.
로컬 Docker Registry에 이미지를 로드합니다.
docker load -i <IMAGE_NAME>.tar로드된 이미지 이름, 태그, Image ID를 확인합니다.
docker images확인한 Image ID를 기반으로 Docker Registry push 경로를 설정합니다.
docker tag <IMAGE_ID> <Docker-registry URL>/<IMAGE_NAME>:<IMAGE_TAG>태그가 정상적으로 지정됐는지 확인합니다.
docker images이미지를 push합니다.
docker push <Docker-registry URL>/<IMAGE_NAME>:<IMAGE_TAG>push 완료 후 Kubernetes에 Agent를 배포합니다.
OpenShift에서 exem-container-agent 배포 안 되는 경우
SecurityContextConstraints(SCC) 권한이 serviceaccount에 바인딩되어 있는지 확인합니다. SCC 관련 작업은 보통 고객사 담당자에게 요청해야 합니다.
직접 SCC를 적용해야 하는 경우:
아래 내용으로
scc.yaml을 생성합니다.apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
name: exem-one-hostpath-scc
allowHostDirVolumePlugin: true
runAsUser:
type: RunAsAny
seLinuxContext:
type: RunAsAny
fsGroup:
type: RunAsAny
volumes:
- hostPath
- configMap
- projected
- secret
users:
- system:serviceaccount:exemone:exemoneSCC 권한 설명
설정 값 용도 allowHostDirVolumePlugintrue container-agent가 각 노드의 cgroup, 프로세스 정보, 런타임 소켓을 읽어 컨테이너 CPU/Memory/Network 메트릭을 수집합니다. 이 권한이 없으면 컨테이너 메트릭 수집이 불가능합니다 runAsUserRunAsAny cgroup 파일과 런타임 소켓(crio.sock 등)이 root 소유이므로 container-agent가 root(uid 0)로 실행되어야 컨테이너 목록 조회 및 메트릭 수집이 가능합니다. 비root 실행 시 permission denied가 발생합니다 seLinuxContextRunAsAny OpenShift 노드는 SELinux가 기본 활성화되어 있어 일반 컨테이너는 호스트 파일 접근이 차단됩니다. spc_t 타입을 설정해야 마운트된 호스트 파일시스템과 런타임 소켓을 읽을 수 있습니다 fsGroupRunAsAny 호스트에서 마운트한 cgroup, proc 등의 파일 그룹 소유권이 다양하므로, 특정 그룹으로 강제하면 파일 읽기에 실패할 수 있습니다 volumes 권한 설명
volume 타입 필수 용도 hostPathO 호스트 파일시스템(/)을 마운트하여 cgroup, 프로세스 정보를 읽고 런타임 소켓(crio.sock, containerd.sock, docker.sock)으로 컨테이너 목록과 상태를 조회합니다 configMapO ConfigMap을 envFrom으로 참조하여 receiver 주소, 클러스터 이름 등 에이전트 설정을 환경변수로 주입합니다 projectedO ServiceAccount 토큰을 Pod에 자동 마운트하여 K8s API Server 인증에 사용합니다. Informer로 Pod/Node 등 리소스를 조회할 때 필요합니다 secret선택 고객사 Container Registry에서 이미지를 가져올 때 imagePullSecrets 사용 시 필요합니다. 공개 레지스트리 또는 별도 인증 방식을 사용하는 경우에는 불필요합니다 SCC를 적용합니다.
oc apply -f scc.yamlSCC 생성을 확인합니다.
kubectl get scc -n <NAMESPACE>serviceaccount에 SCC를 바인딩합니다.
oc adm policy add-scc-to-user exem-one-hostpath-scc -z <SERVICEACCOUNT> -n <NAMESPACE>SCC 권한 적용 후
exem-container-agentDaemonSet YAML의spec.template.spec.containers에 아래securityContext를 추가합니다.securityContext:
runAsUser: 0
seLinuxOptions:
type: spc_t
capabilities:
drop: ["ALL"]exem-container-agent를 재배포합니다.
kubectl delete -f exem-k8s-agent.yaml
kubectl apply -f exem-k8s-agent.yaml