개요

쿠버네티스 환경에서 Harbor Exporter를 통해 Prometheus로 데이터를 수집하는 방법에대해 기술한다.

Harbor, Prometheus 가 설치되었다고 가정한다.

Harbor Exporter 설치

Harbor Exporter 레포지토리를 참고하여 작성하였다.

아래 파일은 c4po/harbor_exporter의 harbor-exporter.yaml에 추가로 6~8번째 줄에 Prometheus 어노테이션을 추가하였다.

추가적으로 61번째 줄 value에 harbor-core의 서비스 이름을 넣어줘야하고 73번째 줄에서 HARBOR_PASSWORD의 Secret을 만들어주거나 value로 넣어줘야한다.

마지막줄에 Harbor가 설치된 Namespace를 넣어주면 끝이난다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
---
kind: Service
apiVersion: v1
metadata:
  name: harbor-exporter
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/port: '9107'
  labels:
    app: harbor-exporter
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 9107
      protocol: TCP
  selector:
    app: harbor-exporter

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: harbor-exporter
  labels:
    app: harbor-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: harbor-exporter
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: harbor-exporter
    spec:
      serviceAccountName: default
      restartPolicy: Always
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
      containers:
        - name: harbor-exporter
          image: "c4po/harbor-exporter:debug"
          imagePullPolicy: Always
# skip metrics can only provide through command line
          # command:
          # - /bin/harbor_exporter
          # - --skip.metrics
          # - "scans"
          # - --skip.metrics
          # - "quotas"
          env:
##          necessary in case you monitor multiple Harbor instances in your Prometheus
#            - name: HARBOR_INSTANCE
#              value: my_harbor
            - name: HARBOR_URI
##            name of the Service for harbor-core
              value: http://harbor-core.harbor # change prefix to the name of your Helm release
##            optionally use below construction to address the external endpoint of Harbor
#              valueFrom:
#                configMapKeyRef:
#                  name: prefix-harbor-core # change prefix to the name of your Helm release
#                  key: EXT_ENDPOINT
##          uncomment if you want to use caching
#           - name: HARBOR_CACHE_ENABLED
#             value: "true"
#           - name: HARBOR_CACHE_DURATION
#             value: "20s"
            - name: HARBOR_USERNAME
              value: "admin"
            - name: HARBOR_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: harbor-core # change prefix to the name of your Helm release
                  key: HARBOR_ADMIN_PASSWORD
#            - name: HARBOR_PASSWORD
#              value: "YOUR-PASSWORD"

          securityContext:
            capabilities:
              drop:
                - SETPCAP
                - MKNOD
                - AUDIT_WRITE
                - CHOWN
                - NET_RAW
                - DAC_OVERRIDE
                - FOWNER
                - FSETID
                - KILL
                - SETGID
                - SETUID
                - NET_BIND_SERVICE
                - SYS_CHROOT
                - SETFCAP
            readOnlyRootFilesystem: true
          resources:
            limits:
              cpu: 400m
              memory: 256Mi
            requests:
              cpu: 100m
              memory: 64Mi
          ports:
            - containerPort: 9107
              name: http
          livenessProbe:
            httpGet:
              path: /-/healthy
              port: http
            initialDelaySeconds: 5
            timeoutSeconds: 5
            periodSeconds: 5
          readinessProbe:
            httpGet:
              path: /-/ready
              port: http
            initialDelaySeconds: 1
            timeoutSeconds: 5
            periodSeconds: 5

---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: harbor-exporter
  labels:
    release: mgmt
spec:
  endpoints:
  - interval: 10s
    scrapeTimeout: 10s
    honorLabels: true
    port: http
    path: /metrics
    scheme: http
  selector:
    matchLabels:
      app: harbor-exporter
  namespaceSelector:
    matchNames:
    - harbor # change to the namespace where you deployed Harbor

Prometheus에서 확인 해보면 아래와같이 지표가 뜰 것이다.

Prometheus.png

Prometheus의 지표를 통해 Grafana를 사용하여 알럿이나 모니터링이 가능해졌다.

Grafana에 대시보드는 harbor-overview.json을 import 하여 사용할 수 있다.

  1. Grafana에서 왼쪽 + 에서 Import 클릭
  2. Import via panel json에서 위 파일 내용을 붙여넣어준다
  3. 하단에 Prometheus-mgmt에 프로메테우스 데이터소스를 선택해준다.

아래 사진과 같이 Grafana에서 Harbor의 상태를 확인 할 수 있다.

Grafana.png