따라하며 배우는 쿠버네티스 - 입문(1)

🎯 들어가기 앞서

이 글은 따라하며 배우는 쿠버네티스의 이성미 강사님의 강의내용을 함께 제가 공부한 내용과 함께 정리한 문서입니다. 🤗

강사님이 워낙 잘 가르치셔서 이해가 잘 안 가는 내용이 있다면 직접 들으시는 걸 추천합니다. 무료 강의지만 개인적으로 들었던 강의 중 가장 좋았습니다.

처음 접하는 분들도 최대한 이해하기 쉽게 써보려 노력했는데 이해하기 어려운 부분이나 잘못된 내용이 있다면 언제든지 피드백 부탁드립니다! 😍

저는 katacoda kubernetes playground를 통해 웹 환경에서 실습했습니다. katacoda를 사용하는 경우 launch.sh만 실행하면 특별한 설치가 필요 없이 k8s를 실습해볼 수 있습니다.

1. Kubernetes 소개

컨테이너란

데스크탑, 클라우드 등 어디서든 코드를 통해 가상으로 원하는 OS를 고르고, 자원(cpu, 메모리, ...)을 할당하며 애플리케이션을 실행할 수 있도록 하는 소프트웨어 실행 유닛입니다.

애플리케이션을 컨테이너화해서 만든 결과물을 컨테이너 이미지라고 합니다.

애플리케이션을 컨테이너화하면 어떤 환경에서든 실행할 수 있으며(linux, Windows, Mac Os 등 환경이 달라서 장애가 발생하는 일이 없다는 말입니다.), 운영 환경을 맘대로 정할 수도 있고 낮은 사양으로도 애플리케이션을 실행할 수 있으며, 배포, 관리 등이 편하다는 장점 등을 가지고 있습니다.

가상 머신과는 달리 모든 인스턴스에 OS를 설치할 필요 없이 자신의 OS 기능과 리소스를 활용합니다. 따라서 간편하게 활용할 수 있어 소형이고 빠르며 어디서든 적용할 수 있습니다.

kubernetes란?

워커 노드들 중에서 어떤 노드에 어떤 애플리케이션을 실행할지, 어떤 노드에 장애가 생기면 다른 어떤 노드에서 failover를 해줄지 등을 총괄합니다.

  • 마스터 노드 : 전체 시스템을 관리하고 통제하는 하나의 시스템입니다. control plane이라고 합니다.
  • 워커 노드 : 마스터 노드의 명령에 따라 애플리케이션 실행을 담당하는 하나의 시스템입니다.
  • failover : 장애 극복 기능. 서버, 시스템, 네트워크 등에서 이상이 생겼을 때 다른 시스템으로 자동전환되는 기능을 말합니다.

즉, kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리하는 컨테이너 오케스트레이션 툴입니다.

kubernetes는 구글에서 제작한 오픈소스이며 k8s라고도 합니다.

kubernetes의 장점

  • 워크로드 분리 : 애플리케이션들이 분리되어 각 기능에 집중할 수 있지만, 서로 통신은 가능합니다.
  • 환경에 종속받지 않음
    • 온프레미스(데스크탑, 회사 내 전산실 등 자체 환경), 퍼블릭 클라우드(AKS, EKS, GKE, ...) 등 어디서나 실행할 수 있습니다.
  • 선언적 API : k8s에게 요청하면 k8s가 현재 상태를 알아서 판단해서 가장 알맞은 요청을 수행합니다.
    • 이러한 특성 때문에 Ops(운영자) 없이 개발이 가능합니다. k8s가 알아서 관리하기 때문입니다. 이러한 특성을 NoOps라고 합니다.

3-1. kubectl 실습 / 실습 환경 구성하기

kubectl이란?

앞에서 말한 선언형 API를 수행하는 주체입니다. kubectl을 통해 쿠버네티스에 명령을 실행하면 쿠버네티스가 알아서 컨테이너들을 관리합니다. 즉 쿠버네티스 명령어라고 생각해도 좋습니다.

kubectl 명령어 기본구조

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

command : 자원(object)에 실행할 명령. create, get, delete, edit, ...
type : 자원의 타입. node, pod, service, ...
name : 자원의 이름
flags : 부가적으로 설정할 옵션. --help, -o options wide

kubectl 명령어 자동완성

다음 명령어를 입력해 등록해 놓아야 tab을 눌러 kubectl 자동완성 기능을 사용할 수 있습니다.

katacoda를 이용하는 분들은 이미 설정되어있기 때문에 설정할 필요가 없습니다.

source <(kubectl completion bash)
source <(kubeadm completion bash)

echo "source <(kubectl completion bash)">> ~/.bashrc
echo "source <(kubeadm completion bash)">> ~/.bashrc

kubectl 명령어들

굳이 외울 필요는 없고 쓰다보면 익혀집니다.

kubectl --help
kubectl [command] --help
kubectl run <자원이름> <옵션>
kubectl create -f obj.yaml
kubectl apply -f obj.yaml
kubectl get <자원이름> <객체이름>
kubectl edit <자원이름> <객체이름>
kubectl describe <자원이름> <객체이름>

get을 통해 자원 혹은 객체에 대한 상태를 확인할 수 있습니다.
describe를 통해 자원 혹은 객체의 상태에 대한 아주 자세한 내용을 확인할 수 있습니다.

