쿠버네티스 Kubernetes, K8S 기초

d4v1d·2022년 3월 4일
0

Docker & Kubernetes

목록 보기
3/8

개요

시작하세요! 도커/쿠버네티스의 내용을 공부하여 정리한 포스트입니다! 🌈

쿠버네티스를 로컬에서 간단히 테스트하는 예제를 따라가는 포스트입니다. Docker Desktop for Mac/Windows가 설치되어있어야 합니다.

설치

쿠버네티스 설치 환경 종류

Docker Desktop for Mac/Windows 혹은 Minikube를 설치했다면 쿠버네티스를 함께 사용할 수 있으므로 별도로 설치하지 않아도 됩니다. 하지만 이러한 방식은 로컬 노드를 standalone 모드(단일 노드로 컨테이너를 구동)로 사용하기 때문에 쿠버네티스의 기능을 완벽하게 사용하기에는 무리가 있습니다. 쿠버네티스의 핵심 기능은 여러 서버의 자원을 클러스터링하여 컨테이너를 배치하는 것인데, 단일 노드로는 이를 확인할 수 없기 때문입니다.

  • Docker Desktop > Preferences > Kubernetes > Enable Kubernetes 체크하기

시작하기

쿠버네티스만의 고유한 특징

모든 리소스는 오브젝트 형태로 관리된다.
쿠버네티스는 대부분의 리소스를 '오브젝트'로 관리하는데, 컨테이너의 집합(파드pods), 컨테이너 집합을 관리하는 컨트롤러(레플리카 셋Replica set), 사용자Service account, 노드Node까지도 하나의 오브젝트로 사용할 수 있습니다.

  • 다양한 K8S 오브젝트 종류들
  • 특정 오브젝트의 description 보기 (예: pod)

쿠버네티스는 kubectl로 사용 가능하지만, yaml 파일을 더 많이 사용한다.
쿠버네티스에서는 yaml 파일에 컨테이너 정보는 물론 컨테이너의 설정값(ConfigMap), 비밀값(Secrets) 등을 담아서 사용합니다. 실제로 서비스를 배포할 때에도 kubectl 명령어를 사용하는 것이 아니라 여러 개의 yaml 파일을 정의해 쿠버네티스에 적용하는 방식으로 동작합니다. 그러므로 모든 리소스 오브젝트는 대부분 yaml 파일로 작성되며, 이 yaml 파일을 잘 작성하는 것이 쿠버네티스를 잘 사용하는 방법이라고 봐도 무방합니다!

쿠버네티스는 여러 개의 컴포넌트로 구성되어 있다.
쿠버네티스 노드의 역할은 크게 마스터/워커로 나누어집니다.

  • 마스터master 노드 쿠버네티스가 제대로 동작할 수 있게 클러스터를 관리합니다.
  • 워커worker 노드 실제 애플리케이션이 구동되는 컨테이너가 생성됨
    마스터 노드에서는 API 서버(kube-apiserver), 컨트롤러 매니저(kube-controller-manager), 스케줄러(kube-scheduler), DNS 서버(coreDNS) 등이 실행되며, 모든 노드에서는 오버레이 네트워크 구성을 위해 프록시(kube-proxy)와 네트워크 플러그인(calico, flannel 등)이 실행됩니다.
    또한, 쿠버네티스 클러스터 구성을 위해 kubelet이라는 에이전트가 모든 노드에서 실행됩니다. kubelet은 컨테이너의 생성, 삭제뿐만 아니라 마스터-워커 노드 간 통신 역할을 담당하는 중요한 에이전트입니다.

kubectl

docker 명령어와 비슷하게, 쿠버네티스의 여러 기능들을 CLI에서 실행할 수 있는 명령어가 있습니다. 바로 kubectl입니다!

Kubernetes Cheat Sheet

  • kubectl version --short kubectl의 client, server 버전을 확인합니다.
» kubectl version --short
Client Version: v1.22.5
Server Version: v1.19.16
WARNING: version difference between client (1.22) and server (1.19) exceeds the supported minor version skew of +/-1
  • kubectl apply yaml 파일 등 쿠버네티스 리소스를 정의하는 파일로부터 애플리케이션을 관리합니다. 클러스터에 리소스를 생성하고 업데이트합니다.
