
배경
EKS를 운영하다 보면 크고 작은 장애와 마주하게 됩니다. (Pod가 뜨지 않거나, Service가 연결되지 않거나, Ingress가 정상인데 트래픽이 오지 않는 등 원인은 다양합니다.)
보통 `kubectl describe`. `kubectl logs`, pod 상세에서 event 세션 확인, Prometheus의 Alertmanager를 통해 알람을 확인하는 방식으로 문제의 원인을 파악합니다.
하지만 실제 운영 환경에서는 에러 원인은 여러 리소스에 걸쳐 있고, 맥락을 종합해야 하는 경우가 많습니다.
AI를 활용해 Kubernetes 클러스터 운영을 조금 더 효율적으로 만들 수 없을까 고민하던 중,
문득 2024년 9월 CNKCD2024에서 발표된 [당신이 누구던 쿠버네티스를 사용한다면 K8sGPT가 당신을 도와줄 수 있습니다] 세션을 보고, GPT 기반 분석이 실제 운영 환경에서 얼마나 도움이 될지 궁금해졌고, 이를 EKS 클러스터에 직접 적용해 보았습니다.
발표 영상
K8sGPT란?

K8sGPT는 쿠버네티스 클러스터의 상태를 분석하고, AI(GPT)를 활용해 문제 원인과 해결 방향을 자연어로 설명해주는 오픈소스 도구입니다.
즉, 단순히 에러를 감지하는 것이 아니라, 이벤트나 리소스 상태, 의존 관계를 종합해서 분석하여 결과를 제공합니다.
주요 기능
자동 문제 감지
pod, deployment, service, ingress 등 다양한 k8s 리소스의 문제를 자동으로 감지합니다. (따로 설정하여 커스텀도 가능합니다.)
AI 기반 분석
OpenAI의 api key를 이용하여 문제가 감지된 리소스에 대해 원인을 분석하고 해결 방안을 세시합니다.
알림
slack을 포함하여 다양한 채널로 알림을 전송합니다.
언어 지원
영어, 한국어등 다양한 언어로 분석 결과를 제공합니다.
> 하지만 저같은 경우엔 한글로 설정했을 때 원활하게 번역되지 않아서 K8sgpt 레포에서 등록된 관련 이슈를 찾아보았고 저와 비슷한 상황을 겪은 사람의 이슈를 발견해서 댓글을 달아놓은 상태입니다. (댓글 링크 얼른 고쳐지길 ㅜ)
아키텍처

기본적인 아키텍처 및 프로세스는 간단합니다.
- Operator가 클러스터 리소스를 지속적으로 관찰합니다.
- 문제가 감지되면 K8sGPT Pod가 분석합니다.
- OpenAI API를 통해 원인 분석합니다.
- 결과를 Result CRD로 저장합니다.
- 설정된 Sink(Slack 등)으로 메시지를 전송합니다.
구성해보기
Overview

