Kubernetes 설치 매뉴얼 (Ubuntu 기반)
1. 모든 노드 공통 설정
1) 호스트네임 설정
sudo hostnamectl set-hostname ope-master # Master
sudo hostnamectl set-hostname ope-node-1 # Node-1
sudo hostnamectl set-hostname ope-node-2 # Node-2
2) /etc/hosts 파일 수정
sudo nano /etc/hosts
내용 추가:
10.103.1.240 ope-master
10.103.1.241 ope-node-1
10.103.1.242 ope-node-2
3) Swap 비활성화
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
4) 방화벽 설정 (옵션)
sudo ufw allow 6443/tcp # API Server
sudo ufw allow 2379:2380/tcp # etcd
sudo ufw allow 10250:10252/tcp # Kubelet, Scheduler, Controller
sudo ufw enable
2. Container Runtime 설치
1) 필수 패키지
sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
2) containerd 설치
sudo apt install -y containerd.io
3) containerd 설정
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
3. Kubernetes 설치
1) 저장소 등록
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key \
| sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" \
| sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
2) 설치
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
4. 커널 네트워크 설정 (중요)
kubeadm init 실행 시 발생했던 오류 해결 방법 포함.
1) 모듈 로드
sudo modprobe overlay
sudo modprobe br_netfilter
영구 적용:
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
2) sysctl 설정
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
확인:
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.ipv4.ip_forward
출력값:
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
5. Master 노드 초기화
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=10.103.1.240
실행 시 이미지 다운로드 단계에서 시간이 오래 걸릴 수 있음.
느릴 경우 아래 명령어로 미리 다운로드 가능:
sudo kubeadm config images pull --kubernetes-version v1.29.15
kubectl 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root에서도 사용해야 한다면:
mkdir -p /root/.kube
cp /home/min/.kube/config /root/.kube/config
chown root:root /root/.kube/config
6. 네트워크 플러그인 설치 (Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
7. Worker 노드 조인
Master에서 조인 명령어 발급:
kubeadm token create --print-join-command
Worker에서 실행:
sudo kubeadm join 10.103.1.240:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
8. 클러스터 확인
kubectl get nodes

Kubernetes MetalLB + NGINX Ingress Controller 설치 가이드 (Ubuntu 22.04)
온프레미스 환경에서 LoadBalancer 타입 인그레스를 사용하려면
MetalLB+Ingress NGINX Controller조합이 가장 간단하고 효과적입니다.
사전 준비
- Ubuntu 22.04 기반 Kubernetes 클러스터 구성이 완료되어 있어야 함
kubectl명령어 사용 가능- 클러스터 내부 Pod 네트워크는
192.168.0.0/16또는 원하는 CIDR 사용 중 - MetalLB가 사용할 여유 IP 대역 확보 (DHCP 충돌 피해야 함)
- Docker 또는 Containerd 런타임 정상 작동 중
1. MetalLB 설치 및 설정
1.1 MetalLB 설치 (native 모드)
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
1.2 MetalLB IP 풀 및 광고 설정
- 아래 내용을
metallb-config.yaml로 저장:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: my-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.0.200-192.168.0.210
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2adv
namespace: metallb-system
192.168.0.200~210은 예시이며, 네트워크 환경에 맞게 조정 필요
- 적용:
kubectl apply -f metallb-config.yaml
1.3 설치 확인
kubectl get pods -n metallb-system
controller,speaker모두 Running 상태면 정상

2. NGINX Ingress Controller 설치
2.1 설치 (Cloud Provider용 배포 파일 사용)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.1/deploy/static/provider/cloud/deploy.yaml
bare-metal환경에서도 Cloud용 배포 YAML이 가장 안정적이고 심플합니다.
2.2 설치 확인
kubectl get pods -n ingress-nginx
ingress-nginx-controller,admission등 모든 Pod가 Running 상태 확인
2.3 LoadBalancer 타입 서비스 확인
kubectl get svc -n ingress-nginx
ingress-nginx-controller서비스가 TYPE: LoadBalancer로 설정되어 있어야 함
2.4 External IP 자동 할당 확인
설치 후 수 분 내로 MetalLB가 EXTERNAL-IP를 할당합니다.
예시:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
ingress-nginx-controller LoadBalancer 10.101.20.223 192.168.0.201 80:xxxx/TCP,443:xxxx/TCP
IP가 pending 상태라면 다음 명령어로 이벤트 확인:
kubectl describe svc ingress-nginx-controller -n ingress-nginx
테스트를 위한 Ingress 리소스 구성 (예시)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: test.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
이 구성 사용 시, test.example.com 도메인을 클라이언트 PC의 /etc/hosts에 MetalLB IP로 설정해주면 테스트 가능
Rancher 설치 및 초기 설정 매뉴얼 (v2.10.3, LoadBalancer 방식)
환경 정보
| 항목 | 값 |
|---|---|
| OS | Ubuntu 22.04 |
| Kubernetes 클러스터 | ope-master, ope-node-1, ope-node-2 |
| CNI 플러그인 | Calico |
| Rancher 버전 | v2.10.3 |
| 접속 방식 | LoadBalancer (MetalLB) 사용 |
| 접속 주소 예시 | https://rancher.example.com |
1. Rancher 설치 전 준비
1.1 Kubernetes 클러스터 상태 확인
kubectl get nodes
출력 예시:
NAME STATUS ROLES AGE VERSION
ope-master Ready control-plane 6m33s v1.29.15
ope-node-1 Ready <none> 3m38s v1.29.15
ope-node-2 Ready <none> 3m36s v1.29.15
1.2 시스템 Pod 상태 확인
kubectl get pods -n kube-system
2. Helm 설치
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
3. Rancher 네임스페이스 생성
kubectl create namespace cattle-system
4. MetalLB를 통한 LoadBalancer 구성
4.1 MetalLB 설치
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
4.2 IP 풀 설정 (예: 192.168.0.240 ~ 192.168.0.250)
# metallb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: rancher-ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.0.240-192.168.0.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: rancher-advertise
namespace: metallb-system
kubectl apply -f metallb-ip-pool.yaml
5. Rancher 설치 (LoadBalancer 방식)
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
예시: rancher.example.com 도메인 사용
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.example.com \
--set bootstrapPassword=admin \
--set replicas=1 \
--set ingress.tls.source=none \
--set service.type=LoadBalancer
도메인은 내부 DNS 또는
/etc/hosts에서 MetalLB IP와 매핑 필요
192.168.0.241 rancher.example.com
6. 설치 후 상태 확인
6.1 Rancher Pod 상태
kubectl get pods -n cattle-system
6.2 Service IP 확인 (EXTERNAL-IP 확인)
kubectl get svc -n cattle-system
출력 예시:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rancher LoadBalancer 10.108.156.115 192.168.0.241 80:xxxxx/TCP,443:yyyyy/TCP 1m
7. 방화벽 설정 (서버에 UFW 사용하는 경우)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
8. Rancher 접속 및 초기 설정
8.1 웹 접속
https://rancher.example.com
최초 접속 시
admin계정 비밀번호 설정 페이지 표시
8.2 비밀번호 수동 확인 (초기값)
kubectl get secret -n cattle-system bootstrap-secret \
-o go-template='{{ .data.bootstrapPassword | base64decode }}'
9. 초기 비밀번호 문제 해결 (Secret 없음 등)
9.1 bootstrap-secret 확인
kubectl get secret -n cattle-system
9.2 새 비밀번호 강제 생성
kubectl -n cattle-system delete secret bootstrap-secret
kubectl -n cattle-system create secret generic bootstrap-secret \
--from-literal=bootstrapPassword="NewPassword123!"
9.3 Rancher Pod 재시작
kubectl delete pod -n cattle-system --all
kubectl rollout restart deployment rancher -n cattle-system
- Rancher UI 접속 시:
- ID:
admin - PW:
NewPassword123!
- ID:



선택 사항: Let’s Encrypt HTTPS 인증서 설정
공인 도메인 보유 시만 적용 가능
helm upgrade rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.example.com \
--set ingress.tls.source=letsEncrypt \
--set letsEncrypt.email=your-email@example.com
최종 점검 체크리스트
| 항목 | 확인 |
|---|---|
Rancher Pod Running 상태인지 확인 | ✅ |
Service 타입 LoadBalancer로 EXTERNAL-IP 할당되었는지 확인 | ✅ |
| 방화벽(80, 443) 오픈 여부 확인 | ✅ |
https://rancher.example.com 으로 접속 성공 | ✅ |
| 초기 admin 비밀번호 설정 완료 | ✅ |
이제 Rancher를 통해 Kubernetes 클러스터를 웹 UI로 관리할 수 있습니다.
Kubernetes 환경에서 GitLab 설치 (MetalLB + Ingress 방식)
디렉토리 구조 및 사전 준비
cd /home/min/download/gitlab
- 구성 파일 목록:
gitlab-pv.yamlgitlab-pvc.yamlgitlab-deployment.yamlgitlab-service.yaml(LoadBalancer용으로 수정)gitlab-ingress.yaml
1. GitLab PV, PVC 생성
kubectl create namespace gitlab
kubectl apply -f gitlab-pv.yaml
kubectl apply -f gitlab-pvc.yaml
gitlab-pv.yaml은/mnt/gitlab-data디렉토리를 사용하는 local-path 기반 PV 설정gitlab-pvc.yaml은 해당 PV를 사용하는 PVC 설정
2. GitLab Deployment 생성
kubectl apply -f gitlab-deployment.yaml
- GitLab Pod 실행
- 내부 포트:
80,443,22오픈 - PVC
/var/opt/gitlab에 마운트
3. GitLab Service (LoadBalancer 타입) 생성
# gitlab-service.yaml
apiVersion: v1
kind: Service
metadata:
name: gitlab-service
namespace: gitlab
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
- name: ssh
port: 22
targetPort: 22
selector:
app: gitlab
kubectl apply -f gitlab-service.yaml
kubectl get svc -n gitlab
EXTERNAL-IP에 MetalLB에서 할당한 IP 표시 (예:
192.168.0.200)
4. Ingress Controller 설치 (미설치 시)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.4/deploy/static/provider/cloud/deploy.yaml
이미 설치되어 있다면 생략 가능
5. Ingress 리소스 생성
# gitlab-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gitlab-ingress
namespace: gitlab
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: gitlab.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gitlab-service
port:
number: 80
kubectl apply -f gitlab-ingress.yaml
kubectl get ingress -n gitlab
- DNS 또는
/etc/hosts설정:192.168.0.200 gitlab.example.com
6. GitLab 컨테이너 설정 변경
kubectl get pod -n gitlab
kubectl exec -it <gitlab-pod-name> -n gitlab -- bash
/etc/gitlab/gitlab.rb 수정
external_url 'http://gitlab.example.com'
nginx['listen_port'] = 80
nginx['listen_addresses'] = ['0.0.0.0']
nginx['proxy_set_headers'] = {
"X-Forwarded-Proto" => "http",
"X-Forwarded-Ssl" => "off"
}
설정 반영
gitlab-ctl reconfigure
gitlab-ctl restart
7. GitLab 접속 확인
curl -I http://gitlab.example.com
또는 브라우저 접속:
http://gitlab.example.com
8. GitLab root 비밀번호 초기 확인
kubectl exec -it <gitlab-pod-name> -n gitlab -- bash
cat /etc/gitlab/initial_root_password
- 초기 ID:
root - 비밀번호는 위 파일에서 확인 (24시간 후 삭제될 수 있음)
root 비밀번호 수동 재설정 (Rails Console 사용)
kubectl exec -it <gitlab-pod-name> -n gitlab -- bash
gitlab-rails console -e production
# 아래 코드 입력
user = User.where(id: 1).first
user.password = '새비번'
user.password_confirmation = '새비번'
user.save!
최종 적용 요약 명령어
cd /home/digi/download/gitlab
kubectl create ns gitlab
kubectl apply -f gitlab-pv.yaml
kubectl apply -f gitlab-pvc.yaml
kubectl apply -f gitlab-deployment.yaml
kubectl apply -f gitlab-service.yaml
kubectl apply -f gitlab-ingress.yaml
kubectl get svc -n gitlab
kubectl get ingress -n gitlab
kubectl exec -it <pod> -n gitlab -- bash
vi /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure
gitlab-ctl restart


GitHub 설치 및 연동
우분투 24.04 진행
apt -y update
apt -y upgrade
- Git 설치
apt -y install git
- git 사용자 정보 설정
git config --global user.name "사용자 이름"
git config --global user.email "이메일 주소"
- github와 ssh 연결
- http 연결 방식도 있으나 ssh 선택
ssh-keygen -t rsa -b 4096 -C "이메일 주소"
- 공개키 github 계정에 등록
- 로그인 후, Settings > SSH and GPG keys > New SSH key
- ssh 공개키 복사하여 추가
- github에서 새로운 저장소를 생성
git clone git@github.com:사용자이름/저장소이름.git
- 파일 추가 및 커밋
cd test
# 클론한 디렉토리로 이동
- 새로운 파일 생성
echo "Hello Git" > hello.txt
- 변경 사항 스테이징
git add hello.txt
- 커밋 생성
git commit -m "test 커밋"
- 원격 저장소로 푸시
git push origin main
https://github.com/ssunmin/sunmin

Argo CD 설치 및 Ingress 기반 외부 접속 구성 가이드 (Kubernetes 클러스터)
개요
Kubernetes 클러스터가 정상적으로 구성되었다면, GitOps 기반 CI/CD 툴인 Argo CD를 설치하고
Ingress + TLS 기반 외부 접속 구성을 통해 https://argocd.test.com 과 같은 도메인으로 접근할 수 있도록 설정할 수 있습니다.
이 가이드는 Helm 없이 설치하며, 서비스 타입은 NodePort가 아닌 Ingress 방식을 사용합니다.
1. Argo CD 네임스페이스 생성
kubectl create namespace argocd
2. Argo CD 설치 (공식 매니페스트 사용)
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
설치 완료 후 파드 상태 확인:
kubectl get pods -n argocd
모든 파드가 Running 상태가 될 때까지 대기합니다.

3. Argo CD Ingress + Service 구성
3.1 서비스 정의
파일 경로: /home/min/download/argocd-service.yaml
apiVersion: v1
kind: Service
metadata:
name: argocd-server
namespace: argocd
labels:
app.kubernetes.io/name: argocd-server
spec:
selector:
app.kubernetes.io/name: argocd-server
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8080
3.2 Ingress 정의
파일 경로: /home/min/download/argocd-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: argocd
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 10m
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
nginx.ingress.kubernetes.io/x-forwarded-prefix: "/"
spec:
ingressClassName: nginx
tls:
- hosts:
- argocd.test.com
secretName: argocd-tls
rules:
- host: argocd.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
4. Ingress 및 서비스 적용
kubectl apply -f /home/min/download/argocd-service.yaml
kubectl apply -f /home/min/download/argocd-ingress.yaml
yaml내namespace: argocd가 지정되어 있다면-n없이도 적용됩니다.
5. 접속 확인
접속 주소
https://argocd.test.com
기본 로그인 정보
- ID:
admin - PW:
test1
기본 비밀번호를 재확인하고 싶다면:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d && echo
6. 리소스 삭제 방법
kubectl delete -f /home/min/download/argocd-service.yaml
kubectl delete -f /home/min/download/argocd-ingress.yaml
7. 네임스페이스 적용 방식 요약
kubectl -n argocd apply -f argocd-ingress.yaml
-n argocd: 명령어에서 네임스페이스 강제 지정- YAML 파일 내
namespace:가 존재하면 해당 값이 우선 적용 - 둘 중 하나만 명확하면 정상 적용됨
8. ERR_TOO_MANY_REDIRECTS 오류 해결
증상
웹 브라우저 접속 시 다음 오류 발생:
너무 여러 번 리디렉션되었습니다 (ERR_TOO_MANY_REDIRECTS)
주요 원인
- Argo CD는 HTTPS 기반으로 동작하도록 기본 설정되어 있음
- Ingress가
X-Forwarded-Proto헤더를 제대로 전달하지 않으면 무한 리다이렉트 발생
해결 방법
아래 어노테이션이 Ingress에 정확히 포함되어 있어야 함:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
또한, argocd-server 서비스는 반드시 targetPort: 8080을 사용해야 함
마무리 요약
| 항목 | 내용 |
|---|---|
| 설치 방식 | 공식 매니페스트 직접 설치 |
| 외부 접속 방식 | Ingress + TLS (argocd.test.com) |
| 인증서 | argocd-tls Secret (사전 생성 필요) |
| 기본 로그인 계정 | admin / test1 |
| 리다이렉션 오류 해결 | 헤더 어노테이션 및 HTTPS 설정 필요 |
| 서비스 포트 설정 | ClusterIP + targetPort: 8080 |


- CI/CD 배포된 개인 웹

Jenkins on Kubernetes 설치 매뉴얼 (Ubuntu 24.04)
1. 환경 개요
- OS: Ubuntu 24.04
- Kubernetes 클러스터 (containerd, Calico CNI)
- 이미 설치된 구성: Rancher, GitLab
- Ingress Controller: NGINX
- 외부 IP 관리: MetalLB
- 도메인: jenkins.ssunmini.com
- 노출 방식: NPM(HTTPS 종료) → Ingress(HTTP) → Service(ClusterIP:8185) → Pod(8080)
2. 네임스페이스 생성
kubectl create namespace jenkins
3. Helm 리포지토리 등록
helm repo add jenkinsci <https://charts.jenkins.io>
helm repo update
4. values.yaml 작성
/home/min/download/jenkins-values.yaml
root@master:/home/min/download# cat jenkins-values.yaml
controller:
image:
registry: docker.io
repository: jenkins/jenkins
tag: lts-jdk17
pullPolicy: IfNotPresent
serviceType: ClusterIP
servicePort: 8185
targetPort: 8080
ingress:
enabled: true
hostName: "jenkins.ssunmini.com"
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
tls: []
jenkinsUrl: "<https://jenkins.ssunmini.com/>"
admin:
username: admin
password: "test"
persistence:
enabled: true
size: 10Gi
5. Jenkins 설치
helm upgrade --install jenkins jenkinsci/jenkins \\
-n jenkins -f /home/min/download/jenkins-values.yaml
6. 리소스 확인
kubectl -n jenkins get pods,svc,ingress
- Pod:
jenkins-0→ READY 2/2 되어야 정상 - Service:
jenkins→ 8185/TCP - Ingress:
jenkins.ssunmini.com→192.168.1.240(Ingress Controller EXTERNAL-IP)
7. Jenkins 초기 로그인
초기 관리자 비밀번호 확인
kubectl -n jenkins exec -it deploy/jenkins -- \\
cat /var/jenkins_home/secrets/initialAdminPassword
관리자 계정 확인
# 관리자 아이디
kubectl -n jenkins get secret jenkins \\
-o jsonpath="{.data.jenkins-admin-user}" | base64 -d; echo
# 관리자 비밀번호
kubectl -n jenkins get secret jenkins \\
-o jsonpath="{.data.jenkins-admin-password}" | base64 -d; echo


Kubernetes Prometheus + Grafana (kube-prometheus-stack) 설치 매뉴얼
1. 설치 개요
- 환경: Kubernetes (Proxmox VM 클러스터 기반)
- 구성 요소: Prometheus, Grafana, Alertmanager, Node Exporter, kube-state-metrics
- Ingress + Nginx Proxy Manager (NPM): TLS 종료 (K8s 내부는 HTTP)
- 스토리지: PVC 사용 (기본 StorageClass 사용 가능)
2. 사전 준비
- Helm 리포지토리 등록
helm repo add prometheus-community <https://prometheus-community.github.io/helm-charts> helm repo update - 네임스페이스 생성
kubectl create namespace monitoring - StorageClass 확인
kubectl get storageclass- 기본 StorageClass가 있으면 그대로 사용 가능
- 기본 StorageClass가 없다면, local-path-provisioner 설치 필요 (이번 설치에서는 생략함)
3. values-prom.yaml
# values-prom.yaml — kube-prometheus-stack
# SSL은 Nginx Proxy Manager(NPM)에 서 종 료 하 므 로 , K8s Ingress는 HTTP로 만 엽 니 다 .
global:
imagePullSecrets: []
rbac:
create: true
# ───────── Grafana ─────────
grafana:
enabled: true
adminUser: admin
adminPassword: "test" # 설 치 후 Secret로 꼭 변 경 권 장
service:
type: ClusterIP
persistence:
enabled: true
type: pvc
accessModes: ["ReadWriteOnce"]
size: 10Gi
# storageClassName: "" # 기 본 StorageClass 사 용 . 필 요 시 지 정
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "8m"
nginx.ingress.kubernetes.io/ssl-redirect: "false" # NPM에 서 TLS 종 료
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- grafana.ssunmini.com
tls: [] # TLS는 NPM에 서 처 리
defaultDashboardsTimezone: Asia/Seoul
# ── (추가) 사이드카: ConfigMap으로 데이터소스/대시보드 자동 등록 ─────────
sidecar:
datasources:
enabled: true
label: grafana_datasource
labelValue: "1"
dashboards:
enabled: true
label: grafana_dashboard
labelValue: "1"
# ── (추가) PVC 권한 문제 해결: initChownData 끄고 fsGroup으로 권한 맞추기 ─────────
initChownData:
enabled: false
podSecurityContext:
fsGroup: 472
fsGroupChangePolicy: "OnRootMismatch"
securityContext:
runAsUser: 472
runAsGroup: 472
# ───────── Prometheus ─────────
prometheus:
service:
type: ClusterIP
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- prometheus.ssunmini.com
paths:
- /
tls: []
prometheusSpec:
retention: 15d
replicas: 1
enableAdminAPI: false
walCompression: true
# 필 요 한 경 우 자 원 제 한 (랩 환 경 이 면 주 석 유 지 )
# resources:
# requests:
# cpu: 200m
# memory: 1Gi
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
# storageClassName: "" # 기 본 StorageClass 사 용
# ───────── Alertmanager ─────────
alertmanager:
service:
type: ClusterIP
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- alert.ssunmini.com
paths:
- /
tls: []
alertmanagerSpec:
replicas: 1
storage:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# storageClassName: "" # 기 본 StorageClass 사 용
# ───────── kube-state-metrics / node exporter ─────────
kube-state-metrics:
enabled: true
prometheus-node-exporter:
enabled: true
hostRootfs: false
# ───────── 기 타 기 본 ─────────
coreDns:
enabled: true
kubeProxy:
enabled: true
kubeEtcd:
enabled: false # 단 일 /관 리 형 환 경 이 면 비 활 성 화 (접 속 불 가 한 경 우 오 류 방 지 )
kubeControllerManager:
enabled: false
kubeScheduler:
enabled: false
4. 설치 명령
(1) 디버그 모드로 빠른 설치
처음 설치 시 타임아웃 오류가 발생 → 디버그 모드로 진행
kubectl create ns monitoring 2>/dev/null || true
helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \\
-n monitoring \\
-f values-prom.yaml \\
--debug
- 이후 상태 확인:
kubectl -n monitoring get pods kubectl -n monitoring get pvc
(2) 정식 설치 (문제 없을 때)
helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \\
-n monitoring \\
-f values-prom.yaml \\
--timeout 20m0s --wait
5. 접속 및 초기 설정
- Grafana:
https://grafana.ssunmini.com - Prometheus:
https://prometheus.ssunmini.com - Alertmanager:
https://alert.ssunmini.com
Grafana 초기 비밀번호 확인:
kubectl -n monitoring get secret kube-prometheus-stack-grafana \\
-o jsonpath="{.data.admin-password}" | base64 -d ; echo


docker install
Rocky 9.4
- docker install
# yum-utiles 패키지 설치
yum -y update
yum -y install yum-utils
- 레포지토리 설정
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 최신 버전의 docker engine 설치
yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- docker 실행
systemctl start docker
- 부팅 시 docker 데몬 자동 실행
systemctl enable docker
- 도커 이미지 검색
# centos 이미지 검색
docker search centos
- 도커 이미지 가져오기
docker pull centos:latest
- 이미지 목록 확인
docker images
- 컨테이너 실행
docker run -d centos
- 실행 중인 컨테이너 확인
docker ps
- 정지된 컨테이너까지 확인
docker ps -a
- 컨테이너 실행 및 중지
docker start centos
docker stop centos
- 컨테이너 접근
docker exec -it centos /bin/bash
Harbor 설치 매뉴얼 (Rocky Linux 9.6, Docker Compose)
1. 환경 정보
- OS: Rocky Linux 9.6
- Host: 192.168.1.11
- TLS: Nginx Proxy Manager(NPM)에서 종단 (Harbor는 http:80만 사용)
2. 사전 준비
# 필수 패키지
sudo dnf -y install curl wget tar net-tools
# Docker 설치
curl -fsSL <https://get.docker.com> | sh
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# Docker Compose Plugin 설치
sudo dnf -y install docker-compose-plugin
docker compose version
3. 디렉터리 준비
mkdir -p /home/min/download/harbor
cd /home/min/download/harbor
4. Harbor 다운로드
HVER="v2.13.2"
wget <https://github.com/goharbor/harbor/releases/download/${HVER}/harbor-offline-installer-${HVER}.tgz>
tar xzf harbor-offline-installer-${HVER}.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
5. harbor.yml 주요 설정
# 도메인
hostname: harbor.ssunmini.com
external_url: <https://harbor.ssunmini.com>
# HTTP만 사용 (NPM에서 TLS 종단)
http:
port: 80
# 데이터 저장소
data_volume: /data
# 관리자 계정
harbor_admin_password: "test"
자체 TLS 종단하지 않으므로 https: 블록은 주석 처리.
6. 설치 실행
cd /home/min/download/harbor/harbor
./install.sh --with-trivy
- 실행 후 같은 디렉터리에
docker-compose.yml생성됨 - 취약점 스캐너 Trivy 포함 설치
7. Compose 파일 경로 맞추기
cp docker-compose.yml /home/min/download/harbor/docker-compose.yaml
8. 로그 설정 패치
Harbor 기본 설정이 syslog tcp://localhost:1514 로 되어 있어 harbor-db 재시작 실패 발생 → UDP IPv4 로 변경
cd /home/min/download/harbor
sed -i 's#tcp://localhost:1514#udp://127.0.0.1:1514#g' docker-compose.yaml
sed -i 's#tcp://\\[::1\\]:1514#udp://127.0.0.1:1514#g' docker-compose.yaml
sed -i 's#tcp://127.0.0.1:1514#udp://127.0.0.1:1514#g' docker-compose.yaml
9. Harbor 기동/관리
# 실행
docker compose -f docker-compose.yaml up -d
# 상태 확인
docker compose -f docker-compose.yaml ps
# 로그 확인
docker compose -f docker-compose.yaml logs -f
중지/재시작:
docker compose -f docker-compose.yaml down
docker compose -f docker-compose.yaml restart

Jenkins Docker Compose 설치 가이드
ome/min/download/jenkins/ 경로에서 Jenkins를 Docker Compose로 설치하고 운영
1. 디렉토리 생성
mkdir -p /home/min/download/jenkins
cd /home/min/download/jenkins
2. docker-compose.yml 작성
/home/min/download/jenkins/docker-compose.yml 파일을 다음과 같이 작성합니다.
version: '3.8'
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts
restart: always
ports:
- "8080:8080"
volumes:
- jenkins_home:/var/jenkins_home
volumes:
jenkins_home:
3. Jenkins 실행
cd /home/min/download/jenkins
sudo docker-compose up -d
컨테이너가 백그라운드에서 실행되며, 8080 포트로 Jenkins에 접근할 수 있습니다.
4. Jenkins 접속
웹 브라우저에서 다음 주소로 접속합니다.
http://<서버 IP>:8080
예: http://192.168.0.11:8080
5. 초기 관리자 비밀번호 확인
Jenkins 초기 설정을 위해 아래 명령어로 비밀번호를 확인합니다.
sudo docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
이 비밀번호를 Jenkins 웹 페이지에 입력하면 플러그인 설치 및 관리자 계정 생성을 진행할 수 있습니다.