initmumu / DevOpsStudy

DevOpsStudy
4 stars 1 forks source link

DevOps Study 2주차 #2

Open initmumu opened 1 year ago

initmumu commented 1 year ago

3장 쿠버네티스로 컨테이너 실행하기

kbpark9898 commented 1 year ago

3.1 kubectl

kubectl [command] [TYPE] [NAME] [flags]

https://kubernetes.io/docs/tutorials/hello-minikube/

위 링크를 통해 minikube로 직접 클러스터를 로컬에 생성하고 서비스를 띄워볼 수 있다. (gcp 무료계정을 모두 사용한 사람은 minikube를 이용해 직접 실습을 진행할 수 있다.)

3.2 디플로이먼트를 이용해 컨테이너 실행하기

책에서는 kubectl get pods 명령어를 통해 pod의 정보를 확인한다. 이 때, describe 명령어를 사용하면 자원의 더 자세한 정보를 확인할 수 있다.

image

pod의 status

kubectl을 이용해 pod의 status 정보를 요청하면, 이 정보는 명확하게 Status 라는 field에 담겨서 나온다. 그런데 사실 k8s api에서 제공하는 pod 자원에 대한 정보는 훨씬 다양하다.

위 공식 문서에서 status 부분, 즉 PodStatus api의 응답 field를 살펴보면 kubectl로 요청한것처럼 단순하게 Status라는 field하나로 데이터가 내려오는것이 아님을 알 수 있다.

그렇다면 실제 서비스에서 k8s core api를 이용해 외부에서 자원을 요청하는 경우, 어떤 방법을 이용해 pod의 status를 결정할 수 있을까?

스크린샷 2023-03-01 오후 3 16 54

위의 사진은 k8s core api를 이용해 자세한 pod의 status 정보를 받아온 결과이다.

우선 status로 표기되는 running data를 phase field에서 찾아볼 수 있다.

그렇다면 이 데이터를 사용하면 될까??

스크린샷 2023-03-01 오후 5 05 58 스크린샷 2023-03-01 오후 5 06 19

잘못된 이미지로 deployment를 생성하고 CrashLoopbackOff status에 빠진 pod에 PodStatus core api를 실행해본 결과이다. 분명 kubectl로 얻어온 Status와 phase 값이 다른것을 알 수 있다.

그렇다고 conditions field를 이용하기엔 어떤 기준으로 특정 상태를 판별해야하는지 알 수 없다.

과연 어떻게 해야할까?

정답은 kubernetes dashboard의 공식 코드에 있다.

https://github.com/kubernetes/kubernetes/blob/00aae4c10c204d258e62a96f30970e9b91b29149/pkg/printers/internalversion/printers.go#L881-L905

kubernetes dashboard의 공식 코드를 살펴보면 pod이 포함한 모든 container들을 순회하고, 이 container들의 상태를 종합적으로 판단하여 status를 결정한다는 사실을 알 수 있다.

역시 뭐든 공식문서가 최고다.

image

실제로 특정 컨테이너의 waiting status에 대한 reason이 CrashLoopBackOff 인것을 살펴볼 수 있었다.

k8s obj로부터 yaml 설정파일 가져오기

스크린샷 2023-03-01 오후 5 15 54 스크린샷 2023-03-01 오후 5 16 07

3.3 클러스터 외부에서 클러스터 안 앱에 접근하기

안타깝게도 책의 예제는 제대로 동작하지 않는데, 그 이유는 책의 예제에서 사용하는 yaml 파일과 nginx 컨테이너의 기본설정간의 간극에 있다.

책의 예제에서 사용하는 yaml 파일은 nginx container의 리스닝 포트를 8080으로 설정한다.

하지만 container에 직접 접속해보면 nginx의 기본 리스닝 포트는 80으로 설정되어있는 것을 알 수 있다. image

따라서 암만 서비스를 이용하여 컨테이너 8080 포트를 터널링 해줘봤자, nginx는 8080 포트를 보고있지 않으므로 다음과 같은 화면을 볼 수 있다..

image

따라서 해결방법은 두가지가 존재한다.

  1. 예제 yaml 파일의 컨테이너 리스닝 포트를 80으로 변경 후 다시 deployment를 만들고 service로 터널링하기
  2. 예제 yaml 파일로 deployment를 실행하고, 직접 nginx container에 접속하여 nginx의 default service port를 8080으로 변경한 뒤 exec 명령어를 통해 nginx 재실행
    • image
    • image

필자는 두가지 방법이 모두 동작하는것을 확인했다. 이제 즐겁게 쿠버네티스를 공부하자.

p.s. 사실 이 문제에 대해 책 예제 공식 repo에 issue를 남기긴 했는데, 원작자께서 직접 볼지는 모르겠다..

원작자께서 위 이슈를 확인해주셨고, 수정 PR을 생성하게 되었다.

DrawingProcess commented 1 year ago

https://csj000714.tistory.com/739

initmumu commented 1 year ago

https://mumulab.tistory.com/entry/3-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4%EB%A1%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0

csw1511 commented 1 year ago

https://velog.io/@csw1511/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9E%85%EB%AC%B8-3%EC%B1%95%ED%84%B0