kubernetes
当实施Kubernetes编排时,分析集群架构设计,优化容器编排性能,解决K8s相关问题。验证资源配置,设计服务部署策略,和最佳实践。
Source facts
- Repository
- microwind/ai-skills
- Last source activity
- March 26, 2026 at 14:58
- Detected SKILL.md language
- Chinese
- Stars
- 83
- Forks
- 24
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
File Explorer
3 filesShowing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- Kubernetes编排
- description
- 当实施Kubernetes编排时,分析集群架构设计,优化容器编排性能,解决K8s相关问题。验证资源配置,设计服务部署策略,和最佳实践。
- license
- MIT
# Kubernetes编排技能
## 概述
Kubernetes是容器编排的事实标准。不当的K8s配置会导致资源浪费、性能问题和运维困难。在设计Kubernetes架构前需要仔细分析应用需求。
**核心原则**: 好的Kubernetes编排应该提升应用可用性和可扩展性,同时保证资源利用率。坏的编排会增加运维复杂性,甚至影响服务稳定性。
## 何时使用
**始终:**
- 设计微服务部署架构时
- 实现容器编排和调度时
- 优化Kubernetes集群性能时
- 解决服务发现和负载均衡问题时
- 建立自动化运维流程时
**触发短语:**
- "Kubernetes部署"
- "K8s集群优化"
- "Pod调度策略"
- "服务网格配置"
- "自动扩缩容"
- "Kubernetes安全"
## Kubernetes编排功能
### 集群架构设计
- Master节点配置
- Worker节点规划
- 网络插件选择
- 存储方案设计
- 高可用架构
### 资源管理
- Pod配置优化
- Deployment策略
- Service和Ingress配置
- ConfigMap和Secret管理
- 资源配额设置
### 调度和扩缩容
- 调度策略配置
- 自动扩缩容设置
- 节点亲和性规则
- 污点和容忍度
- 优先级和抢占
### 监控和运维
- 健康检查配置
- 日志收集方案
- 监控指标设置
- 告警规则配置
- 故障排查
## 常见Kubernetes问题
### 资源配置不当
```
问题:
Pod资源配置不合理导致性能问题
错误示例:
- 没有设置资源请求和限制
- CPU和内存配置过高或过低
- 忽略资源使用监控
- 不合理的QoS类别
解决方案:
1. 设置合理的requests和limits
2. 实施资源监控和告警
3. 优化Pod调度策略
4. 配置合适的QoS类别
```
### 网络通信问题
```
问题:
Kubernetes网络配置导致通信故障
错误示例:
- Service无法访问Pod
- Ingress配置错误
- 网络策略阻止通信
- DNS解析失败
解决方案:
1. 检查Service和Endpoint配置
2. 验证Ingress规则设置
3. 调整NetworkPolicy策略
4. 排查CoreDNS问题
```
### 存储挂载问题
```
问题:
持久化存储挂载失败或数据丢失
错误示例:
- PV和PVC配置不匹配
- 存储类选择错误
- 权限配置问题
- 数据备份策略缺失
解决方案:
1. 正确配置PV和PVC
2. 选择合适的StorageClass
3. 设置正确的访问权限
4. 实施定期备份策略
```
## 代码实现示例
### Kubernetes集群分析器
```python
import kubernetes
import yaml
import json
import time
from typing import List, Dict, Any, Optional, Tuple
from dataclasses import dataclass
from collections import defaultdict
@dataclass
class ClusterMetrics:
"""集群指标"""
node_count: int
pod_count: int
service_count: int
deployment_count: int
namespace_count: int
cpu_capacity: float
memory_capacity: float
cpu_usage: float
memory_usage: float
@dataclass
class PodMetrics:
"""Pod指标"""
name: str
namespace: str
status: str
node_name: str
cpu_requests: float
cpu_limits: float
memory_requests: float
memory_limits: float
restart_count: int
age_seconds: int
@dataclass
class ClusterIssue:
"""集群问题"""
severity: str # critical, high, medium, low
type: str
resource: str
namespace: str
message: str
suggestion: str
class KubernetesClusterAnalyzer:
def __init__(self, kubeconfig_path: Optional[str] = None):
self.kubeconfig_path = kubeconfig_path
self.load_kubernetes_config()
self.v1 = kubernetes.client.CoreV1Api()
self.apps_v1 = kubernetes.client.AppsV1Api()
self.networking_v1 = kubernetes.client.NetworkingV1Api()
self.issues: List[ClusterIssue] = []
def load_kubernetes_config(self):
"""加载Kubernetes配置"""
try:
if self.kubeconfig_path:
kubernetes.config.load_kube_config(config_file=self.kubeconfig_path)
else:
kubernetes.config.load_incluster_config()
except Exception as e:
try:
kubernetes.config.load_kube_config()
except Exception as e2:
raise Exception(f'无法加载Kubernetes配置: {e2}')
def analyze_cluster(self) -> Dict[str, Any]:
"""分析整个集群"""
try:
# 获取集群指标
cluster_metrics = self.get_cluster_metrics()
# 分析Pod
pod_analysis = self.analyze_pods()
# 分析节点
node_analysis = self.analyze_nodes()
# 分析资源使用
resource_analysis = self.analyze_resource_usage()
# 分析网络
network_analysis = self.analyze_network()
# 生成报告
report = {
'cluster_metrics': cluster_metrics,
'pod_analysis': pod_analysis,
'node_analysis': node_analysis,
'resource_analysis': resource_analysis,
'network_analysis': network_analysis,
'issues': self.issues,
'recommendations': self.generate_recommendations(),
'health_score': self.calculate_health_score(cluster_metrics)
}
return report
except Exception as e:
return {'error': f'分析集群失败: {e}'}
def get_cluster_metrics(self) -> ClusterMetrics:
"""获取集群指标"""
try:
# 获取节点数量
nodes = self.v1.list_node()
node_count = len(nodes.items)
# 获取Pod数量
pods = self.v1.list_pod_for_all_namespaces()
pod_count = len(pods.items)
# 获取Service数量
services = self.v1.list_service_for_all_namespaces()
service_count = len(services.items)
# 获取Deployment数量
deployments = self.apps_v1.list_deployment_for_all_namespaces()
deployment_count = len(deployments.items)
# 获取Namespace数量
namespaces = self.v1.list_namespace()
namespace_count = len(namespaces.items)
# 计算资源容量
cpu_capacity = 0
memory_capacity = 0
for node in nodes.items:
cpu_capacity += self.parse_cpu(node.status.capacity.get('cpu', '0'))
memory_capacity += self.parse_memory(node.status.capacity.get('memory', '0'))
return ClusterMetrics(
node_count=node_count,
pod_count=pod_count,
service_count=service_count,
deployment_count=deployment_count,
namespace_count=namespace_count,
cpu_capacity=cpu_capacity,
memory_capacity=memory_capacity,
cpu_usage=0, # 需要通过metrics server获取
memory_usage=0
)
except Exception as e:
raise Exception(f'获取集群指标失败: {e}')
def analyze_pods(self) -> Dict[str, Any]:
"""分析Pod状态"""
try:
pods = self.v1.list_pod_for_all_namespaces()
pod_metrics = []
status_counts = defaultdict(int)
namespace_counts = defaultdict(int)
for pod in pods.items:
# 获取Pod指标
metrics = self.get_pod_metrics(pod)
pod_metrics.append(metrics)
# 统计状态
status_counts[pod.status.phase] += 1
namespace_counts[pod.metadata.namespace] += 1
# 检查Pod问题
self.check_pod_issues(pod, metrics)
return {
'total_pods': len(pods.items),
'status_distribution': dict(status_counts),
'namespace_distribution': dict(namespace_counts),
'pod_metrics': pod_metrics,
'issues': [issue for issue in self.issues if issue.type.startswith('pod_')]
}
except Exception as e:
return {'error': f'分析Pod失败: {e}'}
def get_pod_metrics(self, pod) -> PodMetrics:
"""获取Pod指标"""
try:
# 解析资源请求和限制
cpu_requests = 0
cpu_limits = 0
memory_requests = 0
memory_limits = 0
if pod.spec.containers:
for container in pod.spec.containers:
if container.resources:
if container.resources.requests:
cpu_requests += self.parse_cpu(container.resources.requests.get('cpu', '0'))
memory_requests += self.parse_memory(container.resources.requests.get('memory', '0'))
if container.resources.limits:
cpu_limits += self.parse_cpu(container.resources.limits.get('cpu', '0'))
memory_limits += self.parse_memory(container.resources.limits.get('memory', '0'))
# 计算重启次数
restart_count = 0
if pod.status.container_statuses:
for container_status in pod.status.container_statuses:
restart_count += container_status.restart_count
# 计算Pod年龄
creation_time = pod.metadata.creation_timestamp
age_seconds = int((time.time() - creation_time.timestamp()))
return PodMetrics(
name=pod.metadata.name,
namespace=pod.metadata.namespace,
status=pod.status.phase,
node_name=pod.spec.node_name or '',
cpu_requests=cpu_requests,
cpu_limits=cpu_limits,
memory_requests=memory_requests,
memory_limits=memory_limits,
restart_count=restart_count,
age_seconds=age_seconds
)
except Exception as e:
raise Exception(f'获取Pod指标失败: {e}')
def check_pod_issues(self, pod, metrics: PodMetrics) -> None:
"""检查Pod问题"""
# 检查Pod状态
if pod.status.phase == 'Pending':
self.issues.append(ClusterIssue(
severity='medium',
type='pod_pending',
resource=pod.metadata.name,
namespace=pod.metadata.namespace,
message='Pod处于Pending状态',
suggestion='检查资源配额、节点调度或PVC绑定状态'
))
elif pod.status.phase == 'Failed':
self.issues.append(ClusterIssue(
severity='high',
type='pod_failed',
resource=pod.metadata.name,
namespace=pod.metadata.namespace,
message='Pod处于Failed状态',
suggestion='检查Pod日志和事件,确定失败原因'
))
# 检查重启次数
if metrics.restart_count > 5:
self.issues.append(ClusterIssue(
severity='high',
type='pod_crash_loop',
resource=pod.metadata.name,
namespace=pod.metadata.namespace,
message=f'Pod重启次数过多: {metrics.restart_count}',
suggestion='检查应用日志,可能存在CrashLoopBackOff问题'
))
# 检查资源配置
if metrics.cpu_requests == 0 or metrics.memory_requests == 0:
self.issues.append(ClusterIssue(
severity='medium',
type='pod_no_requests',
resource=pod.metadata.name,
namespace=pod.metadata.namespace,
message='Pod没有设置资源请求',
suggestion='设置CPU和内存请求以确保调度稳定性'
))
if metrics.cpu_limits == 0 or metrics.memory_limits == 0:
self.issues.append(ClusterIssue(
severity='low',
type='pod_no_limits',
resource=pod.metadata.name,
namespace=pod.metadata.namespace,
message='Pod没有设置资源限制',
suggestion='设置资源限制防止资源耗尽'
))
def analyze_nodes(self) -> Dict[str, Any]:
"""分析节点状态"""
try:
nodes = self.v1.list_node()
node_analysis = []
for node in nodes.items:
analysis = {
'name': node.metadata.name,
'status': self.get_node_status(node),
'roles': self.get_node_roles(node),
'capacity': node.status.capacity,
'allocatable': node.status.allocatable,
'conditions': node.status.conditions,
'issues': []
}
# 检查节点问题
for condition in node.status.conditions or []:
if condition.type == 'Ready' and condition.status != 'True':
analysis['issues'].append({
'severity': 'high',
'message': f'节点{node.metadata.name}不可用',
'suggestion': '检查节点状态和网络连接'
})
node_analysis.append(analysis)
return {
'total_nodes': len(nodes.items),
'nodes': node_analysis,
'ready_nodes': len([n for n in node_analysis if n['status'] == 'Ready'])
}
except Exception as e:
return {'error': f'分析节点失败: {e}'}
def get_node_status(self, node) -> str:
"""获取节点状态"""
for condition in node.status.conditions or []:
if condition.type == 'Ready':
return 'Ready' if condition.status == 'True' else 'NotReady'
return 'Unknown'
def get_node_roles(self, node) -> List[str]:
"""获取节点角色"""
roles = []
labels = node.metadata.labels or {}
for label in labels:
if label.startswith('node-role.kubernetes.io/'):
role = label.replace('node-role.kubernetes.io/', '')
if role:
roles.append(role)
return roles or ['worker']
def analyze_resource_usage(self) -> Dict[str, Any]:
"""分析资源使用情况"""
try:
# 这里需要metrics-server支持
# 简化实现,返回基本信息
return {
'message': '需要安装metrics-server获取详细资源使用信息',
'recommendation': '请安装metrics-server: kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml'
}
except Exception as e:
return {'error': f'分析资源使用失败: {e}'}
def analyze_network(self) -> Dict[str, Any]:
"""分析网络配置"""
try:
# 获取所有Service
services = self.v1.list_service_for_all_namespaces()
service_analysis = []
for service in services.items:
analysis = {
'name': service.metadata.name,
'namespace': service.metadata.namespace,
'type': service.spec.type,
View on GitHubThis SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub