쿠버네티스 무게감 있게 설치하기

appti·2024년 4월 2일
0

쿠버네티스 인강

목록 보기
2/15

서론

해당 글은 일프로 님의 인프런 강의 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2의 내용을 정리한 글입니다.

해당 글에 사용된 내용, 사진 및 그림은 모두 강의와 강의 자료에 포함된 내용입니다.

강의 환경

  • 컨테이너를 적용함으로 인해 다음과 같은 과정이 추가
    • 컨테이너 빌드
      • 베이스 이미지 위에 실행하고자 하는 jar 파일을 실행시키는 과정
      • jar 파일 실행을 위해 OpenJDK 이미지를 DockerHub에서 다운
    • 컨테이너 빌드를 통해 생성한 이미지를 DockerHub에 업로드
    • jenkins에서 pod 생성 요청
      • 해당 요청 내에 컨테이너 이미지 주소가 첨부되어 있음
      • 쿠버네티스가 해당 주소를 토대로 이미지를 다운로드
      • 다운받은 이미지를 토대로 컨테이너를 생성할 수 있도록 컨테이너 런타임에 요청
  • 해당 강의에서는 인프라 환경을 구축할 예정

설치 (Mac M1)

1. 다운로드

2. 설치 및 세팅

  • Virtualize 선택

  • Linux 선택

  • Boot ISO Image로 이전에 다운한 Rocky Linux.iso 지정

  • 메모리 : 4096MB
  • CPU 코어 : 4

  • 스토리지 크기 : 32GB

  • 별도로 설정하지 않음

  • 이름 명시 및 Open VM Settings 체크 후 저장

  • 저장 시 다음과 같은 창이 나타남
  • 네트워크 -> 고급 설정 보기 체크 -> 게스트 네트워크 192.168.56.0/24로 지정

  • 실행 후 Install Rocky Linux 9.2 선택

  • 한국어 선택

  • 사용자 설정 -> 루트 비밀번호 설정
  • root가 비밀번호로 SSH 로그인하도록 허용 체크

  • 시스템 -> 설치 목적지
  • 저장소 구성 -> 자동 설정 체크

  • 시스템 -> 네트워크와 호스트 이름
  • 호스트 이름 k8s-master로 지정 후 적용
  • 이더넷 설정 -> IPv4 설정 -> Method 수정
  • 주소에 다음과 같이 추가
    • 주소 : 192.168.56.30
    • 넷마스크 : 255.255.255.0
    • 게이트웨이 : 192.168.56.1

  • 네트워크 및 호스트 이름에서 모든 설정을 끝낸 뒤의 사진

  • 설치 시작

  • 시스템 재시작 선택

  • 재시작 시 위와 같이 다시 설치 과정을 거치기 때문에 좌측 상단의 전원 버튼으로 종료

  • CD/DVD에서 설치용 Locky Linux iso 제거 후 실행

  • 루트 로그인

  • 로그인 성공
  • UTM에서는 명령어 복붙이 안되므로 이후 설치 과정은 SSH를 통해 진행

3. 원격 접속

ssh root@192.168.56.30
  • SSH 원격 접속
  • 설치 과정에서 설정한 ip로 진행

4. 클러스터 설치 및 Pod 확인

# 패키지 업데이트
yum -y update

# 타임존 설정(서울)
timedatectl set-timezone Asia/Seoul

# [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트
# 리눅스 시스템에서 네트워크 트래픽 제어와 관련된 유틸리티 모음
# 기본적으로 설치되어 있지 않기 때문에 바이너리 파일을 찾지 못해 에러가 발생한 것
# 향후 네트워크 기능 확장 및 안정성을 위해 쿠버네티스 공식 문서에서 의존성이 필요하다고 명시되어 있음
# Calico와 같이 쿠버네티스 네트워크 플러그인이 iproute-tc에 의존
# 노드 수준 트래픽 제어, 네트워크 보안 및 모니터링에 사용됨 
yum install -y yum-utils iproute-tc

# /etc/hosts에 정적 호스트 네이밍과 IP 주소를 매핑
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
EOF

# 포트 관련 설정을 생략하기 위해 방화벽 비활성화
systemctl stop firewalld && systemctl disable firewalld

# 스왑 기능 비활성화
# systemd/cgroupfs 모두 컨테이너의 메모리 리소스의 할당량은 제어하는데 스왑을 설정하면 이러한 제한을 무시할 수 있기 때문
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

# 쿠버네티스 클러스터를 구성하기 위해 리눅스 커널에서 특정 모듈과 커널 파라미터 로드 & 설정
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# overlay 모듈 로드
# 컨테이너 이미지 레이어를 mount하는 용도
# 컨테이너 런타임에서 이미지 레이어 관리 시 필요
modprobe overlay

