FrameWorks/Kubernetes

[Kubernetes] RedHat계열을 이용한 쿠버네티스 설치

ABCD 2025. 3. 6.

왜 중간에 멈춘 Kubernetes를 다시 공부하기 시작했을까??

쓸모없는 서두....

현재 시점은 2025년 3월 입니다.
다들 아시겠다 시피 현 시점은 개발자들의 혹한기이기도 하죠.
코로나가 지나가고 정부의 R&D사업 지원을 감축시키는 등 많은 일이 있었습니다.
그 여파로 개발자들이 엄청난 타격을 받고 있죠.... 취업의 엄청난 불황이 닥쳤습니다.
아직도 학원이나 부트캠프에서 비전공자도 시작 연봉 5천이라는 허무맹랑한 이야기를 하고 있습니다.

뭐... 이건 쓸모 없는 이야기니 넘기겠습니다.

자! 저는 이전에 Kubernetes를 공부한 경험이 있습니다. 아주 조금... 말이죠...
DashBoard를 설치하는거에서 그친... 아주 설치만 해봤던 것이죠!!

바야흐로 현재는 대 AI, Kubernetes 시대!! 라고 할 수 있겠습니다.
AI는 분야로서의 한계가 있으니, 경쟁력을 키우려면 Kubernetes라도 열심히 공부해야 겠다고....
다짐을 하여 다시 시작하게 되었습니다.

기존에는 Ubuntu인 데비안 계열로 공부를 해봤지만, 이번엔 Rocky로 RedHat계열을 공부해 보려고합니다.!! 이번엔 진짜로.. 배포까지 해볼 생각이지요.

그럼 시작해 보겠습니다. 다소 천천히 진행하더라도 하나하나 제대로 이해해가면서 공부하려고 합니다.
최대한 제 글을 읽고 이해할 수 있게끔 저도 열심히 노력하고 쉽게 풀어보도록 하겠습니다. 그럼 시작해 볼까요??

 

 

개발환경

  1. Parallels Desktop
  2. Rocky Linux(RedHat 계열) 9.2
  3. containerd 1.6.21
  4. kubernetes 1.27
  5. calico
  6. kubernetes dashboard
  7. tigerea
  8. Metrics Server

 

 

Master Node와 Worker Node 공통 사항

  • Rocky Linux설치시 비밀번호 셋팅할 시에 ssh로 root를 접근 할 수 있게 체크해 주시는 것을 권장합니다. 아니면 귀찮게 ssh접속후 root 계정으로 접근해야하는 번잡함이....
  • OS를 설치후 복사/붙여넣기가 안되니 ssh로 접근해서 사용하는 것을 권장합니다.

 

Rocky Linux의 기본 설정 (설치 과정은 생략)

 

패키지 업데이트

  • 가장 최신 라이브러리를 받고 싶다면 당연히 해야하니 앞으로 업데이트에 관한 내용은 커멘드는 추가하겠지만 설명에서 제외하겠습니다.
yum -y update

 

타임존 설정

  • 현재 기준이 될 도시의 시간 타임을 설정해주면 됩니다. 차후 자동배포를 하기를 원한다면 시간때를 어느 도시, 나라에 맞출건지는 기본적으로 설정을 해주어야 하겠지요??
timedatectl set-timezone Asia/Seoul

 

host설정

  • 설치 전이나 후에 설치한 OS의 IP를 만드시 고정해주셔야 합니다. 나중에 자동할당 되면 Master Node가 해당 Work Node를 못찾기 때문이죠! 
  • cat << EOF >> /etc/hosts ${ip} k8s-master EOF

 

 

Kubeadm 설치 전 사전 작업

 

방화벽 해제

  • 방화벽을 설정해서 다른 포트에서의 접근을 제한할 수도 있지만, 지금은 연습을 하는 것이지 방화벽을 해제하고 자유롭게 사용할 수 있도록 해보겠습니다.
  • 방화벽을 설정하고 사용하는 방법은 공식문서를 활용하시면 되겠습니다.
