사람들이 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/
래퍼런스를 찾아왔다.
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 와 연결해주지 못한다.. 반드시 해결이 필요하다.
'자바 , 기타 공부 > 클라우드 공부' 카테고리의 다른 글
배포 실습/ 쿠버네티스를 활용한 배포 (0) | 2024.02.04 |
---|---|
Docker, Docker를 활용해 상대방의 image를 보고 container를 생성 (1) | 2024.02.03 |
명령어 실습 (0) | 2024.01.31 |
3주차 - Kubernetes 설계 (1) | 2024.01.10 |
3주차 (1) | 2024.01.03 |