ð€ AI-Powered Kubernetes Assistant with MCP
ããŒã«ã«ð€ AI-Powered Kubernetes Assistant with MCP ã«ã€ããŠ
Kubernetes Diagnostic MCPã¯ãKubernetesã¯ã©ã¹ã¿ãŒãéçšããããŒã åãã®ã»ã«ããã¹ãå¯èœãªèªã¿åãå°çšã€ã³ã·ãã³ã調æ»åºç€ã§ããæ±ºå®è«çãªèšºæãšèšŒæ ã«ãä»»æã®AIè§£éãããã³ãåé¢ãã¬ãã¥ãŒä»ã埩æ§ã¯ãŒã¯ãããŒãçµã¿åãããŸãã
äž»ãªæ©èœ
- 01äžè¬çãªã¯ã©ã¹ã¿ãŒãªãœãŒã¹é害ã®èšºæ
- 02Podã®éä¿¡çµè·¯ãšé¢é£ã€ã³ã·ãã³ãã®è¿œè·¡
- 03ã¹ãããã·ã§ããæ¯èŒã«ãã倿Žã®ç¹å®
- 04èªç¶èšèªã«ããã€ã³ã·ãã³ãæ€çŽ¢
- 05埩æ§å€æŽã®ã¬ãã¥ãŒãšçµææ€èšŒ
掻çšã·ãŒã³
- 01ç°åžžãªã¯ãŒã¯ããŒãã®èª¿æ»
- 02ã€ã³ã·ãã³ãåã®å€æŽã®ç¢ºèª
- 03ãµãŒãã¹ã«ãŒãã£ã³ã°ãšãããã¯ãŒã¯ããªã·ãŒã®èª¿æ»
- 04Deploymentã®ããŒã«ããã¯æ¡ã®ã¬ãã¥ãŒ
MCP 察å¿
`/api/mcp`ãšã³ããã€ã³ãã¯èšºæãªã¯ãšã¹ããåãä»ããæ©èœãããã§ã¹ããè¿ããŸããã¯ã©ã¹ã¿ãŒã«æžã蟌ã¿ãè¡ãããMCPã¯ã©ã€ã¢ã³ãã«èšºææ©èœãå ¬éããŸãã
èšå®
ããŒã«ã«ãµãŒããŒã®èšå®ã¯ã©ã®ã¯ã©ã€ã¢ã³ãã§ãå ±éã§ããã³ããŒããŠã¯ã©ã€ã¢ã³ãã® MCP èšå®ãã¡ã€ã«ã«è²Œãä»ããŠãã ããã
ãã®ãµãŒããŒã®ããã±ãŒãžããªã¢ãŒããšã³ããã€ã³ãã¯ãŸã ååŸã§ããŠããŸããããããžã§ã¯ãã® README ã®æé ã«åŸã£ãŠãã ããã
ããŒã«
ããŒã«ã«ãµãŒããŒã®ããŒã«ã¯ãã·ã³äžã§èµ·åããŠåããŠååŸã§ããŸããã¡ã³ãããŒã¯ãŸã ããŒã«äžèЧãæäŸããŠããŸããã
詳现
Kubernetes Diagnostic MCP
Next.js ã§æ§ç¯ããããèªã¿åãå°çšã® Kubernetes ã€ã³ã·ãã³ãããªã¢ãŒãžãã©ãããã©ãŒã ã§ããå ¬åŒã® Kubernetes JavaScript ã¯ã©ã€ã¢ã³ããéããŠã¯ã©ã¹ã¿ãŒã®ã©ã€ãç¶æ ãåéããæ±ºå®è«çãªã«ãŒã«ãšã³ãžã³ã§æ€åºäºé ãæç€ºããŸãããŸãããªãã·ã§ã³ã§ AI ãæŽ»çšããã€ã³ã·ãã³ãã®èª¬æãçæã§ããŸããã¯ã©ã¹ã¿ãŒãžã®æžã蟌ã¿ã¯äžåè¡ããŸããã
ã€ã³ã¹ããŒã«ïŒ ã»ã«ããã¹ãã£ã³ã°ãOIDCïŒKeycloakãããã³ãåé¢ãHelmã
ãã®ããŒãžã§ã³ã§ã¯ãæç€ºçãªããã³ãèšå®ãšèªèšŒæžã¿ã¢ã¯ã»ã¹ãå¿ èŠã§ããç°å¢ã«å¿ããã¯ã©ã¹ã¿ãŒèªèšŒæ å ±ã¯äœ¿çšãããåŸæ¥ã®å ±æå±¥æŽãèªåçã«ã€ã³ããŒãããŸããã
æ©èœ
調æ»ãšåŸ©æ§ã®ã¯ãŒã¯ãããŒ
- Pod ã®ãã©ãã£ãã¯çµè·¯ â èšå®æžã¿ã® Ingress â Service â EndpointSlice â Pod ã®çµè·¯ãããŒããããã³ã°ãããã¯ãšã³ãã®ç¶æ ãIngressïŒEgress ã® NetworkPolicy ã«ããåé¢ã調æ»ããŸããPod ã®ãããã¯ãŒãã³ã°ãšæš©éèšå®ãåç §ããŠãã ããããã±ããã¬ãã«ã®ãããŒãã¬ã¡ããªã¯åéããŸããã
- éå»ã®èª¿æ» â ä¿æãããã€ãã³ããšã¹ãããã·ã§ããããã€ã³ã·ãã³ãã®ã¿ã€ã ã©ã€ã³ãåæ§æããçŸåšã®é害ãšããœãŒãã®ç¯å²ãç¹å®ããŠã蚌æ ãžã®ãªã³ã¯ãšç¢ºèªãã§ãã¯ãçšããŠç¢ºä¿¡åºŠã®äœã調æ»ã®ææãããé äœä»ãããŸãããªãã·ã§ã³ã§ãããã³ãèªèšŒæžã¿ã® Helm CronJobs ãã€ã³ã·ãã³ãçºçåã«ããŒã¿ãåéããŸããéå»ã®èª¿æ»ãåç §ããŠãã ããã
- äœãå€ãã£ããïŒ â ç¯å²ãæå®ããã¹ãããã·ã§ãããæ¯èŒãããããã€ã®ãªããžã§ã³ãã€ã¡ãŒãžããªãœãŒã¹èšå®ãæ§æã®ãã£ã³ã¬ãŒããªã³ãããµãŒãã¹ã®ã«ãŒãã£ã³ã°å€æŽããªãã·ã§ã³ã® Prometheus CPUïŒã¡ã¢ãªã®èšŒæ ã確èªããŸããçžé¢é¢ä¿ã«ã¯ä»®èª¬ã§ããããšã瀺ãããŸãã
- é¢é£ããã€ã³ã·ãã³ã â ãªãŒããŒåç §ããµãŒãã¹ã»ã¬ã¯ã¿ãŒãæ£åžžã§ãªãããŒããžã®é 眮ãé害ãçºçããŠãã PVC äŸåé¢ä¿ãçšããŠæ€åºäºé ãã°ã«ãŒãåããåãªã³ã¯ã®èšŒæ ãæç€ºããŸãã
- ä¿®æ£ããŠæ€èšŒ â 芳枬ãããæ£åžžãªããŒã¹ã©ã€ã³ãžã®ããµããŒã察象㮠Deployment ã®ããŒã«ããã¯ãææ¡ããåºå®ããã GitOps ãããã§ã¹ãã®å€æŽããã¬ãã¥ãŒããŠãã¬ãã¥ãŒæžã¿ã® GitHub PR ãäœæããããŒãžåŸã«åŸ©æ§ãç¶ç¶ããŠããããšãæ€èšŒããŸãã
- æ°žç¶çãªå±¥æŽ â ã¢ãããã¯ãªãã£ã¹ã¯ã¹ãã¬ãŒãžã䜿çšããä¿®æ£ã¯ãŒã¯ãããŒåãã«ããŒã¹ã©ã€ã³ãšæ€èšŒã®èšŒæ ãä¿æããŸãã
GitHub ã®å¯Ÿè±¡ããªãã·ã§ã³ã® Prometheusãæ°žç¶ã¹ãã¬ãŒãžãAPI ã®äŸã埩æ§ã«é¢ããå¥çŽã«ã€ããŠã¯ã調æ»ã¯ãŒã¯ãããŒã®èšå®ãšå¶éäºé ãåç §ããŠãã ããã
蚺æå¯Ÿè±¡
| ãªãœãŒã¹ | æ€åºãããé害ã¢ãŒã |
|---|---|
| Pods | CrashLoopBackOffãImagePullBackOffãOOMKilledãã¹ã±ãžã¥ãŒãªã³ã°ã®å€±æããããŒãã®å€±æ |
| Workloads | DeploymentãStatefulSetãDaemonSetãReplicaSetãJob ãæãŸããç¶æ ã§ã¯ãªã |
| Services | ã»ã¬ã¯ã¿ãŒãæ£åžžãªãšã³ããã€ã³ãã 0 ä»¶ã«è§£æ±ºãã |
| Nodes | NotReadyãMemoryPressureãDiskPressureãPIDPressureãcordoned |
| HPAs | ã¹ã±ãŒãªã³ã°ã§ããªãïŒAbleToScale=FalseïŒãæå€§ã¬ããªã«æ°ã«éããŠãã |
| PVCs | PendingïŒããããžã§ããŒã®é害ïŒãLostïŒããã¯ãšã³ãã® PV ãæ¶å€±ïŒ |
| CronJobs | ã¹ã±ãžã¥ãŒã«ãéãããŸãŸåæ¢ããŠãããžã§ã |
| Events | ãã¹ãŠã®ãªãœãŒã¹ã¿ã€ãã«ããããçžé¢ã®ããèŠåã€ãã³ã |
æ§é åããããªã¹ã¯ãšåœ±é¿ã®ã¢ãã«
ãã¹ãŠã®æ€åºäºé ã«ã¯ããã¬ãŒã³ããã¹ãã®èª¬æã«å ããŠã次㮠2 ã€ã®æ§é åãããè©äŸ¡ãå«ãŸããŸãã
ImpactAssessmentâ ç¯å²ïŒpodïŒworkloadïŒserviceïŒnamespaceïŒnodeïŒclusterïŒã圱é¿ãåãããªãœãŒã¹ã®åç §ã圱é¿ãåããã¬ããªã«æ°ãåé¡ããŠãŒã¶ãŒã«åœ±é¿ãããã©ãããæŠèŠæRiskAssessmentâ ãªã¹ã¯ã¬ãã«ã確信床ã圱é¿ç¯å²ãæŸçœ®ããå Žåã®ãªã¹ã¯ãä¿®æ£ããå Žåã®ãªã¹ã¯ãè©äŸ¡ã®æ ¹æ
ãã®ã¢ãã«ã¯ãµããªãŒã®äž»èŠãªãªã¹ã¯äžèŠ§ãæ¯ããUI ã Markdown ãè§£æããã«æ§é åãããã³ã³ããã¹ãã衚瀺ã§ããããã«ããŸãã
èªç¶èšèªã¯ãšãªã¢ãŒã
ãšã³ãžãã¢ã¯ãã©ãŒã ã®ãã£ãŒã«ãã«å ¥åãã代ããã«ãå¹³æãªè±èªã§ã€ã³ã·ãã³ãã説æã§ããŸãã
ãçŽè¿ã®ãããã€ä»¥éãcheckout ããããã¯ã©ãã·ã¥ãç¶ããŠããŸãã
LLM ã¯èª¬æãã蚺æã®æå³ïŒåå空éãã¯ãŒã¯ããŒããéç¹é åãçç¶ïŒãæœåºãã皌åäžã®ã¯ã©ã¹ã¿ãŒã®ã€ã³ãã³ããªãšç
§åããŠæ€èšŒããããã§ãå
·äœç㪠DiagnosticScope ã«è§£æ±ºããŸãããã®åŸã決å®è«çãšã³ãžã³ã¯å€æŽãªãå®è¡ãããŸããLLM ã®åœ¹å²ã¯å
¥åã®å€æã®ã¿ã§ãããæèŠãçæããããšã¯ãããŸããã
äž»ãªåäœïŒ
- ææ§ãã®è§£æ¶ â ã¯ãŒã¯ããŒããè€æ°ã®åå空éã«ååšããå Žåã確èªããã«ã§ãšã³ãžãã¢ãå®è¡åã«éžæã§ããŸã
- åå空éã®æšå® â ã¯ãŒã¯ããŒãåããåå空éãäžæã«ç¹å®ã§ããå Žåãèªåçã«æšå®ãããŸãïŒç¢ºèªæé ããïŒ
- å®å šæ§ãã§ã㯠â 蚺æãåŒã³åºãåã«ãæœåºããåå空éåãšã¯ãŒã¯ããŒãåãå®éã®ã¯ã©ã¹ã¿ãŒãšç §åããŠæ€èšŒããŸã
- ç·šéãžã®ãã©ãŒã«ãã㯠â ãç·šéããã¿ã³ãæŒããšã解決ããå€ããã©ãŒã ã¢ãŒãã«å ¥åãããããããšã³ãžãã¢ã¯è§£éãä¿®æ£ã§ããŸã
- é©åãªæ©èœçž®é â LLM ããŒãèšå®ãããŠããªãå Žåãã¯ãšãªã¢ãŒãã¯èªåçã«ç¡å¹ã«ãªããŸã
AI ã€ã³ã·ãã³ãã®ãã©ãã£ã
GROQ_API_KEY ãŸã㯠OPENAI_API_KEY ãèšå®ãããAI èŠçŽãæå¹ãªå Žåãæ±ºå®è«çãªæèŠãš Markdown ã¬ããŒãã LLM ã«æž¡ãããæ¬¡ã®å
容ãçæãããŸãã
- ãšã°ãŒã¯ãã£ããµããªãŒ
- æ ¹æ ã®åŒçšãå«ããèããããæ ¹æ¬åå
- 次ã®ã¢ã¯ã·ã§ã³
- èªã¿åãå°çšã®èªååã³ãã³ã
決å®è«çã¬ããŒãã¯å ã«è¿ãããŸããããã·ã¥ããŒãã¯ä»»æã®ãã©ãã£ããå¥éãªã¯ãšã¹ãããããããããã€ããŒã®å¿çé å»¶ã«ãã£ãŠæ ¹æ ã®æç€ºãé ããããšã¯ãããŸãããAI ãã©ãã£ãã¯ãã¬ããŒãã»ã¯ã·ã§ã³ã«æžåŒä»ã Markdown ãšããŠè¡šç€ºãããŸããLLM ã«ã¯ãªãœãŒã¹ãã³ãã³ããåå ãæé ããªãããæç€ºãããŠãããæ±ºå®è«çãšã³ãžã³ããã§ã«èŠã€ããå 容ã®èª¬æãšåªå é äœä»ãã®ã¿ãè¡ããŸãããã®ããŒã«ã¯ LLM ããŒããªããŠãå®å šã«æ©èœããŸãã
LLM ã®åªå
é äœïŒ GROQ_API_KEY ãèšå®ãããŠããå Žå㯠GroqïŒllama-3.3-70b-versatileïŒã䜿çšããŸããèšå®ãããŠããªãå Žå㯠OpenAIïŒgpt-4o-miniïŒããã©ãŒã«ããã¯ãšããŠäœ¿çšããŸãã
UI
- ãã©ãŒã ïŒã¯ãšãªåãæ¿ã â æ§é åãã©ãŒã å
¥åãšèªç¶èšèªã¯ãšãªã¢ãŒããåãæ¿ããŸããèšå®ã¯
localStorageã«ä¿åãããŸã - åå空éããããããŠã³ â 皌åäžã®ã¯ã©ã¹ã¿ãŒããèªåçã«å€ãå ¥åãããŸããã¯ã©ã¹ã¿ãŒã«æ¥ç¶ã§ããªãå Žåã¯ãããã¹ãå ¥åã«åãæ¿ãããŸã
- ã¯ãŒã¯ããŒãããããããŠã³ â åå空éã倿Žããããšèªåçã«æŽæ°ãããŸã
- ã¯ã©ã¹ã¿ãŒã³ã³ããã¹ãã»ã¬ã¯ã¿ãŒ â åèµ·åããã« kubeconfig ã³ã³ããã¹ããåãæ¿ããŸã
- 蚺æå®è¡å±¥æŽ â æè¿ä¿åãããå®è¡çµæããµã€ãããŒã«è¡šç€ºãããŸããé ç®ãã¯ãªãã¯ãããšãå šçµæãåèªã¿èŸŒã¿ã§ããŸã
- ã¡ããªã¯ã¹ã¿ã€ã« â ãããæ°ãç°åžžãªããããèŠåã€ãã³ããããŒãã®å¥å šæ§ãPVC ã®å¥å šæ§ãAI ã®ç¶æ
- æèŠããã« â éèŠåºŠãããžãæ ¹æ ã®äžèЧãèªã¿åãå°çšã³ãã³ããå«ãäžäœ 6 ä»¶ã®æèŠ
- ã¬ã³ããªã³ã°ããã Markdown ã¬ããŒã â AI ãã©ãã£ããŸãã¯æ±ºå®è«çã¬ããŒãããèŠåºããã³ãŒããããã¯ã衚ããªã¹ãä»ãã§è¡šç€ºããŸã
API
| ã¡ãœãã | ãã¹ | 説æ |
|---|---|---|
POST | /api/mcp | 蚺æãå®è¡ |
GET | /api/mcp | æ©èœãããã§ã¹ã |
POST | /api/nlq/parse | èªç¶èšèªã¯ãšãªã DiagnosticScope ã«è§£æ |
GET | /api/nlq/parse | NLQ ã¢ãŒããå©çšå¯èœãç¢ºèª |
GET | /api/namespaces | ã¯ã©ã¹ã¿ãŒã®åå空éãäžèŠ§è¡šç€º |
GET | /api/workloads?namespace= | åå空éå ã®ã¯ãŒã¯ããŒããäžèŠ§è¡šç€º |
GET | /api/contexts | kubeconfig ã³ã³ããã¹ããäžèŠ§è¡šç€º |
GET | /api/history | æè¿ã®èšºæå®è¡ãäžèŠ§è¡šç€º |
GET | /api/history/:id | ID ãæå®ããŠå®è¡çµæå šäœãååŸ |
POST | /api/history/:id/narrative | ä¿åæžã¿ã®æ ¹æ ã«åºã¥ããä»»æã® AI ãã©ãã£ããçæ |
GET | /api/health | ãã«ã¹ãã§ãã¯ïŒã¯ã©ã¹ã¿ãŒã«ã¯ã¢ã¯ã»ã¹ãããk8s ãããŒãã§äœ¿çšïŒ |
èªèšŒãšåé¢
- Keycloak ã®ã»ããã¢ããã¬ã€ããä»å±ããæ±çš OIDC ãµã€ã³ã€ã³ãèªå¯ã³ãŒããPKCEãstateãnonceãããã³çœ²åæžã¿ ID ããŒã¯ã³ã®æ€èšŒã«å¯Ÿå¿ããŸãã
- viewer/operator/admin ããŒã«ãæã€ããã³ãã¯ãŒã¯ã¹ããŒã¹ãKubernetes èªèšŒæ å ±ã¯åé¢ãããèš±å¯ããåå空éããªã¹ãã§æå®ããŸãã
- å±¥æŽãããŒã¹ã©ã€ã³ãä¿®æ£èšç»ãã€ã³ãã°ã¬ãŒã·ã§ã³èšå®ã¯ããã³ãããšã«åé¢ãããŸãã
- èªååçšã®ããã³ã API ããŒãå ±æã®ã°ããŒãã«ããŒãå¿åã¢ã¯ã»ã¹ã¯ãããŸããã
- ID ããšããã³ããã³ãããšã®ã¬ãŒãå¶éãåæåéæ°ã®å¶éãKubernetes èªã¿åãã®ããŒãžããŒã·ã§ã³ãã¿ã€ã ã¢ãŠããé©çšããŸãã
- PVCãèªã¿åãå°çšã®èªèšŒæ å ±ããŠã³ããIngress ããªã·ãŒãåå¥ã® readiness/liveness ãã§ãã¯ãåããé root ã® Helm ãããã€ã¡ã³ãã
ã€ã³ã¹ããŒã«ãŸãã¯éçº
ã€ã³ã¹ããŒã«ã¬ã€ãã«åŸã£ãŠãããã³ãèªèšŒæ å ±ã®ããããžã§ãã³ã°ãOIDC ãããã€ããŒã®èšå®ãSecret ã®äœæã忢±ã® Helm ãã£ãŒãã®ã€ã³ã¹ããŒã«ãè¡ããŸãããœãŒã¹ãªããžããªããããŠã³ããŒããããèªèº«ã®ã¬ãžã¹ããªã§ã€ã¡ãŒãžããã«ãããŠãã ããããªãªãŒã¹ãã€ã¡ãŒãžã¯èªåå ¬éãããŸããã
ããŒã«ã«éçºã§ã¯ã.env.local ã« APP_URL=http://localhost:3000 ãš TENANTS_CONFIG_FILE ãèšå®ããæç€ºçãªããã³ã kubeconfig ãš OIDC ãŸãã¯ããã³ã API ããŒãçšæããŠãããæ¬¡ãå®è¡ããŸãã
npm ci
npm run dev
æ€èšŒ
npm test
npm run typecheck
npm run build
ãã¹ãã§ã¯ã決å®è«çãªèšºæãããã³ãåé¢ãèªèšŒïŒCSRFïŒããŒã«ãçœ²åæžã¿ OIDC ããŒã¯ã³ã®æ€èšŒãã¯ãŒã¯ããŒãã®æææš©ãå¶éä»ãåéãã¬ãã¥ãŒæžã¿ã®åŸ©æ§ã¯ãŒã¯ãããŒã確èªããŸããCI ã§ã¯ã³ã³ããã®ãã«ããæ¬çªäŸåé¢ä¿ã®ç£æ»ãHelm ãã£ãŒããæ€èšŒããŸãã
ç°å¢å€æ°
| 倿° | çšé |
|---|---|
APP_URL | æ£èŠã®ã¢ããªã±ãŒã·ã§ã³ãªãªãžã³ãæ¬çªç°å¢ã§ã¯ HTTPS ãå¿ é ã§ã |
TENANTS_CONFIG_FILE | 管çè ã管çããå¿ é ã®ããã³ã JSON èšå® |
OIDC_ISSUERãOIDC_CLIENT_IDãOIDC_CLIENT_SECRET | ãã©ãŠã¶ãŒã®ãµã€ã³ã€ã³ãããã€ããŒèšå® |
OIDC_GROUPS_CLAIM | ID ããŒã¯ã³ã®ãããã¬ãã«é
åã¯ã¬ãŒã ãããã©ã«ã㯠groups ã§ã |
OIDC_SCOPES | ããã©ã«ã㯠openid profile email ã§ã |
DIAGNOSTICS_DATA_DIR | ããã³ãã®æ°žç¶ã¬ã³ãŒããšãµãŒããŒåŽã»ãã·ã§ã³ãããã©ã«ã㯠.data ã§ã |
DIAGNOSTICS_HISTORY_LIMIT | ããã³ãããšã®ãã³çããããŠããªãå±¥æŽã®ä¿ææ°ãããã©ã«ã㯠200ãæå€§ã¯ 2,000 ã§ã |
GROQ_API_KEYãGROQ_MODEL | ãªãã·ã§ã³ã® AI ãããã€ããŒãããã³ãã® allowAi ãå¿
èŠã§ã |
OPENAI_API_KEYãOPENAI_MODEL | ãªãã·ã§ã³ã®ãã©ãŒã«ãã㯠AI ãããã€ããŒãããã³ãã® allowAi ãå¿
èŠã§ã |
APP_VERSIONãBUILD_ID | ãã«ã¹ãšã³ããã€ã³ãã®ã¡ã¿ããŒã¿ |
GitHub ããã³ Prometheus ã®èªèšŒæ å ±ïŒã¿ãŒã²ããã¯ããã³ãããšã«èšå®ããŸããã€ã³ãã°ã¬ãŒã·ã§ã³ã®èšå®ãåç §ããŠãã ããã
API ãªãã¡ã¬ã³ã¹
POST /api/mcp
curl -X POST https://mcp-diagnostics.127.0.0.1.nip.io/api/mcp \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d '{
"agent": "kubernetes-diagnoser",
"goal": "Find why checkout is failing",
"input_context": {
"namespace": "team-a",
"workload": "checkout",
"context": "team-a",
"includeLogs": true,
"includeNodes": false,
"includeHpa": true,
"enableAiSummary": false,
"tailLines": 120,
"maxPods": 60
}
}'
input_context ã®ãã£ãŒã«ã
| ãã£ãŒã«ã | å | ããã©ã«ã | 説æ |
|---|---|---|---|
namespace | string | default | 調æ»ããåå空é |
context | string | ããã³ãã³ã³ããã¹ã | èšå®æžã¿ã®ããã³ãã¯ã©ã¹ã¿ãŒãšäžèŽããå¿ èŠããããŸã |
workload | string | â | ã¯ãŒã¯ããŒãåã§çµã蟌ã¿ãŸã |
labelSelector | string | â | æšæºã®ã©ãã«ã»ã¬ã¯ã¿ãŒãäŸïŒapp=checkout |
includeLogs | boolean | true | ãã«ã¹äžè¯ã® Pod ãããã°ãåéããŸã |
includeNodes | boolean | false | ããŒãã®ç¶æ ãåéããŸãïŒClusterRole ãå¿ èŠã§ãïŒ |
includeHpa | boolean | true | HPA ã®ã¹ããŒã¿ã¹ãåéããŸã |
enableAiSummary | boolean | false | AI ã«ãã説æãçæããŸã |
tailLines | number | 120 | ã³ã³ããããšã®ãã°è¡æ°ïŒ20ïœ500ïŒ |
maxPods | number | 60 | åéãã Pod ã®æå€§æ°ïŒ1ïœ200ïŒ |
ã¬ã¹ãã³ã¹ã®åœ¢åŒ
{
"requestId": "uuid",
"status": "ok | partial | failed",
"generatedAt": "ISO-8601",
"summary": {
"health": "healthy | degraded | critical",
"totalPods": 12,
"unhealthyPods": 2,
"notReadyNodes": 0,
"pendingPvcs": 1,
"warningEvents": 5,
"criticalFindings": 0,
"highFindings": 2,
"topRisks": ["[HIGH] checkout is crash-looping: pod will not recover without a fix"]
},
"findings": [
{
"id": "pod-production-checkout-0-crashloop",
"severity": "critical",
"category": "runtime",
"title": "Container app is in CrashLoopBackOff",
"resource": { "kind": "Pod", "namespace": "team-a", "name": "checkout-0" },
"signal": "CrashLoopBackOff",
"evidence": ["Restart count: 10", "Last exit code: 1"],
"impact": "Pod is not serving traffic.",
"recommendedActions": ["Check logs for the root cause", "..."],
"automation": [{ "command": "kubectl logs ...", "destructive": false, "requiresApproval": false }],
"impactAssessment": { "scope": "workload", "userFacing": true, "summary": "..." },
"riskAssessment": { "level": "critical", "confidence": "high", "riskIfIgnored": "...", "blastRadius": "workload", "reasons": ["..."] }
}
],
"runbook": ["Step 1...", "Step 2..."],
"output": "# Kubernetes Diagnostic Report\n...",
"snapshot": { /* full raw cluster state */ },
"metadata": { "aiStatus": "success | skipped | disabled | failed", "model": "llama-3.3-70b-versatile" }
}
POST /api/nlq/parse
èªç¶èšèªã§èšè¿°ãããã€ã³ã·ãã³ãã®èª¬æããæ€èšŒæžã¿ã® DiagnosticScope ã«è§£æããŸãã
curl -X POST https://mcp-diagnostics.127.0.0.1.nip.io/api/nlq/parse \
-H "Content-Type: application/json" \
-d '{ "query": "checkout pods keep crashing since last deploy", "context": "kind-test-cluster" }'
ã¬ã¹ãã³ã¹ïŒè§£æ±ºæžã¿ïŒ
{
"intent": { "namespace": "team-a", "workload": "checkout", "focus": ["pods", "logs"], "confidence": "high", ... },
"resolvedContext": { "namespace": "team-a", "workload": "checkout", "includeLogs": true, ... },
"requiresConfirmation": false,
"confirmationPrompt": null
}
ã¬ã¹ãã³ã¹ïŒææ§ïŒ
{
"intent": { ... },
"resolvedContext": null,
"requiresConfirmation": true,
"confirmationPrompt": "Found 'checkout' in 2 namespaces: production, staging.",
"clarificationOptions": {
"field": "namespace",
"prompt": "Choose a namespace for \"checkout\".",
"options": [
{ "label": "production", "value": "production", "resolvedContext": { ... } },
{ "label": "staging", "value": "staging", "resolvedContext": { ... } }
]
}
}
LLM ããŒãèšå®ãããŠããªãå Žå㯠503 ãè¿ããŸããå©çšå¯èœãã©ããã確èªããã«ã¯ããŸã GET /api/nlq/parse ãåŒã³åºããŠãã ããã
ãããžã§ã¯ãæ§æ
âââ agents/
â âââ mcpAgentRunner.ts # Orchestrates collection â analysis â AI â history
âââ app/
â âââ api/
â â âââ mcp/route.ts # POST /api/mcp
â â âââ nlq/parse/route.ts # POST /api/nlq/parse, GET /api/nlq/parse
â â âââ namespaces/route.ts # GET /api/namespaces
â â âââ workloads/route.ts # GET /api/workloads
â â âââ history/route.ts # GET /api/history
â â âââ history/[id]/route.ts # GET /api/history/:id
â â âââ contexts/route.ts # GET /api/contexts
â â âââ health/route.ts # GET /api/health
â âââ page.tsx # Dashboard UI (form + query modes)
âââ lib/
â âââ diagnostics/
â â âââ analyzer.ts # Deterministic Kubernetes rules engine
â â âââ formatter.ts # Markdown report and summary builder
â â âââ __tests__/
â â âââ analyzer.test.ts # 27 unit tests, no kubeconfig needed
â âââ nlq/
â â âââ types.ts # ExtractedIntent, NLQParseResponse, ClusterInventory
â â âââ parser.ts # LLM call + Zod schema validation
â â âââ resolver.ts # Deterministic parameter validation
â â âââ prompt.ts # Prompt construction
â â âââ inventory.ts # Cluster namespace + workload fetcher
â â âââ __tests__/
â â âââ parser.test.ts # JSON parsing and schema validation
â â âââ resolver.test.ts # Resolution logic, no LLM needed
â âââ llm/
â â âââ client.ts # Groq â OpenAI client builder
â âââ kubernetes/
â â âââ collector.ts # Kubernetes API client and snapshot builder
â âââ store/
â â âââ history.ts # Persistent run history and baseline selection
â âââ ratelimit.ts # Bounded fixed-window rate limiter
â âââ validation.ts # Zod request schema and normalisation
âââ lib/auth/ # OIDC, server sessions and route authorization
âââ lib/tenancy/ # Identity bindings, roles and scope authorization
âââ deploy/helm/ # Supported self-hosted installation
âââ types/
â âââ mcp.ts # Full TypeScript type contract
âââ k8s/ # Kubernetes manifests
â âââ namespace.yaml
â âââ rbac.yaml
â âââ deployment.yaml
â âââ ingress.yaml
â âââ secret.example.yaml
âââ vitest.config.ts # Test configuration
âââ Dockerfile # Multi-stage production build
RBAC ã®èŠä»¶
åããã³ãã¯ãèšå®æžã¿ã®åå空éã«éå®ãããå°çšã®èªã¿åãå°çšèªèšŒæ å ±ã䜿çšããŸããåå空éã® Role/RoleBinding ã®äŸãåºçºç¹ãšããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã®ãµãŒãã¹ã¢ã«ãŠã³ãã«ã¯ã¯ã©ã¹ã¿ãŒå šäœã®æš©éããªããããŒã¯ã³ãèªåããŠã³ããããŸãããããŒããžã®ã¢ã¯ã»ã¹ã«ã¯ãããã³ãã«æç€ºçãªæ©èœãä»äžããããã«ã¯ã©ã¹ã¿ãŒ ã¬ãã«ã®æš©éãèšå®ããå¿ èŠããããŸãã
èªèšŒæ å ±ã®ããŒããŒã·ã§ã³ãåé¢ã®ç¢ºèªãã¹ãã¬ãŒãžã®å¶éãå ±æå±¥æŽããã®ç§»è¡ãå ±æãã¹ãã£ã³ã°ã®ããŒããããã«ã€ããŠã¯ãã»ã«ããã¹ãã¬ã€ããåç §ããŠãã ããã
ã³ã¡ã³ã
MCP ã¯åããŠã§ããïŒ
ãããã³ã«ã®æŠèŠããæåã®ãµãŒããŒã®å°å ¥ãŸã§ãããããçåã«ãŸãšããŠçããŸãã
AI ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã«ãããŒã¿ãœãŒã¹ã«çµ±äžçãªæ¹æ³ã§æ¥ç¶ããããã®ãªãŒãã³ãªãããã³ã«ã§ããã¯ã©ã€ã¢ã³ãã¯ã¢ãã«ãšã®å¯Ÿè©±ãæ ããMCP ãµãŒããŒã¯ããŒã«ã»ãªãœãŒã¹ã»ããã³ãããã³ãã¬ãŒããæäŸããŸããæšæºã¡ãã»ãŒãžã§ããåãããããã1 ã€ã®ãµãŒããŒãè€æ°ã®ã¯ã©ã€ã¢ã³ãã§åå©çšã§ããŸãã