반응형

 

k8s에서 fluent-bit 설치 및 stdout 테스트이다. opensearch 설치 및 연동테스트는 아래 링크참조

2024.11.03 - [Develop/k8s] - OpenSearch, Dashboard 설치 및 Fluent-Bit OpenSeach 연동

 

 

0. 로깅 대상 Pod 관련

fluent-bit의 경우 Pod 내 label 이 app: 으로 시작하는 경우 로깅을 하지 못하므로,

반드시 label이 app: 으로 되어있는게 없도록 변경해주어야한다.

 

 

1. 우선 테스트할 서비스를 하나 생성한다

nodejs로 로깅 테스트 - https://github.com/wonkwangyeon/stdout-nodejs

java서비스로 로깅 테스트 - https://github.com/wonkwangyeon/stdout-java

 

 

2. 테스트 서버를 배포한다.

$ kubectl apply -f k8s.yaml
deployment.apps/stdout-node created
service/stdout-node-service created
ingress.networking.k8s.io/stdout-node-ingress created

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
stdout-node-6f945d7989-6xjp2   1/1     Running   0          20s

 

 

3. fluent-bit install

$ helm repo add fluent https://fluent.github.io/helm-charts
$ helm upgrade --install fluent-bit fluent/fluent-bit

# namespace 를 주지않으면 default namespace에 생성된다
$ kubectl get pods
NAME                           READY   STATUS              RESTARTS   AGE
fluent-bit-67blm               0/1     ContainerCreating   0          5s
fluent-bit-vvt7c               0/1     ContainerCreating   0          5s

 

 

4. 현재 elasticsearch 나 opensearch 를 설치하지 않았으므로 stdout테스트를 진행한다. (테스트 후 opensearch 설치 예정)

기존에 있던 OUTPUT인 elasticsearch를 삭제하고 [OUTPUT]으로 stdout 을 추가한다.

(해당 Name의 경우 이름이 정해져있으며, 이름마다 사용할 수 있는 변수?가 다르다. 공식 가이드에서 확인 가능하다.)

$ kubectl edit cm fluent-bit

	기존에 있던 elasticsearch OUTPUT 삭제
    [OUTPUT]
        Name es
        Match host.*
        Host elasticsearch-master
        Logstash_Format On
        Logstash_Prefix node
        Retry_Limit False
        
    아래 stdout OUTPUT 추가
    [OUTPUT]
        Name stdout
        Match kube.*

# config map 수정 후 fluent-bit pod 삭제를 통해 재기동한다.
$ kubectl delete pods fluent-bit-67blm  fluent-bit-vvt7c
pod "fluent-bit-67blm" deleted
pod "fluent-bit-vvt7c" deleted

 

 

5. 1번에서 설치한 테스트 pod 위치를 확인 후 같은 위치의 fluent-bit pod 의 로그를 f option을 통해 확인한다.

이후 테스트 서비스를 호출하여 로그가 fluent-bit pod에 출력되는지 확인한다.

(OpenSearch 연동은 아래링크 참조 :

2024.11.03 - [Develop/k8s] - OpenSearch, Dashboard 설치 및 Fluent-Bit OpenSeach 연동)

# 테스트 서비스 위치 확인 (2번에 있는 것 확인)
$ kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP          NODE      NOMINATED NODE   READINESS GATES
stdout-node-6f945d7989-6xjp2   1/1     Running   0          27m     10.0.2.9    worker2   <none>           <none>

# fluent-bit 위치 확인 (2번 fluent-bit pod 확인)
$ kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP          NODE      NOMINATED NODE   READINESS GATES
fluent-bit-bng54               1/1     Running   0          6m41s   10.0.0.62   worker1   <none>           <none>
fluent-bit-crjlm               1/1     Running   0          6m40s   10.0.2.37   worker2   <none>           <none>

# 2번 fluent-bit 로그 출력
$ kubectl logs -f fluent-bit-crjlm  

