# Gemini CLI 마스터하기(심화): v21 - DevOps의 동반자: Kubernetes(K8s) 클러스터 상호작용 이전 단계들에서는 로컬 파일, 코드베이스, 그리고 Elasticsearch와 같은 다양한 지식 기반에서 정보를 검색하여 LLM의 답변을 증강하는 방법을 배웠습니다. 이제 우리의 초점을 라이브 인프라 관리 및 관찰로 전환하여, Gemini CLI가 현대 인프라의 핵심인 **Kubernetes(K8s) 클러스터**와 직접 상호작용하는 방법을 알아보겠습니다. `list_resources` 스니펫이 보여주듯이, Gemini 에이전트는 DevOps 및 SRE 팀에게 매우 유용한 AI 어시스턴트가 될 수 있습니다. --- ## 1. 왜 Gemini CLI를 K8s와 연동해야 하는가? Kubernetes 클러스터를 관리하는 것은 강력하지만 복잡한 `kubectl` 명령어를 필요로 합니다. Gemini CLI와 K8s의 연동은 다음과 같은 이점을 제공합니다. * **운영 효율성:** 수많은 `kubectl` 명령어를 일일이 기억하거나 문서에서 찾아볼 필요 없이, 자연어로 클러스터 상태, 리소스, 로그 등을 신속하게 질의할 수 있습니다. * **상황 인지 및 요약:** LLM이 K8s의 복잡한 JSON/YAML 출력을 해석하여 인간이 이해하기 쉬운 형태로 요약하거나, 문제의 원인을 진단해 줍니다. * **능동적인 인사이트:** "내 배포에 문제가 있어?"와 같은 질문에 에이전트가 직접 클러스터를 조사하여 잠재적인 문제를 찾아내고 보고할 수 있습니다. * **안전한 상호작용:** 인터랙티브 모드에서는 에이전트가 클러스터에 변경을 가하기 전에 항상 사용자의 승인을 받으므로, 지능과 안전성이 결합된 관리가 가능합니다. ## 2. Gemini CLI의 Kubernetes 통합 원리 (개념) 제공된 `list_resources` 스니펫은 Gemini CLI가 Kubernetes 클러스터와 어떻게 통신하는지 보여줍니다. ```python # list_resources 함수의 일부 (제공된 스니펫 기반 추정) def list_resources(self, api_version, kind, namespace=None, label_selector=None): # dynamic_client는 Kubernetes API와 통신하는 동적 클라이언트 인스턴스 # client.resources.get을 통해 특정 종류의 K8s 리소스에 접근 api = self.dynamic_client.resources.get(api_version=api_version, kind=kind) # namespace와 label_selector를 사용하여 필터링 # list는 리소스 목록을 가져오는 K8s API 호출 if namespace: resources = api.manager.namespace(namespace).get(label_selector=label_selector) else: resources = api.manager.all_namespaces().get(label_selector=label_selector) return resources ``` 1. **인증 및 설정:** * Gemini CLI (또는 그 기반의 Kubernetes 클라이언트)는 `kubeconfig` 파일을 통해 Kubernetes 클러스터에 접근합니다. 즉, `kubectl` 명령어가 작동하는 환경에서 Gemini CLI를 실행하면 자동으로 인증 정보를 활용합니다. * `KUBECONFIG` 환경 변수를 설정하여 특정 `kubeconfig` 파일을 지정할 수도 있습니다. 2. **동적 K8s 클라이언트 (`dynamic_client`):** * `dynamic_client`는 Kubernetes API와 통신하기 위한 유연한 클라이언트입니다. `api_version`, `kind`와 같은 파라미터를 사용하여 어떤 종류의 K8s 리소스(Pod, Deployment, Service, ConfigMap, Custom Resource 등)든 동적으로 질의할 수 있게 합니다. 3. **자연어 질의의 K8s API 호출 변환:** * 사용자가 "default 네임스페이스의 모든 파드를 보여줘"와 같은 자연어 질문을 하면, Gemini 에이전트의 '정책(Policy)'은 이 질문을 `list_resources` 함수가 이해할 수 있는 `api_version='v1'`, `kind='Pod'`, `namespace='default'`와 같은 파라미터로 변환합니다. 4. **K8s API 호출 및 결과 해석:** * 변환된 파라미터로 `list_resources` 함수가 실행되어 실제 Kubernetes API 호출을 수행합니다. * API로부터 반환된 원시 K8s 리소스 데이터(JSON/YAML 형식)는 Gemini LLM으로 전달됩니다. * LLM은 이 복잡한 데이터를 해석하고, 사용자 질문에 맞춰 사람이 이해하기 쉬운 형태로 요약하거나 필요한 정보를 추출하여 답변합니다. ## 3. Gemini CLI로 K8s 상호작용 구현하기 (개념적 워크플로우) ### 단계 1: `kubeconfig` 접근 확인 Gemini CLI를 실행할 터미널에서 `kubectl get pods` 명령어가 정상적으로 작동하는지 확인합니다. ### 단계 2: K8s 질의 (인터랙티브 모드) `INTERACTIVE=1`로 설정하고 `gemini web`을 실행한 후, 웹 인터페이스에서 K8s 관련 명령을 내립니다. **예시 1: 특정 네임스페이스의 파드 목록 확인** * **사용자:** "default 네임스페이스의 모든 파드 이름을 보여줘." * **에이전트 로그:** "요청: 파드 목록 확인. K8s API 호출 구성 중: `api_version='v1'`, `kind='Pod'`, `namespace='default'`." * **행동 제안 카드:** "제안된 행동: `list_resources(api_version='v1', kind='Pod', namespace='default')`" * **사용자:** 승인. * **에이전트 응답:** "default 네임스페이스의 파드 목록입니다: `frontend-abc12`, `backend-xyz34`, `database-qwe56`." **예시 2: 특정 라벨을 가진 배포(Deployment)의 상태 요약** * **사용자:** "app=frontend 라벨이 붙은 배포들의 현재 상태를 요약해 줘." * **에이전트 로그:** "요청: 배포 상태 요약. K8s API 호출 구성 중: `kind='Deployment'`, `label_selector='app=frontend'`." * **행동 제안 카드:** "제안된 행동: `list_resources(api_version='apps/v1', kind='Deployment', label_selector='app=frontend')`" * **사용자:** 승인. * **에이전트 응답:** "app=frontend 배포는 `frontend-v1`이며, 현재 3개 중 3개의 파드가 정상적으로 실행 중입니다. 업데이트 중인 배포는 없습니다." ## 4. Kubernetes 연동의 활용 사례 * **실시간 모니터링:** "현재 CPU 사용량이 높은 파드가 있어?" * **문제 진단:** "이 파드는 왜 Pending 상태야? 이유를 알려줘." * **리소스 관리:** "특정 네임스페이스에서 사용 가능한 PVC(Persistent Volume Claim) 목록을 보여줘." * **보안 감사:** "모든 NetworkPolicy 목록과 그 내용을 요약해 줘." ## 5. 요약 Gemini CLI와 Kubernetes의 연동은 에이전트를 `kubectl`을 대체하는 강력한 'AI 기반 kubectl'로 변모시킵니다. 자연어 질의를 통해 복잡한 클러스터 정보를 신속하게 얻고, 이를 LLM이 해석하여 사람이 이해하기 쉬운 형태로 제공함으로써, DevOps 및 SRE 팀의 운영 효율성을 획기적으로 향상시킬 수 있습니다. Kubernetes 클러스터와 상호작용하는 방법을 배웠으니, 다음 단계에서는 이를 활용하여 실제 **K8s 애플리케이션 디버깅** 시나리오에 Gemini 에이전트를 적용하는 실전 예제를 살펴보겠습니다.