본문으로 건너뛰기

설치구동

  • 사전 준비 사항
    • agent 설치 image 파일들을 고객사 환경의 repository에 업로드 필요
      • (exem-k8s-agent, exem-container-agent, exem-gpu-sidecar*)
      • * exem-gpu-sidecar 는 GPU 모니터링 사용 시에만 필요 — exem-container-agent 와 별개의 독립 버전(tag)으로 관리됨
    • 설치할 namespace 생성
      • 설치 시 namespace를 자동으로 생성하지 않은 이유는 삭제 시 namespace와 관련된 모든 리소스 삭제가 될 위험성이 있기에 직접 생성한 namespace로 동작 되게 끔 하려는 의도
정보

📌 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을 사용한 설치

  1. 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 이름)
  1. deployment.spec.template.spec에 아래 내용 추가
imagePullSecrets:
- name: <SECRET_NAME>
  1. 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 권한 설명:

설정용도
allowHostDirVolumePlugintruecontainer-agent가 각 노드의 cgroup, 프로세스 정보, 런타임 소켓을 읽어서 컨테이너 CPU/Memory/Network 메트릭을 수집함. 이 권한이 없으면 컨테이너 메트릭 수집 불가
runAsUserRunAsAnycgroup 파일과 런타임 소켓(crio.sock 등)이 root 소유이므로, container-agent가 root(uid 0)로 실행되어야 컨테이너 목록 조회 및 메트릭 수집이 가능. 비root 실행 시 permission denied 발생
seLinuxContextRunAsAnyOpenShift 노드는 SELinux가 기본 활성화되어 있어서, 일반 컨테이너는 호스트 파일 접근이 SELinux 정책에 의해 차단됨. spc_t 타입을 설정해야 마운트된 호스트 파일시스템과 런타임 소켓을 읽을 수 있음
fsGroupRunAsAny호스트에서 마운트한 cgroup, proc 등의 파일 그룹 소유권이 다양하므로, 특정 그룹으로 강제하면 파일 읽기에 실패할 수 있음

volumes 권한 설명:

volume 타입필수용도
hostPathO호스트 파일시스템(/)을 마운트하여 cgroup, 프로세스 정보를 읽고, 런타임 소켓(crio.sock, containerd.sock, docker.sock)으로 컨테이너 목록과 상태를 조회
configMapOConfigMap을 envFrom으로 참조하여 receiver 주소, 클러스터 이름 등 에이전트 설정을 환경변수로 주입
projectedOServiceAccount 토큰을 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️⃣" 문서 참조.