kubectl apply -f ./my-manifest.yaml            # 리소스(들) 생성
kubectl apply -f ./my1.yaml -f ./my2.yaml      # 여러 파일로 부터 생성
kubectl apply -f ./dir                         # dir 내 모든 매니페스트 파일에서 리소스(들) 생성
kubectl apply -f https://git.io/vPieo          # url로부터 리소스(들) 생성
kubectl create deployment nginx --image=nginx  # nginx 단일 인스턴스를 시작
  • kubectl get 특정 오브젝트의 목록을 확인합니다.
kubectl get pods    # 파드 목록
kubectl get service # 서비스 목록

파드pod

파드는 컨테이너 애플리케이션의 기본단위이며 동시에 컨테이너 애플리케이션을 배포하기 위한 기본 단위입니다. 파드는 1개 혹은 그 이상의 컨테이너로 구성된 컨테이너 집합입니다.

# Nginx 컨테이너로 구성된 파드를 직접 생성하는 yaml 파일 예시
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

쿠버네티스의 yaml 파일은 일반적으로 apiVersion, kind, metadata, spec 네 가지 항목으로 구성됩니다.

  • apiVersion yaml 파일에서 정의한 오브젝트의 API 버전
  • kind 리소스의 종류(kubectl api-resources 명령어의 KIND 항목에서 확인 가능)
  • metadata 리소스의 부가 정보(label, annotation, name 등)
  • spec 리소스를 생성하기 위한 자세한 정보(파드에서 실행될 컨테이너 정보, 도커 이미지 정보, 포트 정보 등)

kubectl apply -f <yaml 파일 이름> 명령어를 통해 쿠버네티스에 파드를 생성할 수 있습니다.

» kubectl apply -f nginx-pod.yaml
pod/my-nginx-pod created

실행 결과

» kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
my-nginx-pod   1/1     Running   0          40s

이 Nginx 파드를 생성할 때 yaml 파일에 containerPort로 사용할 포트를 정의했지만, 외부에서 접근할 수 있도록 노출된 상태는 아닙니다. 따라서 파드의 Nginx 서버로 요청을 보내려면 파드 컨테이너의 내부 IP로 접근해야 합니다.

kubectl describe 명령어를 통해 생성된 리소스의 자세한 정보를 확인할 수 있습니다.

kubectl describe pods <파드 이름>

» kubectl describe pods my-nginx-pod
Name:         my-nginx-pod
Namespace:    default
Priority:     0
Node:         docker-desktop/192.168.xxx.xxx
Start Time:   Fri, 11 Mar 2022 09:49:53 +0900
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.xxx.xxx.xxx
# ...

파드 describe 결과에서 파드의 IP 주소를 확인할 수 있습니다. 이는 외부에서 접속할 수 없고(나중에 다룰 서비스service 오브젝트를 생성하면 쿠버네티스 외부에서도 접근이 가능합니다!) 클러스터 내부에서만 접근할 수 있기 때문에, Nginx 파드에 직접 접속해보겠습니다.

먼저 클러스터 노드 중 하나에 접속해야 합니다.
kubectl exec <파드 이름> -it -- bash
실행중인 파드의 셸에 접속할 수 있습니다.

» kubectl exec my-nginx-pod -it -- bash
root@my-nginx-pod:/# 

이 셸에서, 위에서 확인한 Nginx 파드의 IP로 HTTP 요청을 전송해봅시다!
curl <파드의 IP 주소>
Nginx 파드가 HTTP response를 보낸 것을 확인할 수 있습니다! 뿌듯🏅

root@my-nginx-pod:/# curl 10.xxx.xxx.xxx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
	...
</style>
</head>
<body>
	...
</body>
</html>

파드 삭제는 kubectl delete -f <yaml 파일 이름> 또는 kubectl delete <파드 이름>

» kubectl delete -f nginx-pod.yaml
pod "my-nginx-pod" deleted
------------------------------------------------------------------------------------------------
» kubectl get pods
No resources found in default namespace.

수정중 ✏️

profile
데이터 엔지니어/백엔드 개발자 d4v1d의 개발 일지🐯

0개의 댓글