쿠버네티스는 (도커가 생성한) 컨테이너를 관리하기 위한 도구이다.
🐋도커의 컨테이너
도커는 운영 체제 수준의 가상화를 통해 격리된 여러개의 컨테이너 애플리케이션을 실행할 수 있다.
가볍고, 효율적이고, 빠르게!
vegrant
로 코드를 풀어서 Virtual Box
에 노드를 업로드 하는 작업을 거친다.
이를 통해서, Virtual Box내 CentOS 가상머신에 마스터 노드부터 워커노드들 까지 쭉 올라가게 된다.
환경이 구성된 이후 Super Putty
로 Putty를 사용하여 각 워커노드(호스트)에 접근하여 사용할 수 있다.
쿠버네티스는 컨테이너를 관리하기위한 🛳️오케스트레이션
이다.
Pod란 쿠버네티스에서 가장 작은 단위로, 컨테이너(도커로 생성한 서비스)의 집합이다.
따라서 파드를 사실 서비스의 단위라고 생각해도 무방하다.
대부분의 서비스는 실제로 1:1 관계로 Pod 1 :컨테이너 1
관계로 사용되기 때문이다.
kubectl run nginx --image=nginx
run nginx
: 생성과 동시에 실행 되는 파드의 이름--image=nginx
: 사용하려는 이미지kubectl get pod
여기서 파드가 생성되는 위치 확인은 다음 명령어로 할 수 있다.
kubectl describe pod nginx
이 때, 파드가 배포되는 위치는 워커 노드(VM)중 k8s 클러스터의 스케줄링 알고리즘을 통해 랜덤하게 배정된다.
현재는 제 2번 워커노드에 파드가 생성된 것을 확인할 수 있다.
curl 172.16.103.129
테스트를 위해 Client url(curl)
명령어를 실행해보자.
배포된 파드의 IP주소로 URL 데이터를 전송하여 nginx 서버가 정상작동하는 지 테스트 할 수 있다.
쿠버네티스에서 서비스(Service)는 클러스터 내의 파드들에 외부에서의 네트워크 접근을 제공한다.
서비스는 파드들에게 고정적인 주소를 할당하여 외부 네트워크 또는 클러스터 내의 다른 파드들이 파드 그룹에 접근할 수 있게 해준다.
자세한 설명은 다음을 참고 ♥️ HERE
외부에 노출시키기 위한 설정은 다음과 같다.
kubectl expose pod nginx --type=NodePort --port=80
해당 노드의 IP와 32206이라는 노드포트를 통해서 nginX가 있는 파드로 서비스를 통해 외부에서 접속할 수 있다.
332206과 같이 노드 포트(nodePort)를 지정하면 사용자는 해당 IP와 노드 포트를 조합하여 웹 어플리케이션에 접근할 수 있다.
과정을 나열하자면, 외부에서 노드(vm)를 타고 서비스로, 서비스에서 파드로, 파드에서 컨테이너로, 컨테이너에서 웹 어플리케이션(80번 포트)으로 접근할 수 있다.
여기서 80번 포트는 클러스터 내부에서 웹 애플리케이션에 연결하기 위해 사용되는 포트입니다.
웹 페이지에 http://192.168.1.10:32206/와 같이 입력할 때, 80번 포트를 사용하여 클러스터 내의 웹 서비스에 연결됩니다. 따라서, 이 포트는 클러스터 내부에서 웹 애플리케이션(nginX)과 통신하기 위한 포트입니다.
외부(내 컴퓨터)에서 가상환경 내 웹 애플리케이션으로 잘 접속되는 것을 확인 할 수 있다.
이를 해결하기 위한 방법이 바로 ➡ 디플로이먼트
kubectl run nginx --image=nginx
위 명령어를 통해 랜덤한 노드에 파드가 하나만 배포되어있는 상황이었다.
하지만 우리가 원하는 상태는 여러 파드를 예비대역으로 모아 둔 상태 즉, deployment이다.
deployment는 파드를 모아둔 것이라고 생각하면 된다.
이제 이를 배포하기 위한 명령어를 알아보자.
버전이 업그레이드 되어 deployment는 kubectl run으로 배포할 수 없다.
kubectl run은 단일 파드를 사용하는 용도로 테스트 할 때만 사용되므로 잘 사용되지 않는다.
둘 중 하나의 방법을 사용하면 된다.
kubectl create deployment deploy-nginx --image=nginx
이렇게 명령어를 통해서 하게되면 하나의 디플로이먼트로 생성한 하나의 파드만 배포된다.
이후 여러개를 배포하기 위해서는 레플리카 셋을 이용해서 다수의 파드를 배포하는 과정을 거쳐야한다.
디플로이먼트로 다수의 파드를 배포하려면 아래 명령어를 통해 레플리카 셋의 값을 늘려주면 된다.
kubectl scale deployment deploy-nginx --replicas=3
기본적으로 default 값의 1에 맞는 파드에서 3의 값에 맞는 파드의 수가 3개로 늘어나게 된다.
kubectl get pods -o wide
이 명령어를 통해 파드를 확인해보면 각 vm에 생성된 걸 확인할 수 있다.(스케쥴링에 의하여)
노드포트로 디플로이먼트(여러개의 파드)를 노출해보자.
다음과 같이 명령어를 수행하면 31575 노드 포트를 통해서 외부에서 접근할 수 있는 것을 확인할 수 있다.
이제 그 다음단계인 노드(VM)포트를 타고 서비스에, 서비스에서 해당 파드로 접속해보자.
아이피는 이전 파드가 하나일 때랑 동일하게 사용하면 된다.
하지만 이처럼 노드의 아이피를 알려주는 것은 사실 너무나 위험부담이 크다.
따라서 디플로이먼트를 사용할 경우에는 로드밸런서를 사용한다!
로드밸런서를 사용하면 여러 장점이 있다.
1. 로드밸런서는 고유의 IP를 가지므로, 노드의 아이피를 노출할 필요가 없다.
2. 가야하는 길을 최적화 할 수 있다.
3. 트래픽의 분산이 가능.
kubectl apply -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
kubectl create deployment chk-hn --image=sysnet4admin/chk-hn
kubectl scale deployment chk-hn --replicas=3
expose deployment chk-hn --type=LoadBalancer --port=80
결과를 확인해보면? 192.168.1.11 이라는 IP로 디플로이먼트한 파드들이 노출되는 하나의 IP주소가 생겼습니다.
이제 만들었던 실습파일들을 깔끔하게 지우고, 실행하도록 합시다.
컨테이너(어플리케이션)을 모아둔 것은?
➡ Pod (파드)
파드를 모아둔 것은?
➡ 디플로이먼트
reeplicaset을 통해서 파드의 수를 늘릴 수 있었다.
쿠버네티스에서 서비스란?
➡ 외부에 애플리케이션을 배포하는 것! (접근할 수 있도록 문을 열어주는 것)
NodePort와 LoadBalancer
deployment 삭제
kubectl delete deployments deploy-nginx
pod 삭제
kubectl delete pod nginx
서비스 삭제
kubectl delete service deploy-nginx
kubectl delete service nginx
이제 kubectl get pods를 해보면 깔끔하게 지워진 것을 확인할 수 있다.
service 또한 동일하게 디폴트인 ClusterIP를 제외하고 전부 다 잘 지워져 있다.
설치했던 meteLB또한 삭제해보자.
kubectl delete -f ~/_Lecture_k8s_starter.kit/ch2/2.4/metallb.yaml
로드밸런서를 설치했던 파일의 위치에 명령어 앞에 kubectl delete를 붙여주면 전체가 다 삭제된다.