Kubernetes – Install on Debian & run nginx

By | 2025년 3월 15일
Table of Contents

Kubernetes – Install on Debian & run nginx

이 가이드는 데비안 시스템에 쿠버네티스를 설치하고 간단한 nginx 애플리케이션을 배포하는 과정을 단계별로 설명합니다.

1. 시스템 준비

1.1 시스템 업데이트

sudo apt update && sudo apt upgrade -y

1.2 필요한 패키지 설치

sudo apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release

1.3 스왑 비활성화

쿠버네티스는 스왑이 비활성화되어 있어야 합니다.

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

(옵션) 라즈베리 파이인 경우

sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

2. Docker 설치

2.1 Docker 공식 GPG 키 추가

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

2.2 Docker 저장소 추가

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2.3 Docker 설치

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

2.4 Docker 서비스 시작 및 활성화

sudo systemctl start docker
sudo systemctl enable docker

# docker ps
# permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/containers/json": dial unix /var/run/docker.sock: connect: permission denied

# sudo docker ps
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

2.5 사용자를 docker 그룹에 추가

sudo usermod -aG docker $USER
newgrp docker

# docker ps
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

3. 쿠버네티스 설치

3.1 쿠버네티스 GPG 키 추가

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3.2 쿠버네티스 저장소 추가

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

3.3 쿠버네티스 컴포넌트 설치

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

3.4 containerd 설정

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

4. 쿠버네티스 클러스터 초기화

4.1 클러스터 초기화

4.1.1 (옵션) 라즈베리 파이인 경우

sudo vi /boot/firmware/cmdline.txt
# 같은 라인 끝에
cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

sudo reboot

4.1.2 커널 설정

sudo modprobe br_netfilter
echo 'br_netfilter' | sudo tee /etc/modules-load.d/k8s.conf

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

4.1.3 초기화

# 초기화 오류시 리셋
# sudo kubeadm reset -f
# sudo systemctl stop kubelet
# sudo rm -rf /var/lib/kubelet/*
# sudo rm -rf /etc/kubernetes/*
# sudo rm -rf /etc/cni/net.d/*

# 추가 디버깅이 필요한 경우
# sudo journalctl -u kubelet -f --no-pager

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

4.2 kubectl 설정

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

4.3 네트워크 플러그인 설치 (Flannel)

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

4.4 마스터 노드에서 파드 스케줄링 허용 (단일 노드 클러스터용)

맨 끝의 마이너스는 오타가 아닙니다.

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

5. Hello, World

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-server
  labels:
    app: server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      name: nginx-server
      labels:
        app: server
    spec:
      containers:
        - name: server
          image: nginx:1.23.3
          ports:
            - containerPort: 80
# kubectl delete -f nginx-deployment.yaml
kubectl create -f nginx-deployment.yaml
kubectl get pods
-------------------
NAME                           READY   STATUS    RESTARTS   AGE
nginx-server-5d4b88c67-rmlc2   1/1     Running   0          83s
nginx-server-5d4b88c67-tqs5x   1/1     Running   0          83s
kubectl expose deployment nginx-server --type=NodePort --name=nginx-service-nodeport
kubectl get service
-------------------
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP   10.96.0.1      <none>        443/TCP        8m29s
nginx-service-nodeport   NodePort    10.106.2.244   <none>        80:31405/TCP   8s

위 31405 포트를 이용해 외부에서 접근 가능합니다.
(방화벽 확인 필요)

http://192.168.20.206:31405/

답글 남기기