DevOps/K8s
[K8s] 쿠버네티스 기초
cumo
2025. 4. 2. 12:49
쿠버네티스란 무엇인가?
**쿠버네티스(Kubernetes)**는 컨테이너화된 애플리케이션의 배포, 확장, 운영 자동화를 위한 오픈소스 플랫폼이다. 구글이 내부에서 운영하던 Borg 시스템에서 영감을 받아 개발되었고, 현재는 **Cloud Native Computing Foundation(CNCF)**의 주요 프로젝트로 관리되고 있다.
간단히 말하면, 쿠버네티스는 여러 서버에 걸쳐 컨테이너를 자동으로 배치하고, 트래픽을 분산시키며, 장애가 발생한 컨테이너를 복구하는 등의 기능을 수행하는 컨테이너 오케스트레이션 시스템이다.
쿠버네티스의 핵심 구성 요소
구성 요소설명
Pod | 하나 이상의 컨테이너를 묶은 최소 배포 단위 |
Node | 쿠버네티스가 관리하는 물리 또는 가상 서버 |
Cluster | 하나 이상의 노드로 구성된 쿠버네티스 환경 |
Deployment | 애플리케이션 배포 및 업그레이드를 관리 |
Service | 외부 또는 내부 네트워크 접근을 위한 지속적인 IP 제공 |
ConfigMap & Secret | 설정 파일이나 민감 정보를 클러스터에 안전하게 저장 |
쿠버네티스를 사용하는 이유
- 자동화된 배포 및 롤백
kubectl apply 명령을 통해 애플리케이션을 선언적으로 배포하고, 문제가 생기면 자동으로 이전 상태로 롤백할 수 있다. - 자체 복구(Self-healing)
Pod가 비정상 상태가 되면 자동으로 다시 시작하거나 재배포한다. - 수평 확장(Horizontal Scaling)
리소스 사용량(CPU, 메모리 등)에 따라 애플리케이션을 자동 확장할 수 있다.
예: - 서비스 디스커버리 및 로드밸런싱
클러스터 내에서 서비스명을 통해 자동으로 통신하고, 외부 트래픽도 안정적으로 분산시킬 수 있다. - 인프라 추상화
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