{"id":10480,"date":"2025-03-15T12:08:43","date_gmt":"2025-03-15T03:08:43","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=10480"},"modified":"2026-10-01T16:56:56","modified_gmt":"2026-10-01T07:56:56","slug":"kubernetes-install-on-debian-run-spring-boot-app","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=10480","title":{"rendered":"Kubernetes &#8211; Install on Debian &#038; run nginx"},"content":{"rendered":"<h1>Kubernetes &#8211; Install on Debian &amp; run nginx<\/h1>\n<p>\uc774 \uac00\uc774\ub4dc\ub294 \ub370\ube44\uc548 \uc2dc\uc2a4\ud15c\uc5d0 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub97c \uc124\uce58\ud558\uace0 \uac04\ub2e8\ud55c nginx \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubc30\ud3ec\ud558\ub294 \uacfc\uc815\uc744 \ub2e8\uacc4\ubcc4\ub85c \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n<h2>1. \uc2dc\uc2a4\ud15c \uc900\ube44<\/h2>\n<h3>1.0 \uba54\ubaa8\ub9ac \ud655\uc778<\/h3>\n<p>\ucd5c\uc18c 4G \uc774\uc0c1\uc740 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">free -m\n               total        used        free      shared  buff\/cache   available\nMem:            3795         610        2249           9        1014        3185\nSwap:              0           0           0<\/code><\/pre>\n<h3>1.1 \uc2dc\uc2a4\ud15c \uc5c5\ub370\uc774\ud2b8<\/h3>\n<pre><code class=\"language-bash\">sudo apt update &amp;&amp; sudo apt upgrade -y<\/code><\/pre>\n<h3>1.2 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0 \uc124\uce58<\/h3>\n<pre><code class=\"language-bash\">sudo apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release<\/code><\/pre>\n<h3>1.3 \uc2a4\uc651 \ube44\ud65c\uc131\ud654<\/h3>\n<p>\ucfe0\ubc84\ub124\ud2f0\uc2a4\ub294 \uc2a4\uc651\uc774 \ube44\ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo swapoff -a\nsudo sed -i &#039;\/ swap \/ s\/^\\(.*\\)$\/#\\1\/g&#039; \/etc\/fstab<\/code><\/pre>\n<p>(\uc635\uc158) \ub77c\uc988\ubca0\ub9ac \ud30c\uc774\uc778 \uacbd\uc6b0<\/p>\n<pre><code class=\"language-bsdh\">sudo systemctl stop dphys-swapfile\nsudo systemctl disable dphys-swapfile<\/code><\/pre>\n<p>Raspberry Pi OS(Trixie, Debian 13 \uae30\ubc18) \uc778 \uacbd\uc6b0<\/p>\n<pre><code class=\"language-bash\">systemctl list-units --type swap -all\n  UNIT           LOAD      ACTIVE   SUB  DESCRIPTION\n  dev-zram0.swap loaded    inactive dead rpi-swap managed swap device (zram+file)\n\u25cf var-swap.swap  not-found inactive dead var-swap.swap\n......<\/code><\/pre>\n<pre><code class=\"language-bash\">sudo swapoff -a\nsudo vi \/etc\/rpi\/swap.conf\n------------------------\n[Main]\n#Mechanism=auto\nMechanism=none\n------------------------\n\nsudo reboot\nswapon --show<\/code><\/pre>\n<h2>2. Docker \uc124\uce58<\/h2>\n<blockquote>\n<p>Kubernetes 1.24 \uc5d0\uc11c dockershim \uc774 \uc81c\uac70\ub41c \uc774\ud6c4 kubeadm \ud074\ub7ec\uc2a4\ud130\ub294 Docker \ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. containerd \ub9cc \uc788\uc73c\uba74 \ub429\ub2c8\ub2e4.<br \/>\n\uc544\ub798 \ubb38\uc11c\uc5d0\uc11c\ub294 \ud3b8\uc758\uc0c1 \ubaa8\ub450 \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<h3>2.1 Docker \uacf5\uc2dd GPG \ud0a4 \ucd94\uac00<\/h3>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/download.docker.com\/linux\/debian\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg<\/code><\/pre>\n<h3>2.2 Docker \uc800\uc7a5\uc18c \ucd94\uac00<\/h3>\n<pre><code class=\"language-bash\">echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/debian $(lsb_release -cs) stable&quot; | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null<\/code><\/pre>\n<h3>2.3 Docker \uc124\uce58<\/h3>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y docker-ce docker-ce-cli containerd.io<\/code><\/pre>\n<h3>2.4 Docker \uc11c\ube44\uc2a4 \uc2dc\uc791 \ubc0f \ud65c\uc131\ud654<\/h3>\n<pre><code class=\"language-bash\">sudo systemctl start docker\nsudo systemctl enable docker<\/code><\/pre>\n<h3>2.5 \uc0ac\uc6a9\uc790\ub97c docker \uadf8\ub8f9\uc5d0 \ucd94\uac00<\/h3>\n<pre><code class=\"language-bash\">sudo usermod -aG docker $USER\nnewgrp docker\n\n# sudo \uc5c6\uc774 \uba85\ub839 \uc2e4\ud589\ndocker ps<\/code><\/pre>\n<h2>3. \ucfe0\ubc84\ub124\ud2f0\uc2a4 \uc124\uce58<\/h2>\n<h3>3.1 \ucfe0\ubc84\ub124\ud2f0\uc2a4 \uc800\uc7a5\uc18c \ucd94\uac00<\/h3>\n<pre><code class=\"language-bash\"># echo &#039;deb [signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.29\/deb\/ \/&#039; | sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list\n\nWarning:\n......\nSignature Packet v3 is not considered secure since 2026-02-01T00:00:00Z\n......\n\n# \uc704 \uba85\ub839\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\ubbc0\ub85c \uc544\ub798 \ubc29\uc2dd\uc73c\ub85c \ubcc0\uacbd\ud569\ub2c8\ub2e4.\n\nVER=v1.34\ncurl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/$VER\/deb\/Release.key | sudo gpg --dearmor --yes -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg\necho &quot;deb [signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/$VER\/deb\/ \/&quot; | sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list\nsudo apt update<\/code><\/pre>\n<h3>3.2 \ucfe0\ubc84\ub124\ud2f0\uc2a4 \ucef4\ud3ec\ub10c\ud2b8 \uc124\uce58<\/h3>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y kubelet kubeadm kubectl\n# \ubc84\uc804 \uace0\uc815\nsudo apt-mark hold kubelet kubeadm kubectl<\/code><\/pre>\n<h3>3.3 containerd \uc124\uc815<\/h3>\n<pre><code class=\"language-bash\">sudo mkdir -p \/etc\/containerd\ncontainerd config default | sudo tee \/etc\/containerd\/config.toml\nsudo sed -i &#039;s\/SystemdCgroup = false\/SystemdCgroup = true\/&#039; \/etc\/containerd\/config.toml\nsudo systemctl restart containerd<\/code><\/pre>\n<h2>4. \ucfe0\ubc84\ub124\ud2f0\uc2a4 \ud074\ub7ec\uc2a4\ud130 \ucd08\uae30\ud654<\/h2>\n<h3>4.1 \ud074\ub7ec\uc2a4\ud130 \ucd08\uae30\ud654<\/h3>\n<h4>4.1.1 (\uc635\uc158) \ub77c\uc988\ubca0\ub9ac \ud30c\uc774\uc778 \uacbd\uc6b0<\/h4>\n<p>putty \ucc3d \ub4f1\uc744 \ucd24\ub300\ud654\ud574 \ubcf4\uba74 \ud55c\uc904\ub9cc \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uadf8 \ub77c\uc778 \ub05d\ub0b4 \uc785\ub825\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">sudo vi \/boot\/firmware\/cmdline.txt\n# \uac19\uc740 \ub77c\uc778 \ub05d\uc5d0\ncgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1\n\nsudo reboot<\/code><\/pre>\n<h4>4.1.2 \ucee4\ub110 \uc124\uc815<\/h4>\n<pre><code class=\"language-bash\">sudo modprobe overlay\nsudo modprobe br_netfilter\nsudo tee \/etc\/modules-load.d\/containerd.conf &lt;&lt;EOF\noverlay\nbr_netfilter\nEOF\n\ncat &lt;&lt;EOF | sudo tee \/etc\/sysctl.d\/k8s.conf\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1\nEOF\n\nsudo sysctl --system<\/code><\/pre>\n<h3>4.1.3 \ucd08\uae30\ud654<\/h3>\n<pre><code class=\"language-bash\"># \ucd08\uae30\ud654 \uc624\ub958\uc2dc \ub9ac\uc14b\n# sudo kubeadm reset -f\n# sudo systemctl stop kubelet\n# sudo rm -rf \/var\/lib\/kubelet\/*\n# sudo rm -rf \/etc\/kubernetes\/*\n# sudo rm -rf \/etc\/cni\/net.d\/*\n\n# \ucd94\uac00 \ub514\ubc84\uae45\uc774 \ud544\uc694\ud55c \uacbd\uc6b0\n# sudo journalctl -u kubelet -f --no-pager\n\nsudo kubeadm init --pod-network-cidr=10.244.0.0\/16\n......\nThen you can join any number of worker nodes by running the following on each as root:\n\n# \uc544\ub798 \uba85\ub839\uc744 \uc800\uc7a5\ud574 \ub461\ub2c8\ub2e4.\n\nkubeadm join 192.168.20.206:6443 --token uqmXXXXXXXXXXXXXXX \\\n        --discovery-token-ca-cert-hash sha256:3c5101XXXXXXXXXXXXXXXXXXXXXXX<\/code><\/pre>\n<h3>4.2 kubectl \uc124\uc815<\/h3>\n<pre><code class=\"language-bash\">mkdir -p $HOME\/.kube\nsudo cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config\nsudo chown $(id -u):$(id -g) $HOME\/.kube\/config<\/code><\/pre>\n<h3>4.3 \ub124\ud2b8\uc6cc\ud06c \ud50c\ub7ec\uadf8\uc778 \uc124\uce58 (Flannel)<\/h3>\n<pre><code class=\"language-bash\">kubectl apply -f https:\/\/github.com\/flannel-io\/flannel\/releases\/latest\/download\/kube-flannel.yml<\/code><\/pre>\n<h3>4.4 \ub9c8\uc2a4\ud130 \ub178\ub4dc\uc5d0\uc11c \ud30c\ub4dc \uc2a4\ucf00\uc904\ub9c1 \ud5c8\uc6a9 (\ub2e8\uc77c \ub178\ub4dc \ud074\ub7ec\uc2a4\ud130\uc6a9)<\/h3>\n<p>\ub9e8 \ub05d\uc758 \ub9c8\uc774\ub108\uc2a4\ub294 \uc624\ud0c0\uac00 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">kubectl taint nodes --all node-role.kubernetes.io\/control-plane-<\/code><\/pre>\n<h2>5. Hello, World<\/h2>\n<p>nginx-deployment.yaml<\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: nginx-server\n  labels:\n    app: server\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: server\n  template:\n    metadata:\n      name: nginx-server\n      labels:\n        app: server\n    spec:\n      containers:\n        - name: server\n          image: nginx:1.23.3\n          ports:\n            - containerPort: 80<\/code><\/pre>\n<pre><code class=\"language-bash\"># kubectl delete -f nginx-deployment.yaml\nkubectl create -f nginx-deployment.yaml<\/code><\/pre>\n<p>30\ucd08 \uc815\ub3c4 \uc9c0\ub098\uba74 Pod \uac00 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">kubectl get pods\n-------------------\nNAME                           READY   STATUS    RESTARTS   AGE\nnginx-server-5d4b88c67-rmlc2   1\/1     Running   0          83s\nnginx-server-5d4b88c67-tqs5x   1\/1     Running   0          83s<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl expose deployment nginx-server --type=NodePort --name=nginx-service-nodeport<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl get service\n-------------------\nNAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE\nkubernetes               ClusterIP   10.96.0.1      &lt;none&gt;        443\/TCP        8m29s\nnginx-service-nodeport   NodePort    10.106.2.244   &lt;none&gt;        80:31405\/TCP   8s\n\nkubectl get nodes -o wide\nNAME   STATUS   ROLES           AGE   VERSION    INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION       CONTAINER-RUNTIME\nrpi4   Ready    control-plane   25m   v1.34.12   192.168.20.206   &lt;none&gt;        Debian GNU\/Linux 13 (trixie)   6.18.50+rpt-rpi-v8   containerd:\/\/2.3.6<\/code><\/pre>\n<p>INTERNAL-IP + \ud3ec\ud2b8\ubc88\ud638\ub97c \ud569\uccd0\uc11c \uc811\uc18d \uac00\ub2a5\ud569\ub2c8\ub2e4.<br \/>\n\ub2e8, \uac19\uc740 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc811\uadfc\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc704 31405 \ud3ec\ud2b8\ub97c \uc774\uc6a9\ud574 \uc678\ubd80\uc5d0\uc11c \uc811\uadfc \uac00\ub2a5\ud569\ub2c8\ub2e4.<br \/>\n(\ubc29\ud654\ubcbd \ud655\uc778 \ud544\uc694)<\/p>\n<p><a href=\"http:\/\/192.168.20.206:31405\/\">http:\/\/192.168.20.206:31405\/<\/a><\/p>\n<h2>6. \ub300\uc2dc\ubcf4\ub4dc<\/h2>\n<p>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ucfe0\ubc84\ub124\ud2f0\uc2a4\uc758 \uc0c1\ud0dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ub9e4\ud2b8\ub9ad\uc2a4 \uc124\uce58<\/h3>\n<pre><code class=\"language-bash\">kubectl apply -f https:\/\/github.com\/kubernetes-sigs\/metrics-server\/releases\/latest\/download\/components.yaml<\/code><\/pre>\n<h3>\ub300\uc2dc\ubcf4\ub4dc \ub2e4\uc6b4\ub85c\ub4dc<\/h3>\n<p>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uc811\uc18d\ud558\uae30 \uc704\ud55c \uc124\uc815\uc744 \ud574\uc90d\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">wget https:\/\/raw.githubusercontent.com\/kubernetes\/dashboard\/v2.7.0\/aio\/deploy\/recommended.yaml\n\nvi recommended.yaml\n......\nkind: Service\n......\nspec:\n  type: NodePort                     # \uc774\uac70\n  ports:\n    - port: 443\n      targetPort: 8443\n      nodePort: 30239                # \uc774\uac70 (\uc704 \ud3ec\ud2b8\ubc88\ud638\uac00 \uc544\ub2cc \uc0c8\ub85c\uc6b4 \ud3ec\ud2b8\ubc88\ud638 \uc9c0\uc815)\n......\n\nkubectl apply -f recommended.yaml<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl get svc -n kubernetes-dashboard<\/code><\/pre>\n<h3>\uacc4\uc815\uc0dd\uc131<\/h3>\n<pre><code class=\"language-bash\">vi dashboard-user.yaml\n---------------------------\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: admin-user\n  namespace: kubernetes-dashboard\n\n---\n\napiVersion: rbac.authorization.k8s.io\/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: admin-user\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: cluster-admin\nsubjects:\n- kind: ServiceAccount\n  name: admin-user\n  namespace: kubernetes-dashboard\n---------------------------<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl apply -f dashboard-user.yaml<\/code><\/pre>\n<pre><code class=\"language-bash\"># \ud1a0\ud070 \uc0dd\uc131 \ubc0f \uc7ac\uc0dd\uc131\nkubectl -n kubernetes-dashboard create token admin-user<\/code><\/pre>\n<h3>\ub85c\uadf8\uc778<\/h3>\n<p><a href=\"https:\/\/\uc11c\ubc84\uc544\uc774\ud53c:30239\/\">https:\/\/\uc11c\ubc84\uc544\uc774\ud53c:30239\/<\/a> \ub85c \uc811\uc18d\ud569\ub2c8\ub2e4.<br \/>\nhttps \ub85c \uc811\uc18d\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes &#8211; Install on Debian &amp; run nginx \uc774 \uac00\uc774\ub4dc\ub294 \ub370\ube44\uc548 \uc2dc\uc2a4\ud15c\uc5d0 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub97c \uc124\uce58\ud558\uace0 \uac04\ub2e8\ud55c nginx \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubc30\ud3ec\ud558\ub294 \uacfc\uc815\uc744 \ub2e8\uacc4\ubcc4\ub85c \uc124\uba85\ud569\ub2c8\ub2e4. 1. \uc2dc\uc2a4\ud15c \uc900\ube44 1.0 \uba54\ubaa8\ub9ac \ud655\uc778 \ucd5c\uc18c 4G \uc774\uc0c1\uc740 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. free -m total used free shared buff\/cache available Mem: 3795 610 2249 9 1014 3185 Swap: 0 0 0 1.1 \uc2dc\uc2a4\ud15c \uc5c5\ub370\uc774\ud2b8 sudo\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=10480\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,45],"tags":[],"class_list":["post-10480","post","type-post","status-publish","format-standard","hentry","category-devops","category-kubernetes-"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10480"}],"version-history":[{"count":31,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10480\/revisions"}],"predecessor-version":[{"id":11995,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10480\/revisions\/11995"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}