Cloud/k8s-CKA

[CKA] 45. Troubleshooting

jinkwon.kim 2023. 11. 7. 21:47
728x90
반응형

개요

k8s를 사용하면 마주칠 수 있는 문제점 및 해결 방법을 알아보겠습니다. 

Application 접속 실패 확인

접근성 확인을 통하여 application의 실패 원인을 찾는다.

환경

단계

1. curl로 접속을 확인

2. service의 selector 확인

selector가 맞게 되었는지 확인. 웹 접속이 잘되면 web service는 정상 동작 하는 것이다.

kubectl get service -o yaml > service.yaml 로 확인 후 수정 하는 것도 좋다.

3. Pod의 상태 확인

Pod의 State 확인

Pod의 describe 확인

Pod의 Log 확인 

현재 Pod의 Log확인

이전 Pod의 Log확인

-f --previous 로 이전 Pod Log 확인

통신 안될때 확인 사항

Pod의 Label 확인 service와 잘 매칭되었는지 확인

Control plane 오류 확인

node 상태 확인 

kubectl get node -o wide

kubelet 상태 확인 

systemctl status kubelet

kube-system Pod들이 안뜰때 

/etc/kubernetes/manifests/ 하위 설정들이 잘못되었는지 본다.

기본 Pod가 배포가 안될떄 

pod 정보에 node관련 정보가 없을면 scheduller를 우선 확인

 

/etc/kubernetes/manifests/kube-scheduler.yaml 확인 

work Node가 실패

상태 확인

node 상태확인

kubectl get nodes

node 상세 확인

kubectl describe node worker-1

정상

  • Unschedulable: 노드가 새로운 파드를 스케줄할 수 없는지 여부를 나타냅니다.
  • NetworkUnavailable: 노드의 네트워크가 올바르게 설정되지 않았는지를 나타냅니다.
  • MemoryPressure: 노드가 메모리 압박을 받고 있는지 여부를 나타냅니다.
  • DiskPressure: 노드가 디스크 공간 압박을 받고 있는지 여부를 나타냅니다.
  • PIDPressure: 노드에서 프로세스 수가 너무 많은지 여부를 나타냅니다.
  • Ready: 노드가 파드를 받아들일 준비가 되었는지를 나타냅니다

비정상

node 안될 때 확인 사항

kubelet의 kubeconfig 파일 확인

API 서버와의 연결 설정에 관한 정보를 설정합니다. 

 

/etc/kubernetes/kubelet.conf

 

/etc/kubernetes/kubelet.conf 파일은 쿠버네티스(Kubernetes) 클러스터의 노드에서 실행되는 kubelet 서비스의 설정 파일입니다. kubelet은 쿠버네티스의 주요 구성 요소 중 하나로, 각 노드에서 컨테이너화된 애플리케이션이 실행되는 것을 관리합니다.

이 설정 파일은 다음과 같은 정보를 포함할 수 있습니다:

  • API 서버의 주소 및 포트 정보: kubelet이 쿠버네티스 API 서버와 통신할 때 사용하는 주소와 포트 정보입니다.
  • 인증 및 권한 부여 정보: kubelet이 API 서버와 안전하게 통신하기 위해 필요한 인증서, 키, 토큰 등의 정보를 포함할 수 있습니다.
  • kubelet이 사용할 기본 설정 및 옵션: 자동 업데이트, 리소스 관리, 로깅 레벨 등 kubelet의 동작을 정의하는 다양한 설정을 포함합니다.

kubelet.conf는 kubelet이 초기화될 때 참조되며, 클러스터의 정상적인 운영을 위해 중요한 역할을 합니다. 이 파일의 내용을 수정하면 kubelet의 동작이 변경될 수 있으니, 변경하기 전에 쿠버네티스의 문서를 참조하거나 충분한 이해를 바탕으로 조심스럽게 수정해야 합니다.

kubelet의 설정 파일

kubelet의 실행에 관련된 설정 파일 입니다.

 

/var/lib/kubelet/config.yaml

 

/var/lib/kubelet/config.yaml 파일은 쿠버네티스 클러스터의 각 노드에서 kubelet이 사용하는 구성 파일입니다. 이 YAML 파일은 kubelet의 동작을 세부적으로 제어하기 위한 다양한 구성 옵션을 포함합니다. kubelet.conf가 주로 API 서버와의 연결 설정에 관한 정보를 담고 있다면, config.yaml은 kubelet의 실행에 관련된 더 광범위한 구성을 다룹니다.

이 파일에는 다음과 같은 설정이 포함될 수 있습니다:

  • Pods 실행 관련 설정: Pod들의 실행 환경에 대한 구성, 예를 들어 최대 Pods 수, Pods의 라이프사이클 이벤트에 대한 처리 방식 등이 이에 해당합니다.
  • 리소스 관리: CPU, 메모리 할당과 같은 리소스 관리와 관련된 설정입니다.
  • 네트워킹: Pod 네트워킹 설정, 네트워크 플러그인 선택 등의 네트워크 관련 설정입니다.
  • 보안: 인증서 경로, 보안 프로필 등 보안과 관련된 설정입니다.
  • 시스템: cgroups 경로, 시스템 리소스를 사용하는 방법, 로깅 레벨 등 시스템 관련 설정입니다.

