본문 바로가기
자바 , 기타 공부/클라우드 공부

K8S (쿠버네티스란?)

by 임지혁코딩 2024. 2. 3.

 

사람들이 docker가 무엇이냐고 물어보면? 가장 유명한 컨테이너화 시스템이라고 설명하면 간단하다. 

 

docker container로 application을 관리할 수 있다. 허나,

수많은 docker container들을 관리해야할 필요 또한 있을 것이다.

이 관리는, 단순히 관리 정리 뿐만 아니라 자동화 개념을 포함한다.

 

AWS를 사용한다는 의미가 KUBERNETES도 사용하지 않고 그냥 AWS 그 자체로 컨테이너 관리 등 모든 것을 진행함이 아님에 주의하자. 구글 클라우드, 혹은 애저 등 다양한 클라우드 환경에서 동작할 수 있음에 주의하자. 

 

DOCKER 내부에도 이러한 관리 프로그램인 DOCKER SWARM이 존재한다.

SWARM은 K8S보다 작업이 간단하다. 허나 K8S로 할 수 있는 것이 더욱 많다. 

 

 

<POD에 대한 개념 재정리>

 

K8S WEBSITE에선 POD를

둘 이상 의 컨테이너의 그룹이라고 정의하였다. 

 

DOCKER가 컨테이너를 생성하고 내부를 관리하고, 쿠버네티스가 DOCKER CONTAINER를 관리한다면

POD는 그 CONTAINER들의 포장지가 된다. 

 

대부분은 POD가 CONTAINER와 1:1 매핑이된다. (물론 1개의 POD에 여러 CONTAINER를 넣을 수 있다.)

(Container간의 동작이 혼자선 불가능할때, 즉 CONTAINER A의 작업 일부를 B가할때)

(우리의 졸업작품중 결제 서비스는, 그렇다면 같은 POD에 결합되어 사용될 수 있을 것 같다.)

 

그럼 1개의 CONTAINER를 1개의 POD로 묶을때는 굳이 왜 POD를 쓸까?

 

K8S는 POD가 올바르게 동작하는지, 혹은 용량을 잘 사용하고 있는지 등을 관리한다. 

 K8S의 동작 단위는, 엄격하게는 POD가 된다. 

(간단하게만 설명하자면, 그 동작 서버는 node라고 부른다)

 

<POD의 생성> 

https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

 

Pod

Pod is a collection of containers that can run on a host.

kubernetes.io

 

래퍼런스를 찾아왔다.

 

 

atom 편집기를 활용, img 파일을 생성하였다.

 

 

kubectl get all을 통해, pod, service 등등 모든 kubectl관련 사항을 보여준다. 

이 포인트는, endpoint로써, 저 port에 내 모든 명령을 전달한다(https를 사용함을 알 수 있다)

 

생성한 yaml형태의 img파일을 보고, 그 명령에 따라 pod을 생성하였다. 

(내부 port는 80을 사용할 것이다. HTTP 형태 애플리케이션이기때문에 80포트를 사용한다)

 

<pod는 kubectl 외부에선 보이지 않는다>

 

우리현재 해당 컨테이너가 내부적으로 80번 포트를 사용함을 알 수 있다. 

pod는 kubernetes 적용 범위(cluster)의 밖에서 확인할 수 없다! 

즉 , 웹브라우저에서 직접적으로 pod에 접근할 수 없다. -> ip를확인해서 8080으로 접속하면 접속되지 않는다.

접속을 원한다면? container를 동작시켜 웹브라우저와의 연결을 진행시켜줘야한다.

 

kubectl describe pod pod이름

을 통해, pod의 오류 발생시 이를 확인할 수 있다. 

 

 

webapp pod의 , 루트 디렉토리를 확인할 수 있다. 

 

사용자의 html -> 쿠버네티스와의 통신을 고민해보자 

CONTAINER 내부에 SHELL을 만들고, 80번 PORT의 LOCALHOST를 실행한다.

그러면 배치해놓은 POD 내부의 웹 서버가 임의 파일에 반응할 것이다. 

 

kubectl -it exec webapp sh

명령어로, shell을 생성하였다.  그러나 localhost://8080으로 접속할 수는 없었다.

 

즉 , POD의 내부에 WEB SERVER가 포함된다. 

POD의 외부에서는 이 WEB SERVER에 임의로 접근할 수 없다. 

(새로운 도구가 필요하다)

 

앞서 CONTAINER를 DOCKERHUB에서 IMG를 받아와 8080 PORT와 통신한  예시의 비밀을 분석할 필요가 있다. 

 

POD의 생성 목적이, 이를 사용하고 버릴 수 있음을 기억하자. 

즉 추가적인 개념이 필요한데, 그것이 Service이다.

 

clieet -> Service (service가 연결할 포드를 찾는다) ->kubernetes cluster 과 같이 연결하낟( 매우 간략화 한 개념)

 

POD의 label을 통해 마치 KEY:VALUE를 생성한다.

EX) APP : WEBAPP  .

 

SERVICE는 SELECTOR라는 KEY:VALUE를 생성한다

EX) APP :WEBAPP . 이후엔 SERVICE는 POD와 해당 KEY:VALUE를 활용하여 연결한다. 

 

<SERVICE 생성 예제>

 

webapp-service.yaml을 생성하였다. 

 

TYPE이 CLUSTERIP일때는, KUBERNETES CLUSTER 내부에서만 접근할 수 있고 웹브라우저론 접근할 수 없다.

TYPE이 NodePort일때는, Node(여기에선 Cluster가 그 단위가 된다) 외부에 특정 port를 노출할 수 있다.

(이 경우엔 ports:nodePort:를 통해 port number를 적어줄 수 있다. 다만, 80으로 굳이할 필요 없다 30080도 된다)

 이때는 30080이 외부 노출, 내부 연결은 80포트로 진행한다. 

 

내부를 보면 POD 생성시 YAML와 그 형태가 유사하나, 

TYPE,SELECTOR,PORTS와 NODEPORT정도만 변경됨을 확인할 수 있다 .

 

완성됨을 확인하자, fleetman-webapp 이 내부는 80, 외부는 30080 port를 사용한다. 

 

그럼에도 아직 연결되지 않는 이유는 무엇일까? 

 

apiVersion:  v1
kind:  Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
    - name : webapp
      image: richardchesterwood/k8s-fleetman-webapp-angular:release0

 

apiVersion: v1
kind: Service
metadata:
  name: fleetman-webapp
spec:
  selector:
    app: webapp
  ports:
    - name: http
      port: 80
  type: NodePort

 

이와 같이 key:value를 맞추어 주었다. 

또한 NodePort를 사용하여 .. 연결이 되게 하였다. 

 

<문제 발생>

 

현재, 문재가 발생한다. NodePort를 활용하여 외부와 연결하게 service를 통해 진행했는데,

kubectl port-forward webapp 30080:80

이렇게 내가 임의로 포트 포워딩을 해주지 않으면 service가 pod 와 연결해주지 못한다.. 반드시 해결이 필요하다.