티스토리 뷰

 

TL;DR

  • 클러스터 = 여러 서버를 묶어 한 번에 관리하고, Pod 실행을 분산시키는 단위
    • 마스터 노드: 전체 관리
    • 워커 노드: 애플리케이션 실행
  • 생성 이유
    • 장애 나도 서비스 지속(고가용성)
    • 트래픽 늘면 노드 추가 가능(확장성)
    • 자원 효율적 사용
    • 배포/스케일링/헬스 체크 자동화

쿠버네티스 클러스터란?

**클러스터(Cluster)**란, 여러 대의 서버(노드)를 하나로 묶어 하나의 논리적 시스템처럼 동작하게 만든 환경을 말합니다.

 

구성 요소

  1. 마스터 노드 (Control Plane)
    • 클러스터 전체를 관리
    • 주요 컴포넌트:
      • kube-apiserver: API 요청 처리
      • etcd: 상태 저장소 (클러스터 상태)
      • kube-scheduler: 어떤 노드에 Pod을 배치할지 결정
      • kube-controller-manager: 상태를 원하는 상태로 유지
  2. 워커 노드 (Worker Node)
    • 실제 애플리케이션(Pod) 실행
    • 주요 컴포넌트:
      • kubelet: 노드에서 Pod 실행/상태 관리
      • kube-proxy: 네트워크 트래픽 라우팅
      • 컨테이너 런타임 (Docker, containerd 등)

즉, 클러스터 = 관리하는 서버 + 애플리케이션 실행 서버들의 집합

 


 클러스터를 생성하는 이유

  1. 고가용성(High Availability)
    • 서버 한 대가 다운되어도 다른 노드가 서비스를 계속 제공
    • 즉, 장애 대비
  2. 확장성(Scalability)
    • 트래픽이 늘어나면 노드를 추가하여 Pod 수를 늘릴 수 있음
    • 클러스터 하나로 여러 서버를 묶어 수평 확장 가능
  3. 리소스 효율화
    • 여러 애플리케이션을 하나의 클러스터에서 관리
    • CPU, 메모리, 네트워크 등 자원을 효율적으로 사용
  4. 자동화된 관리
    • 배포(Deployment), 롤백, 스케일링, 헬스 체크 등을 자동화 가능
    • 사람이 일일이 서버 상태를 관리할 필요 없음
# pod-network-cidr: 파드 네트워크의 IP 주소 범위
# apiserver-advertise-address: 수신 대기 중임을 알릴 IP주소로 마스터 노드의 IP를 설정
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.127.128
# 1. 현재 로그인 사용자 확인
whoami
# - 현재 터미널에서 사용 중인 계정 이름 출력
# - 쿠버네티스 config 설정 시 어떤 계정으로 작업 중인지 확인용

# 2. 기존 kube 설정 삭제
rm -rf $HOME/.kube
# - 기존 kubeconfig 파일 및 디렉토리 삭제
# - 깨끗한 상태에서 새 클러스터 설정을 적용하기 위해 사용

# 3. kube 디렉토리 새로 생성
mkdir -p $HOME/.kube
# - kubeconfig를 저장할 디렉토리 생성
# - -p 옵션: 부모 디렉토리 없으면 자동 생성

# 4. 관리자 kubeconfig 파일 복사
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# - kubeadm으로 생성된 admin.conf를 현재 사용자 홈 디렉토리에 복사
# - -i : 덮어쓰기 시 확인 메시지 표시

# 5. kubeconfig 파일 소유자 변경
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# - 현재 사용자(uid, gid) 소유로 변경
# - root 소유일 경우 일반 사용자로 kube 명령어 실행 불가 문제 해결

# 6. 현재 컨텍스트 확인
kubectl config get-contexts
# - kubeconfig에 정의된 모든 컨텍스트 확인
# - 컨텍스트 = 클러스터/사용자/네임스페이스 설정 정보

# 7. 현재 컨텍스트 이름 변경
kubectl config rename-context $(kubectl config current-context) k8s
# - 현재 컨텍스트 이름을 "k8s"로 변경
# - 클러스터가 여러 개일 때 명확하게 구분 가능

# 8. 변경 후 컨텍스트 재확인
kubectl config get-contexts
# - 컨텍스트 이름이 "k8s"로 변경됐는지 확인

# 9. 모든 네임스페이스의 Pod 상태 확인
kubectl get pods --all-namespaces
# - 클러스터 내 모든 네임스페이스에서 실행 중인 Pod 목록 출력
# - 마스터 노드 및 초기 시스템 Pod 상태 확인용

 

 

 

혹시라도 쿠버네티스를 초기화하고 싶다면, 아래를 실행해주세요.

처음부터 다시 설치해야합니다 !! 

$ sudo su -

$ kubeadm reset -f
$ sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube*
$ rm -rf $HOME/.kube

 

 

 

클러스터 시작하기

$ whoami
ubuntu 

# 기존 kube 설정 삭제
$ rm -rf $HOME/.kube

# kube 디렉토리 새로 생성
$ mkdir -p $HOME/.kube

# admin.conf를 사용자 kubeconfig로 복사
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# → kubeadm init 후 생성된 클러스터 관리용 config 복사

# kubeconfig 소유자를 현재 사용자로 변경
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# → root 소유 문제 해결, kubectl 사용 가능

# 현재 컨텍스트 확인
$ kubectl config get-contexts
# → 클러스터, 사용자, 네임스페이스 정보 확인

# 모든 네임스페이스 Pod 상태 확인
# 마스터 관련 Pod들은 Running, coredns는 Pending 상태
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-76f75df574-4nf25             0/1     Pending   0          44s
kube-system   coredns-76f75df574-btd98             0/1     Pending   0          44s
kube-system   etcd-k8s-master                      1/1     Running   1          58s
kube-system   kube-apiserver-k8s-master            1/1     Running   1          58s
kube-system   kube-controller-manager-k8s-master   1/1     Running   1          58s
kube-system   kube-proxy-fdsgf                     1/1     Running   0          44s
kube-system   kube-scheduler-k8s-master            1/1     Running   1          58s

# Flannel CNI 설치 (Pod 네트워크)
# → Pod 간 통신 및 네트워크 구성
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# CNI 설치 후 Pod 상태 확인
# → kube-flannel Pod가 Init 단계, coredns는 아직 Pending
#    etcd, kube-apiserver, controller-manager, kube-scheduler 등은 Running
$ kubectl get pods --all-namespaces
NAMESPACE      NAME                                 READY   STATUS     RESTARTS   AGE
kube-flannel   kube-flannel-ds-6sb42                0/1     Init:1/2   0          6s
kube-system    coredns-76f75df574-4nf25             0/1     Pending    0          66s
kube-system    coredns-76f75df574-btd98             0/1     Pending    0          66s
kube-system    etcd-k8s-master                      1/1     Running    1          80s
kube-system    kube-apiserver-k8s-master            1/1     Running    1          80s
kube-system    kube-controller-manager-k8s-master   1/1     Running    1          80s
kube-system    kube-proxy-fdsgf                     1/1     Running    0          66s
kube-system    kube-scheduler-k8s-master            1/1     Running    1          80s

 

 

  • 아직 Flannel 초기화 중이어서 coredns와 kube-flannel Pod는 Pending/Init 상태
  • 마스터 핵심 컴포넌트(etcd, apiserver, controller, scheduler)는 모두 정상 Running
  • 시간이 조금 지나면 Flannel이 올라가면서 coredns도 Running 상태가 됩니다.