Run The Bridge

kubernetes project -1- 본문

Cloud/Project

kubernetes project -1-

anfrhrl5555 2021. 10. 11. 00:59
728x90
반응형

9월 말을 마지막으로 kubernetes system engineer 교육이 끝났다. 이제는 본격적으로 project 기간이다.

 

우리는 학과에 도움이 될만한 것을 찾다가, 학교에서 수업을 듣다 보면 보안장비 또는 ESXI, NAS 서버에 접속해야 하는 경우가 있는데 접속할 때마다 아는 사람한테 물어보거나 교수님을 찾아가야만 했다.

 

그러한 불편함을 없애기 위해 학과 장비 접속 가이드를 웹으로 제작하기로 했고, 거기에 이어 장비의 상태 정보를 zabbix의 SNMP로 받아와 Grafana로 시각화하는 것을 Project 주제로 잡았다.

 

실제로 프로젝트는 9월 주말 멘토링부터 조금씩 해와서 지금은 어느 정도 틀이 잡혀있다.

 

현재 k8s로 zabbix를 올린 상태이다.

 

이제 남은 것은 이 zabbix를 Grafana와 연동, 그리고 학과 내에 있는 보안장비와 붙여야 한다.

 

우선 우리 팀원이 짜준 Grafana를 올려본다.

# grafana-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: zbx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      name: grafana
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:latest
        ports:
        - name: grafana
          containerPort: 3000
        resources:
          limits:
            memory: "2Gi"
            cpu: "1000m"
          requests:
            memory: "1Gi"
            cpu: "500m"
        volumeMounts:
          - name: grafana-storage
            mountPath: /var/lib/grafana
          - name: grafana-datasources
            mountPath: /etc/grafana/provisioning/datasources
            readOnly: false
      volumes:
        - name: grafana-storage
          nfs:
            server: 192.168.100.140
            path: /nfs/grafana
        - name: grafana-datasources
          configMap:
            name: grafana-datasources
            defaultMode: 493
# grafana-service
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: zbx
  annotations:
      prometheus.io/scrape: 'true'
      prometheus.io/port:   '3000'
spec:
  selector:
    app: grafana
  type: NodePort
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30004
# grafana-datasource-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-datasources
  namespace: zbx
data:
  prometheus.yaml: |-
    {
        "apiVersion": 1,
        "datasources": [
            {
                "access": "proxy",
                "editable": true,
                "name": "prometheus",
                "orgId": 1,
                "type": "prometheus",
                "url": "http://prometheus-service.monitoring.svc:8080",
                "version": 1
            }
        ]
    }

위의 3개를 pod를 올리면 grafana home을 볼 수 있다.

 

Pod를 올리니까 CrashLoopBackOff 오류가 난다. log를 찍어보니 Permission denide라는데 구글링을 해보자.

 

라는 답변을 받을 수 있었고, 내 NFS서버에 grafana dir는 권한이 666으로 되어있었다. 이걸 777로 바꾸고 다시 시도

Grafana가 잘 올라갔다. + NFS도 잘 저장되는 모습을 볼 수 있었다.

 

이제 웹으로 접속해보자. 

Grafana 화면

접속이 잘된다. 기본 설정 계정은 admin으로 이루어져 있다.

id: admin
pw: admin

접속성공!

이제 zabbix plugin을 설치하고 zabbix server와 연동해보자.(zabbix가 보이지 않으면 All, All 설정을 하고 본다)

Configuration - Plugins - zabbix 검색

 

이제 연동하는 방법을 또다시 구글에 물어보자.

문법이 맞는지는 모른다.

https://fabianlee.org/2017/01/15/grafana-connecting-to-a-zabbix-datasource/

 

Grafana: Connecting to a Zabbix datasource – Fabian Lee : Software Engineer

Zabbix is an open-source monitoring solution that provides metrics collection, dynamic indexes, alerting, dashboards, and an API for external integration.  But graphing is arguably one Zabbix’s weak points; it still builds static images while other ente

fabianlee.org

