Kubernetes manifest generator, linter, and explainer — 10 resource types, 30 lint rules, Korean/English output
Compatible Platforms any
Findings: ["USK v3 경고: interface.runtime 'python3.11'이 권장 값이 아닙니다 (권장: ['python3', 'node', 'bash', 'binary', 'any'])"]
✅ No security risks found.
AI Review Stage
스킬 메타데이터와 코드 파일을 종합적으로 분석한 결과, 다음과 같은 판단 근거로 'approved' 판정을 내립니다. 1. **선언된 Permissions 일치**: 스킬 메타데이터에 `network: false`, `filesystem: false`, `subprocess: false`로 선언되어 있습니다. 코드(`main.py`, `lib/*.py`)를 검토한 결과, 외부 네트워크 통신, 임의의 파일 시스템 접근(자신의 모듈 로딩을 위한 `os.path` 사용은 허용 범위), 외부 프로세스 실행(`subprocess` 모듈 또는 `os.system` 등) 코드가 발견되지 않았습니다. 선언된 권한과 실제 코드가 완벽하게 일치합니다. 2. **악의적 목적 코드 없음**: 데이터 탈취, 시스템 파괴, 난독화 등의 악의적 목적을 가진 코드는 발견되지 않았습니다. 오히려 `lib/generators.py`에서 생성되는 모든 Kubernetes 매니페스트에 `runAsNonRoot: true`, `allowPrivilegeEscalation: false`, `readOnlyRootFilesystem: true`, `capabilities: {'drop': ['ALL']}`와 같은 강력한 보안 기본값을 적용하여, 사용자가 보안 모범 사례를 따르도록 유도하는 긍정적인 측면이 있습니다. 3. **선언되지 않은 외부 통신 없음**: `socket`, `urllib`, `requests` 등 네트워크 통신을 위한 라이브러리 사용이 없으며, `nlu.py` 모듈에서도 '외부 LLM 호출 없음'을 명시하고 `re` 모듈만을 사용하여 자연어 파싱을 수행하는 등 외부 통신을 철저히 차단하고 있습니다. 4. **사용자 데이터 무단 수집/전송 없음**: 스킬의 기능은 입력된 YAML 문자열 또는 파라미터를 처리하여 결과를 반환하는 것에 국한됩니다. 사용자 데이터를 무단으로 수집하거나 외부로 전송하는 코드는 전혀 발견되지 않았습니다. 5. **코드 품질 및 목적 일치**: 코드는 모듈화가 잘 되어 있고, 주석과 독스트링이 상세하며, 입력 유효성 검사 및 에러 처리가 명확합니다. `PyYAML`과 `re` 등 표준적이고 안전한 라이브러리만을 사용합니다. 스킬의 설명(`Kubernetes manifest generator, linter, and explainer`)과 코드의 기능이 정확히 일치하며, 높은 수준의 코드 품질을 보여줍니다. 정적 분석 결과의 'caution' 상태는 구체적인 'red_flags_found'나 'obfuscation_warnings' 없이 나타났으며, 코드 검토 결과 실제 보안 위험으로 이어질 만한 요소는 발견되지 않았습니다. 이는 `os` 모듈 사용 등 일반적인 Python 스크립트 특성으로 인한 일반적인 경고일 가능성이 높습니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
nginx Deployment를 production 네임스페이스에 생성합니다.
{
"action": "generate",
"image": "nginx:1.25.3",
"language": "ko",
"name": "nginx-app",
"namespace": "production",
"params": {
"cpu_limit": "500m",
"cpu_request": "100m",
"memory_limit": "256Mi",
"memory_request": "128Mi"
},
"port": 80,
"replicas": 3,
"resource_type": "Deployment"
}
{
"action": "generate",
"manifest": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: nginx-app\n namespace: production\nspec:\n replicas: 3\n ...\n",
"resource_type": "Deployment"
}
api-server 에 대한 HPA를 생성합니다 (CPU 70% 기준, 2~10 레플리카).
{
"action": "generate",
"language": "ko",
"name": "api-server-hpa",
"namespace": "default",
"params": {
"max_replicas": 10,
"min_replicas": 2,
"target_cpu_percent": 70
},
"resource_type": "HPA"
}
{
"action": "generate",
"manifest": "apiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\n...\n",
"resource_type": "HPA"
}
잘 작성된 Deployment 매니페스트를 lint해 통과 결과를 확인합니다.
{
"action": "lint",
"manifest_yaml": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: good-app\n namespace: production\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: good-app\n template:\n metadata:\n labels:\n app: good-app\n spec:\n securityContext:\n runAsNonRoot: true\n containers:\n - name: app\n image: myrepo/app:1.0.0\n ports:\n - containerPort: 8080\n resources:\n requests:\n cpu: \"100m\"\n memory: \"128Mi\"\n limits:\n cpu: \"500m\"\n memory: \"256Mi\"\n livenessProbe:\n httpGet:\n path: /healthz\n port: 8080\n readinessProbe:\n httpGet:\n path: /ready\n port: 8080\n securityContext:\n allowPrivilegeEscalation: false\n readOnlyRootFilesystem: true\n"
}
{
"action": "lint",
"lint_results": {
"issues": [],
"passed": true,
"score": 100
}
}
probe 누락, latest 태그, 리소스 제한 없음 등 여러 이슈가 있는 매니페스트를 검사합니다.
{
"action": "lint",
"manifest_yaml": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: bad-app\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: bad-app\n template:\n metadata:\n labels:\n app: bad-app\n spec:\n containers:\n - name: app\n image: myrepo/app:latest\n"
}
{
"action": "lint",
"lint_results": {
"issues": [
{
"code": "STR001",
"message": "namespace \uac00 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uba85\uc2dc\uc801 namespace \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.",
"path": "metadata.namespace",
"severity": "warning"
},
{
"code": "SEC001",
"message": "\uc774\ubbf8\uc9c0 \ud0dc\uadf8\uac00 \u0027latest\u0027\uc785\ub2c8\ub2e4. \uace0\uc815 \ubc84\uc804 \ud0dc\uadf8 \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.",
"path": "spec.template.spec.containers[0].image",
"severity": "error"
}
],
"passed": false,
"score": 30
}
}
Deployment 리소스의 주요 필드를 한국어로 설명합니다.
{
"action": "explain",
"language": "ko",
"resource_type": "Deployment"
}
{
"action": "explain",
"explanation": {
"fields": [
{
"description": "\uc2e4\ud589\ud560 Pod \ubcf5\uc81c\ubcf8 \uc218\uc785\ub2c8\ub2e4. \uc774 \uc22b\uc790\ub85c \uc218\ud3c9 \ud655\uc7a5\uc744 \uc81c\uc5b4\ud569\ub2c8\ub2e4.",
"name": "spec.replicas"
},
{
"description": "\uc774 Deployment\uac00 \uad00\ub9ac\ud560 Pod\ub97c \ucc3e\ub294 \ub808\uc774\ube14 \uc140\ub809\ud130\uc785\ub2c8\ub2e4.",
"name": "spec.selector.matchLabels"
}
],
"resource_type": "Deployment",
"summary": "Deployment\ub294 stateless \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc30\ud3ec\uc640 \uc5c5\ub370\uc774\ud2b8\ub97c \uc120\uc5b8\uc801\uc73c\ub85c \uad00\ub9ac\ud569\ub2c8\ub2e4."
}
}
매일 새벽 2시에 실행되는 백업 CronJob을 생성합니다.
{
"action": "generate",
"image": "backup-tool:2.1.0",
"language": "ko",
"name": "db-backup",
"namespace": "ops",
"params": {
"concurrency_policy": "Forbid",
"cpu_limit": "1000m",
"cpu_request": "200m",
"memory_limit": "512Mi",
"memory_request": "256Mi",
"schedule": "0 2 * * *"
},
"resource_type": "CronJob"
}
{
"action": "generate",
"manifest": "apiVersion: batch/v1\nkind: CronJob\n...\n",
"resource_type": "CronJob"
}
지원하지 않는 action 값을 입력했을 때 에러 응답을 확인합니다.
{
"action": "transform",
"resource_type": "Deployment"
}
{
"error": {
"code": "INVALID_INPUT",
"message": "\uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 action\uc785\ub2c8\ub2e4: transform. \ud5c8\uc6a9\uac12: generate, lint, explain"
}
}
All examples are also available via the agent API:
/v1/agent/skills/f4ce390e-32d8-46b5-ae96-c54f6e20620b/schema
No reviews yet. Be the first to leave one!