DevOps & Container Platform

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

온프레미스 환경에서 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 풀 및 광고 설정

  1. 아래 내용을 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은 예시이며, 네트워크 환경에 맞게 조정 필요

  1. 적용:
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로 설정해주면 테스트 가능

환경 정보

항목
OSUbuntu 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!


선택 사항: 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로 관리할 수 있습니다.

디렉토리 구조 및 사전 준비

cd /home/min/download/gitlab
  • 구성 파일 목록:
    • gitlab-pv.yaml
    • gitlab-pvc.yaml
    • gitlab-deployment.yaml
    • gitlab-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

우분투 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

개요

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

yamlnamespace: 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 배포된 개인 웹

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-0READY 2/2 되어야 정상
  • Service: jenkins8185/TCP
  • Ingress: jenkins.ssunmini.com192.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

1. 설치 개요

  • 환경: Kubernetes (Proxmox VM 클러스터 기반)
  • 구성 요소: Prometheus, Grafana, Alertmanager, Node Exporter, kube-state-metrics
  • Ingress + Nginx Proxy Manager (NPM): TLS 종료 (K8s 내부는 HTTP)
  • 스토리지: PVC 사용 (기본 StorageClass 사용 가능)

2. 사전 준비

  1. Helm 리포지토리 등록 helm repo add prometheus-community <https://prometheus-community.github.io/helm-charts> helm repo update
  2. 네임스페이스 생성 kubectl create namespace monitoring
  3. 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

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

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

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 웹 페이지에 입력하면 플러그인 설치 및 관리자 계정 생성을 진행할 수 있습니다.