[kubernetes] 쿠버네티스 기초 (환경 구성 및 간단한 예제)

vinca·2023년 10월 26일
0

☸️ kubernetes

목록 보기
1/35
post-thumbnail
post-custom-banner

☸️쿠버네티스란?

쿠버네티스는 (도커가 생성한) 컨테이너를 관리하기 위한 도구이다.

🐋도커의 컨테이너
도커는 운영 체제 수준의 가상화를 통해 격리된 여러개의 컨테이너 애플리케이션을 실행할 수 있다.
가볍고, 효율적이고, 빠르게!

쿠버네티스의 종류

관리형 쿠버네티스

  • EKS, Azure, GCP등에서 사용하는 쿠버네티스
    사용자가 특별히 관리할 것이 없고, 필요한 것을 사용자가 올려서 사용하는 것

설치형 쿠버네티스

  • RANCHER, OPENSHIF 등
    필요한 쿠버네티스에 필요한 여러 내용을 붙여서 배포용 쿠버네티스를 만든 것.

구성형 쿠버네티스

  • Kubeadm, kops 등
  • 요구사항에 맞게 필요한 환경을 직접 "자유롭게" 구성하도록 해주는 쿠버네티스
  • 직접 구성이 가능하므로 교육용으로 또한 적합하다.

실습 환경 구성

깃허브 다운로드 링크

vegrant로 코드를 풀어서 Virtual Box에 노드를 업로드 하는 작업을 거친다.
이를 통해서, Virtual Box내 CentOS 가상머신에 마스터 노드부터 워커노드들 까지 쭉 올라가게 된다.

Super Putty

다운로드 링크

환경이 구성된 이후 Super Putty로 Putty를 사용하여 각 워커노드(호스트)에 접근하여 사용할 수 있다.


기본 개념

Pod

쿠버네티스는 컨테이너를 관리하기위한 🛳️오케스트레이션이다.

Pod란 쿠버네티스에서 가장 작은 단위로, 컨테이너(도커로 생성한 서비스)의 집합이다.

따라서 파드를 사실 서비스의 단위라고 생각해도 무방하다.
대부분의 서비스는 실제로 1:1 관계로 Pod 1 :컨테이너 1 관계로 사용되기 때문이다.

pod 생성

kubectl run nginx --image=nginx

  • run nginx : 생성과 동시에 실행 되는 파드의 이름
  • --image=nginx : 사용하려는 이미지

생성된 pod 확인

kubectl get pod

여기서 파드가 생성되는 위치 확인은 다음 명령어로 할 수 있다.

kubectl describe pod nginx

이 때, 파드가 배포되는 위치는 워커 노드(VM)중 k8s 클러스터의 스케줄링 알고리즘을 통해 랜덤하게 배정된다.

현재는 제 2번 워커노드에 파드가 생성된 것을 확인할 수 있다.

배포된 파드(nginx 컨테이너) 테스트

curl 172.16.103.129

테스트를 위해 Client url(curl) 명령어를 실행해보자.
배포된 파드의 IP주소로 URL 데이터를 전송하여 nginx 서버가 정상작동하는 지 테스트 할 수 있다.

외부 통신(Service)

쿠버네티스에서 서비스(Service)는 클러스터 내의 파드들에 외부에서의 네트워크 접근을 제공한다.

서비스는 파드들에게 고정적인 주소를 할당하여 외부 네트워크 또는 클러스터 내의 다른 파드들이 파드 그룹에 접근할 수 있게 해준다.

자세한 설명은 다음을 참고 ♥️ HERE

외부에 노출시키기 위한 설정은 다음과 같다.

kubectl expose pod nginx --type=NodePort --port=80

해당 노드의 IP와 32206이라는 노드포트를 통해서 nginX가 있는 파드로 서비스를 통해 외부에서 접속할 수 있다.

332206과 같이 노드 포트(nodePort)를 지정하면 사용자는 해당 IP와 노드 포트를 조합하여 웹 어플리케이션에 접근할 수 있다.

과정을 나열하자면, 외부에서 노드(vm)를 타고 서비스로, 서비스에서 파드로, 파드에서 컨테이너로, 컨테이너에서 웹 어플리케이션(80번 포트)으로 접근할 수 있다.

http://192.168.1.10:32206/

여기서 80번 포트는 클러스터 내부에서 웹 애플리케이션에 연결하기 위해 사용되는 포트입니다.
웹 페이지에 http://192.168.1.10:32206/와 같이 입력할 때, 80번 포트를 사용하여 클러스터 내의 웹 서비스에 연결됩니다. 따라서, 이 포트는 클러스터 내부에서 웹 애플리케이션(nginX)과 통신하기 위한 포트입니다.

ping, curl

외부(내 컴퓨터)에서 가상환경 내 웹 애플리케이션으로 잘 접속되는 것을 확인 할 수 있다.

파드가 1개? 그럼 죽으면 끝나는 거 아냐?

이를 해결하기 위한 방법이 바로 ➡ 디플로이먼트

kubectl run nginx --image=nginx
위 명령어를 통해 랜덤한 노드에 파드가 하나만 배포되어있는 상황이었다.

하지만 우리가 원하는 상태는 여러 파드를 예비대역으로 모아 둔 상태 즉, deployment이다.

deployment는 파드를 모아둔 것이라고 생각하면 된다.

이제 이를 배포하기 위한 명령어를 알아보자.

kubectl run

버전이 업그레이드 되어 deployment는 kubectl run으로 배포할 수 없다.
kubectl run은 단일 파드를 사용하는 용도로 테스트 할 때만 사용되므로 잘 사용되지 않는다.

그럼 어떤 명령어로?

둘 중 하나의 방법을 사용하면 된다.

  • kubectl create + scale 늘리기
  • kubectl apply + XML 파일

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

먼저 deployment로 관리되는 pod를 생성해줍니다.

kubectl create deployment chk-hn --image=sysnet4admin/chk-hn

delpoyment chk-hn에 있는 파드의 개수를 3개로 늘립니다.

kubectl scale deployment chk-hn --replicas=3

LoadBanlancer 형태로 웹 브라우저(80포트)에서 접근이 가능하도록 합니다.

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를 붙여주면 전체가 다 삭제된다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps
post-custom-banner

0개의 댓글