[kubernetes] kubeadm, kubelet, kubectl 설치하기
[kubernetes] kubeadm, kubelet, kubectl 설치하기
Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 확장, 관리하는 오픈 소스 플랫폼이며, 다양한 환경에서 일관된 애플리케이션 실행을 가능하게 해주는 컨테이너 오케스트레이션 도구입니다.
Kubernetes를 사용하기 위해 kubeadm, kubelet, kubectl 패키지 등을 사용하여 클러스터를 구성하거나 Pod를 사용할 수 있습니다.
각 패키지에 대한 내용을 확인해보고 설치하는 방법을 알아보도록 하겠습니다.
패키지별 용도
kubeadm
kubeadm은 Kubernetes 클러스터를 설치하고 관리하는 데 필요한 기본 도구로, 클러스터의 부트스트랩 작업을 자동화하는 역할을 합니다. 또한 kubeadm은 클러스터 초기화, 노드 추가 및 업그레이드와 같은 작업을 쉽게 할 수 있도록 명령어를 제공합니다. 주로 마스터 노드(컨트롤 플레인)를 설정하고 클러스터를 시작하는 데 사용됩니다.
- 주요 기능
- 클러스터 초기화 (init)
kubeadm init
명령어를 사용하여 컨트롤 플레인을 초기화하고, 클러스터의 기본 구성 요소들을 설치합니다.- 인증서, 키, 구성 파일 등을 생성하고, 필수적인 컨트롤러 컴포넌트들을 설정할 수 있습니다.
- 노드 추가 (join)
kubeadm join
명령어를 사용하여 워커 노드를 기존 클러스터에 추가합니다.- 이를 통해 워커 노드가 마스터 노드에 연결되어 작업을 처리할 수 있습니다.
- 클러스터 업그레이드
- Kubernetes의 새로운 버전이 릴리스될 때, kubeadm upgrade 명령어를 사용하여 클러스터를 업그레이드할 수 있습니다.
- 클러스터 초기화 (init)
kubelet
kubelet은 Kubernetes 클러스터에서 각 노드에 상주하며 Pod와 컨테이너를 관리하는 에이전트입니다. 또한 kubelet은 마스터 노드의 API 서버에서 내려오는 명령을 받아서 해당 노드에서 컨테이너가 올바르게 실행되는지 지속적으로 모니터링하고 관리하는 역할을 합니다. Kubernetes의 기본 구성 요소 중 하나로, Pod의 상태를 보고하고 필요한 경우 컨테이너를 다시 시작하는 등 작업을 수행합니다.
- 주요 기능
- Pod 및 컨테이너 관리
- kubelet은 Pod의 정의를 받아 해당 Pod를 생성하고, 올바르게 실행되고 있는지 확인합니다.
- 컨테이너의 상태를 주기적으로 확인하며, 상태가 이상할 경우 컨테이너를 재시작하여 상태를 유지하도록 합니다.
- 노드 상태 보고
- kubelet은 마스터 노드의 API 서버에 노드의 상태와 자원 사용량(CPU, 메모리 등)을 주기적으로 보고합니다.
- 이를 통해 클러스터 관리자가 노드의 상태를 모니터링할 수 있습니다.
- 로깅 및 진단
- kubelet은 로그 파일을 관리하고, 시스템의 진단 정보를 수집하여 클러스터의 상태를 확인하는 데 도움을 줍니다.
- Pod 및 컨테이너 관리
kubectl
kubectl은 Kubernetes 클러스터와 상호작용하기 위한 명령줄 도구로, 클러스터 내 리소스 관리, 배포, 디버깅 등을 수행할 수 있는 가장 중요한 도구 중 하나입니다. kubectl을 사용하면 Kubernetes API 서버와 통신하여 클러스터 상태를 조회하거나 관리할 수 있으며, Kubernetes 리소스를 생성, 조회, 수정, 삭제하는 다양한 작업을 수행할 수 있습니다.
- 주요 기능
- Kubernetes 리소스 관리
- 클러스터 내에서 Pod, Service, Deployment, ConfigMap 등과 같은 리소스를 생성, 조회, 업데이트, 삭제할 수 있습니다.
- 클러스터 상태 모니터링
- 노드, 네임스페이스, 컨테이너 등의 상태를 확인하고, 로그를 조회하여 애플리케이션 상태를 진단할 수 있습니다.
- 배포 관리
- 애플리케이션 배포, 확장, 롤백 등의 작업을 쉽게 수행할 수 있습니다.
- Kubernetes 리소스 관리
설치
kubeadm, kubelet, kubectl 패키지 설치 작업은 Rocky Linux 9.4 버전에서 테스트를 진행했습니다.
또한 각 패키지의 버전은 1.31 버전을 설치하도록 설정하였습니다.
Kubernetes는 Github으로 프로젝트가 관리되고 있습니다.
Kubernetes의 최신 릴리즈 노트 를 확인해보면 24년 9월 둘째 주에 릴리즈한 v1.31.1 버전이 최신 버전입니다.
각각의 kubeadm, kubelet, kubectl 패키지 들은 kubernetes GitHub 프로젝트의 리포지토리를 통해 확인할 수 있습니다.
본격적으로 설치를 진행해보도록 하겠습니다.cat
명령어를 사용하여 Kubernetes repo를 추가합니다. repo 추가 시 최신 버전인 v1.31 버전을 지정하였습니다.
# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
yum list
명령어를 사용하여 yum repo 확인 시 1.31 버전의 kubeadm, kubelet, kubectl 패키지 리스트를 확인하실 수 있습니다.
# yum list kube*
Kubernetes 4.2 kB/s | 1.7 kB 00:00
Installed Packages
kubeadm.x86_64 1.31.0-150500.1.1 @kubernetes
kubectl.x86_64 1.31.0-150500.1.1 @kubernetes
kubelet.x86_64 1.31.0-150500.1.1 @kubernetes
kubernetes-cni.x86_64 1.5.1-150500.1.1
yum install
명령어를 사용하여 kubeadm, kubelet, kubectl 패키지를 설치합니다.
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
Last metadata expiration check: 0:00:12 ago on Fri 20 Sep 2024 01:36:55 PM KST.
Package kubelet-1.31.0-150500.1.1.x86_64 is already installed.
Package kubeadm-1.31.0-150500.1.1.x86_64 is already installed.
Package kubectl-1.31.0-150500.1.1.x86_64 is already installed.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
kubeadm x86_64 1.31.1-150500.1.1 kubernetes 11 M
kubectl x86_64 1.31.1-150500.1.1 kubernetes 11 M
kubelet x86_64 1.31.1-150500.1.1 kubernetes 15 M
Transaction Summary
================================================================================
Upgrade 3 Packages
##### 생략 #####
Upgraded:
kubeadm-1.31.1-150500.1.1.x86_64 kubectl-1.31.1-150500.1.1.x86_64
kubelet-1.31.1-150500.1.1.x86_64
Complete!
kubelet은 데몬 형태로 실행되므로 systemctl
명령어를 사용하여 시스템 부팅 시 자동으로 시작되도록 등록하고, 시작합니다.
# systemctl enable --now kubelet
*** 2024-10-17 추가
Kubernetes는 노드의 메모리 관리 방식을 중요하게 여기며, 스왑(Swap)이 활성화된 상태에서는 메모리 관련 문제가 발생할 수 있기 때문에 이를 비활성화해야 합니다.
스왑(Swap) 비활성화 후 kubelet을 재시작 합니다.
# swapoff -a
# sed -i '/ swap / s/^/#/' /etc/fstab
# systemctl restart kubelet
*** 2024-10-30 추가
Linux에서 기본적으로 구동 중인 firewalld 서비스를 종료합니다. API 서버 연결 및 노드 추가 등의 작업 시 방화벽으로 작업이 비정상적으로 동작할 수 있습니다. 해당 서비스를 종료할 수 없다면 허용이 필요한 모든 방화벽 정책 확인 후 방화벽 정책을 추가하여 사용 가능합니다.
firewalld 서비스를 종료 후 재시작 시에도 비활성화 하도록 설정합니다.
# systemctl stop firewalld
# systemctl disable firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
설치 확인
kubeadm
kubeadm version
명령어를 사용하여 kubeadm 패키지가 정상적으로 설치되었는지 확인합니다.
# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.1",
GitCommit:"948afe5ca072329a73c8e79ed5938717a5cb3d21", GitTreeState:"clean",
BuildDate:"2024-09-11T21:26:49Z", GoVersion:"go1.22.6", Compiler:"gc", Platform:"linux/amd64"}
kubelet
kubelet --version
명령어를 사용하여 kubelet 패키지가 정상적으로 설치되었는지 확인합니다.
# kubelet --version
Kubernetes v1.31.1
systemctl
명령어를 사용하여 kubelet 데몬의 상태를 확인합니다.
클러스트가 구성되어 있지 않기 때문에 실행되고 있지만 상태는 실패로 확인될 것입니다.
# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Fri 2024-09-20 16:20:57 KST; 3s ago
Docs: https://kubernetes.io/docs/
Process: 1465978 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)
Main PID: 1465978 (code=exited, status=1/FAILURE)
CPU: 136ms
kubectl
kubectl version
명령어를 사용하여 kubectl 패키지가 정상적으로 설치되었는지 확인합니다.
클러스트가 구성되어 있지 않기 때문에 API와 통신할 수 없어 API 서버 연결 오류가 발생할 것입니다.
# kubectl version
Client Version: v1.31.1
Kustomize Version: v5.4.2
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Rocky Linux 9.4에서 kubeadm, kubelet, kubectl 패키지를 설치하는 방법을 알아봤습니다.
먼저, Kubernetes 관련 repo를 등록하고 yum install
명령어를 사용하여 각 패키지를 설치합니다. 그 후, 각 패키지별 version 명령어를 사용하여 버전 정보를 확인할 수 있으며, kubelet 및 kubectl 에서는 클러스트가 구성되어 있지 않기 때문에 오류가 발생하는 것을 확인하실 수 있습니다.
지금까지 kubeadm, kubelet, kubectl 패키지를 설치하는 방법을 간단히 알아보는 시간을 가졌습니다....! 끝...!
유익하게 보셨다면 공감을 눌러주고, 댓글로 의견을 공유해 남겨주시면 감사하겠습니다!
[Reference]
https://github.com/kubernetes/kubernetes
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/