kubelet은 시작할 때 이 config.yaml 파일을 로드하여 해당 설정에 따라 Pod를 스케줄링하고, 리소스를 할당하며, 컨테이너의 생명주기를 관리하는 등의 작업을 수행합니다. 따라서 이 파일은 노드의 kubelet이 어떻게 동작할지 결정하는 핵심 구성 요소입니다.

/var/lib/kubelet/config.yaml 파일은 노드의 동작을 조정할 때 중요하므로, 변경 시에는 주의가 필요하며, 변경 사항을 적용하기 전에 쿠버네티스의 공식 문서를 참조하거나 테스트 환경에서 먼저 시험해 보는 것이 좋습니다.

kubelet의 상태 확인

systemctl status kubelete.service

 

jounalctl -u kubelet.service

worker node의 client 인증서 확인 

Issuer와 Subject 확인

 

Networkding 문제 

CoreDNS가 pending 일때

CNI가 배포되었는지 확인

CoreDNS가 CrashLoopBackOff or Error state 일때

1. docker version update

2. Disable SELinux

3. Modify the coredns deployment to set allowPrivilegeEscalation to true:

kubectl -n kube-system get deployment coredns -o yaml | \
  sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
  kubectl apply -f -

4. CoreDNS 포드와 kube-dns 서비스가 제대로 작동하는 경우 kube-dns 서비스에 유효한 엔드포인트가 있는지 확인하세요.

               kubectl -n kube-system ep kube-dns 가져오기


서비스에 대한 엔드포인트가 없는 경우 서비스를 검사하고 올바른 선택기와 포트를 사용하는지 확인하세요.

kube-proxy 문제 발생시 대청방법

kube-proxy 수정 방법

kube-proxy는 Kubernetes 클러스터 내에서 서비스를 유지하는 네트워크 프록시입니다. kube-proxy를 수정하는 방법은 여러 가지가 있으며, 여러분이 원하는 수정의 종류에 따라 달라질 수 있습니다.

  1. kube-proxy 설정 변경하기:
    • kube-proxy의 설정은 일반적으로 ConfigMap을 통해 관리됩니다. 이 ConfigMap은 보통 kube-system 네임스페이스에 있으며, kube-proxy라는 이름으로 찾을 수 있습니다.
    • 설정을 변경하려면, 다음의 명령어를 사용하여 ConfigMap을 편집할 수 있습니다
      • kubectl edit configmap kube-proxy -n kube-system
    • ConfigMap을 편집한 후, 변경 사항이 적용되도록 kube-proxy가 실행 중인 각 노드에서 kube-proxy 파드를 재시작해야 할 수도 있습니다.
  2. kube-proxy의 실행 매개변수 변경하기:
    • kube-proxy가 DaemonSet으로 배포된 경우, 실행 매개변수를 변경하려면 해당 DaemonSet의 정의를 편집해야 합니다.
    • 다음 명령어를 사용하여 DaemonSet을 편집할 수 있습니다:
      • kubectl edit daemonset kube-proxy -n kube-system
    • 여기에서 spec.template.spec.containers[0].command 배열을 찾아 실행 매개변수를 변경합니다.
  3. kube-proxy 이미지 업그레이드:
    • 새 버전의 kube-proxy로 업그레이드하려면, DaemonSet의 이미지를 업데이트해야 합니다.
    • 다음과 같이 이미지를 업데이트합니다:
      • kubectl set image daemonset/kube-proxy -n kube-system kube-proxy=new_image:tag
    • 이때 new_image:tag를 새로운 이미지와 태그로 대체합니다.
  4. kube-proxy의 로깅 레벨 변경:
    • 로깅 레벨을 변경하려면, kube-proxy의 시작 매개변수 중 하나인 --v를 조정합니다.
    • 로깅 레벨을 변경하는 예:
      • kubectl edit configmap kube-proxy -n kube-system
    • 로깅 레벨이 config.conf 파일의 v 플래그를 통해 설정됩니다.
  5. kube-proxy 재시작:
    • 설정을 변경한 후에는 kube-proxy를 재시작해야 할 수 있습니다. 이는 해당 POD를 삭제하면 쿠버네티스가 자동으로 재시작합니다:
      • kubectl delete pod -n kube-system -l k8s-app=kube-proxy
  6. kube-proxy의 버전 업그레이드:
    • 클러스터 전체를 업그레이드하면 kube-proxy도 업그레이드됩니다. 이는 kubeadm upgrade 명령어를 사용하여 수행할 수 있습니다.

각각의 변경 사항이 적용되었는지 확인하려면, kube-proxy 로그를 확인하거나, 변경한 설정이 예상대로 작동하는지 테스트해야 합니다. 변경 사항이 적용되지 않았거나 문제가 발생하는 경우, 쿠버네티스 문서나 커뮤니티 포럼에서 관련 정보를 찾거나 질문을 게시하여 도움을 요청할 수 있습니다.

 

문제시 대처방벙

1. kube-proxy 설정 확인 

    kubectl describe ds kube-proxy -n kube-system

    Command:
      /usr/local/bin/kube-proxy
      --config=/var/lib/kube-proxy/config.conf

2. kube-proxy pod가 kube-system namespac에 있는지 확인

3. kube-proxy log 확인

4.configmap이 올바르게 정의되어 있고 kube-proxy 바이너리를 실행하기 위한 구성 파일이 올바른지 확인하세요.

728x90
반응형