kubectl delete pod main
kubectl api-resources

api에 대한 축약어 등을 확인할 수 있습니다.

3-2. kubectl command / pod 생성하기

실습 : kubectl 명령어 예시

kubectl get nodes
kubectl get nodes -o wide
kubectl describe nodes controlplane

describe를 통해서는 OS 정보, 이를 활용해 생성할 수 있는 pod의 수 등 자세한 내용을 알 수 있습니다.

실습 : nginx pod 생성해보기

kubectl run webserver --image=nginx:1.14 --port 80
kubectl get pods
kubectl describe pod webserver

nginx는 웹서버기 때문에 80포트를 열어 생성했습니다. get을 통해 생성/생성중임을 확인할 수 있고, 생성중이라면 describe를 통해 어떻게 생성중인지 자세히 확인할 수 있습니다.

curl 요청을 통해 nginx가 잘 작동중인지 확인할 수 있었습니다.

kubectl create deployment mainui --image=httpd --replicas=3

혹은,

kubectl create deployment mainui --image=httpd
kubectl scale deployment/mainui --replicas=3

쿠버네티스 버전에 따라 --replicas 명령어가 지원되지 않는 경우가 있습니다. katacoda에서는 지원이 안 되었는데 이런 경우 우선 생성해놓고 deployment 실행한 뒤, 나중에 kubectl scale deployment/mainui --replicas=3을 입력해서 확장할 수 있습니다.

run과 create의 차이는 run은 파드 1개만 생성하고 관리해주는 데 반해, create는 그룹 내 파드를 1개 생성하고 관리해준다고 생각할 수 있습니다. 즉, create를 통해 생성한 경우 동일한 파드를 여러개 생성할 수 있습니다.

이제 webserver 컨테이너 안으로 접속해 nginx의 기본 웹사이트를 변경해 보도록 하겠습니다.

kubectl exec webserver -it -- /bin/bash

--뒤에는 컨테이너 안에 적용시킬 명령어를 적습니다. 지금 경우에는 컨테이너 내부로 접속할 것이기 때문에 /bin/bash를 적습니다.

cd /usr/share/nginx/html/
echo "Jerry's web" > index.html
exit

다시 한 번 curl 명령으로 GET 명령을 보내 웹사이트가 변경된 것을 확인할 수 있습니다.

kubectl logs webserver

logs 명령을 통해 해당 파드에서 발생한 로그들을 확인할 수도 있습니다.

그런데 우리가 curl을 통해 접속할 때는 ip를 통해 접속할 수 있지만, 외부에 있는 사용자는 접근할 수 없습니다. 이럴 때 우리는 포트 포워드라는 것을 사용해서 접근시킬 수 있습니다.

kubectl port-forward webserver 8080:80

이 말은 다른 곳에서 8080으로 접속하면 80으로 매치시켜서 접속시켜주겠다는 말입니다.

터미널을 또 하나 열어 확인해 봤을 때 8080 포트로도 접속 가능한 것을 알 수 있습니다.

혹여나 현재 얘기하는 것들이 이해가지 않더라도 괜찮습니다! 지금은 어떠한 것들이 있는지 살펴보는 단계니까요 😃 그냥 이런 식으로 명령어를 사용하는 거구나 하고 넘어가시면 됩니다.

kubectl edit deployments.apps mainui

edit 명령어를 활용해 vi로 현재 실행중인 컨테이너의 내용을 수정할 수도 있습니다. 예를 들어 아까 만든 deployments의 mainui의 replica의 내용을 5로 수정하면 5개로 바꿀 수 있습니다.

하지만 아쉽게도 katacoda에서는 vi를 제대로 지원하지 않는 것 같습니다. 원래는 여기서 더 내려가서 spec의 replica를 수정해야 하는데 더 내려가지 못하네요 😭 따라서 우선 그냥 넘어가겠습니다.

이번엔 pod 정보를 yaml 파일로 만들어 보겠습니다.

kubectl run webserver --image=nginx:1.14 --port 80 --dry-run \
-o yaml > webserver-pod.yaml

--dry-run 명령어를 이용하면 실행 테스트를 해볼 수 있습니다. 이를 위해 추가했고, 해당 pod의 정보를 webserver-pod.yaml파일로 만들 수 있습니다.

그럼 이제 파드를 생성할 수 있는 yaml파일을 하나 생성한 것입니다.

이번엔 pod들을 제거해 보겠습니다. pod 제거는 delete를 활용하면 됩니다.

이번엔 yaml 파일을 통해 pod를 생성해 보겠습니다.


오늘은 k8s의 기본적인 내용과 명령어를 알아봤습니다.

katacoda는 환경을 세팅할 필요가 없어서 좋긴 한데 자꾸 세션이 끊어지는 점이나, 느린 반응속도, vi를 활용할 수 없음은 너무 불편하네요 😭

다음번에는 m1 환경에서 여러 노드를 만들 수 있는 방법을 찾아봐야 할 것 같습니다.

틀린 내용이나 이해가 안 가는 내용에 대한 내용이 있다면 언제든 말해주세요! 적극 반영하겠습니다! 🥰

좋은 웹페이지 즐겨찾기