[cloud] Kubeadm을 활용한 k8s cluster 구축 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

VM

  • image - ubuntu 22.04 lts
  • CPU : 4core
  • Memory : 4096 MB
  • network
    • Shared Network
      • guest network - 192.168.100.0/24
    • Bridged (Advanced)

kubeadm 설치 과정

timezone 설정

sudo timedatectl set-timezone "Asia/Seoul"
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd.service

kubelet를 제대로 동작하려면 swap을 반드시 꺼야 한다.

sudo swapoff -a && sudo sed -i '/swap/s/&/#/' /etc/fstab

방화벽 끄기

sudo ufw disable

필수 포트 확인

  • 쿠버네티스 컴포넌트 끼리 통신하기 위해 특정 포트가 반드시 열려 있어야 한다.
telnet 127.0.0.1 6443

iptables 설정

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

Docker Engine 설치

  • docker apt 저장소 설정
# 1. 패키지 준비
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# 2. GPG 키 저장소 생성
sudo install -m 0755 -d /etc/apt/keyrings

# 3. GPG 키 등록 (중요: .gpg로 저장해야 함)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 4. apt 소스 등록 (중요: signed-by 경로 수정)
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 패키지 색인 업데이트
sudo apt-get update

  • CRI(Container Runtime Interface) - containerd
sudo apt-get install docker-ce docker-ce-cli [containerd.io](http://containerd.io/)
  • 확인
sudo docker run hello-world
  • containerd 환경 설정 파일은 아래 경로에서 확인가능
/etc/containerd/config.toml
  • cir 활성화 하고 containerd 재시작
sudo sed -i 's/^disabled_plugins/#disabled_plugins/' /etc/containerd/config.toml
sudo systemctl restart containerd

쿠버네티스 설치

kubeadm, kubelet 및 kubectl 설치

  • kubeadm: 클러스터를 부트스트랩하는 명령이다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.

echo '======== [7] kubeadm 설치 ========'
echo '======== [7-1] APT 저장소 설정 ========'

# [1] GPG 키 등록
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key \
  | gpg --dearmor \
  | sudo tee /etc/apt/trusted.gpg.d/kubernetes.gpg > /dev/null
# [2] 저장소 등록 (signed-by 안 씀, trusted.gpg.d에 있으므로 전역 신뢰)
echo "deb https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
# [3] 패키지 업데이트
sudo apt-get update
# [4] Kubernetes 1.29 컴포넌트 설치
sudo apt-get install -y kubelet=1.29.1-1.1 kubeadm=1.29.1-1.1 kubectl=1.29.1-1.1
sudo apt-mark hold kubelet kubeadm kubectl

echo '======== [8] kubeadm으로 클러스터 생성 ========여기서부터는 Master Node만 수행'
echo '======== [8-1] 클러스터 초기화 (Pod Network 세팅) ========'
sudo kubeadm init --pod-network-cidr=20.96.0.0/16 --apiserver-advertise-address=192.168.100.3

echo '======== [8-2] kubectl 사용 설정 ========'
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

echo '======== [8-3] Pod Network 설치 (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

echo '======== [9] 쿠버네티스 편의기능 설치 ========'
echo '======== [9-1] kubectl 자동완성 기능 ========'
sudo apt-get install -y bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "alias k=kubectl" >> ~/.bashrc
echo "complete -o default -F __start_kubectl k" >> ~/.bashrc
source ~/.bashrc

echo '======== [9-2] Dashboard 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml

echo '======== [9-3] 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


1. Helm Chart로 Prometheus + Grafana 설치

# Helm 설치 안 되어 있으면
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

2. kube-prometheus-stack 설치 (Prometheus + Grafana + Exporter 통합)

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

3. kubectl patch를 사용해서 ClusterIP를 NodePort로 변경해야함

kubectl patch svc prometheus-stack-grafana -n monitoring \
  -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "targetPort": 3000, "protocol": "TCP", "nodePort": 30001}]}}'

4. 설치 확인

kubectl get pods -n monitoring
  • id : admin
  • 비밀번호 : prom-operator
  • 접속 주소
http://192.168.100.3:30001

WorkerNode Join

  • master node에서 join 명령어 조회
kubeadm token create --print-join-command
sudo kubeadm join 192.168.100.3:6443 --token jcbakj.2j27grcbuo4u02gv --discovery-token-ca-cert-hash sha256:4490c9f421dff849466f5f7048e5a2737b4ae98407ff42fd77f217bdc8460a94
  • Master Node에서 명령어로 조회 가능

image

  • k8s dashboard image
  • Grafana image

(추후) 로그(Log) 모니터링 – Loki 연동

  • Loki란?
    • Grafana Labs에서 만든 로그 수집 시스템
    • Prometheus처럼 label 기반 질의 가능
    • Fluent Bit / Promtail로 로그 수집
  • Loki 설치
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

helm install loki grafana/loki-stack \
  --namespace loki-stack --create-namespace \
  --set grafana.enabled=false \
  --set prometheus.enabled=false \
  --set fluent-bit.enabled=true