블로그 홈

[kasten] Kasten 온라인 설치

본 가이드는 Default StorageClass가 선언되지 않은 순수 Rook-Ceph (v1.31) 환경에서 쿠버네티스 엔터프라이즈 백업 솔루션인 Kasten K10 (v8.5)을 안정적으로 올리기 위한 핵심 가이드라인입니다.

운영자23분 읽기4회
[kasten] Kasten 온라인 설치

일단 가장 중요한 것

  • kasten은 기본적으로 자체 스냅샷 표준을 기반으로 백업 받기 때문에 CSI Driver 가 볼륨 스냅샷 기능을 지원해야 하며, 사전에[ VolumeSanpshotClass 가 설치 전 생성해야 함

1. 온라인 설치 방법

외부 인터넷 통신이 된다는 전제하게 진행

Step 1 : Helm repo 추가 및 네임스페이스 생성

ubuntu@k8s-master:~$ kubectl create ns kasten-io
namespace/kasten-io created

Step 2 : Kasten 배포

helm install k10 kasten/k10 --namespace=kasten-io \
  --set global.persistence.storageClass="rook-ceph-block" \
  --set auth.tokenAuth.enabled=true \
  --set eula.accept=true \
  --set eula.company="test" \
  --set eula.email="**" / 회사 계정입력

Step 3 : kasten Service 확인

저는 조금 오래걸렸습니다. 리소스가 좀 딸리네요

  • Pod 켜지는중

  • PVC : kasten에 필요한 pvc 입니다. 스토리지 클래스는 CSI 의 스냅샷 기능이 있는 SC로 사용하여 배포.

  • SVC : 이렇게가 많은 서비스들이 있네요… 일단 pod 는 정상이니 진행하겠습니다.


Step 4 : Kasten 토큰 생성

  • 관리 권한 서비스 토큰 생성하여 들어갈 수 있음

  • 이권한도 들어가야함 .

https://docs.kasten.io/latest/access/rbac/


# kasten 서비스 계정 만들기
kubectl create serviceaccount k10-admin -n kasten-io

# 생성
kubectl create token k10-admin --n kasten-io --duration=24h



판단 미스..

광고

  • 현재 Cluster IP로 기본 설정되어있어 들어가기 어려움 그래서 두가지 경우가 있었음..


방법 1 : 임시로 포트포워딩

kubectl port-forward service/gateway -n kasten-io 8080:80 --address 0.0.0.0


방법 2 : NordPort 로 변경해서 영구적으로 접속가능하게 하는 방법

## 업데이트 후 진행

helm upgrade k10 kasten/k10 --namespace=kasten-io \
  --reuse-values \
  --set gateway.service.type="NodePort"


하지만 나는 귀찮기때문에 임시 포트포워딩만 해주겠습니다…


접속 완

  • 접속 후 토근 생성받은 것만 넣으면


이슈사항

  • 토큰 생성 명령어로 토큰 집어넣었는데 안됨….


  • Auth 로그 보니 불일치? 이런게 있음… 왜그런건지는 모르겠음.

+ GPT 피셜은 K8S 가 거부 했다는 의미

  • veeam 커뮤니티 찾아보니까 이런게 많아서 우회해서 고정 시크릿 토큰 하나 받아서 하면 된다는 피셜 알게됨

해결 방법

  1. 기존 k10-admin 계정과 결합하는 수동 토큰 시크릿 생성 yaml 짜기

# k10-admin.yaml

apiVersion: v1
kind: Secret
metadata:
  name: k10-admin-token-secret
  namespace: kasten-io
  annotations:
    kubernetes.io/service-account.name: "k10-admin"
type: kubernetes.io/service-account-token

$ kubectl apply -f k10-admin.yaml 실행
  1. 고정 시크릿 내부에서 순수한 베어 토큰만 추출 (디코딩한거)

kubectl get secret k10-admin-token-secret -n kasten-io -o jsonpath='{.data.token}' | base64 --decode; echo ""
  • 그럼 디코딩한걸로 주입하면?

안됨…

실시간 로그 분석

 log does not need rotating (log size is below the 'size' threshold)
2026/06/05 05:55:31 "GET http://192.168.181.81:8000/healthz HTTP/1.1" from 172.22.3.64:47616 - 200 9B in 19.112µs
2026/06/05 05:55:31 "GET http://192.168.181.81:8000/healthz HTTP/1.1" from 172.22.3.64:47626 - 200 9B in 11.741µs
{"File":"kasten.io/k10/kio/auth/handlers/ok.go","Function":"kasten.io/k10/kio/auth/handlers.(*OKHandler).ServeHTTP","Line":29,"RequestID":"2a60b227-60a3-11f1-bad6-3e4074cddbd0","cluster_name":"7eea85a1-9661-44ae-8f2a-049917479af4","hostname":"auth-svc-bb59bc84b-2l4ll","level":"info","msg":"Authenticated: no auth required","path":"/v0/authz/k10/auth-svc/v0/login","spanID":"c9d72c3a297742f6","status":200,"time":"2026-06-05T05:55:33.211Z","traceID":"c5c90ed2901982ec7192b2dbd5f04153","version":"8.5.11"}
2026/06/05 05:55:33 "POST http://172.22.3.60:31133/k10/auth-svc/v0/login HTTP/1.1" from 172.22.3.60:4412 - 200 0B in 20.422594ms
{"File":"kasten.io/k10/kio/auth/handlers/redirect.go","Function":"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP","Line":34,"RequestID":"2a66a5c8-60a3-11f1-bad6-3e4074cddbd0","cluster_name":"7eea85a1-9661-44ae-8f2a-049917479af4","hostname":"auth-svc-bb59bc84b-2l4ll","level":"info","location":"/k10/?page=Login","msg":"Redirected: no token in X-Forwarded-Access-Token or Authorization","path":"/v0/authz/k10/","spanID":"24adce4aff8e0745","status":307,"time":"2026-06-05T05:55:33.250Z","traceID":"10185648b2b8f4f451e573b7715946c3","version":"8.5.11"}
2026/06/05 05:55:33 "GET http://172.22.3.60:31133/k10/ HTTP/1.1" from 172.22.3.60:4412 - 307 52B in 2.010222ms
{"File":"kasten.io/k10/kio/auth/handlers/redirect.go","Function":"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP","Line":34,"RequestID":"2a839419-60a3-11f1-bad6-3e4074cddbd0","cluster_name":"7eea85a1-9661-44ae-8f2a-049917479af4","hostname":"auth-svc-bb59bc84b-2l4ll","level":"info","location":"/k10/?page=Login","msg":"Redirected: no token in X-Forwarded-Access-Token or Authorization","path":"/v0/authz/k10/dashboardbff-svc/v0/upgradeInfo","spanID":"7f32ca2db357deec","status":307,"time":"2026-06-05T05:55:33.440Z","traceID":"f13000b73a6923a97de7221cb924eb4a","version":"8.5.11"}
2026/06/05 05:55:33 "GET http://172.22.3.60:31133/k10/dashboardbff-svc/v0/upgradeInfo HTTP/1.1" from 172.22.3.60:4412 - 307 52B in 3.426818ms
{"File":"kasten.io/k10/kio/auth/handlers/redirect.go","Function":"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP","Line":34,"RequestID":"2a842399-60a3-11f1-bad6-3e4074cddbd0","cluster_name":"7eea85a1-9661-44ae-8f2a-049917479af4","hostname":"auth-svc-bb59bc84b-2l4ll","level":"info","location":"/k10/?page=Login","msg":"Redirected: no token in X-Forwarded-Access-Token or Authorization","path":"/v0/authz/k10/favicon.ico","spanID":"76c9a5ed35c70913","status":307,"time":"2026-06-05T05:55:33.443Z","traceID":"9ea18ae98d831a493d675b1723eeec81","version":"8.5.11"}
2026/06/05 05:55:33 "GET http://172.22.3.60:31133/k10/favicon.ico HTTP/1.1" from 172.22.3.60:64294 - 307 52B in 7.153974ms
{"File":"kasten.io/k10/kio/auth/handlers/redirect.go","Function":"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP","Line":34,"RequestID":"2a8568ce-60a3-11f1-bad6-3e4074cddbd0","cluster_name":"7eea85a1-9661-44ae-8f2a-049917479af4","hostname":"auth-svc-bb59bc84b-2l4ll","level":"info","location":"/k10/?page=Login","msg":"Redirected: no token in X-Forwarded-Access-Token or Authorization","path":"/v0/authz/k10/favicon.ico","spanID":"57a7275f2439c10a","status":307,"time":"2026-06-05T05:55:33.451Z","traceID":"a7e3a1006d4ca84e9b9471bea568ca1d","version":"8.5.11"}
2026/06/05 05:55:33 "GET http://172.22.3.60:31133/k10/favicon.ico HTTP/1.1" from 172.22.3.60:4412 - 307 52B in 1.944522ms
172.22.3.64 - - [05/Jun/2026:05:55:33 +0000] "GET /v0/healthz HTTP/1.1" 301 162 "-" "kube-probe/1.31"
172.22.3.64 - - [05/Jun/2026:05:55:33 +0000] "GET /v0/healthz HTTP/1.1" 301 162 "-" "kube-probe/1.31"
172.22.3.64 - - [05/Jun/2026:05:55:33 +0000] "GET /v0/healthz/ HTTP/1.1" 200 3 "http://192.168.181.82:8000/v0/healthz" "kube-probe/1.31"
172.22.3.64 - - [05/Jun/2026:05:55:33 +0000] "GET /v0/healthz/ HTTP/1.1" 200 3 "http://192.168.181.82:8000/v0/healthz" "kube-probe/1.31"
[0] tcp.0: [[1780638933.321392239, {}], {"File"=>"kasten.io/k10/kio/auth/handlers/ok.go", "Function"=>"kasten.io/k10/kio/auth/handlers.(*OKHandler).ServeHTTP", "Level"=>"info", "Line"=>29, "Message"=>"Authenticated: no auth required", "RequestID"=>"2a60b227-60a3-11f1-bad6-3e4074cddbd0", "Time"=>"2026-06-05T05:55:33.211563299Z", "cluster_name"=>"7eea85a1-9661-44ae-8f2a-049917479af4", "hostname"=>"auth-svc-bb59bc84b-2l4ll", "path"=>"/v0/authz/k10/auth-svc/v0/login", "spanID"=>"c9d72c3a297742f6", "status"=>200, "traceID"=>"c5c90ed2901982ec7192b2dbd5f04153", "version"=>"8.5.11"}]
[1] tcp.0: [[1780638933.321415426, {}], {"File"=>"kasten.io/k10/kio/auth/handlers/redirect.go", "Function"=>"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP", "Level"=>"info", "Line"=>34, "Message"=>"Redirected: no token in X-Forwarded-Access-Token or Authorization", "RequestID"=>"2a66a5c8-60a3-11f1-bad6-3e4074cddbd0", "Time"=>"2026-06-05T05:55:33.250322268Z", "cluster_name"=>"7eea85a1-9661-44ae-8f2a-049917479af4", "hostname"=>"auth-svc-bb59bc84b-2l4ll", "location"=>"/k10/?page=Login", "path"=>"/v0/authz/k10/", "spanID"=>"24adce4aff8e0745", "status"=>307, "traceID"=>"10185648b2b8f4f451e573b7715946c3", "version"=>"8.5.11"}]
[2] tcp.0: [[1780638933.823382468, {}], {"File"=>"kasten.io/k10/kio/auth/handlers/redirect.go", "Function"=>"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP", "Level"=>"info", "Line"=>34, "Message"=>"Redirected: no token in X-Forwarded-Access-Token or Authorization", "RequestID"=>"2a839419-60a3-11f1-bad6-3e4074cddbd0", "Time"=>"2026-06-05T05:55:33.440000982Z", "cluster_name"=>"7eea85a1-9661-44ae-8f2a-049917479af4", "hostname"=>"auth-svc-bb59bc84b-2l4ll", "location"=>"/k10/?page=Login", "path"=>"/v0/authz/k10/dashboardbff-svc/v0/upgradeInfo", "spanID"=>"7f32ca2db357deec", "status"=>307, "traceID"=>"f13000b73a6923a97de7221cb924eb4a", "version"=>"8.5.11"}]
[3] tcp.0: [[1780638933.823398201, {}], {"File"=>"kasten.io/k10/kio/auth/handlers/redirect.go", "Function"=>"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP", "Level"=>"info", "Line"=>34, "Message"=>"Redirected: no token in X-Forwarded-Access-Token or Authorization", "RequestID"=>"2a842399-60a3-11f1-bad6-3e4074cddbd0", "Time"=>"2026-06-05T05:55:33.44356608Z", "cluster_name"=>"7eea85a1-9661-44ae-8f2a-049917479af4", "hostname"=>"auth-svc-bb59bc84b-2l4ll", "location"=>"/k10/?page=Login", "path"=>"/v0/authz/k10/favicon.ico", "spanID"=>"76c9a5ed35c70913", "status"=>307, "traceID"=>"9ea18ae98d831a493d675b1723eeec81", "version"=>"8.5.11"}]
[4] tcp.0: [[1780638933.823402193, {}], {"File"=>"kasten.io/k10/kio/auth/handlers/redirect.go", "Function"=>"kasten.io/k10/kio/auth/handlers.(*RedirectHandler).ServeHTTP", "Level"=>"info", "Line"=>34, "Message"=>"Redirected: no token in X-Forwarded-Access-Token or Authorization", "RequestID"=>"2a8568ce-60a3-11f1-bad6-3e4074cddbd0", "Time"=>"2026-06-05T05:55:33.451933686Z", "cluster_name"=>"7eea85a1-9661-44ae-8f2a-049917479af4", "hostname"=>"auth-svc-bb59bc84b-2l4ll", "location"=>"/k10/?page=Login", "path"=>"/v0/authz/k10/favicon.ico", "spanID"=>"57a7275f2439c10a", "status"=>307, "traceID"=>"a7e3a1006d4ca84e9b9471bea568ca1d", "version"=>"8.5.11"}]
  • GPT 왈: 백엔드까지는 정상적으로 완료 되었지만 메인 페이지에서 차단된거같음 이라고 나옴

  • https로 해야할거같음..


NGINX 로 설정하기

STEP 1: 사설 인증서 발급

# 1. 인증서를 생성할 임시 공간 이동
mkdir -p ~/kasten_k8s_ssl && cd ~/kasten_k8s_ssl

# 2. OpenSSL로 마스터 노드 IP(172.22.3.60) 기반 인증서 파일 생성
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key \
  -out tls.crt \
  -subj "/C=KR/O=DigitalITech/CN=172.22.3.60"

# 3. Kasten 네임스페이스 내부에 쿠버네티스 정식 TLS Secret으로 업로드
kubectl create secret tls kasten-https-secret \
  --cert=tls.crt \
  --key=tls.key \
  -n kasten-io

셀프 인증서 부터 만들어 보아요


  • CN은 마스터 노드 로 해서 인식되게 만들었습니다.


STEP 2 : NGINX 설정 값 백업용 CONFIGMAP

nginx 리버스 프록시 yaml 파일 생성

ubuntu@k8s-master:~/kasten_ssl$ cat nginx.conf 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-proxy-config
  namespace: kasten-io
data:
  nginx.conf: |
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log notice;
    pid /var/run/nginx.pid;

    events {
        worker_connections 1024;
    }

    http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        client_max_body_size 1024M;

        server {
            listen 8443 ssl;
            server_name 172.22.3.60;

            # 쿠버네티스 Secret이 마운트될 경로
            ssl_certificate /etc/nginx/ssl/tls.crt;
            ssl_certificate_key /etc/nginx/ssl/tls.key;

            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers HIGH:!aNULL:!MD5;

            # 사용자가 IP만 치고 들어왔을 때 /k10/으로 자동 리다이렉트
            location = / {
                return 301 $scheme://$http_host/k10/;
            }

            location / {
                # Kasten 내부 gateway 서비스 이름과 포트 직접 지정
                proxy_pass http://10.102.61.108:80;

                # ⭐️ 역슬래시(\) 제거 및 헤더 매핑 수정
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                # Kasten 인증용 핵심 헤더 (토큰 유실 방지)
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Port $server_port;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_read_timeout 600s;
            }
        }
    }
