설치및구동
- 사전 준비 사항
- agent 설치 image 파일들을 고객사 환경의 repository에 업로드 필요
- (exem-k8s-agent, exem-container-agent, exem-gpu-sidecar*)
- * exem-gpu-sidecar 는 GPU 모니터링 사용 시에만 필요 — exem-container-agent 와 별개의 독립 버전(tag)으로 관리됨
- 설치할 namespace 생성
- 설치 시 namespace를 자동으로 생성하지 않은 이유는 삭제 시 namespace와 관련된 모든 리소스 삭제가 될 위험성이 있기에 직접 생성한 namespace로 동작 되게 끔 하려는 의도
- agent 설치 image 파일들을 고객사 환경의 repository에 업로드 필요
정보
📌 GPU 모니터링 사용 시 배포 yaml 은 4. yaml 상세 > 4.1 GPU 모니터링 사용 시 (전체 yaml), 사이드카 상세는 exem-container-agent > GUIDE > 4. 사이드카 참조.
2.1 화면을 통한 설치
- exemONE의 Setting ➝ Platform/Kubernetes의 Install Agent를 통해 생성된 yaml을 download
- k8s cluster에 yaml 배포
1. 왼쪽 아래 계정에서 설정

2. 플랫폼 > 쿠버네티스 클릭

3. YAML 파일 내보내기

4. Agent 구성도

5. 설정

- Description 참고
6. 내용 확인

7. YAML 파일 수정

8. YAML 파일 다운로드

9. Cluster에 배포