systemctl stop firewalld # 방화벽을 사용하지 않게 설정
systemctl disable firewalld # 방화벽이 부팅시 자동으로 시작하지 않도록 설정
  • 아래와 같이 나온다면 설정이 된것입니다.

이미지

 

스왑 비활성화

  • 스왑 비활성화는 공식문서에서 반드시라는 단어로 언급할 만큼 중요합니다.
  • 스왑을 비활성화 하는 이유가 궁금하신 분은 제가 작성한 글 중에 'Kubernetes 구성중 Swap Memory를 끄는 이유!!' 를 참고하시면 되겠습니다.
# swap off 하는 command
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

# swapoff가 되었는지 확인하는 command
free
cat /etc/fstab | grep swap
  • 위 두 명령어를 이용해 swap off가 되었는지 확인합니다.

이미지이미지

 

컨테이너 런타임(CRI) 설치

  • 컨테이너 런타임이란 containerd, cri-o와 같은 컨테이너를 생성해주는 엔진들을 말합니다. containerd의 경우에는 우리가 잘 알고 있는 Docker에서 컨테이너를 생성해주는 부분만 따로 꺼내온 녀석입니다. cri-o같은 경우는 RedHat을 만든 분들이 containerd와 같은 기능을 하는 녀석을 따로 만들어서 배포한 녀석으로 세세하게는 다르겠지만 본질적인 역할은 같다고 생각하시면 됩니다.

 

컨테이너 런타임 설치 전 사전 작업 (iptables세팅)

  • iptables세팅을 하는 이유는 브릿지 네티워크 인터페이스에 패킷이 iptables를 거쳐가도록 하는 설정을 하는 것입니다. 이설정을 해주어야 30000번 포트가 Kubernetes안에 있는 Pod중 어떤 IP로 가야하는지 알려주는 것이죠.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 필요한 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

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

 

컨테이너 런타임 설치

  • 자 이제 그럼 containerd를 설치해보 겠습니다. 공식문서에 가보면 containerd의 설치 방법이 나와있는데 여기에서 containerd 시작하기를 클릭하면 gitHub사이트로 이동하게 됩니다. 우리는 여기에서 Option2방식을 사용해서 간단하게 설치해 보겠습니다.
  • Option2에서 Rocky의 경우에는 RedHat기반이기 때문에 CentOS를 클릭해 주면 됩니다.

이미지

  • 도커홈페이지로 접속하게 되는데 containterd를 다운 받을 수 있게 repo를 추가해줍니다.
# repo를 추가하기 위해 필요한 command
yum install -y yum-utils iproute-tc

# repo 추가
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum repolist enabled # repo를 적용한것을 확인

이미지

  • 공식문서에는 도커엔진과 관련한 것들도 설치하는 명령어가 존재하지만 우리는 도커 엔진까지는 필요가 없기 때문에 containerd만 설치해보도록 할거에요.
  • 1.6.21버전을 선택한 이유는 현재 우리가 설치하려는 Kubernetes 1.27버전은 1.6 버전 이상에서 호환이 가능하고 LTS버전이기 때문에 채택하는 겁니다.
# containerd 설치
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
# containerd를 적용 시키기위해 daemon을 reload
systemctl daemon-reload
# 실행시키기
systemctl enable --now containerd

# 동작하는지 확인
systemctl status containerd
  • 아래처럼 active가 나타났다면 동작하고 있는겁니다!!

이미지

 

커테이너 런타임 cri 활성화

  • 쿠버네티스 문서에 Kubelet의 Cgroup의 Default가 cgroupfs라고 나와있습니다. 하지만, 레드햇 계열 리눅스의 경우 systemd를 메인으로 프로세스를 실행시키는 시스템이기 때문에, 쿠버네티스 설치시 Defaultsystemd가 세팅됩니다. 이 경우 containerd도 systemd로 변경하여 모두 systemd를 쓰는게 Core 사용에 부담이 없습니다.
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml

systemctl restart containerd
  • 다음 command를 이용해 적용이 되었는지 확인해 봅시다.
cat /etc/containerd/config.toml | grep SystemdCgroup

이미지

 

