AWS/Project

[K8S 환경에 Kafka 및 EFK 배포] TroubleShooting

jih0ssang 2024. 4. 19. 14:45

Instances failed to join the kubernetes cluster

Instances failed to join the kubernetes cluster

새로 추가한 서브넷을 라우팅 테이블로 연결 안해둬서.. 안됐음


Helm 버전 에러

helm version 2 설치하니 에러 생겨서 helm version 3.14.4로 진행...

참고 블로그: https://helm.sh/ko/docs/intro/install/

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

$ chmod 700 get_helm.sh

$ ./get_helm.sh

 

$ kubectl --namespace kube-system create sa tiller
$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
$ helm init --service-account tiller
$ helm repo update

 

참고 블로그: https://velog.io/@hsshin0602/%EC%9A%B4%EC%86%A1%EC%9E%A5-%EC%A0%95%EB%B3%B4%EB%B3%B4%ED%98%B8-%EC%84%9C%EB%B9%84%EC%8A%A4-EKS-kafka-%EC%97%B0%EB%8F%99

$ kubectl create ns kafka

$ helm repo add bitnami https://charts.bitnami.com/bitnami

# helm repo 추가되었는지 확인
$ helm repo list
NAME     URL
bitnami  https://charts.bitnami.com/bitnami

# helm chart(kafka) 확인
$ helm search kafka
NAME	        CHART VERSION
bitnami/kafka   2.3.5

# kafka 설치 및 배포
helm install my-kafka bitnami/kafka -n kafka

# kafka 배포 확인
kubectl get all -n kafka

 

 

  • pod/my-kafka-controller-0,1,2
    • kafka cluster의 컨트롤러 역할
    • 클러스터의 상태 관리
  • service/my-kafka
    • 클라이언트가 kafka cluster에 접근할 수 있도록 함
    • 클러스터의 외부로 노출됨
  • service/my-kafka-controller-headless
    • kafka cluster 엔드포인트를 제공하는 Headless 서비스
    • 개별 파드의 IP를 노출하여 클러스터 내 각각의 인스턴스에 직접 접근할 수 있도록 함
  • statefulset.apps/my-kafka-controller
    • kafka는 영구 볼륨이 있는 statefulset으로 배포
    • 데이터를 저장 및 관리
    • 파드를 관리하고 안정적인 호스트 이름과 스토리지 보장
    • pod/my-kafka-controller은 statefulset이다.

Helm Repository

  • Stable Repository
    • google에서 제공하는 repo
    • 신뢰성이 높고 안정적인 Helm 차트가 포함
    • 주로 많이 사용
  • Incubator Repository
    • 아직 실험적이거나 개발 중인 Helm 차트
    • 새로운 애플리케이션, 기능, 또는 업데이트 중인 애플리케이션에 대한 차트가 주로 포함
  • bitnami
  • 기타 등등..

helm install 할때 이름이 이미 사용중이다 뜨는 에러

cannot re-use a name that is still in use

 

$ helm list -n kafka

 네임스페이스 지정안하면 안보인다... 꼭 지정해서 리소스 목록 확인하기!!


 

Pod가 계속 Pending 상태

원인
헬름 차트를 이용하여 kafka를 설치하게 되면 Persistent Volume Claim이 자동으로 생성되는데, 이에 이용되는 Persistant Volume이 없기 때문에 Pending 상태가 되고 volumeMode와 Storageclass에 따라 동적으로 binding이 될 수 있다. → PV 생성 필요!!

참조 블로그: https://ssnotebook.tistory.com/entry/Kubernetes-%ED%97%AC%EB%A6%84-%EC%B0%A8%ED%8A%B8Helm-Chart%EB%A1%9C-Apache-Kafka-%EC%84%A4%EC%B9%98bitnami

https://ssnotebook.tistory.com/entry/Kubernetes-헬름-차트Helm-Chart로-Apache-Kafka-설치bitnami

 

name과 hostPath가 다른 PV와 중복되지 않게 주의하여 생성한다.

 

 

pvc와 pv binding 

 

 

claimRef 필수

 

위의 yaml처럼 PV만 생성했더니 PV와 PVC binding되었다.

하지만 또 난관이 있었으니..


Pod CrashLoopBackOff 상태

프로세스가 컨테이너 내에 없어서 생기는 현상

 

Edit 할때 /tmp 하위에 저장되는 현상

 

Pod를 Edit했을 때 제대로 작성했을 경우 한번에 저장 성공하지만

제대로 작성되지 않을 경우, /tmp/edit-123456789.yaml 에 저장된다.. (에디터 관련된 문제라고 한다.)

그 때는 아래 명령어처럼 KUBE_EDITOR를 지정한다.

KUBE_EDITOR="nano" kubectl edit statefulset/my-kafka-controller

 

 

container 내부에 간단한 명령어 실행시켰다.

spec:
  containers:
    command: ['sh', '-c', 'sleep infinity']