여기 나와있는 대로 한 번 해본다.

 

error

위와 같은 오류가 뜬다... grafana log를 살펴보자

zabbix에서 무언가를 불러볼 때 오류가 나는 거 같다.

 

그러던 중 구글에서 http://192.168.100.140:30080/api_jsonrpc.php을 시도해보라는 것을 봤고, curl로 테스트해보았다.

curl -v http://192.168.100.140:30080/api_jsonrpc.php

curl로 테스트하니까 문장의 앞에 '<', '>'가 보이는데 아마 연결에 실패해서 꺾새가 값에 들어갔고, 그래서 오류를 발생시켰다고 볼 수 있다. 

 

나는 DataSource를 연결하기 위해 다음과 같이 주었는데, 192.168.100.140은 VM HOST의 IP이다. 즉 Zabbix server의 IP가 아니다. 하지만 Zabbix server의 IP는 Pod에 올라가므로 IP가 바뀐다. 어떤 방법을 써야 할까.....

 

 

일단 검색 방법을 약간 바꾸어보았다. 방금은 zabbix였다면 지금은 zabbix server ㅋㅋ!!

무지 성 loopback address도 오류가 난다 아휴 우웅~~!@!!

 

이제는 service IP를 넣어본다. (10.111.20.4)

똑같네.....ㅎㅎ 다른 방법을 또 찾아본다... 멈추지 않는다!!

 

우선 다음 파일이 zabbix-web에 있는 것을 알 수 있었다.

 

30분 가까이 구글 검색하면서 뇌를 굴려 본 결과.... Pod 간 네트워크 통신은 같은 대역이라 잘되는데 혹시 Port가 문제라 안 되는 건가?라는 생각이 들었다.

 

그래서 zabbix-web에다가 ContainerPort 3000(Grafana)을 넣어주고, service에도 3000번 port를 따로 생성했다.

# deployment
ports:
 - name: zabbix-server
 containerPort: 80
 - name: grafana
containerPort: 3000
  # service
  - name: grafana
    port: 3000
    protocol: TCP
    targetPort: 3000

그래도 아직 오류가 뜬다....대체 뭐가 문제일까...근데 중간에 remote_addr=100.200.102.64가 나온다.

 

kubectl get pod -A, kubectl get service -A로 확인해도 저런 IP가 없다... grafana image에 문제가 있는 건가?

 

image안에 들어가 봐도 별게 없다..... 흠...

 

https://grafana.com/docs/grafana/latest/installation/kubernetes/

 

Deploy Grafana on Kubernetes

› Installation › Deploy Grafana on Kubernetes Deploy Grafana on Kubernetes This page explains how to install and run Grafana on Kubernetes (K8S). It uses Kubernetes manifests for the setup. If you prefer Helm, refer to the Grafana Helm community charts

grafana.com

검색 결과 grafana image에 문제가 있는 것으로 보고 공식 홈페이지에서 새롭게 grafana yaml파일을 만들어본다.

 

파일은 'grafana-deployment.yaml'  'grafana-service.yaml' 'grafana-volume.yaml'로 3개이다.

 

각 내용은 다음과 같다. volume, service, deployment 순으로 올려준다.

# grafana-volume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: grafana-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.100.140
    path: /nfs/grafana2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc-claim
  namespace: zbx
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
# grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: grafana-service
  namespace: zbx
spec:
  ports:
    - port: 3000
      protocol: TCP
      targetPort: 3000
      nodePort: 30004
      targetPort: http-grafana
  selector:
    app: grafana
  type: NodePort
# grafana-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: zbx
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        supplementalGroups:
          - 0
      containers:
        - name: grafana
          image: grafana/grafana:7.5.2
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 250m
              memory: 750Mi
          volumeMounts:
            - mountPath: /var/lib/grafana
              name: grafana-pv
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-pvc-claim

 

그러면 새롭게 grafana을 올릴 수 있다. 메뉴를 조금 봤는데 살짝 옛날 버전? 같았다.

7.5.2

 