ubuntu@k8s-master:~/kasten_ssl$ cat NordPort.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kasten-nginx-proxy
  namespace: kasten-io
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kasten-nginx-proxy
  template:
    metadata:
      labels:
        app: kasten-nginx-proxy
    spec:
      hostNetwork: true
      # ⭐️ 추가 1: 마스터 노드(control-plane)에만 배포되도록 강제 지정
      dnsPolicy:  ClusterFirstWithHostNet  
      nodeSelector:
        node-role.kubernetes.io/control-plane: ""
        
      # ⭐️ 추가 2: 마스터 노드의 애플리케이션 배포 제한(Taint)을 무시
      tolerations:
      - operator: Exists
      
      containers:
      - name: nginx
        image: nginx:stable-alpine
        ports:
        - containerPort: 443
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        - name: ssl-volume
          mountPath: /etc/nginx/ssl
          readOnly: true
      volumes:
      - name: config-volume
        configMap:
          name: nginx-proxy-config
      - name: ssl-volume
        secret:
          secretName: kasten-https-secret
---
apiVersion: v1
kind: Service
metadata:
  name: kasten-nginx-nodeport
  namespace: kasten-io
spec:
  type: NodePort
  ports:
  - port: 443
    targetPort: 443
    nodePort: 32443 # 👈 테스트하기 직관적인 고정 HTTPS NodePort 수동 지정
  selector:
    app: kasten-nginx-proxy

배포 후 완료 함..!

광고

운

운영자

운영자

엔터프라이즈 인프라, 가상화, 백업 솔루션 및 데이터 아키텍처를 연구하고 기록합니다.

이전

[kasten] 스토리지 클래스 스냅샷 연동 에러

[kasten] 스토리지 클래스 스냅샷 연동 에러

Kasten 백업 엔진이 Rook-Ceph 블록 볼륨의 CSI 스냅샷을 찍어야 하는데, 어떤 스냅샷 클래스 규칙을 트리거해야 하는지 식별할 수 있는 전용 주석(Annotation)이 누락됨.

7분 읽기3

다음

관련 게시글

V

Veeam Kasten 9.0.7 업데이트 - 대규모 Export 병렬 처리와 Restore 지연 수정

Veeam Kasten 9.0.7에서 대량 Export 동시 실행 시 executor thread 고갈로 Backup·Restore까지 지연될 수 있던 문제가 수정됐습니다. 취소된 Restore/Import 장기 실행, KubeVirt Restore, Azure Infrastructure Profile 수정 사항과 업그레이드 전 체크포인트를 함께 정리합니다.

9분 읽기3

댓글

또는 로그인

첫 번째 댓글을 남겨보세요!