'

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Study45] k8s 환경설정
    FISA 2026. 4. 2. 10:49

    N-tier 구조의 Kubernetes(K8S) 클러스터를 직접 구축하는 실습입니다.

    여러 서버를 연결해서 컨테이너를 자동으로 관리하는 시스템을 만듭니다.

     

    전체 구조는 

    [server01: 마스터 노드]  ←→  [server02: 워커 노드]
                                         ←→  [server03: 워커 노드]
    server01인 마스터노드가 이 pod를 실행해!하면 워커 노드가 실행하는 구조입니다. 마스터가 어느 워커에 Pod를 배치할지도 자동으로 결정해요. 예를 들어 server02가 바쁘면 server03에 배치하는 식으로, 이걸 스케줄링이라고 합니다.

     

     

    그럼 본격적으로 환경셋팅을 시작할게요.

     

    [ 01단계 ]  모든 노드 공통 설정 (네트워크 준비)

    이 단계의 목적은 컨테이너들이 서로 통신할 수 있도록 리눅스 커널을 준비 하는 것입니다.

    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF

    왜?

    리눅스는 기본적으로 컨테이너 네트워크에 필요한 기능이 꺼져 있어서, 부팅할 때 자동으로 켜지도록 등록하는 것입니다.

    overlay → 서로 다른 서버에 있는 Pod끼리 같은 네트워크인 것처럼 통신하게 해줌

    br_netfilter → 컨테이너 트래픽에 방화벽(iptables) 규칙을 적용할 수 있게 해줌

     

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1
    EOF

    왜?

    모듈을 등록했어도 커널 파라미터도 따로 켜줘야 실제로 동작합니다.

    방화벽 필터링 허용 + 패킷 전달 허용을 설정하는 것입니다.

     
    modprobe overlay
    modprobe br_netfilter
    sysctl --system

    왜?

    부팅 없이 지금 당장 적용하기 위함입니다.

     

     

    [ 02단계 ] — K8s 패키지 설치 (모든 노드)

     
    sudo apt update && sudo apt install -y containerd

    containerd = 실제로 컨테이너를 실행시키는 엔진입니다.

    Docker와 비슷하지만 더 가볍습니다. K8s는 Docker 대신 이걸 사용합니다.

    sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

    왜?

    SystemdCgroup = true로 바꿔야 K8s와 containerd가 프로세스 자원을 같은 방식으로 관리합니다. 이게 false면 나중에 노드가 불안정해집니다.

    sudo apt-get install -y kubelet kubeadm kubectl

     

    kubeadm 클러스터 설치/초기화 도구 건물 시공업자
    kubelet 각 노드에서 컨테이너 실행 현장 작업자
    kubectl 클러스터에 명령 내리는 CLI 리모컨

    [ 03단계 ] — 마스터 노드 초기화 (server01만)

     
     
    bash
    sudo kubeadm init \
      --apiserver-advertise-address=10.0.2.15 \
      --pod-network-cidr=192.168.0.0/16 \
      --cri-socket /run/containerd/containerd.sock

    왜? 마스터 노드를 클러스터의 두뇌로 초기화합니다.

    • --apiserver-advertise-address → 마스터 노드 IP (워커들이 여기로 접속)
    • --pod-network-cidr → Pod들에게 줄 가상 IP 대역 (Calico 기본값)
    • --cri-socket → containerd를 런타임으로 사용하겠다는 선언
     
     
    bash
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    왜? kubectl 명령어가 클러스터에 접속하려면 인증 정보가 필요한데, 그 파일을 내 홈 디렉토리에 복사하는 것입니다. 이게 없으면 kubectl get nodes 같은 명령어가 안 됩니다.


    [ 04단계 ] — CNI(Calico) 설치 (마스터 노드에서만)

     
     
    bash
    curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml
    kubectl apply -f calico.yaml --validate=false

    왜? K8s는 설치해도 Pod 간 네트워크가 없으면 통신이 안 됩니다. Calico는 그 네트워크를 만들어주는 플러그인입니다. 마스터에서 한 번만 설치하면 모든 노드에 자동 배포됩니다.


    [ 05단계 ] — 워커 노드 연결 (server02, server03)

     
     
    bash
    sudo kubeadm join 10.0.2.15:6443 --token xxx \
      --discovery-token-ca-cert-hash sha256:xxx

    왜? 워커 노드가 마스터에게 "나도 이 클러스터에 참여할게요"라고 등록하는 명령입니다. 토큰은 마스터 init 때 발급된 일종의 초대장입니다. 토큰은 마스터에서 설치할때 나왔던 kubeadm...부터 싹다 복붙하면돼요.

     

     

    중간중간 개억까가 있엇는데...

    대략적으로 마스터노드의 서비스가 모두 떠있는지 kubectl status로 확인하고, 안떠있으면 다시 재시작하거나 ai한테 물어봐서 켜는거 설정하고 

    sudo kubeadm reset -f
    sudo rm -rf /etc/cni/net.d
    sudo rm -rf /var/lib/kubelet/*
    sudo systemctl restart kubelet
    
    - 기존 kubelet 관련 파일 삭제
    sudo rm -f /etc/kubernetes/kubelet.conf
    sudo rm -f /etc/kubernetes/pki/ca.crt

    워커노드에서 다시 이거 설정 삭제하고~

    sudo kube...이거 해주면 됩니다.

    대부분 메모리부족 , ram부족이거나 api서비스 안떠있는 오류인 것 같아요

     

    다 됐으면 마스터노드에서

     

     

    와같이 ready뜹니다.

     

     

     

     

     

     

     

     

     

     

    728x90

    댓글

Designed by Tistory.
티스토리 친구하기