May 21, 2025

[Home-K8S] #5 k8sgpt 설치 (code-server)

[Home-K8S] #5  k8sgpt 설치 (code-server)

k8sgpt

k8sgpt라는 llm으로 내 k8s를 검사하고 솔루션까지 알려준다는 아주 매력적인 이야기를 하는 서비스가 있습니다.

실제로 구성해서 오류 Pod를 만들어서 해보면 솔루션이 나옵니다.

k8sgpt analyze --namespace default --filter Pod --explain 

K8S Code-Server에 k8sgpt 구성하기

k8sgpt는 CLI 형태입니다. 그래서 원래 code-server에서 kubectl, helm을 추가해서 했듯이 k8sgpt도 실행파일을 넣어주면 됩니다.

[Home-K8S] #4 code-server 구성
Kubernetes 클러스터에 code-server로 VS Code 원격 IDE 구축하기. nginx-ingress·TLS·인증 설정까지 단계별 가이드합니다.

k8sgpt cli 설치

원래 코드의 initContainer에 k8sgpt를 다운받는 컨테이너를 작성합니다.
공식 Docker Image가 있긴 하지만, 그 이미지에서 다운받지는 못합니다.
(https://k8sgpt.ai/docs/getting-started/installation 제공하는 방법을 사용합니다. )

initContainers:
  - name: k8sgpt-copy
    image: alpine:latest
    command:
      - /bin/sh
      - -c
      - |
        apk add --no-cache curl tar && \
        curl -L https://github.com/k8sgpt-ai/k8sgpt/releases/latest/download/k8sgpt_Linux_x86_64.tar.gz -o /tmp/k8sgpt.tar.gz && \
        tar -xzf /tmp/k8sgpt.tar.gz -C /mnt/bin && \
        chmod +x /mnt/bin/k8sgpt
    volumeMounts:
      - name: bin-volume
        mountPath: /mnt/bin
containers:
  volumeMounts:
    - name: bin-volume
      mountPath: /usr/local/bin/k8sgpt
      subPath: k8sgpt

환경변수 설정

저는 Ollama를 내부에 구성해서 사용 중입니다. 기본값은 openai로 되어 있습니다.

containers:
  env:
    - name: K8SGPT_BACKEND
      value: ollama
    - name: K8SGPT_MODEL
      value: exaone3.5:2.4b
    - name: K8SGPT_BASEURL
      value: http://ollama-ds.ollama.svc.cluster.local:11434

기본 ConfigMap 구성

근데 환경변수는 안됩니다. 나만 안되는 건지 모르겠는데, 설정이 안되어서 ConfigMap을 만들어서 넣어줍니다. 기존 configmap을 사용해 줍니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: code-server-config
  namespace: code-server
data:
  config.yaml: |
    bind-addr: 127.0.0.1:8080
    auth: none
  k8sgpt.yaml: |
    language: ko
    
    ai:
        providers:
            - name: ollama
              model: exaone3.5:2.4b
              baseurl: http://ollama.ollama.svc.cluster.local:11434
              temperature: 0.7
              topp: 0.5
              topk: 50
              maxtokens: 2048
              customheaders: []
        defaultprovider: "ollama"
    commit: 306b3c9
    date: unknown
    kubeconfig: ""
    kubecontext: ""
    verbose: false
    version: 0.4.17
---
apiVersion: apps/v1
kind: Deployment
  ...
      containers:
        volumeMounts:
          - name: code-config
            mountPath: /home/coder/.config/k8sgpt/k8sgpt.yaml
            subPath: k8sgpt.yaml

권한 설정

위와 같이 설치하고 k8sgpt analyze --explain 을 실행하면 다른 namespace를 보지 못합니다. 실행이 제대로 되지 않으니 볼 수 있는 권한을 넣어줘야 합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: k8sgpt-read-access
rules:
  - apiGroups: ["", "apps", "batch", "networking.k8s.io", "admissionregistration.k8s.io"]
    resources: ["pods", "nodes", "configmaps", "services", "endpoints", "deployments", "replicasets", "jobs", "cronjobs", "statefulsets", "persistentvolumeclaims", "ingresses", "mutatingwebhookconfigurations", "validatingwebhookconfigurations"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: code-server-k8sgpt-read
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: k8sgpt-read-access
subjects:
  - kind: ServiceAccount
    name: default
    namespace: code-server

code-server에 있는 default SA에 ClusterRole 을 넣어줍니다.

사용법

k8sgpt analyze --explain

명령어를 수행하면 모든 namespace를 보고 문제점을 찾아줍니다만, 문제점이 있습니다.

마무리

기본적으로 내부 통신을 위해 생성되는 kube-root-ca.crt ConfigMap도 k8sgpt가 Error로 표현합니다.
아무 pod에서도 사용중이지 않으니 안쓸거면 지우라는 뜻인데 지우면 안됩니다.

그래서 기본적으로 실제 오류가 생겼을 때, 원하는 것만 찍어서 검사를 해야할 것으로 보입니다.
처음 나왔던 명령어 대로 원하는 namespace에 특정 resource를 검사하면 됩니다.

k8sgpt analyze --namespace default --filter Pod --explain 

Comments