새소식

Cloud Engineering Log

외부 docker.sock을 kubernetes에서 모니터링하는 방법

  • -

 

지금 팀에서, 모종의 이유로 베어메탈 노드에서 docker를 운용하고, 동시에 그 노드를 이용해 오픈스택 -> 쿠버네티스 가상화까지 하고 있다.

 

하지만 주로 쿠버네티스에서 모니터링을 체크하고, 운용하다 보니, 가끔 docker가 말썽인 경우에 캐치하기가 어려운 문제가 있었다.

 

그래서 아래 코드로 도커의 소켓 (/var/run/docker.sock)을 프록시로 로그를 확인하도록 하고 있었는데, 아무래도 로그가 실시간으로 너무 많이 찍혀서 솔직히 트레이싱하기 힘들다.

curl --unix-socket /var/run/docker.sock http://localhost/events

 

 

그래서 고안한 것은, docker.sock을 이용해 모니터링하는 pod를 쿠버네티스에서 띄우는 방식이다.

 

apiVersion: v1
kind: Service
metadata:
  name: {{ DOCKER-MONITOR-JAY }}
spec:
  selector:
    app: {{ DOCKER-MONITOR-JAY }}
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ DOCKER-MONITOR-JAY }}
  labels:
    app: {{ DOCKER-MONITOR-JAY }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ DOCKER-MONITOR-JAY }}
  template:
    metadata:
      labels:
        app: {{ DOCKER-MONITOR-JAY }}
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 60
      containers:
        - name: {{ DOCKER-MONITOR-JAY }}
          image: portainer/portainer
          imagePullPolicy: "IfNotPresent"
          readinessProbe:
            httpGet:
              path: /
              port: 9000
              scheme: HTTP
          volumeMounts:
            - mountPath: /var/run/docker.sock
              name: devops-docker-sock
      volumes:
      - name: devops-docker-sock
        hostPath:
          path: /var/run/docker.sock
          type: Socket

핵심은, volumes에서 docker의 socket을 던져줘야한다.

나는 간단하게 베어메탈 노드의 hostPath를 그대로 던졌다.

 

하지만, 뭐 여러 종류로 사용한다면, PVC를 활용할 일이 많을 것 같다.

 

당연하게도, {{ DOCKER-MONITOR-JAY }}로 표현한 것들의 이름을 바꿔주어야한다.

 

그리고 9000 포트로 뽑은 svc에 인그레스를 연결하면, 다음과 같은 화면이 우리를 맞이해준다.

(물론, admin password를 입력하고, local을 선택해야 나온다.)

 

 

해피 인프라, 해피 쿠버네티스!

 

개발시간 5분컷, 행복했당

 

(portainer license 정보: https://github.com/portainer/portainer/blob/develop/LICENSE , GPL 파생이라고 한다)

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.