DevOps/K8s

[K8s] 쿠버네티스 기초

cumo 2025. 4. 2. 12:49

쿠버네티스란 무엇인가?

**쿠버네티스(Kubernetes)**는 컨테이너화된 애플리케이션의 배포, 확장, 운영 자동화를 위한 오픈소스 플랫폼이다. 구글이 내부에서 운영하던 Borg 시스템에서 영감을 받아 개발되었고, 현재는 **Cloud Native Computing Foundation(CNCF)**의 주요 프로젝트로 관리되고 있다.

간단히 말하면, 쿠버네티스는 여러 서버에 걸쳐 컨테이너를 자동으로 배치하고, 트래픽을 분산시키며, 장애가 발생한 컨테이너를 복구하는 등의 기능을 수행하는 컨테이너 오케스트레이션 시스템이다.

쿠버네티스의 핵심 구성 요소

구성 요소설명
Pod 하나 이상의 컨테이너를 묶은 최소 배포 단위
Node 쿠버네티스가 관리하는 물리 또는 가상 서버
Cluster 하나 이상의 노드로 구성된 쿠버네티스 환경
Deployment 애플리케이션 배포 및 업그레이드를 관리
Service 외부 또는 내부 네트워크 접근을 위한 지속적인 IP 제공
ConfigMap & Secret 설정 파일이나 민감 정보를 클러스터에 안전하게 저장

쿠버네티스를 사용하는 이유

  1. 자동화된 배포 및 롤백
    kubectl apply 명령을 통해 애플리케이션을 선언적으로 배포하고, 문제가 생기면 자동으로 이전 상태로 롤백할 수 있다.
  2. 자체 복구(Self-healing)
    Pod가 비정상 상태가 되면 자동으로 다시 시작하거나 재배포한다.
  3. 수평 확장(Horizontal Scaling)
    리소스 사용량(CPU, 메모리 등)에 따라 애플리케이션을 자동 확장할 수 있다.
    예: 
  4. 서비스 디스커버리 및 로드밸런싱
    클러스터 내에서 서비스명을 통해 자동으로 통신하고, 외부 트래픽도 안정적으로 분산시킬 수 있다.
  5. 인프라 추상화
    AWS, GCP, Azure, 온프레미스 등 다양한 인프라에서 동일한 방식으로 애플리케이션을 실행할 수 있다.
kubectl autoscale deployment my-app --cpu-percent=50 --min=1 --max=10

자주 쓰이는 명령어 예시

# 클러스터 노드 상태 확인
kubectl get nodes

# 모든 네임스페이스의 리소스 보기
kubectl get all --all-namespaces

# 특정 Deployment 배포
kubectl apply -f deployment.yaml

# Pod 로그 확인
kubectl logs <pod-name>

# 인터랙티브 셸 진입
kubectl exec -it <pod-name> -- /bin/bash

 

 

쿠버네티스 특징

  • 워크플로 형태가 아닌 선언적인 시스템 구조를 가지고 추구하는 상태 선언시 현재상태와 추구 형태를
    맞추려고 노력함
  • 마스터노드 : 선언적인 시스템 구조 , 워커노드: 워크플로우 구조
  • API 서버는 업데이트시 마다 ectd를 확인하고 맞춤



2. 쿠버네티스 구성방법 

 2-1 쿠버네티스 설치

 

Worker 구성

 

보안그룹 &방화벽 설정

#보안그룹&방화벽 포트

컨트롤
프로토콜	방향	포트 범위	목적	사용 주체
TCP 인증	인바운드	6443	쿠버네티스 API 서버	모두
TCP 인증	인바운드	2379-2380	etcd 서버 클라이언트 API	kube-apiserver, etcd
TCP 인증	인바운드	10250	쿠벨렛 API	셀프, 컨트롤 플레인
TCP 인증	인바운드	10259	kube-스케줄러	자신
TCP 인증	인바운드	10257	kube-controller-manager	자신

Worker

프로토콜	방향	포트 범위	목적	사용 주체
TCP 인증	인바운드	10250	쿠벨렛 API	셀프, 컨트롤 플레인
TCP 인증	인바운드	10256	kube-proxy	자체, 로드 밸런서
TCP 인증	인바운드	30000-32767	NodePort 서비스 †	모두
TCP 인증	인바운드	22	    SSH 서비스 †	모두

공통
프로토콜	방향	포트 범위	목적	사용 주체
TCP 인증	인바운드	6784             셀프
UDP 인증	인바운드	6783-6784        셀프

 

설치 및 설정 ( manual :   kubeadm 설치하기 | 쿠버네티스)

#설치과정

sudo hostnamectl set-hostname k8s_cp #호스트 명 변경
sudo su - #관리자 권한 
cd /etc/modules-load.d/ #커널에 특정 기능 로드
/
vi k8s.conf
overlay # 컨테이너 상 파일 구성
br_netfilter # 컨테이너 간통신을 위한 브릿지 네트워크 활성
/
modprobe overlay #모듈 활성화
modprobe br_netfilter #모듈 활성화

/
cd /etc/sysctl.d/ #사용할 시스템 커널 매개변수 설정
vi k8s.conf
net.bridge.bridge-nf-call-iptables = 1 #커널 방화벽
net.bridge.bridge-nf-call-ip6tables = 1 # 브릿지 네트워크 패킷이 통과하도록 
net.ipv4.ip_forward = 1 # 시스템이 패킷을 다른 네트워크로 포워딩 하도록 설정

sysctl --system #변경사항 적용
/
dnf -y install containerd # CRI containerd 설치
systemctl --now  enable containerd
containerd config default | tee /etc/containerd/config.toml #toml 파일 생성
139행 -> SystemdCgroup = group로 변경
/
#쿠버네티스 레포지터리 추가
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
/
#쿠버네티스 설치
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl --now enable kubelet 
kubelet init
#CPU, 메모리 에러 시
kubeadm init --ignore-preflight-errors=Mem --ignore-preflight-errors=NumCPU
/
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

vi /etc/containerd/config.toml
139행 systemdCgroup = true
/
#쿠버네티스 실행
kubectl get pod 
/
#host 설정
vi /etc/hosts
/
#Flannel 설치
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
  
worker, cp IP 입력
확인


kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
#git으로부터 자동화 설치

kubectl get pod -A # 팟 설정

 

Node 구성

#설치과정

sudo hostnamectl set-hostname k8s_cp #호스트 명 변경

cd /etc/modules-load.d/ #커널에 특정 기능 로드

sudo su - #관리자 권한 
/
vi k8s.conf
overlay # 컨테이너 상 파일 구성
br_netfilter # 컨테이너 간통신을 위한 브릿지 네트워크 활성
/
modprobe overlay #모듈 활성화
modprobe br_netfilter #모듈 활성화
/
cd /etc/sysctl.d/ #사용할 시스템 커널 매개변수 설정
/
vi k8s.conf
net.bridge.bridge-nf-call-iptables = 1 #커널 방화벽
net.bridge.bridge-nf-call-ip6tables = 1 # 브릿지 네트워크 패킷이 통과하도록 
net.ipv4.ip_forward = 1 # 시스템이 패킷을 다른 네트워크로 포워딩 하도록 설정

/
dnf -y install containerd # CRI containerd 설치
systemctl --now  enable containerd
containerd config default | tee /etc/containerd/config.toml #toml 파일 생성
139행 -> SystemdCgroup = group로 변경
/
#쿠버네티스 레포지터리 추가
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
/
#쿠버네티스 설치
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl --now enable kubelet 
kubelet init

 


POD 생성하기

kubectl run 4glpod --image=nginx