연속된 글입니다.

  1. https://teamsmiley.github.io/2020/09/30/kubespray-01-vagrant/
  2. https://teamsmiley.github.io/2020/10/01/kubespray-02-install-kube-local-internal-loadbalancer/
  3. https://teamsmiley.github.io/2020/10/02/kubespray-03-kube-with-haproxy/
  4. https://teamsmiley.github.io/2020/10/04/kubernetes-multi-cluster/
  5. https://teamsmiley.github.io/2020/10/05/kubernetes-cert-manager/
  6. https://teamsmiley.github.io/2020/10/06/kubernetes-metallb-ingress-nginx/
  7. https://teamsmiley.github.io/2020/10/06/kubernetes-helm/
  8. https://teamsmiley.github.io/2020/10/08/kubernetes-prometheus-grafana/
  9. https://teamsmiley.github.io/2020/10/08/kubernetes-log/
  10. https://teamsmiley.github.io/2020/10/10/kubernetes-backup-velero/

kubernetes - Log를 분석해보자.

  1. fluentd가 로그를 수집해서 elasticsearch에 보내면
  2. elastic search는 로그를 저장하고
  3. kibana가 elastic search를 디비로 해서 화면에 로그를 뿌려줌

create namespace

k create namespace logging
kcn logging

꼭 logging을쓰기 바란다. 설치파일중에 namespace 가 고정된 부분이 있다.(fluent bit 관련해서)

install

helm repo add elastic https://helm.elastic.co

일단 persistence가 없는걸로 해서 진행해본다.

helm install elasticsearch elastic/elasticsearch \
--set persistence.enabled=false --namespace logging

kubectl get pods --namespace=monitoring -l app=elasticsearch-master -w #상태 모니터링

kubectl describe svc elasticsearch-master

확인

포트 포워딩

kubectl --namespace logging port-forward svc/elasticsearch-master 9200

http://localhost:9200/

동작한다.

kibana

install

helm install kibana elastic/kibana --namespace logging

확인해보자. 포트 포워딩

kubectl --namespace logging port-forward svc/kibana-kibana 5601

http://localhost:5601/app/home

잘 보인다.

외부 아이피로 서비스 오픈

매번 포트포워드 어려워서 서비스 외부에 오픈

vi 01.kibana-external-service.yml
apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: kibana
    meta.helm.sh/release-namespace: logging
  labels:
    app: kibana
    app.kubernetes.io/managed-by: Helm
    heritage: Helm
    release: kibana
  name: kibana-external
  namespace: logging
spec:
  loadBalancerIP: 192.168.2.96
  ports:
    - name: http-ext
      port: 80
      protocol: TCP
      targetPort: 5601
  selector:
    app: kibana
    release: kibana
  sessionAffinity: None
  type: LoadBalancer
k apply -f 01.kibana-external-service.yml

http://192.168.2.96 으로 확인하자. 잘 보인다.

Fluent Bit

Fluentd is a log collector, processor, and aggregator. Fluent Bit is a log collector and processor (it doesn’t have strong aggregation features such as Fluentd).

Fluentd를 경량화해서 메모리도 적게 쓰고 cpu도 적게쓰는 버전이 fluent bit이다.

https://github.com/fluent/fluent-bit-kubernetes-logging/

install

daemonset으로 올려서 모든 노드에 설치가 되게 한다.

kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-service-account.yaml
kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role.yaml
kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role-binding.yaml

configmap

기본 컨피그를 다운받자.

curl -O https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/elasticsearch/fluent-bit-configmap.yaml

파일을 열어서 다음 부분을 수정한다.

[OUTPUT]
Name es
Match \*
#Host            ${FLUENT_ELASTICSEARCH_HOST}
#Port            ${FLUENT_ELASTICSEARCH_PORT}
Host elasticsearch-master.logging.svc.cluster.local #이부분 수정
Port 9200 # 이부분 수정
Logstash_Format On
Replace_Dots On
Retry_Limit False

적용하자.

kubectl create -f fluent-bit-configmap.yaml

궁금증

elasticsearch-master.logging.svc.cluster.local 이주소는 어디서 가져오는걸가?

https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/ 여기 참고해서

vi dnsutils.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
    - name: dnsutils
      image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
      command:
        - sleep
        - "3600"
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

실행

kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml

이제 파드가 만들어지면 다음 명령어로 확인할수 있다.

kubectl exec -i -t dnsutils -- nslookup elasticsearch-master.logging

Name:	elasticsearch-master.logging.svc.cluster.local
Address: 10.233.10.21

deploy

이제 deploy를 해서 daemonset을 올려서 elasticsearch에 값을 보내자.

kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/elasticsearch/fluent-bit-ds.yaml

에러가 혹시 나면 configmap에서 꼭 elastic search ip / port를 줘야한다.

kibana로 로그가 들어오는지 확인하자.

http://192.168.2.96 에서 kibana » index pattern » logstash-* 추가하자.

잠시후

결과가 잘 나온다. 사용법은 다음에

ingress에 붙여보자.

기존에는 따로 서비스를 만들어서 아이피를 할당하여 처리하였는데 불편해보임 ingress-nginx에 추가하여 외부에 오픈해보자.

cert만들기

---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: logging-tls
  namespace: logging
spec:
  secretName: logging-tls
  issuerRef:
    name: le-dns-issuer-live
    kind: ClusterIssuer
  dnsNames:
    - kibana.c2.xgridcolo.com

ingress만들기

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kibana
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  namespace: logging
spec:
  rules:
    - host: kibana.c2.xgridcolo.com
      http:
        paths:
          - backend:
              serviceName: kibana-kibana
              servicePort: 5601
            path: /

  tls:
    - hosts:
        - kibana.c2.xgridcolo.com
      secretName: logging-tls

dns나 hosts 파일을 변경하여 url로 접속해보면 된다.

teamsmiley's profile image

teamsmiley

2020-10-08 00:00

Read more posts by this author