참고 블로그: https://www.inflearn.com/questions/194283/crashloopbackoff

 

드디어 Pod가 정상적으로 Running되는 모습...은 하나만 Running되네?


Pod CrashLoopBackOff 상태

Back-off restarting failed container kafka in pod my-kafka-controller-2_kafka

 

참조 블로그: https://kodekloud.com/blog/what-is-kubernetes-back-off-restarting-failed-container-error/

 

원인은 리소스 부족인 것 같다.. t2 type에서 M5으로 올렸더니 Running 됨..

 


KRAFT 전용 kafka 설치

Back-off restarting failed container kafka in pod my-kafka-controller-2_kafka

https://sotl.tistory.com/292

https://medium.com/spitha-techblog/kafka-kraft-435fe2bab1de

https://medium.com/@remya.savithry/kafka-kubernetes-deployment-brokers-with-kraft-zookeeperless-deployment-3-59c9b617b557

https://github.com/rafaelmnatali/kafka-k8s

https://rafaelnatali.wixsite.com/rmn-technology/post/running-kafka-in-kubernetes-with-kraft-mode


자원 부족) vm-max-map을 증가시켜라


CreateContainerConfigError

# kibana-deployment.yaml
secretKeyRef:
              name: elasticsearch-pw-elastic

여기서 해당 name의 secret이 없어서 뜨는 에러인 것 같다.


Secret 생성

참고 블로그: https://velog.io/@1yangsh/k8s-%EC%8B%9C%ED%81%AC%EB%A6%BFsecret

# Secret 생성
$ kubectl create secret generic elasticsearch-pw-elastic -n kube-logging --from-literal password=aaaaaaaaaaaaaaaa
# Secret 확인
$ kubectl get secrets -n kube-logging
NAME		           TYPE     DATA   AGE
elasticsearch-pw-elastic   Opaque   1      18s

 

정상적으로 동작함을 확인했다.

 


Kibana server is not ready yet 

kubectl logs [파드명] -n [네임스페이스명] 을 통해 로그 확인

{"type":"log","@timestamp":"2024-04-28T00:37:00Z","tags":["warning","task_manager"],"pid":1,"message":"PollError [security_exception] failed to authenticate user [elastic], with { header={ WWW-Authenticate=\"Basic realm=\\\"security\\\" charset=\\\"UTF-8\\\"\" } }"}

 

"elastic" 유저의 비밀번호가 일치하지 않는다는 에러이다.

# 비밀번호 초기화
Changed password for user apm_system
PASSWORD apm_system = VbFFFFFFFFFFFFFFFFF

Changed password for user kibana
PASSWORD kibana = 7HDDDDDDDDDDDDDD

Changed password for user logstash_system
PASSWORD logstash_system = sgSSSSSSSSSSSSSSSS

Changed password for user beats_system
PASSWORD beats_system = r7lDDDDDDDDDDDDDD

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = zVVVVVVVVVVVVV

Changed password for user elastic
PASSWORD elastic = gI4HHHHHHHHHH

# secret 생성
$ kubectl create secret generic elasticsearch-pw-elastic -n kube-logging --from-literal password=gI4HHHHHHHHHH

# kibana 생성
$ kubectl apply -f kibana-configmap.yaml -f kibana-service.yaml -f kibana-deployment.yaml

 

비밀번호 초기화해서 secret 키를 생성한다. 그 이후에 kibana를 생성한다.

url창에 kibana(Service) 로드밸런서 url을 넣으면 정상적으로 Kibana가 구동되어 대시보드가 뜬다 !!

 


Fluentd 로그 수집 불가

pattern not match: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Fluentd 에이전트가 "pattern not match:" 경고로 가득 차면 일정 시간이 지나면 멈춰서 처리가 중지된다.

 

컨테이너가 적절한 JSON 형식으로 로그를 작성하지 않는 것 같습니다. 여러 줄 파서 플러그인을 구성하지 않는 한 각 JSON 개체는 한 줄로 작성되어야 합니다 .

 

1. kubernetes.conf 수정

"exclude_path ["/var/log/containers/fluent*"]"

2

 

로그 수집이 안돼요~~~~~~~~~~~~~~~~~~~~~~~

 

 

kafka 컨테이너 접속
$ kubectl exec -it kafka-0 bash -n kafka

 

kafka 컨테이너의 로그를 수집하겠다.


ElasticSearch Pod가 안뜸

$ kubectl create namespace elk
$ helm install --name elasticsearch --version 7.8.1 elastic/elasticsearch --namespace elk

$ kubectl describe pod elasticsearch-master-0
  Warning  Unhealthy               3m10s (x2 over 3m20s)  kubelet, ip-10-117-56-142.us-west-2.compute.internal  Readiness probe failed: Waiting for elasticsearch cluster to become ready (request params: "wait_for_status=green&timeout=1s" )
Cluster is not yet ready (request params: "wait_for_status=green&timeout=1s" )

 

 

https://waspro.tistory.com/762