Skip to main content

kubernetes

当验证Kubernetes配置时,分析YAML清单语法,检查资源定义规范,验证部署配置。验证集群资源,设计安全策略,和最佳实践。

معلومات المصدر

المستودع
microwind/ai-skills
آخر نشاط في المصدر
٢٦ مارس ٢٠٢٦ في ١٤:٥٨
لغة SKILL.md المكتشفة
الصينية
النجوم
٨٣
التفرعات
٢٤

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

مستكشف الملفات
5 ملفات

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
Kubernetes验证器
description
当验证Kubernetes配置时,分析YAML清单语法,检查资源定义规范,验证部署配置。验证集群资源,设计安全策略,和最佳实践。
license
MIT
# Kubernetes验证器技能 ## 概述 Kubernetes配置验证是确保部署成功的关键步骤。无效的Kubernetes清单会静默部署然后神秘失败。在部署前进行全面验证可以避免生产环境问题。 **核心原则**: 好的配置验证应该覆盖语法、语义和最佳实践,确保部署的稳定性和安全性。坏的配置会导致部署失败、资源浪费和安全风险。 ## 何时使用 **始终:** - 部署到Kubernetes集群之前 - 验证YAML清单文件时 - 检查资源配置定义时 - 调试Pod启动失败时 - 规划资源限制策略时 - 审查部署配置时 **触发短语:** - "这个Kubernetes配置有效吗?" - "验证K8s清单文件" - "检查Pod定义" - "审查部署配置" - "为什么无法部署?" - "验证服务网格配置" ## Kubernetes验证功能 ### YAML语法验证 - 语法结构检查 - 必填字段验证 - 数据类型验证 - 嵌套结构检查 ### 资源定义验证 - API版本检查 - 资源规格验证 - 字段完整性检查 - 引用关系验证 ### 最佳实践检查 - 资源限制设置 - 健康检查配置 - 安全策略验证 - 镜像拉取策略检查 ### 配置分析 - 服务发现配置 - 存储挂载验证 - 环境变量检查 - 密钥管理验证 ## 常见Kubernetes配置问题 ### 缺失资源限制 ``` 问题: Pod没有设置CPU和内存限制 错误示例: apiVersion: v1 kind: Pod spec: containers: - name: app image: nginx # 没有resources字段 后果: - Pod可能耗尽所有可用资源 - 影响其他Pod正常运行 - 集群变得不稳定 解决方案: 1. 设置resources.requests确保调度 2. 设置resources.limits防止资源耗尽 3. 根据应用特点合理配置 4. 监控资源使用情况并调整 ``` ### 缺失健康检查 ``` 问题: Deployment没有配置存活性和就绪性探针 错误示例: apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: app image: nginx # 没有livenessProbe和readinessProbe 后果: - 故障Pod仍被标记为健康 - 流量被发送到故障Pod - 用户体验差 解决方案: 1. 配置livenessProbe检测容器健康 2. 配置readinessProbe检测服务就绪 3. 设置合适的检查间隔和阈值 4. 配置startupProbe处理启动慢的应用 ``` ### 镜像配置错误 ``` 问题: 镜像不存在或仓库地址错误 错误示例: spec: containers: - name: app image: nonexistent/app:latest # 镜像不存在 后果: - Pod无法启动 - ImagePullBackOff错误 - 服务不可用 解决方案: 1. 验证镜像在仓库中存在 2. 使用正确的仓库地址和命名空间 3. 避免使用latest标签 4. 配置正确的镜像拉取策略 ``` ### 安全配置不当 ``` 问题: 容器以特权模式运行或使用root用户 错误示例: spec: containers: - name: app securityContext: privileged: true # 特权模式 runAsUser: 0 # root用户 后果: - 容器获得主机权限 - 安全风险增加 - 可能影响主机稳定性 解决方案: 1. 避免使用特权模式 2. 使用非root用户运行 3. 配置只读根文件系统 4. 限制Linux capabilities ``` ## 代码实现示例 ### Kubernetes配置验证器 ```python import yaml import json import re from typing import List, Dict, Any, Optional, Tuple from dataclasses import dataclass from pathlib import Path @dataclass class ValidationIssue: """验证问题""" severity: str # critical, high, medium, low type: str resource: str field: str message: str suggestion: str line_number: Optional[int] = None @dataclass class ValidationResult: """验证结果""" is_valid: bool issues: List[ValidationIssue] warnings: List[ValidationIssue] summary: Dict[str, Any] class KubernetesConfigValidator: def __init__(self): self.issues: List[ValidationIssue] = [] self.warnings: List[ValidationIssue] = [] # Kubernetes资源必填字段定义 self.required_fields = { 'Pod': { 'apiVersion': True, 'kind': True, 'metadata': True, 'spec': True, 'spec.containers': True }, 'Deployment': { 'apiVersion': True, 'kind': True, 'metadata': True, 'spec': True, 'spec.selector': True, 'spec.template': True }, 'Service': { 'apiVersion': True, 'kind': True, 'metadata': True, 'spec': True, 'spec.selector': True, 'spec.ports': True } } # 最佳实践规则 self.best_practice_rules = { 'resource_limits': 'medium', 'health_checks': 'medium', 'image_tag': 'low', 'security_context': 'high', 'replicas': 'medium' } def validate_yaml_file(self, file_path: str) -> ValidationResult: """验证YAML文件""" try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() return self.validate_yaml_content(content, file_path) except FileNotFoundError: self.issues.append(ValidationIssue( severity='critical', type='file_error', resource='', field='', message=f'文件不存在: {file_path}', suggestion='检查文件路径是否正确' )) return self._generate_result() except Exception as e: self.issues.append(ValidationIssue( severity='critical', type='file_error', resource='', field='', message=f'读取文件失败: {e}', suggestion='检查文件权限和格式' )) return self._generate_result() def validate_yaml_content(self, content: str, file_name: str = '') -> ValidationResult: """验证YAML内容""" try: # 重置问题列表 self.issues = [] self.warnings = [] # 解析YAML documents = yaml.safe_load_all(content) for doc in documents: if doc is None: continue # 验证单个文档 self.validate_document(doc, file_name) return self._generate_result() except yaml.YAMLError as e: self.issues.append(ValidationIssue( severity='critical', type='syntax_error', resource='', field='', message=f'YAML语法错误: {e}', suggestion='检查YAML语法,注意缩进和格式' )) return self._generate_result() def validate_document(self, doc: Dict[str, Any], file_name: str) -> None: """验证单个文档""" if not isinstance(doc, dict): self.issues.append(ValidationIssue( severity='critical', type='structure_error', resource='', field='', message='文档必须是字典类型', suggestion='检查YAML文档结构' )) return # 获取资源类型 kind = doc.get('kind', '') api_version = doc.get('apiVersion', '') if not kind: self.issues.append(ValidationIssue( severity='critical', type='missing_field', resource='', field='kind', message='缺少kind字段', suggestion='添加资源类型,如Pod、Deployment等' )) return # 验证必填字段 self.validate_required_fields(doc, kind) # 验证特定资源类型 if kind == 'Pod': self.validate_pod(doc) elif kind == 'Deployment': self.validate_deployment(doc) elif kind == 'Service': self.validate_service(doc) # 验证最佳实践 self.validate_best_practices(doc, kind) def validate_required_fields(self, doc: Dict[str, Any], kind: str) -> None: """验证必填字段""" required = self.required_fields.get(kind, {}) for field, is_required in required.items(): if is_required: value = self.get_nested_field(doc, field) if value is None: self.issues.append(ValidationIssue( severity='critical', type='missing_field', resource=kind, field=field, message=f'缺少必填字段: {field}', suggestion=f'添加{field}字段' )) def get_nested_field(self, doc: Dict[str, Any], field_path: str) -> Any: """获取嵌套字段值""" keys = field_path.split('.') value = doc for key in keys: if isinstance(value, dict) and key in value: value = value[key] else: return None return value def validate_pod(self, doc: Dict[str, Any]) -> None: """验证Pod配置""" spec = doc.get('spec', {}) containers = spec.get('containers', []) if not containers: self.issues.append(ValidationIssue( severity='critical', type='missing_field', resource='Pod', field='spec.containers', message='Pod必须包含至少一个容器', suggestion='添加容器配置' )) return for i, container in enumerate(containers): container_name = container.get('name', f'container-{i}') # 验证容器名称 if not container.get('name'): self.issues.append(ValidationIssue( severity='high', type='missing_field', resource='Pod', field=f'spec.containers[{i}].name', message='容器缺少名称', suggestion='为容器设置唯一名称' )) # 验证镜像 image = container.get('image', '') if not image: self.issues.append(ValidationIssue( severity='critical', type='missing_field', resource='Pod', field=f'spec.containers[{i}].image', message='容器缺少镜像', suggestion='指定容器镜像' )) elif ':latest' in image: self.warnings.append(ValidationIssue( severity='medium', type='best_practice', resource='Pod', field=f'spec.containers[{i}].image', message='使用latest镜像标签', suggestion='使用具体的版本标签确保部署一致性' )) # 验证资源配置 resources = container.get('resources', {}) if not resources: self.warnings.append(ValidationIssue( severity='medium', type='best_practice', resource='Pod', field=f'spec.containers[{i}].resources', message='容器没有设置资源配置', suggestion='设置CPU和内存的requests和limits' )) else: # 检查资源请求 requests = resources.get('requests', {}) if not requests: self.warnings.append(ValidationIssue( severity='medium', type='best_practice', resource='Pod', field=f'spec.containers[{i}].resources.requests', message='容器没有设置资源请求', suggestion='设置CPU和内存请求以确保调度' )) # 检查资源限制 limits = resources.get('limits', {}) if not limits: self.warnings.append(ValidationIssue( severity='medium', type='best_practice', resource='Pod', field=f'spec.containers[{i}].resources.limits', message='容器没有设置资源限制', suggestion='设置CPU和内存限制防止资源耗尽' )) # 验证健康检查 liveness_probe = container.get('livenessProbe') readiness_probe = container.get('readinessProbe') if not liveness_probe and not readiness_probe: self.warnings.append(ValidationIssue( severity='medium', type='best_practice', resource='Pod', field=f'spec.containers[{i}].probes', message='容器没有配置健康检查', suggestion='添加livenessProbe和readinessProbe' )) # 验证安全上下文 security_context = container.get('securityContext', {}) if security_context.get('privileged', False): self.issues.append(ValidationIssue( severity='high', type='security', resource='Pod', field=f'spec.containers[{i}].securityContext.privileged', message='容器以特权模式运行', suggestion='避免使用特权模式,最小化权限' )) if security_context.get('runAsUser') == 0: self.warnings.append(ValidationIssue( severity='medium', type='security', resource='Pod', field=f'spec.containers[{i}].securityContext.runAsUser', message='容器以root用户运行', suggestion='使用非root用户运行容器' )) def validate_deployment(self, doc: Dict[str, Any]) -> None: """验证Deployment配置""" spec = doc.get('spec', {}) template = spec.get('template', {}) pod_spec = template.get('spec', {}) # 验证副本数 replicas = spec.get('replicas', 1) if replicas == 1: self.warnings.append(ValidationIssue( severity='medium', type='availability', resource='Deployment', field='spec.replicas', message='副本数为1,存在单点故障风险', suggestion='增加副本数提高可用性' )) # 验证选择器匹配 selector = spec.get('selector', {}) match_labels = selector.get('matchLabels', {})
عرض على GitHub
ملف SKILL.md هذا كبير جدا، لذلك يعرض SkillsMP القسم الاول فقط هنا. عرض على GitHub