{"id":1040,"date":"2025-08-16T23:47:04","date_gmt":"2025-08-16T14:47:04","guid":{"rendered":"https:\/\/wp.ssunmini.com\/?page_id=1040"},"modified":"2026-01-05T08:51:46","modified_gmt":"2026-01-04T23:51:46","slug":"devops-container-platform","status":"publish","type":"page","link":"https:\/\/wp.ssunmini.com\/?page_id=1040","title":{"rendered":"DevOps &#038; Container Platform"},"content":{"rendered":"\n<div class=\"wp-block-esab-accordion esab-o57ctfd1\" data-mode=\"individual\" data-close=\"true\"><div class=\"esab__container\">\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Kubernetes \uc124\uce58 \ub9e4\ub274\uc5bc (Ubuntu \uae30\ubc18)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\"><strong>1. \ubaa8\ub4e0 \ub178\ub4dc \uacf5\ud1b5 \uc124\uc815<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1) \ud638\uc2a4\ud2b8\ub124\uc784 \uc124\uc815<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo hostnamectl set-hostname ope-master   # Master\nsudo hostnamectl set-hostname ope-node-1   # Node-1\nsudo hostnamectl set-hostname ope-node-2   # Node-2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2) \/etc\/hosts \ud30c\uc77c \uc218\uc815<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/hosts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub0b4\uc6a9 \ucd94\uac00:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10.103.1.240 ope-master\n10.103.1.241 ope-node-1\n10.103.1.242 ope-node-2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3) Swap \ube44\ud65c\uc131\ud654<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo swapoff -a\nsudo sed -i '\/swap\/d' \/etc\/fstab<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4) \ubc29\ud654\ubcbd \uc124\uc815 (\uc635\uc158)<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 6443\/tcp    # API Server\nsudo ufw allow 2379:2380\/tcp # etcd\nsudo ufw allow 10250:10252\/tcp # Kubelet, Scheduler, Controller\nsudo ufw enable<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Container Runtime \uc124\uce58<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1) \ud544\uc218 \ud328\ud0a4\uc9c0<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2) containerd \uc124\uce58<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install -y containerd.io<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3) containerd \uc124\uc815<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/etc\/containerd\ncontainerd config default | sudo tee \/etc\/containerd\/config.toml &gt;\/dev\/null\nsudo sed -i 's\/SystemdCgroup = false\/SystemdCgroup = true\/' \/etc\/containerd\/config.toml\n\nsudo systemctl restart containerd\nsudo systemctl enable containerd<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Kubernetes \uc124\uce58<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1) \uc800\uc7a5\uc18c \ub4f1\ub85d<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.29\/deb\/Release.key \\\n | sudo gpg --dearmor -o \/usr\/share\/keyrings\/kubernetes-archive-keyring.gpg\n\necho \"deb &#91;signed-by=\/usr\/share\/keyrings\/kubernetes-archive-keyring.gpg] \\\n https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.29\/deb\/ \/\" \\\n | sudo tee \/etc\/apt\/sources.list.d\/kubernetes.list &gt; \/dev\/null<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2) \uc124\uce58<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y kubelet kubeadm kubectl\nsudo apt-mark hold kubelet kubeadm kubectl<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. \ucee4\ub110 \ub124\ud2b8\uc6cc\ud06c \uc124\uc815 (\uc911\uc694)<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>kubeadm init<\/code> \uc2e4\ud589 \uc2dc \ubc1c\uc0dd\ud588\ub358 \uc624\ub958 \ud574\uacb0 \ubc29\ubc95 \ud3ec\ud568.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1) \ubaa8\ub4c8 \ub85c\ub4dc<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo modprobe overlay\nsudo modprobe br_netfilter<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc601\uad6c \uc801\uc6a9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/modules-load.d\/k8s.conf &lt;&lt;EOF\noverlay\nbr_netfilter\nEOF<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2) sysctl \uc124\uc815<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo tee \/etc\/sysctl.d\/k8s.conf &lt;&lt;EOF\nnet.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.ipv4.ip_forward = 1\nEOF\n\nsudo sysctl --system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud655\uc778:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sysctl net.bridge.bridge-nf-call-iptables\nsysctl net.ipv4.ip_forward<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd9c\ub825\uac12:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Master \ub178\ub4dc \ucd08\uae30\ud654<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm init --pod-network-cidr=192.168.0.0\/16 \\\n --apiserver-advertise-address=10.103.1.240\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\uc2e4\ud589 \uc2dc <strong>\uc774\ubbf8\uc9c0 \ub2e4\uc6b4\ub85c\ub4dc \ub2e8\uacc4\uc5d0\uc11c \uc2dc\uac04\uc774 \uc624\ub798 \uac78\ub9b4 \uc218 \uc788\uc74c<\/strong>.<br>\ub290\ub9b4 \uacbd\uc6b0 \uc544\ub798 \uba85\ub839\uc5b4\ub85c \ubbf8\ub9ac \ub2e4\uc6b4\ub85c\ub4dc \uac00\ub2a5:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm config images pull --kubernetes-version v1.29.15<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>kubectl \uc124\uc815<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>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\n\n\n<p class=\"wp-block-paragraph\">root\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/root\/.kube\ncp \/home\/min\/.kube\/config \/root\/.kube\/config\nchown root:root \/root\/.kube\/config<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. \ub124\ud2b8\uc6cc\ud06c \ud50c\ub7ec\uadf8\uc778 \uc124\uce58 (Calico)<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/docs.projectcalico.org\/manifests\/calico.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Worker \ub178\ub4dc \uc870\uc778<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Master\uc5d0\uc11c \uc870\uc778 \uba85\ub839\uc5b4 \ubc1c\uae09:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubeadm token create --print-join-command<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Worker\uc5d0\uc11c \uc2e4\ud589:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo kubeadm join 10.103.1.240:6443 --token &lt;TOKEN&gt; \\\n --discovery-token-ca-cert-hash sha256:&lt;HASH&gt;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8. \ud074\ub7ec\uc2a4\ud130 \ud655\uc778<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"398\" height=\"80\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-210035.png\" alt=\"\" class=\"wp-image-1132\" style=\"width:550px;height:auto\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Kubernetes MetalLB + NGINX Ingress Controller \uc124\uce58 \uac00\uc774\ub4dc (Ubuntu 22.04)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0693e3\" class=\"has-inline-color\">\uc628\ud504\ub808\ubbf8\uc2a4 \ud658\uacbd\uc5d0\uc11c <strong>LoadBalancer \ud0c0\uc785 \uc778\uadf8\ub808\uc2a4<\/strong>\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 <code>MetalLB<\/code> + <code>Ingress NGINX Controller<\/code> \uc870\ud569\uc774 \uac00\uc7a5 \uac04\ub2e8\ud558\uace0 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4.<\/mark><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc0ac\uc804 \uc900\ube44<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ubuntu 22.04 \uae30\ubc18 Kubernetes \ud074\ub7ec\uc2a4\ud130 \uad6c\uc131\uc774 \uc644\ub8cc\ub418\uc5b4 \uc788\uc5b4\uc57c \ud568<\/li>\n\n\n\n<li><code>kubectl<\/code> \uba85\ub839\uc5b4 \uc0ac\uc6a9 \uac00\ub2a5<\/li>\n\n\n\n<li>\ud074\ub7ec\uc2a4\ud130 \ub0b4\ubd80 Pod \ub124\ud2b8\uc6cc\ud06c\ub294 <code>192.168.0.0\/16<\/code> \ub610\ub294 \uc6d0\ud558\ub294 CIDR \uc0ac\uc6a9 \uc911<\/li>\n\n\n\n<li>MetalLB\uac00 \uc0ac\uc6a9\ud560 <strong>\uc5ec\uc720 IP \ub300\uc5ed \ud655\ubcf4<\/strong> (DHCP \ucda9\ub3cc \ud53c\ud574\uc57c \ud568)<\/li>\n\n\n\n<li>Docker \ub610\ub294 Containerd \ub7f0\ud0c0\uc784 \uc815\uc0c1 \uc791\ub3d9 \uc911<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. MetalLB \uc124\uce58 \ubc0f \uc124\uc815<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 MetalLB \uc124\uce58 (native \ubaa8\ub4dc)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/metallb\/metallb\/v0.14.5\/config\/manifests\/metallb-native.yaml\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 MetalLB IP \ud480 \ubc0f \uad11\uace0 \uc124\uc815<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\uc544\ub798 \ub0b4\uc6a9\uc744 <code>metallb-config.yaml<\/code>\ub85c \uc800\uc7a5:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: metallb.io\/v1beta1\nkind: IPAddressPool\nmetadata:\n  name: my-ip-pool\n  namespace: metallb-system\nspec:\n  addresses:\n    - 192.168.0.200-192.168.0.210\n---\napiVersion: metallb.io\/v1beta1\nkind: L2Advertisement\nmetadata:\n  name: l2adv\n  namespace: metallb-system<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong><code>192.168.0.200~210<\/code>\uc740 \uc608\uc2dc\uc774\uba70, \ub124\ud2b8\uc6cc\ud06c \ud658\uacbd\uc5d0 \ub9de\uac8c \uc870\uc815 \ud544\uc694<\/strong><\/p>\n<\/blockquote>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\uc801\uc6a9:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f metallb-config.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.3 \uc124\uce58 \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n metallb-system<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>controller<\/code>, <code>speaker<\/code> \ubaa8\ub450 <strong>Running<\/strong> \uc0c1\ud0dc\uba74 \uc815\uc0c1<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"612\" height=\"96\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-210315.png\" alt=\"\" class=\"wp-image-1134\" style=\"width:802px;height:auto\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. NGINX Ingress Controller \uc124\uce58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 \uc124\uce58 (Cloud Provider\uc6a9 \ubc30\ud3ec \ud30c\uc77c \uc0ac\uc6a9)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/ingress-nginx\/controller-v1.12.1\/deploy\/static\/provider\/cloud\/deploy.yaml<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>bare-metal<\/code> \ud658\uacbd\uc5d0\uc11c\ub3c4 Cloud\uc6a9 \ubc30\ud3ec YAML\uc774 \uac00\uc7a5 \uc548\uc815\uc801\uc774\uace0 \uc2ec\ud50c\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 \uc124\uce58 \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n ingress-nginx<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ingress-nginx-controller<\/code>, <code>admission<\/code> \ub4f1 \ubaa8\ub4e0 Pod\uac00 <strong>Running<\/strong> \uc0c1\ud0dc \ud655\uc778<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.3 LoadBalancer \ud0c0\uc785 \uc11c\ube44\uc2a4 \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get svc -n ingress-nginx<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ingress-nginx-controller<\/code> \uc11c\ube44\uc2a4\uac00 <strong>TYPE: LoadBalancer<\/strong>\ub85c \uc124\uc815\ub418\uc5b4 \uc788\uc5b4\uc57c \ud568<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.4 External IP \uc790\ub3d9 \ud560\ub2f9 \ud655\uc778<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc124\uce58 \ud6c4 \uc218 \ubd84 \ub0b4\ub85c MetalLB\uac00 <strong>EXTERNAL-IP<\/strong>\ub97c \ud560\ub2f9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\uc2dc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)\ningress-nginx-controller   LoadBalancer   10.101.20.223   192.168.0.201   80:xxxx\/TCP,443:xxxx\/TCP<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">IP\uac00 pending \uc0c1\ud0dc\ub77c\uba74 \ub2e4\uc74c \uba85\ub839\uc5b4\ub85c \uc774\ubca4\ud2b8 \ud655\uc778:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl describe svc ingress-nginx-controller -n ingress-nginx<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud14c\uc2a4\ud2b8\ub97c \uc704\ud55c Ingress \ub9ac\uc18c\uc2a4 \uad6c\uc131 (\uc608\uc2dc)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: test-ingress\n  namespace: default\n  annotations:\n    nginx.ingress.kubernetes.io\/rewrite-target: \/\nspec:\n  ingressClassName: nginx\n  rules:\n    - host: test.example.com\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: my-service\n                port:\n                  number: 80\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc131 \uc0ac\uc6a9 \uc2dc, <code>test.example.com<\/code> \ub3c4\uba54\uc778\uc744 \ud074\ub77c\uc774\uc5b8\ud2b8 PC\uc758 <code>\/etc\/hosts<\/code>\uc5d0 MetalLB IP\ub85c \uc124\uc815\ud574\uc8fc\uba74 \ud14c\uc2a4\ud2b8 \uac00\ub2a5<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Rancher \uc124\uce58 \ubc0f \ucd08\uae30 \uc124\uc815 \ub9e4\ub274\uc5bc (v2.10.3, LoadBalancer \ubc29\uc2dd)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">\ud658\uacbd \uc815\ubcf4<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\ud56d\ubaa9<\/th><th>\uac12<\/th><\/tr><\/thead><tbody><tr><td>OS<\/td><td>Ubuntu 22.04<\/td><\/tr><tr><td>Kubernetes \ud074\ub7ec\uc2a4\ud130<\/td><td><code>ope-master<\/code>, <code>ope-node-1<\/code>, <code>ope-node-2<\/code><\/td><\/tr><tr><td>CNI \ud50c\ub7ec\uadf8\uc778<\/td><td>Calico<\/td><\/tr><tr><td>Rancher \ubc84\uc804<\/td><td>v2.10.3<\/td><\/tr><tr><td>\uc811\uc18d \ubc29\uc2dd<\/td><td><strong>LoadBalancer (MetalLB)<\/strong> \uc0ac\uc6a9<\/td><\/tr><tr><td>\uc811\uc18d \uc8fc\uc18c \uc608\uc2dc<\/td><td><code>https:\/\/rancher.example.com<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Rancher \uc124\uce58 \uc804 \uc900\ube44<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Kubernetes \ud074\ub7ec\uc2a4\ud130 \uc0c1\ud0dc \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get nodes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd9c\ub825 \uc608\uc2dc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME         STATUS   ROLES           AGE     VERSION\nope-master   Ready    control-plane   6m33s   v1.29.15\nope-node-1   Ready    &lt;none&gt;          3m38s   v1.29.15\nope-node-2   Ready    &lt;none&gt;          3m36s   v1.29.15<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 \uc2dc\uc2a4\ud15c Pod \uc0c1\ud0dc \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n kube-system<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Helm \uc124\uce58<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/raw.githubusercontent.com\/helm\/helm\/main\/scripts\/get-helm-3 | bash\nhelm version<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Rancher \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create namespace cattle-system<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. MetalLB\ub97c \ud1b5\ud55c LoadBalancer \uad6c\uc131<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 MetalLB \uc124\uce58<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/metallb\/metallb\/v0.14.5\/config\/manifests\/metallb-native.yaml<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 IP \ud480 \uc124\uc815 (\uc608: <code>192.168.0.240 ~ 192.168.0.250<\/code>)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># metallb-ip-pool.yaml\napiVersion: metallb.io\/v1beta1\nkind: IPAddressPool\nmetadata:\n  name: rancher-ip-pool\n  namespace: metallb-system\nspec:\n  addresses:\n    - 192.168.0.240-192.168.0.250\n---\napiVersion: metallb.io\/v1beta1\nkind: L2Advertisement\nmetadata:\n  name: rancher-advertise\n  namespace: metallb-system<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f metallb-ip-pool.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Rancher \uc124\uce58 (LoadBalancer \ubc29\uc2dd)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>helm repo add rancher-stable https:\/\/releases.rancher.com\/server-charts\/stable\nhelm repo update<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc608\uc2dc: <code>rancher.example.com<\/code> \ub3c4\uba54\uc778 \uc0ac\uc6a9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>helm install rancher rancher-stable\/rancher \\\n  --namespace cattle-system \\\n  --set hostname=rancher.example.com \\\n  --set bootstrapPassword=admin \\\n  --set replicas=1 \\\n  --set ingress.tls.source=none \\\n  --set service.type=LoadBalancer<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ub3c4\uba54\uc778\uc740 \ub0b4\ubd80 DNS \ub610\ub294 <code>\/etc\/hosts<\/code> \uc5d0\uc11c MetalLB IP\uc640 \ub9e4\ud551 \ud544\uc694<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>192.168.0.241 rancher.example.com<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \uc124\uce58 \ud6c4 \uc0c1\ud0dc \ud655\uc778<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1 Rancher Pod \uc0c1\ud0dc<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n cattle-system<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6.2 Service IP \ud655\uc778 (EXTERNAL-IP \ud655\uc778)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get svc -n cattle-system<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd9c\ub825 \uc608\uc2dc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE\nrancher   LoadBalancer   10.108.156.115 192.168.0.241   80:xxxxx\/TCP,443:yyyyy\/TCP   1m\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. \ubc29\ud654\ubcbd \uc124\uc815 (\uc11c\ubc84\uc5d0 UFW \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow 80\/tcp\nsudo ufw allow 443\/tcp\nsudo ufw reload<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Rancher \uc811\uc18d \ubc0f \ucd08\uae30 \uc124\uc815<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1 \uc6f9 \uc811\uc18d<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;rancher.example.com<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ucd5c\ucd08 \uc811\uc18d \uc2dc <code>admin<\/code> \uacc4\uc815 \ube44\ubc00\ubc88\ud638 \uc124\uc815 \ud398\uc774\uc9c0 \ud45c\uc2dc<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">8.2 \ube44\ubc00\ubc88\ud638 \uc218\ub3d9 \ud655\uc778 (\ucd08\uae30\uac12)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get secret -n cattle-system bootstrap-secret \\\n  -o go-template='{{ .data.bootstrapPassword | base64decode }}'<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. \ucd08\uae30 \ube44\ubc00\ubc88\ud638 \ubb38\uc81c \ud574\uacb0 (Secret \uc5c6\uc74c \ub4f1)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 bootstrap-secret \ud655\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get secret -n cattle-system<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">9.2 \uc0c8 \ube44\ubc00\ubc88\ud638 \uac15\uc81c \uc0dd\uc131<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n cattle-system delete secret bootstrap-secret\n\nkubectl -n cattle-system create secret generic bootstrap-secret \\\n  --from-literal=bootstrapPassword=\"NewPassword123!\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">9.3 Rancher Pod \uc7ac\uc2dc\uc791<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl delete pod -n cattle-system --all\nkubectl rollout restart deployment rancher -n cattle-system<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rancher UI \uc811\uc18d \uc2dc:\n<ul class=\"wp-block-list\">\n<li>ID: <code>admin<\/code><\/li>\n\n\n\n<li>PW: <code>NewPassword123!<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1813\" height=\"903\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2025\/08\/2.png\" alt=\"\" class=\"wp-image-1106\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1904\" height=\"720\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-205603.png\" alt=\"\" class=\"wp-image-1130\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1887\" height=\"899\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-221129.png\" alt=\"\" class=\"wp-image-1153\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc120\ud0dd \uc0ac\ud56d: Let&#8217;s Encrypt HTTPS \uc778\uc99d\uc11c \uc124\uc815<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\uacf5\uc778 \ub3c4\uba54\uc778 \ubcf4\uc720 \uc2dc\ub9cc \uc801\uc6a9 \uac00\ub2a5<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>helm upgrade rancher rancher-stable\/rancher \\\n  --namespace cattle-system \\\n  --set hostname=rancher.example.com \\\n  --set ingress.tls.source=letsEncrypt \\\n  --set letsEncrypt.email=your-email@example.com<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ucd5c\uc885 \uc810\uac80 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\ud56d\ubaa9<\/th><th>\ud655\uc778<\/th><\/tr><\/thead><tbody><tr><td>Rancher Pod <code>Running<\/code> \uc0c1\ud0dc\uc778\uc9c0 \ud655\uc778<\/td><td>\u2705<\/td><\/tr><tr><td>Service \ud0c0\uc785 <code>LoadBalancer<\/code>\ub85c EXTERNAL-IP \ud560\ub2f9\ub418\uc5c8\ub294\uc9c0 \ud655\uc778<\/td><td>\u2705<\/td><\/tr><tr><td>\ubc29\ud654\ubcbd(80, 443) \uc624\ud508 \uc5ec\ubd80 \ud655\uc778<\/td><td>\u2705<\/td><\/tr><tr><td><code>https:\/\/rancher.example.com<\/code> \uc73c\ub85c \uc811\uc18d \uc131\uacf5<\/td><td>\u2705<\/td><\/tr><tr><td>\ucd08\uae30 admin \ube44\ubc00\ubc88\ud638 \uc124\uc815 \uc644\ub8cc<\/td><td>\u2705<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c Rancher\ub97c \ud1b5\ud574 Kubernetes \ud074\ub7ec\uc2a4\ud130\ub97c \uc6f9 UI\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Kubernetes \ud658\uacbd\uc5d0\uc11c GitLab \uc124\uce58 (MetalLB + Ingress \ubc29\uc2dd)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">\ub514\ub809\ud1a0\ub9ac \uad6c\uc870 \ubc0f \uc0ac\uc804 \uc900\ube44<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/min\/download\/gitlab<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uad6c\uc131 \ud30c\uc77c \ubaa9\ub85d:\n<ul class=\"wp-block-list\">\n<li><code>gitlab-pv.yaml<\/code><\/li>\n\n\n\n<li><code>gitlab-pvc.yaml<\/code><\/li>\n\n\n\n<li><code>gitlab-deployment.yaml<\/code><\/li>\n\n\n\n<li><code>gitlab-service.yaml<\/code> (LoadBalancer\uc6a9\uc73c\ub85c \uc218\uc815)<\/li>\n\n\n\n<li><code>gitlab-ingress.yaml<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. GitLab PV, PVC \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create namespace gitlab\nkubectl apply -f gitlab-pv.yaml\nkubectl apply -f gitlab-pvc.yaml<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>gitlab-pv.yaml<\/code>\uc740 <code>\/mnt\/gitlab-data<\/code> \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 local-path \uae30\ubc18 PV \uc124\uc815<br><code>gitlab-pvc.yaml<\/code>\uc740 \ud574\ub2f9 PV\ub97c \uc0ac\uc6a9\ud558\ub294 PVC \uc124\uc815<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. GitLab Deployment \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f gitlab-deployment.yaml<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitLab Pod \uc2e4\ud589<\/li>\n\n\n\n<li>\ub0b4\ubd80 \ud3ec\ud2b8: <code>80<\/code>, <code>443<\/code>, <code>22<\/code> \uc624\ud508<\/li>\n\n\n\n<li>PVC <code>\/var\/opt\/gitlab<\/code>\uc5d0 \ub9c8\uc6b4\ud2b8<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. GitLab Service (LoadBalancer \ud0c0\uc785) \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># gitlab-service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: gitlab-service\n  namespace: gitlab\nspec:\n  type: LoadBalancer\n  ports:\n    - name: http\n      port: 80\n      targetPort: 80\n    - name: ssh\n      port: 22\n      targetPort: 22\n  selector:\n    app: gitlab\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f gitlab-service.yaml\nkubectl get svc -n gitlab<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">EXTERNAL-IP\uc5d0 MetalLB\uc5d0\uc11c \ud560\ub2f9\ud55c IP \ud45c\uc2dc (\uc608: <code>192.168.0.200<\/code>)<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Ingress Controller \uc124\uce58 (\ubbf8\uc124\uce58 \uc2dc)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/ingress-nginx\/controller-v1.9.4\/deploy\/static\/provider\/cloud\/deploy.yaml<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\uc774\ubbf8 \uc124\uce58\ub418\uc5b4 \uc788\ub2e4\uba74 \uc0dd\ub7b5 \uac00\ub2a5<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Ingress \ub9ac\uc18c\uc2a4 \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># gitlab-ingress.yaml\napiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: gitlab-ingress\n  namespace: gitlab\n  annotations:\n    nginx.ingress.kubernetes.io\/rewrite-target: \/\nspec:\n  rules:\n    - host: gitlab.example.com\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: gitlab-service\n                port:\n                  number: 80<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f gitlab-ingress.yaml\nkubectl get ingress -n gitlab<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DNS \ub610\ub294 <code>\/etc\/hosts<\/code> \uc124\uc815: <code>192.168.0.200 gitlab.example.com<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. GitLab \ucee8\ud14c\uc774\ub108 \uc124\uc815 \ubcc0\uacbd<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pod -n gitlab\nkubectl exec -it &lt;gitlab-pod-name&gt; -n gitlab -- bash<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><code>\/etc\/gitlab\/gitlab.rb<\/code> \uc218\uc815<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>external_url 'http:\/\/gitlab.example.com'\nnginx&#91;'listen_port'] = 80\nnginx&#91;'listen_addresses'] = &#91;'0.0.0.0']\nnginx&#91;'proxy_set_headers'] = {\n  \"X-Forwarded-Proto\" =&gt; \"http\",\n  \"X-Forwarded-Ssl\" =&gt; \"off\"\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc124\uc815 \ubc18\uc601<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>gitlab-ctl reconfigure\ngitlab-ctl restart<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. GitLab \uc811\uc18d \ud655\uc778<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I http:\/\/gitlab.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ub294 \ube0c\ub77c\uc6b0\uc800 \uc811\uc18d:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;gitlab.example.com<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. GitLab root \ube44\ubc00\ubc88\ud638 \ucd08\uae30 \ud655\uc778<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl exec -it &lt;gitlab-pod-name&gt; -n gitlab -- bash\ncat \/etc\/gitlab\/initial_root_password<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucd08\uae30 ID: <code>root<\/code><\/li>\n\n\n\n<li>\ube44\ubc00\ubc88\ud638\ub294 \uc704 \ud30c\uc77c\uc5d0\uc11c \ud655\uc778 (24\uc2dc\uac04 \ud6c4 \uc0ad\uc81c\ub420 \uc218 \uc788\uc74c)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">root \ube44\ubc00\ubc88\ud638 \uc218\ub3d9 \uc7ac\uc124\uc815 (Rails Console \uc0ac\uc6a9)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl exec -it &lt;gitlab-pod-name&gt; -n gitlab -- bash\ngitlab-rails console -e production\n\n# \uc544\ub798 \ucf54\ub4dc \uc785\ub825\nuser = User.where(id: 1).first\nuser.password = '\uc0c8\ube44\ubc88'\nuser.password_confirmation = '\uc0c8\ube44\ubc88'\nuser.save!<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ucd5c\uc885 \uc801\uc6a9 \uc694\uc57d \uba85\ub839\uc5b4<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/digi\/download\/gitlab\n\nkubectl create ns gitlab\nkubectl apply -f gitlab-pv.yaml\nkubectl apply -f gitlab-pvc.yaml\nkubectl apply -f gitlab-deployment.yaml\nkubectl apply -f gitlab-service.yaml\nkubectl apply -f gitlab-ingress.yaml\n\nkubectl get svc -n gitlab\nkubectl get ingress -n gitlab\n\nkubectl exec -it &lt;pod&gt; -n gitlab -- bash\nvi \/etc\/gitlab\/gitlab.rb\ngitlab-ctl reconfigure\ngitlab-ctl restart<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"402\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-210510.png\" alt=\"\" class=\"wp-image-1136\" style=\"aspect-ratio:1.748790825230616;width:1008px;height:auto\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1698\" height=\"906\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-210653.png\" alt=\"\" class=\"wp-image-1139\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">GitHub \uc124\uce58 \ubc0f \uc5f0\ub3d9<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<p class=\"wp-block-paragraph\">\uc6b0\ubd84\ud22c 24.04 \uc9c4\ud589<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt -y update\n\napt -y upgrade<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git \uc124\uce58<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>apt -y install git<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>git \uc0ac\uc6a9\uc790 \uc815\ubcf4 \uc124\uc815<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git config --global user.name \"\uc0ac\uc6a9\uc790 \uc774\ub984\"\n\ngit config --global user.email \"\uc774\uba54\uc77c \uc8fc\uc18c\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>github\uc640 ssh \uc5f0\uacb0\n<ul class=\"wp-block-list\">\n<li>http \uc5f0\uacb0 \ubc29\uc2dd\ub3c4 \uc788\uc73c\ub098 ssh \uc120\ud0dd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-keygen -t rsa -b 4096 -C \"\uc774\uba54\uc77c \uc8fc\uc18c\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacf5\uac1c\ud0a4 github \uacc4\uc815\uc5d0 \ub4f1\ub85d\n<ul class=\"wp-block-list\">\n<li>\ub85c\uadf8\uc778 \ud6c4, Settings &gt; SSH and GPG keys &gt; New SSH key<\/li>\n\n\n\n<li>ssh \uacf5\uac1c\ud0a4 \ubcf5\uc0ac\ud558\uc5ec \ucd94\uac00<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>github\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \uc800\uc7a5\uc18c\ub97c \uc0dd\uc131<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone git@github.com:\uc0ac\uc6a9\uc790\uc774\ub984\/\uc800\uc7a5\uc18c\uc774\ub984.git<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud30c\uc77c \ucd94\uac00 \ubc0f \ucee4\ubc0b<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cd test\n# \ud074\ub860\ud55c \ub514\ub809\ud1a0\ub9ac\ub85c \uc774\ub3d9<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc0c8\ub85c\uc6b4 \ud30c\uc77c \uc0dd\uc131<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"Hello Git\" &gt; hello.txt<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubcc0\uacbd \uc0ac\ud56d \uc2a4\ud14c\uc774\uc9d5<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git add hello.txt<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucee4\ubc0b \uc0dd\uc131<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git commit -m \"test \ucee4\ubc0b\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc6d0\uaca9 \uc800\uc7a5\uc18c\ub85c \ud478\uc2dc<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin main<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;github.com\/ssunmin\/sunmin<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"695\" height=\"772\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2024\/11\/image-7-1.png\" alt=\"\" class=\"wp-image-675\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Argo CD \uc124\uce58 \ubc0f Ingress \uae30\ubc18 \uc678\ubd80 \uc811\uc18d \uad6c\uc131 \uac00\uc774\ub4dc (Kubernetes \ud074\ub7ec\uc2a4\ud130)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">\uac1c\uc694<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0693e3\" class=\"has-inline-color\">Kubernetes \ud074\ub7ec\uc2a4\ud130\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \uad6c\uc131\ub418\uc5c8\ub2e4\uba74, GitOps \uae30\ubc18 CI\/CD \ud234\uc778 <strong>Argo CD<\/strong>\ub97c \uc124\uce58\ud558\uace0<br><strong>Ingress + TLS \uae30\ubc18 \uc678\ubd80 \uc811\uc18d \uad6c\uc131<\/strong>\uc744 \ud1b5\ud574 <code>https:\/\/argocd.test.com<\/code> \uacfc \uac19\uc740 \ub3c4\uba54\uc778\uc73c\ub85c \uc811\uadfc\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>\uc774 \uac00\uc774\ub4dc\ub294 Helm \uc5c6\uc774 \uc124\uce58\ud558\uba70, \uc11c\ube44\uc2a4 \ud0c0\uc785\uc740 NodePort\uac00 \uc544\ub2cc <strong>Ingress \ubc29\uc2dd<\/strong>\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/mark><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Argo CD \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create namespace argocd<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Argo CD \uc124\uce58 (\uacf5\uc2dd \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \uc0ac\uc6a9)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -n argocd -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc124\uce58 \uc644\ub8cc \ud6c4 \ud30c\ub4dc \uc0c1\ud0dc \ud655\uc778:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get pods -n argocd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \ud30c\ub4dc\uac00 <code>Running<\/code> \uc0c1\ud0dc\uac00 \ub420 \ub54c\uae4c\uc9c0 \ub300\uae30\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"711\" height=\"163\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-210925.png\" alt=\"\" class=\"wp-image-1141\" style=\"width:830px;height:auto\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Argo CD Ingress + Service \uad6c\uc131<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 \uc11c\ube44\uc2a4 \uc815\uc758<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud30c\uc77c \uacbd\ub85c<\/strong>: <code>\/home\/min\/download\/argocd-service.yaml<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Service\nmetadata:\n  name: argocd-server\n  namespace: argocd\n  labels:\n    app.kubernetes.io\/name: argocd-server\nspec:\n  selector:\n    app.kubernetes.io\/name: argocd-server\n  ports:\n    - name: http\n      port: 80\n      targetPort: 8080\n    - name: https\n      port: 443\n      targetPort: 8080\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Ingress \uc815\uc758<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud30c\uc77c \uacbd\ub85c<\/strong>: <code>\/home\/min\/download\/argocd-ingress.yaml<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: argocd-ingress\n  namespace: argocd\n  annotations:\n    nginx.ingress.kubernetes.io\/backend-protocol: \"HTTPS\"\n    nginx.ingress.kubernetes.io\/ssl-redirect: \"true\"\n    nginx.ingress.kubernetes.io\/proxy-body-size: 10m\n    nginx.ingress.kubernetes.io\/proxy-read-timeout: \"600\"\n    nginx.ingress.kubernetes.io\/use-forwarded-headers: \"true\"\n    nginx.ingress.kubernetes.io\/x-forwarded-prefix: \"\/\"\nspec:\n  ingressClassName: nginx\n  tls:\n    - hosts:\n        - argocd.test.com\n      secretName: argocd-tls\n  rules:\n    - host: argocd.test.com\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: argocd-server\n                port:\n                  number: 443<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Ingress \ubc0f \uc11c\ube44\uc2a4 \uc801\uc6a9<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f \/home\/min\/download\/argocd-service.yaml\nkubectl apply -f \/home\/min\/download\/argocd-ingress.yaml<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>yaml<\/code> \ub0b4 <code>namespace: argocd<\/code>\uac00 \uc9c0\uc815\ub418\uc5b4 \uc788\ub2e4\uba74 <code>-n<\/code> \uc5c6\uc774\ub3c4 \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \uc811\uc18d \ud655\uc778<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc811\uc18d \uc8fc\uc18c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;argocd.test.com<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uae30\ubcf8 \ub85c\uadf8\uc778 \uc815\ubcf4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ID: <code>admin<\/code><\/li>\n\n\n\n<li>PW: <code>test1<\/code><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\uae30\ubcf8 \ube44\ubc00\ubc88\ud638\ub97c \uc7ac\ud655\uc778\ud558\uace0 \uc2f6\ub2e4\uba74:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n argocd get secret argocd-initial-admin-secret \\\n  -o jsonpath=\"{.data.password}\" | base64 -d &amp;&amp; echo<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \ub9ac\uc18c\uc2a4 \uc0ad\uc81c \ubc29\ubc95<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl delete -f \/home\/min\/download\/argocd-service.yaml\nkubectl delete -f \/home\/min\/download\/argocd-ingress.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc801\uc6a9 \ubc29\uc2dd \uc694\uc57d<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n argocd apply -f argocd-ingress.yaml<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-n argocd<\/code>: \uba85\ub839\uc5b4\uc5d0\uc11c \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uac15\uc81c \uc9c0\uc815<\/li>\n\n\n\n<li>YAML \ud30c\uc77c \ub0b4 <code>namespace:<\/code>\uac00 \uc874\uc7ac\ud558\uba74 \ud574\ub2f9 \uac12\uc774 \uc6b0\uc120 \uc801\uc6a9<\/li>\n\n\n\n<li>\ub458 \uc911 \ud558\ub098\ub9cc \uba85\ud655\ud558\uba74 \uc815\uc0c1 \uc801\uc6a9\ub428<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. ERR_TOO_MANY_REDIRECTS \uc624\ub958 \ud574\uacb0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc99d\uc0c1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6f9 \ube0c\ub77c\uc6b0\uc800 \uc811\uc18d \uc2dc \ub2e4\uc74c \uc624\ub958 \ubc1c\uc0dd:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ub108\ubb34 \uc5ec\ub7ec \ubc88 \ub9ac\ub514\ub809\uc158\ub418\uc5c8\uc2b5\ub2c8\ub2e4 (ERR_TOO_MANY_REDIRECTS)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc8fc\uc694 \uc6d0\uc778<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Argo CD\ub294 HTTPS \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud558\ub3c4\ub85d \uae30\ubcf8 \uc124\uc815\ub418\uc5b4 \uc788\uc74c<\/li>\n\n\n\n<li>Ingress\uac00 <code>X-Forwarded-Proto<\/code> \ud5e4\ub354\ub97c \uc81c\ub300\ub85c \uc804\ub2ec\ud558\uc9c0 \uc54a\uc73c\uba74 \ubb34\ud55c \ub9ac\ub2e4\uc774\ub809\ud2b8 \ubc1c\uc0dd<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud574\uacb0 \ubc29\ubc95<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ub798 \uc5b4\ub178\ud14c\uc774\uc158\uc774 Ingress\uc5d0 \uc815\ud655\ud788 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud568:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx.ingress.kubernetes.io\/backend-protocol: \"HTTPS\"\nnginx.ingress.kubernetes.io\/ssl-redirect: \"true\"\nnginx.ingress.kubernetes.io\/use-forwarded-headers: \"true\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c, <code>argocd-server<\/code> \uc11c\ube44\uc2a4\ub294 \ubc18\ub4dc\uc2dc <code>targetPort: 8080<\/code>\uc744 \uc0ac\uc6a9\ud574\uc57c \ud568<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ub9c8\ubb34\ub9ac \uc694\uc57d<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\ud56d\ubaa9<\/th><th>\ub0b4\uc6a9<\/th><\/tr><\/thead><tbody><tr><td>\uc124\uce58 \ubc29\uc2dd<\/td><td>\uacf5\uc2dd \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \uc9c1\uc811 \uc124\uce58<\/td><\/tr><tr><td>\uc678\ubd80 \uc811\uc18d \ubc29\uc2dd<\/td><td>Ingress + TLS (<code>argocd.test.com<\/code>)<\/td><\/tr><tr><td>\uc778\uc99d\uc11c<\/td><td><code>argocd-tls<\/code> Secret (\uc0ac\uc804 \uc0dd\uc131 \ud544\uc694)<\/td><\/tr><tr><td>\uae30\ubcf8 \ub85c\uadf8\uc778 \uacc4\uc815<\/td><td>admin \/ test1<\/td><\/tr><tr><td>\ub9ac\ub2e4\uc774\ub809\uc158 \uc624\ub958 \ud574\uacb0<\/td><td>\ud5e4\ub354 \uc5b4\ub178\ud14c\uc774\uc158 \ubc0f HTTPS \uc124\uc815 \ud544\uc694<\/td><\/tr><tr><td>\uc11c\ube44\uc2a4 \ud3ec\ud2b8 \uc124\uc815<\/td><td>ClusterIP + targetPort: 8080<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1905\" height=\"892\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-220143.png\" alt=\"\" class=\"wp-image-1146\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1912\" height=\"874\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-220227.png\" alt=\"\" class=\"wp-image-1147\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CI\/CD \ubc30\ud3ec\ub41c \uac1c\uc778 \uc6f9<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1881\" height=\"887\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-220350.png\" alt=\"\" class=\"wp-image-1149\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Jenkins on Kubernetes \uc124\uce58 \ub9e4\ub274\uc5bc (Ubuntu 24.04)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">1. \ud658\uacbd \uac1c\uc694<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OS: <strong>Ubuntu 24.04<\/strong><\/li>\n\n\n\n<li>Kubernetes \ud074\ub7ec\uc2a4\ud130 (containerd, Calico CNI)<\/li>\n\n\n\n<li>\uc774\ubbf8 \uc124\uce58\ub41c \uad6c\uc131: <strong>Rancher, GitLab<\/strong><\/li>\n\n\n\n<li>Ingress Controller: <strong>NGINX<\/strong><\/li>\n\n\n\n<li>\uc678\ubd80 IP \uad00\ub9ac: <strong>MetalLB<\/strong><\/li>\n\n\n\n<li>\ub3c4\uba54\uc778: <strong><a href=\"http:\/\/jenkins.ssunmini.com\">jenkins.ssunmini.com<\/a><\/strong><\/li>\n\n\n\n<li>\ub178\ucd9c \ubc29\uc2dd: <strong>NPM(HTTPS \uc885\ub8cc) \u2192 Ingress(HTTP) \u2192 Service(ClusterIP:8185) \u2192 Pod(8080)<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create namespace jenkins<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Helm \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ub4f1\ub85d<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>helm repo add jenkinsci &lt;https:\/\/charts.jenkins.io&gt;\nhelm repo update<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. values.yaml \uc791\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/home\/min\/download\/jenkins-values.yaml<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master:\/home\/min\/download# cat jenkins-values.yaml\ncontroller:\n  image:\n    registry: docker.io\n    repository: jenkins\/jenkins\n    tag: lts-jdk17\n    pullPolicy: IfNotPresent\n  serviceType: ClusterIP\n  servicePort: 8185\n  targetPort: 8080\n  ingress:\n    enabled: true\n    hostName: \"jenkins.ssunmini.com\"\n    annotations:\n      nginx.ingress.kubernetes.io\/ssl-redirect: \"false\"\n      nginx.ingress.kubernetes.io\/proxy-body-size: \"100m\"\n    tls: &#91;]\n  jenkinsUrl: \"&lt;https:\/\/jenkins.ssunmini.com\/&gt;\"\n\n  \n  admin:\n    username: admin\n    password: \"test\"\n\npersistence:\n  enabled: true\n  size: 10Gi<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Jenkins \uc124\uce58<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>helm upgrade --install jenkins jenkinsci\/jenkins \\\\\n  -n jenkins -f \/home\/min\/download\/jenkins-values.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \ub9ac\uc18c\uc2a4 \ud655\uc778<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n jenkins get pods,svc,ingress<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pod: <code>jenkins-0<\/code> \u2192 <strong>READY 2\/2<\/strong> \ub418\uc5b4\uc57c \uc815\uc0c1<\/li>\n\n\n\n<li>Service: <code>jenkins<\/code> \u2192 <strong>8185\/TCP<\/strong><\/li>\n\n\n\n<li>Ingress: <code>jenkins.ssunmini.com<\/code> \u2192 <code>192.168.1.240<\/code> (Ingress Controller EXTERNAL-IP)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Jenkins \ucd08\uae30 \ub85c\uadf8\uc778<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd08\uae30 \uad00\ub9ac\uc790 \ube44\ubc00\ubc88\ud638 \ud655\uc778<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n jenkins exec -it deploy\/jenkins -- \\\\\n  cat \/var\/jenkins_home\/secrets\/initialAdminPassword<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\uad00\ub9ac\uc790 \uacc4\uc815 \ud655\uc778<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \uad00\ub9ac\uc790 \uc544\uc774\ub514\nkubectl -n jenkins get secret jenkins \\\\\n  -o jsonpath=\"{.data.jenkins-admin-user}\" | base64 -d; echo\n\n# \uad00\ub9ac\uc790 \ube44\ubc00\ubc88\ud638\nkubectl -n jenkins get secret jenkins \\\\\n  -o jsonpath=\"{.data.jenkins-admin-password}\" | base64 -d; echo<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1903\" height=\"447\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-221309.png\" alt=\"\" class=\"wp-image-1158\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1883\" height=\"715\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-221413.png\" alt=\"\" class=\"wp-image-1160\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Kubernetes Prometheus + Grafana (kube-prometheus-stack) \uc124\uce58 \ub9e4\ub274\uc5bc<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">1. \uc124\uce58 \uac1c\uc694<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ud658\uacbd<\/strong>: Kubernetes (Proxmox VM \ud074\ub7ec\uc2a4\ud130 \uae30\ubc18)<\/li>\n\n\n\n<li><strong>\uad6c\uc131 \uc694\uc18c<\/strong>: Prometheus, Grafana, Alertmanager, Node Exporter, kube-state-metrics<\/li>\n\n\n\n<li><strong>Ingress + Nginx Proxy Manager (NPM)<\/strong>: TLS \uc885\ub8cc (K8s \ub0b4\ubd80\ub294 HTTP)<\/li>\n\n\n\n<li><strong>\uc2a4\ud1a0\ub9ac\uc9c0<\/strong>: PVC \uc0ac\uc6a9 (\uae30\ubcf8 StorageClass \uc0ac\uc6a9 \uac00\ub2a5)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \uc0ac\uc804 \uc900\ube44<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Helm \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ub4f1\ub85d<\/strong> <code>helm repo add prometheus-community &lt;https:\/\/prometheus-community.github.io\/helm-charts&gt; helm repo update<\/code><\/li>\n\n\n\n<li><strong>\ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc0dd\uc131<\/strong> <code>kubectl create namespace monitoring<\/code><\/li>\n\n\n\n<li><strong>StorageClass \ud655\uc778<\/strong><code>kubectl get storageclass<\/code>\n<ul class=\"wp-block-list\">\n<li>\uae30\ubcf8 StorageClass\uac00 \uc788\uc73c\uba74 \uadf8\ub300\ub85c \uc0ac\uc6a9 \uac00\ub2a5<\/li>\n\n\n\n<li>\uae30\ubcf8 StorageClass\uac00 \uc5c6\ub2e4\uba74, <strong>local-path-provisioner<\/strong> \uc124\uce58 \ud544\uc694 (\uc774\ubc88 \uc124\uce58\uc5d0\uc11c\ub294 \uc0dd\ub7b5\ud568)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. values-prom.yaml<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># values-prom.yaml \u2014 kube-prometheus-stack\n# SSL\uc740  Nginx Proxy Manager(NPM)\uc5d0 \uc11c  \uc885 \ub8cc \ud558 \ubbc0 \ub85c , K8s Ingress\ub294  HTTP\ub85c \ub9cc  \uc5fd \ub2c8 \ub2e4 .\nglobal:\n  imagePullSecrets: &#91;]\n  rbac:\n    create: true\n\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Grafana \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ngrafana:\n  enabled: true\n  adminUser: admin\n  adminPassword: \"test\"     # \uc124 \uce58  \ud6c4  Secret\ub85c  \uaf2d  \ubcc0 \uacbd  \uad8c \uc7a5\n  service:\n    type: ClusterIP\n  persistence:\n    enabled: true\n    type: pvc\n    accessModes: &#91;\"ReadWriteOnce\"]\n    size: 10Gi\n    # storageClassName: \"\"           # \uae30 \ubcf8  StorageClass \uc0ac \uc6a9 . \ud544 \uc694  \uc2dc  \uc9c0 \uc815\n  ingress:\n    enabled: true\n    ingressClassName: nginx\n    annotations:\n      nginx.ingress.kubernetes.io\/proxy-body-size: \"8m\"\n      nginx.ingress.kubernetes.io\/ssl-redirect: \"false\"   # NPM\uc5d0 \uc11c  TLS \uc885 \ub8cc\n      nginx.ingress.kubernetes.io\/backend-protocol: \"HTTP\"\n    hosts:\n      - grafana.ssunmini.com\n    tls: &#91;]  # TLS\ub294  NPM\uc5d0 \uc11c  \ucc98 \ub9ac\n  defaultDashboardsTimezone: Asia\/Seoul\n\n  # \u2500\u2500 (\ucd94\uac00) \uc0ac\uc774\ub4dc\uce74: ConfigMap\uc73c\ub85c \ub370\uc774\ud130\uc18c\uc2a4\/\ub300\uc2dc\ubcf4\ub4dc \uc790\ub3d9 \ub4f1\ub85d \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  sidecar:\n    datasources:\n      enabled: true\n      label: grafana_datasource\n      labelValue: \"1\"\n    dashboards:\n      enabled: true\n      label: grafana_dashboard\n      labelValue: \"1\"\n\n  # \u2500\u2500 (\ucd94\uac00) PVC \uad8c\ud55c \ubb38\uc81c \ud574\uacb0: initChownData \ub044\uace0 fsGroup\uc73c\ub85c \uad8c\ud55c \ub9de\ucd94\uae30 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  initChownData:\n    enabled: false\n  podSecurityContext:\n    fsGroup: 472\n    fsGroupChangePolicy: \"OnRootMismatch\"\n  securityContext:\n    runAsUser: 472\n    runAsGroup: 472\n\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Prometheus \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nprometheus:\n  service:\n    type: ClusterIP\n  ingress:\n    enabled: true\n    ingressClassName: nginx\n    annotations:\n      nginx.ingress.kubernetes.io\/ssl-redirect: \"false\"\n      nginx.ingress.kubernetes.io\/backend-protocol: \"HTTP\"\n    hosts:\n      - prometheus.ssunmini.com\n    paths:\n      - \/\n    tls: &#91;]\n  prometheusSpec:\n    retention: 15d\n    replicas: 1\n    enableAdminAPI: false\n    walCompression: true\n    # \ud544 \uc694 \ud55c  \uacbd \uc6b0  \uc790 \uc6d0  \uc81c \ud55c  (\ub7a9  \ud658 \uacbd \uc774 \uba74  \uc8fc \uc11d  \uc720 \uc9c0 )\n    # resources:\n    #   requests:\n    #     cpu: 200m\n    #     memory: 1Gi\n    storageSpec:\n      volumeClaimTemplate:\n        spec:\n          accessModes: &#91;\"ReadWriteOnce\"]\n          resources:\n            requests:\n              storage: 50Gi\n          # storageClassName: \"\"      # \uae30 \ubcf8  StorageClass \uc0ac \uc6a9\n\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Alertmanager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nalertmanager:\n  service:\n    type: ClusterIP\n  ingress:\n    enabled: true\n    ingressClassName: nginx\n    annotations:\n      nginx.ingress.kubernetes.io\/ssl-redirect: \"false\"\n      nginx.ingress.kubernetes.io\/backend-protocol: \"HTTP\"\n    hosts:\n      - alert.ssunmini.com\n    paths:\n      - \/\n    tls: &#91;]\n  alertmanagerSpec:\n    replicas: 1\n    storage:\n      volumeClaimTemplate:\n        spec:\n          accessModes: &#91;\"ReadWriteOnce\"]\n          resources:\n            requests:\n              storage: 10Gi\n          # storageClassName: \"\"      # \uae30 \ubcf8  StorageClass \uc0ac \uc6a9\n\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 kube-state-metrics \/ node exporter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nkube-state-metrics:\n  enabled: true\n\nprometheus-node-exporter:\n  enabled: true\n  hostRootfs: false\n\n# \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \uae30 \ud0c0  \uae30 \ubcf8  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ncoreDns:\n  enabled: true\n\nkubeProxy:\n  enabled: true\n\nkubeEtcd:\n  enabled: false   # \ub2e8 \uc77c \/\uad00 \ub9ac \ud615  \ud658 \uacbd \uc774 \uba74  \ube44 \ud65c \uc131 \ud654 (\uc811 \uc18d  \ubd88 \uac00 \ud55c  \uacbd \uc6b0  \uc624 \ub958  \ubc29 \uc9c0 )\n\nkubeControllerManager:\n  enabled: false\n\nkubeScheduler:\n  enabled: false<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. \uc124\uce58 \uba85\ub839<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">(1) \ub514\ubc84\uadf8 \ubaa8\ub4dc\ub85c \ube60\ub978 \uc124\uce58<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\uc74c \uc124\uce58 \uc2dc \ud0c0\uc784\uc544\uc6c3 \uc624\ub958\uac00 \ubc1c\uc0dd \u2192 \ub514\ubc84\uadf8 \ubaa8\ub4dc\ub85c \uc9c4\ud589<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl create ns monitoring 2&gt;\/dev\/null || true\n\nhelm upgrade --install kube-prometheus-stack prometheus-community\/kube-prometheus-stack \\\\\n  -n monitoring \\\\\n  -f values-prom.yaml \\\\\n  --debug<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc774\ud6c4 \uc0c1\ud0dc \ud655\uc778: <code>kubectl -n monitoring get pods kubectl -n monitoring get pvc<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">(2) \uc815\uc2dd \uc124\uce58 (\ubb38\uc81c \uc5c6\uc744 \ub54c)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>helm upgrade --install kube-prometheus-stack prometheus-community\/kube-prometheus-stack \\\\\n  -n monitoring \\\\\n  -f values-prom.yaml \\\\\n  --timeout 20m0s --wait<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \uc811\uc18d \ubc0f \ucd08\uae30 \uc124\uc815<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grafana: <code>https:\/\/grafana.ssunmini.com<\/code><\/li>\n\n\n\n<li>Prometheus: <code>https:\/\/prometheus.ssunmini.com<\/code><\/li>\n\n\n\n<li>Alertmanager: <code>https:\/\/alert.ssunmini.com<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Grafana \ucd08\uae30 \ube44\ubc00\ubc88\ud638 \ud655\uc778:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl -n monitoring get secret kube-prometheus-stack-grafana \\\\\n  -o jsonpath=\"{.data.admin-password}\" | base64 -d ; echo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1901\" height=\"818\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-223411.png\" alt=\"\" class=\"wp-image-1170\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1897\" height=\"894\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-223505.png\" alt=\"\" class=\"wp-image-1171\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">docker install<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<p class=\"wp-block-paragraph\">Rocky 9.4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>docker install<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># yum-utiles \ud328\ud0a4\uc9c0 \uc124\uce58\nyum -y update\nyum -y install yum-utils<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub808\ud3ec\uc9c0\ud1a0\ub9ac \uc124\uc815<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>yum-config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucd5c\uc2e0 \ubc84\uc804\uc758 docker engine \uc124\uce58<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>docker \uc2e4\ud589<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl start docker<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubd80\ud305 \uc2dc docker \ub370\ubaac \uc790\ub3d9 \uc2e4\ud589<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl enable docker<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub3c4\ucee4 \uc774\ubbf8\uc9c0 \uac80\uc0c9<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># centos \uc774\ubbf8\uc9c0 \uac80\uc0c9 \ndocker search centos<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub3c4\ucee4 \uc774\ubbf8\uc9c0 \uac00\uc838\uc624\uae30<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker pull centos:latest<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc774\ubbf8\uc9c0 \ubaa9\ub85d \ud655\uc778<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker images<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucee8\ud14c\uc774\ub108 \uc2e4\ud589<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d centos<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2e4\ud589 \uc911\uc778 \ucee8\ud14c\uc774\ub108 \ud655\uc778<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc815\uc9c0\ub41c \ucee8\ud14c\uc774\ub108\uae4c\uc9c0 \ud655\uc778<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps -a<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucee8\ud14c\uc774\ub108 \uc2e4\ud589 \ubc0f \uc911\uc9c0<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start centos\n\ndocker stop centos<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucee8\ud14c\uc774\ub108 \uc811\uadfc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">docker exec -it centos \/bin\/bash<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Harbor \uc124\uce58 \ub9e4\ub274\uc5bc (Rocky Linux 9.6, Docker Compose)<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<h2 class=\"wp-block-heading\">1. \ud658\uacbd \uc815\ubcf4<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OS: Rocky Linux 9.6<\/li>\n\n\n\n<li>Host: 192.168.1.11<\/li>\n\n\n\n<li>TLS: Nginx Proxy Manager(NPM)\uc5d0\uc11c \uc885\ub2e8 (Harbor\ub294 http:80\ub9cc \uc0ac\uc6a9)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \uc0ac\uc804 \uc900\ube44<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud544\uc218 \ud328\ud0a4\uc9c0\nsudo dnf -y install curl wget tar net-tools\n\n# Docker \uc124\uce58\ncurl -fsSL &lt;https:\/\/get.docker.com&gt; | sh\nsudo systemctl enable --now docker\nsudo usermod -aG docker $USER\n\n# Docker Compose Plugin \uc124\uce58\nsudo dnf -y install docker-compose-plugin\ndocker compose version<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. \ub514\ub809\ud130\ub9ac \uc900\ube44<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/home\/min\/download\/harbor\ncd \/home\/min\/download\/harbor<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Harbor \ub2e4\uc6b4\ub85c\ub4dc<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>HVER=\"v2.13.2\"\nwget &lt;https:\/\/github.com\/goharbor\/harbor\/releases\/download\/${HVER}\/harbor-offline-installer-${HVER}.tgz&gt;\n\ntar xzf harbor-offline-installer-${HVER}.tgz\n\ncd harbor\n\ncp harbor.yml.tmpl harbor.yml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. <code>harbor.yml<\/code> \uc8fc\uc694 \uc124\uc815<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub3c4\uba54\uc778\nhostname: harbor.ssunmini.com\nexternal_url: &lt;https:\/\/harbor.ssunmini.com&gt;\n\n# HTTP\ub9cc \uc0ac\uc6a9 (NPM\uc5d0\uc11c TLS \uc885\ub2e8)\nhttp:\n  port: 80\n\n# \ub370\uc774\ud130 \uc800\uc7a5\uc18c\ndata_volume: \/data\n\n# \uad00\ub9ac\uc790 \uacc4\uc815\nharbor_admin_password: \"test\"<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\uc790\uccb4 TLS \uc885\ub2e8\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c https: \ube14\ub85d\uc740 \uc8fc\uc11d \ucc98\ub9ac.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \uc124\uce58 \uc2e4\ud589<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/min\/download\/harbor\/harbor\n.\/install.sh --with-trivy<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2e4\ud589 \ud6c4 \uac19\uc740 \ub514\ub809\ud130\ub9ac\uc5d0 <code>docker-compose.yml<\/code> \uc0dd\uc131\ub428<\/li>\n\n\n\n<li>\ucde8\uc57d\uc810 \uc2a4\uce90\ub108 Trivy \ud3ec\ud568 \uc124\uce58<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Compose \ud30c\uc77c \uacbd\ub85c \ub9de\ucd94\uae30<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cp docker-compose.yml \/home\/min\/download\/harbor\/docker-compose.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. \ub85c\uadf8 \uc124\uc815 \ud328\uce58<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Harbor \uae30\ubcf8 \uc124\uc815\uc774 <code>syslog tcp:\/\/localhost:1514<\/code> \ub85c \ub418\uc5b4 \uc788\uc5b4 <code>harbor-db<\/code> \uc7ac\uc2dc\uc791 \uc2e4\ud328 \ubc1c\uc0dd \u2192 <strong>UDP IPv4<\/strong> \ub85c \ubcc0\uacbd<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/min\/download\/harbor\nsed -i 's#tcp:\/\/localhost:1514#udp:\/\/127.0.0.1:1514#g' docker-compose.yaml\nsed -i 's#tcp:\/\/\\\\&#91;::1\\\\]:1514#udp:\/\/127.0.0.1:1514#g' docker-compose.yaml\nsed -i 's#tcp:\/\/127.0.0.1:1514#udp:\/\/127.0.0.1:1514#g' docker-compose.yaml<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Harbor \uae30\ub3d9\/\uad00\ub9ac<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc2e4\ud589\ndocker compose -f docker-compose.yaml up -d\n\n# \uc0c1\ud0dc \ud655\uc778\ndocker compose -f docker-compose.yaml ps\n\n# \ub85c\uadf8 \ud655\uc778\ndocker compose -f docker-compose.yaml logs -f<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc9c0\/\uc7ac\uc2dc\uc791:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose -f docker-compose.yaml down\n\ndocker compose -f docker-compose.yaml restart<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1908\" height=\"890\" src=\"https:\/\/wp.ssunmini.com\/wp-content\/uploads\/2026\/01\/\uc2a4\ud06c\ub9b0\uc0f7-2026-01-03-222136.png\" alt=\"\" class=\"wp-image-1163\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-esab-accordion-child\"><div class=\"esab__head\" role=\"button\" aria-expanded=\"false\"><div class=\"esab__heading_txt\"><p class=\"esab__heading_tag\">Jenkins Docker Compose \uc124\uce58 \uac00\uc774\ub4dc<\/p><\/div><div class=\"esab__icon\"><div class=\"esab__collapse\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m3.5 20.5c-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 4.6 4.7 4.6 12.3 0 17-4.7 4.6-12.3 4.6-17 0zm0.9-0.9c4.2 4.2 11 4.2 15.2 0 4.2-4.2 4.2-11 0-15.2-4.2-4.3-11-4.3-15.2 0-4.3 4.2-4.3 11 0 15.2z\"><\/path><path d=\"m11.4 15.9v-3.3h-3.3c-0.3 0-0.6-0.3-0.6-0.6 0-0.4 0.3-0.6 0.6-0.6h3.3v-3.3c0-0.3 0.3-0.6 0.6-0.6 0.3 0 0.6 0.3 0.6 0.6v3.3h3.3c0.3 0 0.6 0.2 0.6 0.6q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2h-3.3v3.3q0 0.2-0.2 0.4-0.2 0.2-0.4 0.2c-0.4 0-0.6-0.3-0.6-0.6z\"><\/path><\/svg> <\/div><div class=\"esab__expand\"> <svg version=\"1.2\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path fill-rule=\"evenodd\" d=\"m12 24c-6.6 0-12-5.4-12-12 0-6.6 5.4-12 12-12 6.6 0 12 5.4 12 12 0 6.6-5.4 12-12 12zm10.6-12c0-5.9-4.7-10.6-10.6-10.6-5.9 0-10.6 4.7-10.6 10.6 0 5.9 4.7 10.6 10.6 10.6 5.9 0 10.6-4.7 10.6-10.6z\"><\/path><path d=\"m5.6 11.3h12.8v1.4h-12.8z\"><\/path><\/svg> <\/div><\/div><\/div><div class=\"esab__body\">\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0693e3\" class=\"has-inline-color\">ome\/min\/download\/jenkins\/ \uacbd\ub85c\uc5d0\uc11c Jenkins\ub97c Docker Compose\ub85c \uc124\uce58\ud558\uace0 \uc6b4\uc601<\/mark><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. \ub514\ub809\ud1a0\ub9ac \uc0dd\uc131<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/home\/min\/download\/jenkins\ncd \/home\/min\/download\/jenkins<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. docker-compose.yml \uc791\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/home\/min\/download\/jenkins\/docker-compose.yml<\/code> \ud30c\uc77c\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc791\uc131\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\n\nservices:\n  jenkins:\n    container_name: jenkins\n    image: jenkins\/jenkins:lts\n    restart: always\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - jenkins_home:\/var\/jenkins_home\n\nvolumes:\n  jenkins_home:<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Jenkins \uc2e4\ud589<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/home\/min\/download\/jenkins\nsudo docker-compose up -d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucee8\ud14c\uc774\ub108\uac00 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \uc2e4\ud589\ub418\uba70, 8080 \ud3ec\ud2b8\ub85c Jenkins\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Jenkins \uc811\uc18d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6f9 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ub2e4\uc74c \uc8fc\uc18c\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/&lt;\uc11c\ubc84 IP&gt;:8080\n\uc608: http:\/\/192.168.0.11:8080<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \ucd08\uae30 \uad00\ub9ac\uc790 \ube44\ubc00\ubc88\ud638 \ud655\uc778<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jenkins \ucd08\uae30 \uc124\uc815\uc744 \uc704\ud574 \uc544\ub798 \uba85\ub839\uc5b4\ub85c \ube44\ubc00\ubc88\ud638\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker exec -it jenkins cat \/var\/jenkins_home\/secrets\/initialAdminPassword<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ube44\ubc00\ubc88\ud638\ub97c Jenkins \uc6f9 \ud398\uc774\uc9c0\uc5d0 \uc785\ub825\ud558\uba74 \ud50c\ub7ec\uadf8\uc778 \uc124\uce58 \ubc0f \uad00\ub9ac\uc790 \uacc4\uc815 \uc0dd\uc131\uc744 \uc9c4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":3,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1040","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/pages\/1040","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1040"}],"version-history":[{"count":43,"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/pages\/1040\/revisions"}],"predecessor-version":[{"id":1184,"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=\/wp\/v2\/pages\/1040\/revisions\/1184"}],"wp:attachment":[{"href":"https:\/\/wp.ssunmini.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}