# br_netfilter 모듈 로드
# 브릿지 네트워크 장치에 대한 패킷 필터링 활성화하는 용도
# 쿠버네티스 네트워크 플러그인에서 브릿지를 사용하기 때문에 로드
modprobe br_netfilter

# net.bridge.bridge* : 브릿지 설정
# 리눅스 브릿지가 IPv4, IPv6 트래픽을 iptable에 전달하도록 설정
# 쿠버네티스 네트워크 정책 등에서 트래픽 필터링을 수행하기 위함
# net.ipv4.ip_forward : 리눅스 커널의 IP 포워딩을 활성화
# 한 네트워크 인터페이스에서 다른 인터페이스로 패킷을 전달 가능
# 쿠버네티스 노드에서 pod 간 통신을 위해 IP 포워딩을 사용하기 때문에 필수
cat <<EOF |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

# /etc/sysctl.d 디렉토리에 정의된 커널 파라미터 값 적용
sysctl --system

# 도커에서 제공하는 containerd.io를 통해 runC와 containerd를 함께 설치하기 위해 ret hat 계열인 CentOS의 도커 레포지토리 연결
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# containerd & runC 다운
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now containerd

# containerd를 패키지로 설치한 경우 CRI가 비활성화 되어있으므로 이를 활성화
# red hat 계열 리눅스는 기본적으로 systemd를 사용하므로 CRI 활성화 시 systemd 사용
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd

# 쿠버네티스 설치
# kubelet, kubeadm, kubectl는 별도로 버전을 지정해 설치할 것이므로 제외
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

# SELinux : 리눅스 시스템에서 액세스 제어 보안 정책을 제공하는 커널 모듈
# SELinux의 엄격한 정책으로 인해 쿠버네티스 컴포넌트나 컨테이너 실행에 문제가 발생할 수 있으므로 일시적으로 비활성화
# 설치 후 활성화시키는 것이 보편적인 방법
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# kubelet, kubeadm, kubectl 설치
yum install -y kubelet-1.27.2-150500.1.1.aarch64 kubeadm-1.27.2-150500.1.1.aarch64 kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes
systemctl enable --now kubelet

# kubeadm으로 pod 네트워크 설정
# CIDR로 네트워크 대역폭 설정
# apiserver IP 주소 설정
kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30

# kubectl 사용 설정
# kubectl 구성 파일 저장 디렉토리
mkdir -p $HOME/.kube
# /etc/kubernetes/admin.conf 파일을 $HOME/.kube/config로 복사
# admin.conf 파일은 쿠버네티스 API 서버에 인증하고 액세스할 수 있는 인증 정보와 클러스터 정보가 포함되어 있음
# -i를 통해 덮어쓰기 활성화
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 파일의 소유권을 현재 사용자(= root)로 변경
chown $(id -u):$(id -g) $HOME/.kube/config

# CNI 플러그인 calico 설치 
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml

# 마스터 노드 taint 삭제 
# taint로 인해 마스터 노드에는 사용자가 직접 생성한 애플리케이션이 pod로 스케줄링되지 않음
# 현재 실습 환경은 마스터 노드만이 존재하기 때문에 이를 비활성화해 마스터 노드에도 pod 스케줄링이 되도록 설정
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-

# kubectl 자동완성 설정
yum -y install bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc

# 대시보드 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml

# metric 서버 설치 
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
k get pods -A
  • pod 확인 명령어

  • 정상적으로 설치되었음을 확인할 수 있음

5. 대시보드 접속

https://192.168.56.30:30000/#/login
  • 위 주소로 접속

  • 생략

  • 좌측 메뉴 중 노드 선택 시 위와 같이 출력

설치 과정 설명