Kubernetes 설치하기

  • 자! 이제 쿠버네티스를 설치할 준비는 완료 되었습니다. 쿠버네티스를 설치하기 위해서 몇가지 설정이 필요한데요. 알아보도록 합시다.

 

repo설정 하기

  • 당연하게도 Kubernetes를 설치하기위해 repo잡아 주어야하는데요. 이 과정입니다.
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설정 하기

  • 표준 리눅스 보안은 임의 접근 제어(Discretionary Access Control - DAC) 모델을 따릅니다. SELinux는 Linux 커널에 내장된 보안 모듈로 강제적 접근 제어(Mandatory Access Control - MAC)를 수행합니다. 응용프로그램에서 불필요한 부분은 제외하고 오직 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는 것이 가능한 것이죠. 따라서 사용자는 한 응용 프로그램에게 그 프로그램이 제대로 작동하는데 필요한 권한만 안전하게 부여할 수 있습니다.
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

 

kubelet, kubeadm, kubectl 패키지 설치

  • 이제 본격적으로 Kubernetes를 설치할 차례입니다.
  • 이제 끝났습니다. 기본적인 Kubernetes의 설치는 끝났습니다!! 아래 command를 입력하세요!
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

 

 

Master Node에서의 설정

  • 자 위에서 한 설치과정은 Master Node와 Worker Node 둘 모두 해주어야하는 사항이었습니다. 이제부터는 Master Node에서의 설정만 남았는데요! 시작해 볼까요??

 

kubeadm으로 클러스터 생성

 

클러스터 초기화(Pod Network 세팅)

kubeadm init --pod-network-cidr=${사용하지 않는 흔치 않은 ip로 채택} --apiserver-advertise-address ${ip}
  • 설치가 완료되면 아래 문구가 나타나게 됩니다. 이 문구는 kubectl을 사용하기 위해 설정을 잡아주는 것인데요. 그냥 복사붙여넣기 해서 넣어주면 됩니다.

이미지

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

Pod Network 설치(feat. calico)

  • Pod Network란 쿠버네티스 안에서 Pod간, Pod와 Service간, Container간, Container와 외부간의 통신을 도와주는 인터페이스 입니다.
  • 다양한 CNI(Pod Network Interface)이 존재하며 우리는 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

 

Master Node에 Pod을 생성할 수 있게 설정

  • Pod들을 편하게 관리하고 모니터링 할 수 있게 도와주는 Dashboard를 설치하기 위해 Master Node도 일을 할 수 있도록(Pod을 생성) 설정해봅시다.
  • 해당 설정은 권한을 부여하는 것인데, control-plane 역할만 하는 권한을 빼주는 command입니다.
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-

 

편의 기능 설치

 

kubectl 자동 완성 기능

  • 우리는 Linux환경에서 tab으로 자동완성 기능을 사용하고 있습니다.
  • 이 기능을 할 수 있게 만들어 주는 것이지요.

 

Dashboard 설치

  • 위에서 언급한 바와 같이 모니터링을 할 수 있게 도와주는 기능 입니다.

 

Metrics Server 설치

  • 현재 사용중인 Memory와 CPU점유율을 그래프로 편하게 보여주는 기능을 합니다.
# 자동완성 기능 설치
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

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

# Metrics Server 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml

 

Dashboard 확인해보기

  • 각자 설정한 고정 ip의 30000번 포트로 접속해보면 Dashboard가 나오게 됩니다. 인증서가 정상적이지 않아 비공개로 나오지만, 무시하고 화면을 띄우면 로그인 선택화면이 나오고 현재 설정으로 생략 가능하게 해 두어서 생략 버튼을 누르면 Dashboard가 나타나는 것을 확인 할 수 있습니다.
https://${ip}:30000/#/login
  • 접속 후 좌측 탭에서 파드탭으로 이동하고 좌측 상단에 select를 모든 네임스페이스로 변경하면 이쁜게 나올겁니다. ㅎㅎ 다들 고생하셨습니다. ㅎㅎ

이 내용은 일프로님의 강의를 참고하여 재정리한 자료 입니다.

728x90
반응형

댓글

💲 추천 글