# service 호출 후 아래 로그 확인
[0] kube.var.log.containers.stdout-node-6f945d7989-6xjp2_default_stdout-a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10.log: [[1730388117.989743401, {}], {"time"=>"2024-10-31T15:21:57.989743401Z", "stream"=>"stdout", "_p"=>"F", "log"=>"2024-10-31T15:21:57.989Z debug : Log Hello World", "kubernetes"=>{"pod_name"=>"stdout-node-6f945d7989-6xjp2", "namespace_name"=>"default", "pod_id"=>"037e0276-650f-460f-85cb-095ed4f65cd7", "labels"=>{"pod-template-hash"=>"6f945d7989", "stdout"=>"stdout-node"}, "host"=>"worker2", "container_name"=>"stdout", "docker_id"=>"a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10", "container_hash"=>"sha256:aff389fbc4cac45f0ca6de06328e7d51f1d887306a9c278d4349f61e281ac562", "container_image"=>"docker.io/stdout/node:latest"}}]
[1] kube.var.log.containers.stdout-node-6f945d7989-6xjp2_default_stdout-a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10.log: [[1730388117.989830525, {}], {"time"=>"2024-10-31T15:21:57.989830525Z", "stream"=>"stdout", "_p"=>"F", "log"=>"2024-10-31T15:21:57.989Z info : Log Hello World", "kubernetes"=>{"pod_name"=>"stdout-node-6f945d7989-6xjp2", "namespace_name"=>"default", "pod_id"=>"037e0276-650f-460f-85cb-095ed4f65cd7", "labels"=>{"pod-template-hash"=>"6f945d7989", "stdout"=>"stdout-node"}, "host"=>"worker2", "container_name"=>"stdout", "docker_id"=>"a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10", "container_hash"=>"sha256:aff389fbc4cac45f0ca6de06328e7d51f1d887306a9c278d4349f61e281ac562", "container_image"=>"docker.io/stdout/node:latest"}}]
[2] kube.var.log.containers.stdout-node-6f945d7989-6xjp2_default_stdout-a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10.log: [[1730388117.989854900, {}], {"time"=>"2024-10-31T15:21:57.9898549Z", "stream"=>"stdout", "_p"=>"F", "log"=>"2024-10-31T15:21:57.989Z warn : Log Hello World", "kubernetes"=>{"pod_name"=>"stdout-node-6f945d7989-6xjp2", "namespace_name"=>"default", "pod_id"=>"037e0276-650f-460f-85cb-095ed4f65cd7", "labels"=>{"pod-template-hash"=>"6f945d7989", "stdout"=>"stdout-node"}, "host"=>"worker2", "container_name"=>"stdout", "docker_id"=>"a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10", "container_hash"=>"sha256:aff389fbc4cac45f0ca6de06328e7d51f1d887306a9c278d4349f61e281ac562", "container_image"=>"docker.io/stdout/node:latest"}}]
[3] kube.var.log.containers.stdout-node-6f945d7989-6xjp2_default_stdout-a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10.log: [[1730388117.989863650, {}], {"time"=>"2024-10-31T15:21:57.98986365Z", "stream"=>"stdout", "_p"=>"F", "log"=>"2024-10-31T15:21:57.989Z error : Log Hello World", "kubernetes"=>{"pod_name"=>"stdout-node-6f945d7989-6xjp2", "namespace_name"=>"default", "pod_id"=>"037e0276-650f-460f-85cb-095ed4f65cd7", "labels"=>{"pod-template-hash"=>"6f945d7989", "stdout"=>"stdout-node"}, "host"=>"worker2", "container_name"=>"stdout", "docker_id"=>"a9b9155dd52d8338234bbbf37ccc057d72d7d4731044068a9beaaa2aeeba4f10", "container_hash"=>"sha256:aff389fbc4cac45f0ca6de06328e7d51f1d887306a9c278d4349f61e281ac562", "container_image"=>"docker.io/stdout/node:latest"}}]

 

 

fluent-bit를 설치하고 간단히 stdout 을 통해 테스트가 되는 것을 확인하였다.

OpenSearch 연동은 아래 링크 참조

2024.11.03 - [Develop/k8s] - OpenSearch, Dashboard 설치 및 Fluent-Bit OpenSeach 연동

반응형
반응형

 

ctr image import image.tar 시 아무런 응답이 없고 실제로 업로드가 안될 때

1. 해당 image.tar 파일을 압축해제하고  manifest.json 파일을 오픈다

2. 오픈시 RepoTags 부분을 확인하면 null값으로 들어가있으며, 이를 수정하면 된다.

 

"RepoTags" : null, -> "RepoTags": ["이미지 URL"]

 

이후 ctr image import 명령어를 수행하면 image가 import 되는 것을 확인할 수 있다.

반응형
반응형

 

kubernetes-dashboard 는 기본적으로 localhost 에서 https 를 권장하지만 Ingress 를 적용하여 접속할 수도 있다.

kubernetes-dashboard-kong-proxy를 기준으로 https ingress 접속하는 방법이다.

 

 

1. 인증서 생성

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dashboard.wky.kr/O=Kubernetes"
또는
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dashboard.wky.kr/O=Kubernetes" -addext "subjectAltName = DNS:dashboard.wky.kr"

 

 

2. secret 생성

kubectl create secret tls tls-dashboard --key tls.key --cert tls.crt -n kubernetes-dashboard

 

 

3. Ingress 생성 및 적용

# vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
spec:
  ingressClassName: nginx
  rules:
  - host: dashboard.wky.kr
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard-kong-proxy
            port:
              number: 443
  tls:
  - hosts:
    - dashboard.wky.kr
    secretName: tls-dashboard
 
 # 적용
 kubectl apply -f ingress.yaml -n kubernetes-dashboard

 

 

4. 접속할 pc 의 hosts에 등록

vi /etc/hosts

172.1.1.1 dashboard.wky.kr

 

 

5. 확인

 

 

기타. ssl-passthrough

ssl-passthrough 를 적용하기 위해선 deployment에 --enable-ssl-passthrough 플래그를 추가한다.

kubectl edit deploy -n ingress-nginx ingress-nginx-controller

...
spec:
  containers:
  - args:
    - /nginx-ingress-controller
    - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
    - --election-id=ingress-nginx-leader
    - --controller-class=k8s.io/ingress-nginx
    - --ingress-class=nginx
    - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key
    - --enable-ssl-passthrough=true
...

 

ingress 설정

# vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /dash(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: kubernetes-dashboard-kong-proxy
            port:
              number: 443
 
 # 적용
 kubectl apply -f ingress.yaml -n kubernetes-dashboard

 

확인

반응형

+ Recent posts