쿠버네티스 설치 (모든 노드)

  • rocky linux 기본 설정
    • 패키지 업데이트, 타임존 설정
  • kubeadm 설치 전 사전 작업
    • 방화벽 해제, 스왑 비활성화
  • 컨테이너 런타임 설치
    • containerd, cri-o, 도커 엔진, 미란티스 컨테이너 런타임 등
    • 컨테이너 런타임 설치 전 사전 작업
      • iptables으로 IPv4를 포워딩해 브릿지된 트래픽을 보도록 설정
        • 쿠버네티스 클러스터의 가상 네트워크 솔루션은 노드 간 통신을 위해 리눅스 브릿지를 사용하기 때문
        • 노드 머신이 브릿지를 통해 전달되는 트래픽을 볼 수 있도록 허용하는 설정
        • 리눅스의 네트워크가 쿠버네티스의 pod 네트워크로 접근할 수 있도록 하는 과정
    • systemd/cgroups
      • 쿠버네티스가 컨테이너 관리와 리소스 제어를 위해 사용하는 커널 기능
      • 쿠버네티스 설치 시 systemd/cgroupfs로 설정한 값과 컨테이너 런타임의 설정을 통일시켜야 함
      • 쿠버네티스, containerd의 기본 값은 cgroups
        • red hat 계열은 기본 값이 systemd이기 때문에 스크립트에서는 systemd로 설정을 변경
      • cgroups
        • 프로세스를 계층 구조로 그룹화하고 그룹별로 리소스 사용량(CPU, 메모리, 디스크 I/O 등)을 제한하고 모니터링 할 수 있는 커널 기능
        • 쿠버네티스에서는 각 컨테이너를 별도의 cgroup에 할당하여 컨테이너 간 리소스 분리 보장
      • systemd
        • 리눅스 시스템 및 서비스 관리자로, 프로세스 관리와 기능을 cgroups와 연동하여 수행
    • 컨테이너 런타임인 containerd 설치
      • 도커에서 제공하는 containerd.io를 통해 runC와 containerd를 함께 설치
        • 도커 엔진 설치를 위해 repository 설정 후 containerd 설치
        • 설치 시 쿠버네티스와 호환되는 버전인지 확인하고 신규 기능이 필요하지 않는 이상 LTS 버전을 사용할 것을 권장
      • 설치 후 파일 확인
      • cntainerd를 패키지를 통해 설치했다면 CRI가 비활성화 되어 있기 때문에 이를 활성화
  • 쿠버네티스 패키지 설치
    • kubelet, kubeadm, kubectl 설치
      • kubelet
        • 쿠버네티스 노드에서 실행되는 에이전트로, 컨테이너가 실행되는 환경 관리
        • 노드의 Pod 스펙을 기반으로 컨테이너를 실행하고 관리
        • 각 노드는 반드시 kubelet를 설치해야 함
      • kubeadm
        • 쿠버네티스 클러스터를 부트스트랩하고 관리하는 도구
        • 클러스터 초기화, 노드 조인, 업그레이드, 설정 관리 등의 작업 수행
      • kubectl
        • 쿠버네티스 클러스터와 상호작용하기 위한 커맨드라인 도구

마스터 노드 세팅

  • kubeadm으로 클러스터 생성
    • 클러스터 초기화
      • 다음과 같은 컴포넌트가 pod 형태로 초기화
        • kube-scheduler
          • 쿠버네티스 클러스터의 스케줄러 역할을 수행하는 컴포넌트
          • 새로 생성된 Pod를 적절한 노드에 할당하고 리소스를 효율적으로 분배
        • control-mgmt
          • 쿠버네티스 클러스터의 다양한 컨트롤러를 관리하는 컴포넌트
          • 노드 관리, 레플리케이션 관리, 엔드포인트 관리, 서비스 어카운트/토큰 관리 등의 역할 수행
        • etcd
          • 분산 키-값 저장소로, 쿠버네티스 클러스터의 모든 클러스터 데이터를 저장하는 역할
          • 클러스터 상태, 구성 정보, 시크릿 데이터 등 관리
        • kube-proxy
          • 노드 수준의 네트워크 규칙을 관리하고 유지하는 컴포넌트
          • 클러스터 내부 및 외부에서 Kubernetes 서비스에 접근할 수 있도록 기능 제공
        • kube-apiserver
          • 쿠버네티스 API를 제공하는 컴포넌트
      • Pod 네트워크 세팅
        • CIDR을 통해 네트워크 대역을 새롭게 세팅
        • 약 100만 개 정도의 pod를 생성할 수 있는 대역
      • 초기화 이후 쿠버네티스에 접속할 수 있는 인증서 생성
    • kubectl 사용 설정
      • 쿠버네티스 설치 및 초기화 이후 생성된 인증서를 사용할 수 있도록 설정
      • 인증서를 통해 kube-apiserver에 API를 보내 CLI 통신 가능
    • CNI(Container Network Interface) 플러그인 설치(calico)
      • 컨테이너들 간의 통신을 관리하는 쿠버네티스와 네트워크 간의 인터페이스
    • 마스터에 pod를 생성할 수 있도록 설정
      • kubeadm, 대시보드 pod는 마스터에 올라가도 되도록 설정이 되어 있음
      • 마스터에 유저가 만든 pod는 일반적으로 올리지 않는 것이 암묵적인 원칙
        • 현재 환경은 마스터 노드만 존재하기 때문에 관련된 설정을 수행하는 과정
  • 쿠버네티스 편의 기능 설치
    • kubectl 자동완성 기능
    • Dashboard 설치
    • Metrics Server 설치
      • 컨테이너 CPU, Memory는 기본적으로 컨테이너 런타임이 관리
      • Metrics Server가 Pod에 존재하는 모든 컨테이너의 Metrics를 조회해 표시
profile
안녕하세요

0개의 댓글