{"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":"2025-07-17T15:08:57","modified_gmt":"2025-07-17T06:08:57","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.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<h2>2. Docker \uc124\uce58<\/h2>\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<\/code><\/pre>\n<h2>3. \ucfe0\ubc84\ub124\ud2f0\uc2a4 \uc124\uce58<\/h2>\n<h3>3.1 \ucfe0\ubc84\ub124\ud2f0\uc2a4 GPG \ud0a4 \ucd94\uac00<\/h3>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.29\/deb\/Release.key | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/code><\/pre>\n<h3>3.2 \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<\/code><\/pre>\n<h3>3.3 \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\nsudo apt-mark hold kubelet kubeadm kubectl<\/code><\/pre>\n<h3>3.4 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<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<\/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:\/\/raw.githubusercontent.com\/flannel-io\/flannel\/master\/Documentation\/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<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<\/code><\/pre>\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\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.<\/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.1 \uc2dc\uc2a4\ud15c \uc5c5\ub370\uc774\ud2b8 sudo apt update &amp;&amp; sudo apt upgrade -y 1.2 \ud544\uc694\ud55c \ud328\ud0a4\uc9c0 \uc124\uce58 sudo apt install -y curl wget apt-transport-https ca-certificates gnupg lsb-release 1.3 \uc2a4\uc651 \ube44\ud65c\uc131\ud654 \ucfe0\ubc84\ub124\ud2f0\uc2a4\ub294 \uc2a4\uc651\uc774 \ube44\ud65c\uc131\ud654\ub418\uc5b4\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":15,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10480\/revisions"}],"predecessor-version":[{"id":10523,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10480\/revisions\/10523"}],"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}]}}