본문 바로가기

K8S

쿠버네티스(Kubernetes) 실습 환경 구성 - 초기 구성

728x90

■ 쿠버네티스 실습 환경

  • Oracle VirtualBox 최신 버전
  • Ubuntu 24.04 Desktop 버전
  • 도커 최신 버전 사용
  • 쿠버네티스 버전 1.28 → 1.29 (업그레이드 진행)
  • 런타임 환경 containerd 사용
  • 3-Node Cluster 환경 구성 (Master Plane 1EA, Worker Node 2EA)

 

■ 쿠버네티스 VM 구성

  • Master 1대만 구성 후 나머지는 VM 복제 후 IP 주소와 HOSTNAME만 변경 하면 됩니다. 
항목 Master Node1 Node2
IP IP1: NAT
IP2: 192.168.56.10(DNS: 8.8.8.8)
IP1: NAT
IP2: 192.168.56.11(DNS: 8.8.8.8)
IP1: NAT
IP2: 192.168.56.12(DNS: 8.8.8.8)
HOST
NAME
K8sMaster K8sNode1 K8sNode2
호스트
파일
127.0.0.1 k8s-master
192.168.56.10 k8s-master
192.168.56.11 k8s-node1
192.168.56.12 k8s-node2
192.168.56.13 k8s-node3
127.0.0.1 k8s-node1
192.168.56.10 k8s-master
192.168.56.11 k8s-node1
192.168.56.12 k8s-node2
192.168.56.13 k8s-node3
127.0.0.1 k8s-node2
192.168.56.10 k8s-master
192.168.56.11 k8s-node1
192.168.56.12 k8s-node2
192.168.56.13 k8s-node3

 

■ 쿠버네티스 VM 공통 설정

  • 설치 패키지
sudo apt-get install -y net-tools, openssh-server, vim, tree, htop
  • 우분투 방화벽 해제 및 상태 확인
  sudo ufw disable # 방화벽 비활성화
  sudo ufw status  # 방화벽 상태확인
  • Pod가 SWAP을 사용하지 않도록 하여 성능 유지
    • SWAP은 컴퓨터의 메모리가 모두 사용될 때 하드 디스크의 일부분을 메모리 공간처럼 사용할 수 있는 영역
    • 윈도우의 가상 메모리 개념과 유사하지만 기술적인 부분에서 차이가 발생함
    • Pod가 SWAP 영역으로 빠지게 되면 성능저하가 발생하기 때문에 쿠버네티스에서는 SWAP을 사용하지 않는다
  sudo swapoff -a  # SWAP 사용하지 않도록 설정, 재부팅시 기능 해제됨
  free # 메모리 확인
  /etc/fstab 부분에서 swap 영역 주석 처리

 

  • NTP 설정 필요성 및 설정 방법
    • 쿠버네티스 클러스터는 다수의 VM으로 구성되어 있고 시간 동기화는 클러스터 동작의 중요한 역할을 수행
    • 통신&스케줄링:  노드가 동일한 시간에 작업이 수행 되게 하기 위해선 전체 시스템이 정확한 시간 시스템을 사용해야 합니다.
    • 인증&보안:  TLS(Transport Layer Security) 인증서의 유효 기간은 시간에 따라 결정되며, 정확한 시간 동기화가 필요합니다.
  sudo apt-get install -y ntp 
  # ntp 설치 시 기존에 설치 되어 있는 time-daemon과 충돌이 발생할 경우 "sudo apt remove systemd-timesyncd" 삭제 후 ntp 설치 
  sudo systemctl restart ntp 
  sudo systemctl status ntp 
  sudo ntpq -p # NTP 호출 정보 확인
  • IP Forwarding 기능 활성화 
    IP Forward는 쿠버네티스 네트워킹에서 "부하분산"과 "서비스 프록시"  기능을 수행하여 효율적인 트래픽 관리와 안정성을 제공합니다
  echo '1' > /proc/sys/net/ipv4/ip_forward 
  cat /proc/sys/net/ipv4/ip_forward 
  #호출값 1 확인

 

  • 컨테이너 런타임 환경 구성 - containerd 활용
    • containerd에서 사용할 커널 모듈에 대한 정의 및 containderd에서 참조할 conf 파일 생성
#/etc/modules-load.d/ 항목은 리눅스 시스템에서 커널 모듈을 부팅 시 자동으로 로드하는 데 사용 됩니다.

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

#overlay
overlay는 컨테이너 파일 시스템을 구성하는 데 사용되는 드라이버입니다.
컨테이너 이미지를 레이어로 쌓아서 파일 시스템을 생성하고, 이를 컨테이너에서 사용합니다.
예를 들어, 여러 이미지 레이어를 하나의 파일 시스템으로 합치는 데 사용됩니다.

#br_netfilter
br_netfilter는 브리지 네트워크에서 iptables를 사용하여 트래픽을 필터링하는 데 필요한 커널 모듈입니다.
브리지된 트래픽을 올바르게 보기 위해 iptables 설정에 필요합니다.

#커널에 생성한 모듈을 등록하여 사용가능하도록 설정
#modprobe는 리눅스에서 사용되는 프로그램으로, 적재 가능 커널 모듈 (LKM)을 리눅스 커널에 추가하거나 커널로부터 제거하는 데 사용됩니다
sudo modprobe overlay
sudo modprobe br_netfilter

 

  • 노드간 통신을 위한 iptables bridge 설정 추가 
    • 99-kubernetes-cri.conf
       컨테이너 런타임(CRI)과 관련된 설정을  포함하며, 해당 파일은 컨테이너 런타임과 상호작용을 지원하며, 컨테이너 간 통신과 관련된 설정을 포함 합니다. 
    • k8s.conf
      쿠버네티스 클러스터의 다른 설정과 관련된 매개변수를 설정 합니다. 해당 파일은 쿠버네티스 클러스터의 전반적인 동작에 영향을 미치는 설정을 포함 합니다. 
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
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

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

# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system

 

  • 컨테이너 런타임 환경 구성 - 도커 설치 및 버전 확인 
    • containerd는 도커를 설치하면 자동으로 설치 되는 패키지 이다. 그러나 도커 설치 없이 containerd만 별도로 설치 할 수 있으나 쿠버네티스 공식에서는 도커 설치를 기본 가이드로 하고 있다.
    • (참조: https://github.com/containerd/containerd/blob/main/docs/getting-started.md // 공식 바이너리 정보, apt 및 소스코드로 설치 방법 제공) 
# 정상적으로 도커가 설치 되면 아래 명령어를 입력하면 정상적인 결과값을 반환 받을 수 있다.
sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
 
 
 #도커 버전 확인
 sudo docker version
Client: Docker Engine - Community
 Version:           27.0.3
 API version:       1.46
 Go version:        go1.21.11
 Git commit:        7d4bcd8
 Built:             Sat Jun 29 00:02:23 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.0.3
  API version:      1.46 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       662f78c
  Built:            Sat Jun 29 00:02:23 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.18
  GitCommit:        ae71819c4f5e67bb4d5ae76a6b735f29cc25774e
 runc:
  Version:          1.7.18
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

 

 

#containerd에서 사용할 기본 설정값 생성 
sudo sh -c "containerd config default > /etc/containerd/config.toml"

#line 1에 있는 disabled_plugins = [] 확인, 값이 없어야 함

 

 

  • 컨테이너 런타임 환경 구성 - cgroup 설정
    • 리눅스에서 cgroup (Control Group)은 선택적으로 리소스를 격리, 관리, 제한하는 리눅스 프로세스의 그룹으로 프로세스에 할당된 리소스를 제한하는데 사용된다. 
    • kubelet(클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리)과 그에 연계된 컨테이너 런타임 모두 컨트롤 그룹(control group)들과 상호작용 해야 한다.
    • 파드 및 컨테이너 자원 관리가 수정될 수 있도록 하고 cpu 혹은 메모리와 같은 자원의 요청(request)과 상한(limit)을 설정하기 위함이다.
    • 컨트롤 그룹과 상호작용하기 위해서는, kubelet과 컨테이너 런타임이 "동일한 cgroup 드라이버 및 구성"을 사용해야 한다. 
    • 사용가능한 cgroup 드라이버는 cgroupfssystemd 2가지가 있다. cgroupfs는 kubelet의 기본 cgroup 드라이버 이지만, 배포판 리눅스의 cgroup 드라이버는 systemd 이다. 리눅스를 변경하는 것 보다 kubelet을 변경하는 것이 좋다. 
    • 세부사항은 쿠버네티스 공식 홈페이지 참조
#/etc/containerd/config.toml 수정
#systemd cgroup 드라이버를 runc 에서 사용하려면, 다음과 같이 설정

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

 

 

  • 컨테이너 런타임 환경 구성 - 도커 데몬 설정
    • 도커 데몬에서 사용 할 기본 cgroup의 설정을 systemd로 변경 하기
sudo vi /etc/docker/daemon.json

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


sudo mkdir -p /etc/systemd/system/docker.service.d
sudo usermod -aG docker [계정명] #sudo 없이 사용하기
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl restart docker
sudo systemctl status docker  # Active 상태 확인 
sudo systemctl restart containerd.service
sudo systemctl status containerd.service
sudo reboot

---
#도커 버전 확인
docker version

#도커의 cgroup 드라이버가 systemd 변경 확인
docker info

 

 

  • 쿠버네티스 설치 kubeadm, kubelet 및 kubectl 설치
    • kubeadm: 클러스터를 부트스트랩하는 명령어 이다.
    • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행 하는 컴포넌트 이다.
    • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티
    • 쿠버네티스 최초 클러스터 구성을 위해 kubeadm을 사용하며, kubeadm이 kubelet 및 kubectl을 설치하거나 관리하지 않기 때문에 버전 차이를 확인해야 한다. kubeadm이 설치하는 컨트롤 플레인과 kubelet의 버전이 다를 경우 예상치 못한 오류가 발생한다. 다만 Minor 버전의 차이는 지원한다
#패키지 업데이트
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

#패키지 레포에 대한 공개키 다운로드
#`/etc/apt/keyrings` 해당 디렉토리가 없을 경우 먼저 생성 해야 함.
#sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

#키 정보와 레포 URL 지정
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
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

#kubeadm 패키지 정보 확인
sudo apt-cache policy kubeadm

#패키지 업데이트 후 다운로드 
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
#자동 업데이트 방지
sudo apt-mark hold kubelet kubeadm kubectl

#버전 확인
kubeadm version
kubectl version
kubelet --version

#자동 시작 등록
sudo systemctl daemon-reload
sudo systemctl restart kubelet.service
sudo systemctl enable --now kubelet.service

#Service Discovery를 위한 HOSTS 등록
vi /etc/hosts
192.168.56.10 k8s-master
192.168.56.11 k8s-node1
192.168.56.12 k8s-node2
192.168.56.13 k8s-node3

 

  • VM 복제 진행
    • VM 복제 수행 시 MAC 주소 갱신 버전으로 선택 (3번째 옵션) 
    • 복제 후 HOSTNAME, IP 주소 및 HOSTS 파일 설정 변경

728x90