- 예시 화면의 명령어로 클러스터에 배포
2.2 Helm을 사용한 설치
- Helm 문서 참고
2.3 배포 후 버전 확인
아래 명령어를 통해 Cluster에 배포된 exem-container-agent와 exem-k8s-agent Image의 버전을 확인할 수 있습니다.
kubectl get deployments -n exem-one exem-k8s-agent -o jsonpath="{..image}"
kubectl get daemonsets -n exem-one exem-container-agent -o jsonpath="{..image}"
GPU 모니터링 사용 시 DaemonSet 의 {..image} 출력에 exem-gpu-sidecar 이미지가 함께 표시됩니다.
2.4 배포 시 예외 상황 대응
2.4.1 고객사의 Container Registry로부터 ImagePull에 실패하는 상황
- 담당자에게 고객사 Container Registry 접근 권한이 없어서 해당 권한을 요청함
- 접근 할 수 있는 secret만 생성해주는 경우 아래 명령어로 SECRET_NAME 확인 (kubectl get secret -n \<NAMESPACE> 명령어로 secret 확인 가능)
kubectl get secrets -n exemone
- kubernetes의 secret 을 받은 경우 exemone 설치 yaml 파일에 아래 내용 추가 설정
- (\<SECRET_NAME>은 위의 kubectl로 확인 가능한 실제 secret 이름)
- deployment.spec.template.spec에 아래 내용 추가
imagePullSecrets:
- name: <SECRET_NAME>
- daemonset.spec.template.spec에 아래 내용 추가
imagePullSecrets:
- name: <SECRET_NAME>
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: exem-k8s-agent
name: exem-k8s-agent
namespace: {{xm_conf.namespace}}
spec:
replicas: 1
selector:
matchLabels:
name: exem-k8s-agent
template:
metadata:
labels:
name: exem-k8s-agent
spec:
imagePullSecrets:
- name: <SECRET_NAME>
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: exem-container-agent
name: exem-container-agent
namespace: {{xm_conf.namespace}}
spec:
selector:
matchLabels:
app: exem-container-agent
template:
metadata:
labels:
app: exem-container-agent
spec:
imagePullSecrets:
- name: <SECRET_NAME>
- 이후 kubernetes에 agent 배포합니다.
2.4.2 Docker (Container Registry) 권한을 K8S에 적용해야하는 경우
https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/ 위의 kubernetes 정식 문서 참고하여 secret을 직접 생성
- 이미 docker가 registry에 login 되어있는 경우
kubectl create secret -n <NAMESPACE> generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
- docker-registry (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>
- 이후 2.3.1 의 과정을 진행합니다.
2.4.3 Docker-registry에 직접 image를 push 해야하는 경우
- 배포된 image tar 파일을 docker 커맨드를 사용할 수 있는 서버에 upload
- docker load -i \<IMAGE_NAME>.tar 명령어로 로컬 docker registry에 load
- docker images 명령어로 load가 잘 됐는지 image name과 tag, image ID를 확인
- 위에서 확인한 Image ID를 기반으로 아래 명령어를 통해 docker-registry에 push할 경로를 셋팅
- docker tag \<IMAGE_ID> \<Docker-registry URL>/\<IMAGE_NAME>:\<IMAGE_TAG>
- docker images 명령어로 동일한 IMAGE_ID로 url 경로가 들어간 image name이 있는지 확인
- 위에서 준비한 docker image를 push
- docker push \<Docker-registry URL>/\<IMAGE_NAME>:\<IMAGE_TAG>
- 이후 kubernetes에 agent를 배포합니다.
2.4.4 OpenShift에서 Warning 문구 뜨면서 exem-container-agent가 배포 안되는 경우
- SecurityContextConstraints (SCC) 권한이 현재 배포하려는 exemone의 serviceaccount에 바인딩 되어있는지 확인
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:<NAMESPACE>:<SERVICEACCOUNT_NAME>
- system:serviceaccount:exemone:exemone
SCC 권한 설명:
| 설정 | 값 | 용도 |
|---|---|---|
| allowHostDirVolumePlugin | true | container-agent가 각 노드의 cgroup, 프로세스 정보, 런타임 소켓을 읽어서 컨테이너 CPU/Memory/Network 메트릭을 수집함. 이 권한이 없으면 컨테이너 메트릭 수집 불가 |
| runAsUser | RunAsAny | cgroup 파일과 런타임 소켓(crio.sock 등)이 root 소유이므로, container-agent가 root(uid 0)로 실행되어야 컨테이너 목록 조회 및 메트릭 수집이 가능. 비root 실행 시 permission denied 발생 |
| seLinuxContext | RunAsAny | OpenShift 노드는 SELinux가 기본 활성화되어 있어서, 일반 컨테이너는 호스트 파일 접근이 SELinux 정책에 의해 차단됨. spc_t 타입을 설정해야 마운트된 호스트 파일시스템과 런타임 소켓을 읽을 수 있음 |
| fsGroup | RunAsAny | 호스트에서 마운트한 cgroup, proc 등의 파일 그룹 소유권이 다양하므로, 특정 그룹으로 강제하면 파일 읽기에 실패할 수 있음 |
volumes 권한 설명:
| volume 타입 | 필수 | 용도 |
|---|---|---|
| hostPath | O | 호스트 파일시스템(/)을 마운트하여 cgroup, 프로세스 정보를 읽고, 런타임 소켓(crio.sock, containerd.sock, docker.sock)으로 컨테이너 목록과 상태를 조회 |
| configMap | O | ConfigMap을 envFrom으로 참조하여 receiver 주소, 클러스터 이름 등 에이전트 설정을 환경변수로 주입 |
| projected | O | ServiceAccount 토큰을 Pod에 자동 마운트하여 K8s API Server 인증에 사용. Informer로 Pod/Node 등 리소스를 조회할 때 필요 |
| secret | 선택 | 고객사 Container Registry에서 이미지를 가져올 때 imagePullSecrets 사용 시 필요. 공개 레지스트리 또는 별도 인증 방식을 사용하는 경우 불필요 |
scc 주체(subject) 목록 정의:
- 정의한 SCC를 serviceAccount에(
system:serviceaccount) 부여하기 위한 목록 정의 (<namespace>:<serviceaccount-name>)
users:
- system:serviceaccount:exemone:exemone
- scc의 경우 openshift client (oc)로 작업을 진행해야하며 권한 관련된 작업이기 때문에 보통은 고객사 담당자에게 요청해야합니다.
- 직접 scc 를 적용해야하는 경우 위의 scc.yaml 파일 생성 후 아래 명령어로 scc 추가
oc apply -f scc.yaml
- 이후 kubectl get scc -n \<NAMESPACE> 명령어로 scc 생성 확인
exem-one-hostpath-scc false <no value> RunAsAny RunAsAny RunAsAny RunAsAny <no value> false ["configMap","hostPath","projected","secret"]
- scc.yaml 생성 후 serviceaccount와 바인딩
(exem-one-hostpath-scc 는 위에서 만든 scc의 이름이며 변경해도 상관없습니다.)
oc adm policy add-scc-to-user exem-one-hostpath-scc -z <SERVICEACCOUNT> -n <NAMESPACE>
- 위의 scc 권한이 적용된 이후 exem-container-agent (daemonset) yaml 파일 수정
(daemonset.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
- GPU 모니터링 사용 시 SCC 추가 권한은 "9. FAQ > 9-4 > 6️⃣" 문서 참조.