일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 10km
- 대전
- 하체
- Python
- Shell
- 달리기
- 성수대교
- docker
- Kubernetes
- 자전거
- 러닝
- 한강
- 소모임
- 오답노트
- DSEC
- 정보처리기사
- 힐링
- 대구
- zabbix
- GitHub
- 맛집
- Run The Bridge
- Linux
- 유산소
- 뚝섬유원지
- 건대입구역
- Grafana
- 중식
- Podman
- 2021
- Today
- Total
Run The Bridge
kubernetes project -1- 본문
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도 잘 저장되는 모습을 볼 수 있었다.
이제 웹으로 접속해보자.
접속이 잘된다. 기본 설정 계정은 admin으로 이루어져 있다.
id: admin
pw: admin
이제 zabbix plugin을 설치하고 zabbix server와 연동해보자.(zabbix가 보이지 않으면 All, All 설정을 하고 본다)
이제 연동하는 방법을 또다시 구글에 물어보자.
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
여기 나와있는 대로 한 번 해본다.
위와 같은 오류가 뜬다... 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을 올릴 수 있다. 메뉴를 조금 봤는데 살짝 옛날 버전? 같았다.
새롭게 올린 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이 된다.
'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 |