
쿠버네티스
쿠버네티스(K8S)란 컨테이너를 배포하고 확장 및 관리를 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼입니다. 컨테이너를 배포할 WokerNode와 컨테이너를 관리할 MasterNode를 구성하여 쿠버네티스를 구축한 내용을 정리하였습니다.
호환성 및 설치 조건 확인
구성에 앞서 쿠버네티스 설치하기 위한 Ubuntu 서버와 구축환경에서 사용할 Runtime을 선정이 필요합니다.
K8S 1.24버전 부터는 Docker의 CRI 런타임 지원중단 이슈로 CRI-O 런타임을 선정하여 구성 하였습니다.
그외 설치 요건을 확인하여 구성을 진행하였습니다.
이름 | OS 및 Runtime | 버전 | 비고 |
Master Node 1EA | Ubuntu | 22.04 | CPU 2Core 이상 Mem 2G 이상 Disk 30G 이상 |
Worker Node 2EA | Ubuntu | 22.04 | |
K8S | kubeadm kubelet kubectl |
1.27 | CRI 및 쿠버네티스 버전은 동일하게 구성 |
Runtime | Cri-o | 1.27 |
K8S 설치 (모든 노드에 공통 적용)
Ubuntu 최신 업데이트 패키지 버전 업데이트
sudo apt update
sudo apt upgrade
Ubuntu 방화벽 OFF
작업 편의상 모든 방화벽을 OFF하였으나 세부적인 방화벽 구성이 필요한 경우 아래 문서를 참고해주세요.
https://kubernetes.io/ko/docs/reference/networking/ports-and-protocols/
sudo ufw disable
sudo ufw status

쿠버네티스 노드 식별을 위한 Hostname 구성
워커노드를 Hostname으로 호출하기 위해 각 노드별로 서로 다른 Hostname을 지정합니다.
sudo vim /etc/hostname
- MasterNode
- WorkerNode01
- WorkerNode02
스왑메모리 비활성
Swapoff 명령어를 통해 스왑메모리를 즉시 비활성하고 재부팅 후에도 Swap이 켜지지 않도록 합니다.
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
스왑메모리가 정상적으로 OFF되어 있는지 확인하려면 Free 명령어를 수행합니다.
sudo free

쿠버네티스 커널 파라미터 수정
Node 및 Container 통신을 위한 overlay, 네트워크 브리지 패킷 통신에 필요한 br_netfilter 구성
K8S.conf / kubernetes.conf 둘다 사용가능 합니다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
#재부팅 후에도 값이 유지되도록 하기
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
apt 레포지토리 의존성 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl
구글 클라우드의 공개 사이닝 키를 다운로드
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
쿠버네티스 APT 레포지토리 추가
1.27버전 설치 시 쿠버네티스 Docs의 레포지토리 경로는 작동하지 않습니다.
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
최신 버전의 쿠버네티스 설치 시 변경된 레포지토리로 설치해야 됩니다.
2023년 9월 13일 이후에 출시된 Kubernetes 버전을 설치하려면 에서 호스팅되는 새 패키지 저장소를 사용하는 것이 강력히 권장되며 필요합니다.
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/change-package-repository/
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.27/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
kubelet, kubeadm, kubectl 설치
sudo apt install kubelet kubeadm kubectl
kubelet, kubeadm, kubectl 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
kubelet, kubeadm, kubectl 버전 체크
sudo kubeadm version
sudo kubectl version
sudo kubelet --version

쿠버네티스 런타임 설치 CRI-O (모든 노드에 공통 적용)
Ubuntu 버전 및 CRI Runtime 환경 변수 설정
24.05.06일 기준 Ubuntu 22.04 Repositories를 못찾는 이슈가 있습니다. xUbuntu_20.04로 바꿔 임시 해결이 가능합니다.
#오류 메시지 일부
Connection failed [IP: 95.216.238.135 443]
Fetched 31.5 MB in 19s (1,703 kB/s)
E: Failed to fetch https://mirror.aardsoft.fi/opensuse/repositories/devel%3A/kubic%3A/libcontainers%3A/stable/xUbuntu_22.04/amd64/cri-o-runc_1.1.12~0_amd64.deb Connection failed [IP: 95.216.238.135 443]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
export OS=xUbuntu_22.04
export CRIO_VERSION=1.27
CRI-O apt 레포지토리 추가
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -
sudo apt-get update
CRI-O 설치 및 데몬 활성화
sudo apt-get install cri-o cri-o-runc -y
sudo systemctl daemon-reload
sudo systemctl enable crio --now
CRI-O 서비스 & 버전 체크
sudo service crio status
sudo crio --version


쿠버네티스 초기화 및 클러스터 구성 (Master Node)
Kubernetes Cluster 생성
10.244.0.0/16 CIDR 범위의 Pod 네트워크를 생성하고
10.50.152.171/32 MaterNode의 IP 주소로 Kubernetes 클러스터를 초기화합니다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.50.152.171

Kubernetes Cluster 구성
클러스터 구성을 위해 다음과 같이 홈 디렉토리 설정 및 Token 값을 백업 합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#Token 값 백업
kubeadm join 10.50.152.171:6443 --token ku8qoy.t7lt25gnlcm8e8bq \
--discovery-token-ca-cert-hash sha256:a3b042e3c1da771bb81333f578eb8c02dc486ad3793a6e4c19964
Kubernetes TroubleShooting
구성 시 자주 발생한 이슈를 정리해보면 스왑메모리, 런타임, Kubelet, Kubeadm Reset 등의 서비스가 미 실행중이거나 Kubeadm Reset 반영으로 이슈가 해결 되는 경우가 빈번해서 하기 내용이 누락되지 않았는지 확인이 필요합니다.
#Swap
sudo swapoff -a
#CRI 런타임 실행
sudo systemctl daemon-reload
sudo systemctl enable crio --now
#Kubelet 실행
sudo systemctl start kubelet
#Kubeadm 리셋
sudo kubeadm reset
#오류메시지 일부
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[ERROR Port-10250]: Port 10250 is in use
[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
쿠버네티스 노드 구성 (Worker Node)
Kubernetes Node Join
마스터노드에서 백업 해둔 Token 값을 Worker Node에 붙여넣기 하여 MasterNode에 조인합니다.

쿠버네티스 마스터 노드 (Master Node)
Kubernetes Node 가입 상태 확인하기
sudo kubectl get node
