코딩 기록 저장소

[쿠버네티스] VMware를 이용한 쿠버네티스 구축&배포 프로젝트 - ① 본문

개인 공부/쿠버네티스

[쿠버네티스] VMware를 이용한 쿠버네티스 구축&배포 프로젝트 - ①

KimNang 2025. 5. 20. 11:02

※ 컴퓨터의 메모리 부족으로 인해 서버컴퓨터에서 학습을 진행하게 됨

 

목차

     

    1. Ubuntu 환경에 VMware 설치

    서버컴퓨터 환경

    - 우분투 : 24.04.2 LTS

    - 커널 : 6.11.0-21-generic

     

    01. VMware 파일 설치

    1. broadcom 사이트에 접속한 후 오른쪽 위 'Support Portal - Go To Portal'을 통해 로그인을 함
      https://www.broadcom.com/



    2. Software - VMware Cloud Foundation - My Downloads를 통해 이동함


    3. 다운로드 하는 링크로 이동하여 환경에 맞는 버전을 설치함


    4. 이 파일을 서버컴퓨터의 디렉터리에 이동한 후 다음 코드를 통해 설치를 진행함
      - 관리자 권한으로 쉘을 이용해 VMware 설치 파일을 실행함
      sudo sh VMware-Workstation-Full-17.6.3-24583834.x86_64.bundle


    5. 설치되면 아래의 명령어를 통해 vmware를 실행함
      - 이때 -E 옵션을 이용해 환경 변수를 유지해서 실행을 함
      - 입력하지 않으면 GUI가 실행될 때 X11 디스플레이를 열 수 없는 문제가 발생했음
      sudo -E vmware


    6. 동의해야하는 것들은 선택 후 Next를 누르고, CEIP와 관련된 것은 No를 선택한 후 Finish를 누름
      - 완료되면 이런 창이 뜨게됨!

     

     

    2. VM 생성 및 노드 구성

    01. VM 생성

    VM 생성하기
    1. 우측에서 new virtual machine클릭함


    2. os 이미지를 선택함
      - 우분투 사이트(https://releases.ubuntu.com/focal/)에 접속해 설치 파일을 내려받으면 됨

    3. VM을 설정함
      - 이름은 기본 이름인 'Ubuntu 64-bit'로 설정
      - 'Customize Hardware...' 버튼을 클릭하고 아래처럼 설정함
      - 네트워크 어댑터는 VMnet8번 NAT으로 설정함
      - USB컨트롤러랑 Sound Card는 필요없으니 삭제 후 'Close' 버튼을 클릭함

      • Disk Size : 20GB
      • Processors : 2개, 2개 총 4개
      • Memory : 4GB (4096MB)

     

     

     

    Ubuntu 설치하기

    - 이제 vm은 만들어졌고 다운받은 ubuntu iso 파일로 서버를 설치함

    - 언어는 영어를 선택하고 그 다음 나오는 창도 쭉쭉 넘기면 됨

     

    1. ens32에서 엔터 누르고 IPv4설정으로 넘어감


    2. Manual 선택


    3. 주소를 맞게 입력함

    4. 이후 다 기본 설정되어있는대로 진행함
    5. SSH 설정에서 'Install OpenSSH server' 체크하고 진행함


    6. 설치가 다 되면 reboot now가 뜸
      - 클릭하여 재부팅 하면 됨

     

    02. 노드 구성

    가상환경 clone 후 노드 구성하기
    1. 우클릭 후 'Manage - Clone'을 클릭함


    2. 이름과 Type을 아래와 같이 설정 후 완료함
      - Clone Type은 full로 설정
      - 마스터 노드 1대와 워커 노드 2대로 구성할 예정이라 3개를 클론 후 각각 이름을 설정함!


    3. 각각 VM에 접속해 호스트 이름과 고정 IP를 변경함
      - 마스터노드 : master
      - 워커노드 : worker1, worker2
      • 호스트 이름 수정
        - /etc/hostname 파일과 /etc/hosts 파일 수정
        sudo nano /etc/hostname

        sudo nano /etc/hosts


      • 노드들의 고정 IP를 변경함
        - 설정 파일 /etc/netplan/ 디렉토리에 있는, 설정 파일에 접근하여 고정 IP를 다른 VM과 겹치지 않게 다 바꿔줌
        - 마스터 노드 : 11 / 워커 노드 1 : 12 / 워커 노드 2 : 13 으로 설정함
        cd /etc/netplan/
        ls -l


    3. 쿠버네티스 설치 및 연결

    01. 쿠버네티스 설치

    sudo su - # root 사용자로 변경
    sudo apt-get update && sudo apt-get upgrade # 리눅스를 최신 상태로 업데이트
    sudo apt install apt-transport-https curl

     

    br_netfilter 모듈 활성화하기
    # br_netfilter 모듈 로드
    sudo modprobe br_netfilter
    
    # 부팅 시 br_netfilter 모듈 자동 로드 설정
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    br_netfilter
    EOF
    
    # iptables 필터링 활성화 설정
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    # sysctl 설정 적용
    sudo sysctl --system

     

    스왑 메모리 비활성화 하기

    - kubelet이 제대로 작동하려면 스왑 메모리를 비활성화 해야함
    - 두 번째로 실행한 명령어는 시스템이 재부팅되어도 스왑 메모리가 비활성화되도록 유지시킴
    스왑 메모리 : 물리 메모리가 부족할 경우를 대비해서 만들어 놓은 공간

    sudo swapoff -a
    sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

     

     

    도커(엔진 및 런타임) 설치하기
    sudo apt install docker.io
    sudo systemctl start docker
    sudo systemctl enable docker # 재부팅 후에도 서비스가 자동으로 시작되도록 설정
    sudo systemctl status docker # 도커 서비스 상태 확인

     

    - 일반 사용자 계정의 경우 권한 문제로 작업에 제약이 있을 수 있으므로 권한을 설정함

    sudo usermod -aG docker $USER

     

     

    - 도커가 정상적으로 설치되었는지 hello-world를 이용해 확인함

    docker run hello-world

     

    cgroup 드라이버 설정
    - 쿠버네티스에서는 도커의 cgroup 관리를 위해 systemd를 사용하도록 변경해야 함
    - 변경하지 않으면 클러스터 설치 과정에서 오류가 발생할 수 있음
    1. docker info 명령어로 도커 설치 정보를 확인함

    2. 다음 명령어는 cgroup driver가 systemd가 아닌 경우에만 실행
    - 코드를 입력한 후에는 차례대로 esc, :wq!, enter를 입력하고 빠져나옴
    vi /etc/docker/daemon.json

    {
    	"exec-opts" : ["native.cgroupdriver=systemd"],
        "log-driver" : "json-file",
        "log-opts" : {
        	"max-size" : "100m"
        },
        "storage-driver" : "overlay2"
    }


    3. 도커 서비스를 다시 실행함

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo systemctl daemon-reload # .service 파일을 변경하면 데몬을 다시 로드해야 함
    sudo systemctl restart docker # 도커 서비스 재시작

     

     

    쿠버네티스 설치하기
    # 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
    curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
    
    # 쿠버네티스 apt 리포지터리를 추가한다.
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
    # 저장소 추가되었기 때문에 apt 업데이트
    sudo apt-get update
    
    # 쿠버네티스 패키지 설치
    sudo apt-get install -y kubelet kubeadm kubectl
    
    # 쿠버네티스 패키지 버전 고정
    sudo apt-mark hold kubelet kubeadm kubectl
    
    # 쿠버네티스 설치 버전 조회
    kubelet --version
    kubeadm version
    kubectl version
    
    # kubelet service 확인
    sudo systemctl status kubelet.service

     

     

     

    02. 쿠버네티스 연결

    • 마스터 노드 설정하기
      - 마스터 노드는 클러스터를 생성하는 것이 중요함
      - 클러스터는 마스터와 워커 노드를 하나의 관리 단위로 묶는 역할을 함
      - kubeadm init : 쿠버네티스 클러스터 생성
      - pod-network-cidr : 파드 네트워크의 IP 주소 범위
      - apiserver-advertise-address : 수신 대기 중임을 알릴 IP 주소 (API 서버의 IP 주소)로 마스터 노드의 IP를 설정
      # Kubernetes 클러스터 초기화 (특정 Pod 네트워크 CIDR 및 API 서버 광고 주소 지정)
      sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.2
      
      # 이후 kubeadm join과 관련된 내용이 나온다면 따로 메모해두기!
      
      # kubectl이 Kubernetes 클러스터와 상호작용할 수 있도록 .kube 디렉토리 생성
      mkdir -p $HOME/.kube
      
      # 관리자 인증 파일을 kubectl에 필요한 config 파일로 복사
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      
      # 사용자 권한으로 config 파일의 소유자 변경 (현재 사용자에게 읽기/쓰기 권한 부여)
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
      # 설치 확인
      kubectl get nodes


      • 네트워크 설정하기
        - 서로 다른 노드에 떠 있는 파드 간의 통신 혹은 외부와의 통신을 위해서는 CNI 플러그인이 필요함
        - 여기서는 플라넬 CNI 플러그인을 사용함
        kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

        - 플라넬 CNI 플러그인이 정상적으로 설치되면 다음 명령어를 입력해 CoreDNS 파드가 실행 중(running)인지 확인함. CoreDNS 파드가 실행 중이어야 파드들의 네트워크 통신이 가능함
        kubectl get pods --all-namespaces

    ※ 마스터 노드 NotReady 상태 해결했던 방법

    더보기

    - 나의 문제 : 노드 확인 명령어 치면 아래와 같은 오류 뜨면서 안되는 문제 발생

    The connection to the server <host>:6443 was refused - did you specify the right host or port?

     

    - 해결 방법 : ens32를 사용중이라 Flannel에서 인터페이스를 지정함

    1. Flannel 설치 파일 다운로드
      wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


    2. 파일 수정
              containers:
              - name: kube-flannel
                image: quay.io/coreos/flannel:v0.22.0-amd64
                command:
                  - /opt/bin/flanneld
                  - --ip-masq
                  - --kube-subnet-mgr
                # # # 여기 사이에 추가했음! # # #
                env:
                  - name: FLANNEL_NETWORK
                    value: "10.244.0.0/16"
                  - name: FLANNEL_IFACE
                    value: "ens32"
                # # # # # # # # # # # # # # # # #
                resources:
                  {}


    3. Flannel 네트워크 플러그인 적용
      kubectl apply -f kube-flannel.yml


    4. coredns 재생성함

     

     

     

     

    • 워커 노드 설정하기
      - 워커 노드는 마스터 노드에 생성된 클러스터에 조인하기 위해 kubeadm join 명령어를 실행함
      - 마스터 노드에서 클러스터 설치 결과로 보여 준 명령어를 수정없이 그대로 사용하면 됨
      - 실행 결과 마지막에 'Run kubectl get nodes' on the control-plane to see this node join the cluster' 라는 문구가 나타나면 정상적으로 설치된 것
      kubeadm join 192.168.0.3:6443 --token i1zobz.lvw2yxvxjyv3tk7y \
              --discovery-token-ca-cert-hash sha256:8da5a66297c72b90e6e809ca76a5bcfedbad121821496b2d6357bbf6f319764a



      + 마스터 노드에서 쿠버네티 클러스터에 등록된 노드들의 상태를 보여주는 명령으로 확인해봄
      kubectl get nodes
      잘 연결된 것을 확인할 수 있음!!