환경 구성
Slack Bot 만들기
slack bot을 만들어서 메시지를 받기 위해서는 3가지 권한이 설정되어야 합니다.
- chat:write : 채널에 메시지 보내기
- channels:read : 채널 목록/정보 조회(대상 채널 찾기 등에 필요)
- channels:join : 봇이 채널에 자동 join 가능
본 글에서는 설정이 단순한 Incoming Webhook 방식을 사용했지만, Bot Token 방식으로 확장할 경우 위 권한 설정이 필요합니다.
Namespace 생성
kubectl create namespace k8sgpt-operator-system
K8sGPT Operator 설치
K8sGPT는 Operator가 CR을 감시하고 동작을 조율하는 구조이므로, 먼저 Operator를 설치합니다.
https://github.com/k8sgpt-ai/k8sgpt-operator/blob/main/chart/operator/values.yaml
k8sgpt-operator/chart/operator/values.yaml at main · k8sgpt-ai/k8sgpt-operator
Automatic SRE Superpowers within your Kubernetes cluster - k8sgpt-ai/k8sgpt-operator
github.com
# values.yaml
...
controllerManager:
manager:
image:
repository: ghcr.io/k8sgpt-ai/k8sgpt-operator
tag: v0.2.7
...
helm upgrade --install k8sgpt-operator k8sgpt/k8sgpt-operator \
-n k8sgpt-operator-system \
-f values.yaml
secret 생성
OpenAI API Key는 CR에 직접 넣지 않고 Kubernetes Secret으로 분리하는 것이 안전합니다.
# k8sgpt-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: k8sgpt-openai-secret
namespace: k8sgpt-operator-system
type: Opaque
stringData:
openai-api-key: "sk-proj-YOUR-OPENAI-API-KEY-HERE"
K8sgpt에서 사용할 openai 의 api key를 secret으로 배포합니다.
kubectl apply -f k8sgpt-secret.yaml
K8sGPT Custom Resource 생성
K8sGPT는 Kubernetes Operator 패턴을 기반으로 동작하는 도구로, 동작 방식을 K8sGPT Custom Resource(CR)를 통해 제어합니다.
즉, K8sGPT라는 Custom Resource(CR)를 생성하고, Operator는 이 CR의 spec을 읽어 어떻게 동작할지 선언적으로 제어합니다.
# k8sgpt.yaml
apiVersion: core.k8sgpt.ai/v1alpha1
kind: K8sGPT
metadata:
name: k8sgpt
namespace: k8sgpt-operator-system
labels:
environment: dev
cluster: development
spec:
ai:
enabled: true
model: gpt-4o-mini
backend: openai
secret:
name: k8sgpt-openai-secret
key: openai-api-key
repository: ghcr.io/k8sgpt-ai/k8sgpt
version: v0.4.27
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
filters:
- Pod
- Deployment
- StatefulSet
- Service
- Ingress
- Node
- PersistentVolumeClaim
sink:
type: slack
webhook: "{SLACK_WEBHOOK_URL}"
channel: "#{channel_name}"
k8sgpt의 동작 방식은 K8sGPT Custom Resource 설정에 모두 담겨 있습니다.
이 CR을 통해
- 무엇을 분석할지 (filters)
- 어떻게 분석할지 (ai)
- 분석 결과를 어디로 전달할지 (sink)
를 선언적으로 설정할 수 있습니다.
아래에서는 filters, ai, sink 설정을 중심으로 k8sgpt의 핵심 설정을 단계별로 살펴보겠습니다.
...
ai:
enabled: true
model: gpt-4o-mini
backend: openai
secret:
name: k8sgpt-openai-secret
key: openai-api-key
...
spec.ai 부분에 사용할 gpt model과 openai api key를 secret으로 등록한 k8sgpt-openai-secret을 설정합니다.
특히, model 부분에서는 gpt-4o-mini를 사용하도록 설정했는데, 장애 빈도가 낮고 비용이 중요하다 싶으면 mini와 같은 경량 모델을 추천드리고, 복잡한 클러스터 분석이 필요하다 싶으면 상위 모델사용하는 것을 추천 드립니다.
Secret 변경 후에는 Operator가 자동으로 재로딩하지 않는 경우도 있으므로,
필요 시 K8sGPT CR을 재적용하거나 Operator Pod를 재시작하는 것이 안전합니다.
...
filters:
- Pod
- Deployment
- StatefulSet
- Service
- Ingress
- Node
- PersistentVolumeClaim
...
ConfigMap, Secret 등은 필요 시에만 추가하는 것이 권장합니다.
...
sink:
type: slack
webhook: "{SLACK_WEBHOOK_URL}"
channel: "#{channel_name}"
...
마지막으로 K8sGPT가 분석한 정보를 slack으로 전달하기 위한 설정을 하는 sink 세션입니다.
K8s 동작흐름
위의 세션들을 통해 k8sGPT의 동작흐름을 살펴보면 아래와 같습니다.
- Operator가 필터 대상 리소스 상태를 주기적으로 스캔
- 이상 상태 감지
- AI 분석 수행
- 분석 결과를 K8sGPT Result CR로 저장
- sink 설정에 따라 Slack으로 메시지 전송
Slack 알림은 이벤트 기반이 아니라 “분석 결과 기반” 알림입니다.
배포 후 결과 확인
kubectl apply -f k8sgpt.yaml
위 명령어를 통해 CR을 배포합니다.
kubectl get results -n k8sgpt-operator-system
그 후 일정 시간이 지나면, K8sGPT가 분석을 수행하고 Result CR를 생성합니다.

kubectl describe ${results} -n k8sgpt-operator-system
위 명령어를 통해 특정 results를 확인해보면 gpt의 분석을 기반으로 문제가 발생한 리소스 / 이벤트 기반 원인 분석 / 조치 방향에 대한 가이드가 적혀져 저장됩니다.

slack 알람 메시지 확인

Slack 알림에서는 이를 요약한 메시지를 바로 확인할 수 있습니다.
정리
K8sGPT는 쿠버네티스 장애를 자동으로 해결해주는 도구는 아닙니다.
하지만 운영 중 발생한 이슈에 대해 초기 맥락과 원인 추정을 빠르게 제공해주는 도구로서는 충분한 장점이 있습니다. 특히 이벤트, 리소스 상태, 의존 관계를 한 번에 종합해 설명해주기 때문에 어떻게 해결할 지에 대해 제시해주었던 것이 도움이 되었습니다.
다만 K8sGPT는 기존의 Prometheus, Alertmanager와 같은 모니터링/알림 시스템을 대체하는 솔루션이 아니라, 운영자의 판단을 보조하는 분석 지원 도구로 접근하는 것이 적절해보입니다.
Dev / Staging 환경에서 먼저 활용해보고, 보안·비용·분석 정확도를 검토한 뒤 운영 환경에 적용하는 방식을 추천합니다. (특히 open ai token 비용 고려…)
참고
- https://github.com/k8sgpt-ai/k8sgpt
GitHub - k8sgpt-ai/k8sgpt: Giving Kubernetes Superpowers to everyone
Giving Kubernetes Superpowers to everyone. Contribute to k8sgpt-ai/k8sgpt development by creating an account on GitHub.
github.com
'데브옵스 이야기 > Kubernetes' 카테고리의 다른 글
| stakater/Reloader 사용시 configmap, secret 변경할 시에 감지 안되는 이슈 (0) | 2025.12.22 |
|---|---|
| K8s의 Memory? (RAM, Storage) (0) | 2024.08.02 |
| Kubernetes common errors (1) | 2024.07.29 |
| CKA, CKAD 취득 후기 (0) | 2024.03.04 |