새롭게 올린 grafana로 Datasource를 만들어야 한다. 우선 zabbix plguin을 넣는다

처음에는 없는데 Find more plugins on Grafana.com에서 받아서 CLI명령으로 설치하면 된다.

 

그러면 Grafana를 재시작하라는데, 그냥 pod를 껐다가 올리면 NFS설정으로 인해 zabbix plugin이 설치되어있다!

 

이제 Datasources를 생성한다.

마찬가지로 실패가 뜬다... 로그를 보면

똑같이 remote_addr=100.200.102.64가 잡혀있다.... 저 IP는 대체 뭘까...

 

드디어 3시간 동안 개 삽질 삽질 삽질을 해서 알아냈다.

 

우선적으로 예전에 교육시간 때 Prometheus + Grafana 연동하는 부분을 다시 봤다. 거기서 강사님은 내가 생각한 것처럼 같은 Pod안이므로 Service명으로 줘도 충분히 통신이 된다고 하셨고, 'kubectl get service'로 나오는 이름과 포트를 주었다. 그것을 바탕으로 나도 똑같이 시도해보았지만, connection refused, invalid character '<' looking for beginning of value 같은 오류밖에 뜨지 않았다.

 

저러한 오류를 한 50번 가까이 본 결과 Github에서 'alexanderzobnin'라는 사람이 Grafana와 Zabbix에 대해 commit 해놨다. 거기에는 많은 문제들이 있었는데 이렇게 issuese만 235개가 있었다. 나는 혹시 나하고 오류를 검색해보았고

 

나와 관련된 오류를 가진 사람을 볼 수 있었다. 내용을 번역해서 천천히 읽어 본 결과 댓글에서 해결할 수 있었다

저렇게 http://zabbix-host/api_jsonpc.php을 넣어보라는 것이었다. 

 

나는 바로 실행에 옮겼고, 내 zabbix-fronend는 zabbix-web이라는 이름으로 동작하고 내부 포트로는 80 포트가 열려있다. 이제 save&test를 해본다.

 

결과는 드디어 성공! 18시부터 해서 01:00시까지 약 5시간 정도 고민한 결과 생각보다 빠르게 해결할 수 있었다.

 

바로 DashBoard도 만들어본다.

잘 만들어진다! 이로써 주말에 해야 할 일은 얼추 다했다. 정보보안 기사 공부도 했고, Zabbix + Grafana 연동 문제, DevOps 남은 부분 정리도 했고 마지막으로 운동도 했다.

 

이제 다음으로는 마지막이라고 볼 수 있는 장비에서 SNMP 통신으로 Zabbix와 연동하는 것이 남아있다.

 

오늘 할 일은 끝냈으니 이제 나도 자러 가야겠다~

 

 

뭔가 이분 github을 많이 방문할 거 같아서 링크를 남긴다.

https://github.com/alexanderzobnin/grafana-zabbix/issues/1089

 

invalid character '<' looking for beginning of value · Issue #1089 · alexanderzobnin/grafana-zabbix

Hi, our zabbix provider switch zabbix to HTTPS with cert, so i have updated grafana and zabbix plugin to latest versions Grafana Zabbix Grafana-Zabbix Plugin v7.3.2 4.0.5 4.0.1 after enable "S...

github.com

 

※ 오류잡기(zabbix - Database 연결)

다음과 같은 오류가 나올 수 있다.

네트워크 문제거나, NFS에 있는 폴더 권한 문제일 수 있다. 그래서 우선적으로 mysql volume 파일 권한을 777로 주고 내가 쓰는 네트워크인 calico.yaml을 껏다가 재실행하면 정상적으로 DB connection이 된다.

calico 껏다 켜기

728x90
반응형

'Cloud > Project' 카테고리의 다른 글

kubernetes project -6-  (0) 2021.10.24
kubernetes project -5-  (0) 2021.10.21
kubernetes project -4-  (0) 2021.10.16
kubernetes project -3-  (0) 2021.10.14
kubernetes project -2-  (2) 2021.10.11
Comments