[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
k8sgpt라는 llm으로 내 k8s를 검사하고 솔루션까지 알려준다는 아주 매력적인 이야기를 하는 서비스가 있습니다.
실제로 구성해서 오류 Pod를 만들어서 해보면 솔루션이 나옵니다.
k8sgpt analyze --namespace default --filter Pod --explain 
k8sgpt는 CLI 형태입니다. 그래서 원래 code-server에서 kubectl, helm을 추가해서 했듯이 k8sgpt도 실행파일을 넣어주면 됩니다.

원래 코드의 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을 사용해 줍니다.
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-servercode-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