Go语言实现Kubernetes主从架构模拟系统

一、完整代码:

复制代码
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"math/rand"
	"sync"
	"time"
)

// ==================== 基础数据结构 ====================

// PodStatus Pod状态枚举
type PodStatus string

const (
	Pending   PodStatus = "Pending"
	Running   PodStatus = "Running"
	Succeeded PodStatus = "Succeeded"
	Failed    PodStatus = "Failed"
)

// NodeStatus 节点状态枚举
type NodeStatus string

const (
	Ready    NodeStatus = "Ready"
	NotReady NodeStatus = "NotReady"
)

// Pod 定义Pod结构体
type Pod struct {
	Name          string    `json:"name"`
	Namespace     string    `json:"namespace"`
	Image         string    `json:"image"`
	CPURequest    float64   `json:"cpu_request"`
	MemoryRequest int       `json:"memory_request"` // MB
	Status        PodStatus `json:"status"`
	NodeName      string    `json:"node_name,omitempty"`
	StartTime     time.Time `json:"start_time,omitempty"`
	Labels        map[string]string `json:"labels,omitempty"`
	Annotations   map[string]string `json:"annotations,omitempty"`
}

// Node 定义节点结构体
type Node struct {
	Name              string     `json:"name"`
	IP                string     `json:"ip"`
	Status            NodeStatus `json:"status"`
	CapacityCPU       float64    `json:"capacity_cpu"`
	CapacityMemory    int        `json:"capacity_memory"` // MB
	AllocatableCPU    float64    `json:"allocatable_cpu"`
	AllocatableMemory int        `json:"allocatable_memory"` // MB
	Pods              []string   `json:"pods"`
	Labels            map[string]string `json:"labels,omitempty"`
	Taints            []Taint    `json:"taints,omitempty"`
	Conditions        []NodeCondition `json:"conditions,omitempty"`
	mu                sync.RWMutex
}

// Taint 节点污点
type Taint struct {
	Key    string `json:"key"`
	Value  string `json:"value"`
	Effect string `json:"effect"` // NoSchedule, PreferNoSchedule, NoExecute
}

// NodeCondition 节点条件
type NodeCondition struct {
	Type   string `json:"type"`
	Status string `json:"status"`
	Reason string `json:"reason,omitempty"`
}

// Event 事件结构体(Kubernetes风格的事件系统)
type Event struct {
	Type      string    `json:"type"`
	Reason    string    `json:"reason"`
	Message   string    `json:"message"`
	Source    string    `json:"source"`
	Timestamp time.Time `json:"timestamp"`
	Object    string    `json:"object"` // 关联对象名称
}

// ==================== APIServer实现 ====================

// APIServer Kubernetes API Server模拟
type APIServer struct {
	pods        map[string]*Pod
	nodes       map[string]*Node
	podQueue    []*Pod
	events      []Event
	subscribers []chan Event // 事件订阅者
	mu          sync.RWMutex
}

// NewAPIServer 创建新的APIServer
func NewAPIServer() *APIServer {
	return &APIServer{
		pods:     make(map[string]*Pod),
		nodes:    make(map[string]*Node),
		podQueue: make([]*Pod, 0),
		events:   make([]Event, 0),
	}
}

// CreatePod 创建Pod
func (a *APIServer) CreatePod(podSpec map[string]interface{}) string {
	a.mu.Lock()
	defer a.mu.Unlock()

	pod := &Pod{
		Name:          podSpec["name"].(string),
		Namespace:     podSpec["namespace"].(string),
		Image:         podSpec["image"].(string),
		CPURequest:    podSpec["cpu_request"].(float64),
		MemoryRequest: podSpec["memory_request"].(int),
		Status:        Pending,
		Labels:        make(map[string]string),
		Annotations:   make(map[string]string),
	}

	if _, exists := a.pods[pod.Name]; exists {
		return fmt.Sprintf("Pod %s already exists", pod.Name)
	}

	a.pods[pod.Name] = pod
	a.podQueue = append(a.podQueue, pod)
	
	// 记录事件
	event := Event{
		Type:      "Normal",
		Reason:    "Created",
		Message:   fmt.Sprintf("Pod %s created", pod.Name),
		Source:    "APIServer",
		Timestamp: time.Now(),
		Object:    pod.Name,
	}
	a.recordEvent(event)
	a.notifySubscribers(event)

	log.Printf("📝 APIServer: Pod %s created and queued for scheduling", pod.Name)
	return fmt.Sprintf("Pod %s created successfully", pod.Name)
}

// RegisterNode 注册节点
func (a *APIServer) RegisterNode(node *Node) {
	a.mu.Lock()
	defer a.mu.Unlock()

	a.nodes[node.Name] = node
	
	event := Event{
		Type:      "Normal",
		Reason:    "NodeRegistered",
		Message:   fmt.Sprintf("Node %s registered", node.Name),
		Source:    "APIServer",
		Timestamp: time.Now(),
		Object:    node.Name,
	}
	a.recordEvent(event)
	a.notifySubscribers(event)

	log.Printf("🖥️  APIServer: Node %s registered", node.Name)
}

// GetUnscheduledPods 获取待调度的Pods
func (a *APIServer) GetUnscheduledPods() []*Pod {
	a.mu.RLock()
	defer a.mu.RUnlock()

	unscheduled := make([]*Pod, 0)
	for _, pod := range a.podQueue {
		if pod.Status == Pending {
			unscheduled = append(unscheduled, pod)
		}
	}
	return unscheduled
}

// UpdatePodStatus 更新Pod状态
func (a *APIServer) UpdatePodStatus(podName string, status PodStatus, nodeName string) {
	a.mu.Lock()
	defer a.mu.Unlock()

	if pod, exists := a.pods[podName]; exists {
		pod.Status = status
		if nodeName != "" {
			pod.NodeName = nodeName
		}
		if status == Running && pod.StartTime.IsZero() {
			pod.StartTime = time.Now()
		}

		// 从队列中移除已调度的Pod
		if status == Running || status == Succeeded || status == Failed {
			newQueue := make([]*Pod, 0)
			for _, p := range a.podQueue {
				if p.Name != podName {
					newQueue = append(newQueue, p)
				}
			}
			a.podQueue = newQueue
		}

		// 记录事件
		eventType := "Normal"
		if status == Failed {
			eventType = "Warning"
		}
		event := Event{
			Type:      eventType,
			Reason:    "StatusUpdated",
			Message:   fmt.Sprintf("Pod %s status updated to %s", podName, status),
			Source:    "APIServer",
			Timestamp: time.Now(),
			Object:    podName,
		}
		a.recordEvent(event)
		a.notifySubscribers(event)
	}
}

// GetNodes 获取所有节点
func (a *APIServer) GetNodes() map[string]*Node {
	a.mu.RLock()
	defer a.mu.RUnlock()

	nodes := make(map[string]*Node)
	for k, v := range a.nodes {
		nodes[k] = v
	}
	return nodes
}

// ListPods 列出所有Pods
func (a *APIServer) ListPods() []Pod {
	a.mu.RLock()
	defer a.mu.RUnlock()

	pods := make([]Pod, 0, len(a.pods))
	for _, pod := range a.pods {
		pods = append(pods, *pod)
	}
	return pods
}

// SubscribeEvents 订阅事件
func (a *APIServer) SubscribeEvents() chan Event {
	a.mu.Lock()
	defer a.mu.Unlock()

	ch := make(chan Event, 100)
	a.subscribers = append(a.subscribers, ch)
	return ch
}

func (a *APIServer) recordEvent(event Event) {
	a.events = append(a.events, event)
	// 保持最近1000个事件
	if len(a.events) > 1000 {
		a.events = a.events[1:]
	}
}

func (a *APIServer) notifySubscribers(event Event) {
	for _, ch := range a.subscribers {
		select {
		case ch <- event:
		default:
			// 如果channel满,则跳过
		}
	}
}

// ==================== 调度器实现 ====================

// Scheduler Kubernetes调度器
type Scheduler struct {
	apiServer  *APIServer
	running    bool
	stopCh     chan struct{}
	scheduling chan *Pod // 调度队列
}

// NewScheduler 创建调度器
func NewScheduler(apiServer *APIServer) *Scheduler {
	return &Scheduler{
		apiServer:  apiServer,
		running:    true,
		stopCh:     make(chan struct{}),
		scheduling: make(chan *Pod, 100),
	}
}

// SchedulePod 调度单个Pod
func (s *Scheduler) SchedulePod(pod *Pod) {
	// 实现高级调度算法
	nodes := s.apiServer.GetNodes()
	
	var bestNode *Node
	var bestScore float64 = -1
	
	for _, node := range nodes {
		if s.nodeIsSchedulable(node, pod) {
			score := s.scoreNode(node, pod)
			if score > bestScore {
				bestScore = score
				bestNode = node
			}
		}
	}
	
	if bestNode != nil {
		// 更新节点资源
		bestNode.mu.Lock()
		bestNode.AllocatableCPU -= pod.CPURequest
		bestNode.AllocatableMemory -= pod.MemoryRequest
		bestNode.Pods = append(bestNode.Pods, pod.Name)
		bestNode.mu.Unlock()
		
		// 更新Pod状态
		s.apiServer.UpdatePodStatus(pod.Name, Running, bestNode.Name)
		
		log.Printf("🎯 Scheduler: Pod %s scheduled to node %s (score: %.2f)", 
			pod.Name, bestNode.Name, bestScore)
		
		// 记录调度事件
		event := Event{
			Type:      "Normal",
			Reason:    "Scheduled",
			Message:   fmt.Sprintf("Pod %s scheduled to %s", pod.Name, bestNode.Name),
			Source:    "Scheduler",
			Timestamp: time.Now(),
			Object:    pod.Name,
		}
		s.apiServer.notifySubscribers(event)
	} else {
		log.Printf("⚠️  Scheduler: No suitable node found for pod %s", pod.Name)
	}
}

func (s *Scheduler) nodeIsSchedulable(node *Node, pod *Pod) bool {
	node.mu.RLock()
	defer node.mu.RUnlock()
	
	// 检查节点状态
	if node.Status != Ready {
		return false
	}
	
	// 检查资源
	if node.AllocatableCPU < pod.CPURequest || 
	   node.AllocatableMemory < pod.MemoryRequest {
		return false
	}
	
	// 检查污点容忍
	if !s.checkTaints(node, pod) {
		return false
	}
	
	return true
}

func (s *Scheduler) scoreNode(node *Node, pod *Pod) float64 {
	node.mu.RLock()
	defer node.mu.RUnlock()
	
	score := 0.0
	
	// 1. 资源利用率评分 (越低越好,但我们转换为越高越好)
	cpuUtilization := 1.0 - (node.AllocatableCPU / node.CapacityCPU)
	memoryUtilization := 1.0 - float64(node.AllocatableMemory)/float64(node.CapacityMemory)
	
	// 倾向于选择资源利用率较低的节点
	score += (1.0 - cpuUtilization) * 40
	score += (1.0 - memoryUtilization) * 40
	
	// 2. Pod亲和性/反亲和性 (简化实现)
	if s.checkAffinity(node, pod) {
		score += 15
	}
	
	// 3. 节点标签匹配
	score += s.checkNodeSelector(node, pod) * 5
	
	return score
}

func (s *Scheduler) checkTaints(node *Node, pod *Pod) bool {
	// 简化实现:检查Pod是否有对应的容忍
	// 实际K8s中需要复杂的污点/容忍匹配逻辑
	return true
}

func (s *Scheduler) checkAffinity(node *Node, pod *Pod) bool {
	// 简化的亲和性检查
	// 实际K8s中有复杂的亲和性/反亲和性规则
	return true
}

func (s *Scheduler) checkNodeSelector(node *Node, pod *Pod) float64 {
	// 简化的节点选择器检查
	// 返回匹配的标签数量
	return 0
}

// Run 启动调度器
func (s *Scheduler) Run() {
	ticker := time.NewTicker(2 * time.Second)
	defer ticker.Stop()
	
	for {
		select {
		case <-s.stopCh:
			return
		case pod := <-s.scheduling:
			s.SchedulePod(pod)
		case <-ticker.C:
			// 定期调度
			unscheduledPods := s.apiServer.GetUnscheduledPods()
			for _, pod := range unscheduledPods {
				select {
				case s.scheduling <- pod:
				default:
					log.Printf("⚠️  Scheduler queue full, skipping pod %s", pod.Name)
				}
			}
		}
	}
}

// Stop 停止调度器
func (s *Scheduler) Stop() {
	close(s.stopCh)
	s.running = false
}

// ==================== Kubelet实现 ====================

// Kubelet 节点代理
type Kubelet struct {
	node      *Node
	apiServer *APIServer
	pods      map[string]*Pod
	running   bool
	stopCh    chan struct{}
}

// NewKubelet 创建Kubelet
func NewKubelet(node *Node, apiServer *APIServer) *Kubelet {
	return &Kubelet{
		node:      node,
		apiServer: apiServer,
		pods:      make(map[string]*Pod),
		running:   true,
		stopCh:    make(chan struct{}),
	}
}

// RunPod 在节点上运行Pod
func (k *Kubelet) RunPod(pod *Pod) {
	if _, exists := k.pods[pod.Name]; exists {
		return
	}
	
	k.pods[pod.Name] = pod
	
	log.Printf("🚀 Kubelet/%s: Starting pod %s", k.node.Name, pod.Name)
	
	// 模拟Pod运行
	go func(podName string) {
		// 随机运行时间
		runTime := time.Duration(rand.Intn(10)+5) * time.Second
		time.Sleep(runTime)
		
		// 随机决定Pod是否成功
		success := rand.Float64() > 0.2 // 80%成功率
		status := Succeeded
		if !success {
			status = Failed
		}
		
		// 释放节点资源
		k.node.mu.Lock()
		if pod, exists := k.pods[podName]; exists {
			k.node.AllocatableCPU += pod.CPURequest
			k.node.AllocatableMemory += pod.MemoryRequest
			
			// 从节点Pod列表中移除
			for i, p := range k.node.Pods {
				if p == podName {
					k.node.Pods = append(k.node.Pods[:i], k.node.Pods[i+1:]...)
					break
				}
			}
		}
		delete(k.pods, podName)
		k.node.mu.Unlock()
		
		k.apiServer.UpdatePodStatus(podName, status, "")
		
		log.Printf("✅ Kubelet/%s: Pod %s %s after %v", 
			k.node.Name, podName, status, runTime)
	}(pod.Name)
}

// SyncWithAPIServer 与API Server同步
func (k *Kubelet) SyncWithAPIServer() {
	ticker := time.NewTicker(3 * time.Second)
	defer ticker.Stop()
	
	for {
		select {
		case <-k.stopCh:
			return
		case <-ticker.C:
			allPods := k.apiServer.ListPods()
			
			for _, pod := range allPods {
				if pod.NodeName == k.node.Name && pod.Status == Running {
					k.node.mu.RLock()
					_, running := k.pods[pod.Name]
					k.node.mu.RUnlock()
					
					if !running {
						k.RunPod(&pod)
					}
				}
			}
		}
	}
}

// Stop 停止Kubelet
func (k *Kubelet) Stop() {
	close(k.stopCh)
	k.running = false
}

// ==================== 控制器管理器实现 ====================

// ControllerManager 控制器管理器
type ControllerManager struct {
	apiServer *APIServer
	running   bool
	stopCh    chan struct{}
}

// NewControllerManager 创建控制器管理器
func NewControllerManager(apiServer *APIServer) *ControllerManager {
	return &ControllerManager{
		apiServer: apiServer,
		running:   true,
		stopCh:    make(chan struct{}),
	}
}

// MonitorSystem 监控系统状态
func (c *ControllerManager) MonitorSystem() {
	ticker := time.NewTicker(5 * time.Second)
	defer ticker.Stop()
	
	for {
		select {
		case <-c.stopCh:
			return
		case <-ticker.C:
			nodes := c.apiServer.GetNodes()
			
			for _, node := range nodes {
				// 模拟节点故障
				if rand.Float64() < 0.05 { // 5%概率节点故障
					node.mu.Lock()
					if node.Status == Ready {
						node.Status = NotReady
						node.Conditions = append(node.Conditions, NodeCondition{
							Type:   "Ready",
							Status: "False",
							Reason: "SimulatedFailure",
						})
						log.Printf("🔴 Controller: Node %s marked as NotReady", node.Name)
						
						event := Event{
							Type:      "Warning",
							Reason:    "NodeNotReady",
							Message:   fmt.Sprintf("Node %s is not ready", node.Name),
							Source:    "ControllerManager",
							Timestamp: time.Now(),
							Object:    node.Name,
						}
						c.apiServer.notifySubscribers(event)
					}
					node.mu.Unlock()
				} else if rand.Float64() < 0.3 && node.Status == NotReady {
					node.mu.Lock()
					node.Status = Ready
					// 更新节点条件
					for i, cond := range node.Conditions {
						if cond.Type == "Ready" {
							node.Conditions[i].Status = "True"
							node.Conditions[i].Reason = "SimulatedRecovery"
						}
					}
					log.Printf("🟢 Controller: Node %s recovered to Ready", node.Name)
					node.mu.Unlock()
				}
			}
		}
	}
}

// Stop 停止控制器管理器
func (c *ControllerManager) Stop() {
	close(c.stopCh)
	c.running = false
}

// ==================== Deployment控制器 ====================

// Deployment 部署对象
type Deployment struct {
	Name      string `json:"name"`
	Namespace string `json:"namespace"`
	Replicas  int    `json:"replicas"`
	Image     string `json:"image"`
	CPU       float64 `json:"cpu"`
	Memory    int    `json:"memory"`
}

// DeploymentController 部署控制器
type DeploymentController struct {
	apiServer   *APIServer
	deployments map[string]*Deployment
	running     bool
	stopCh      chan struct{}
}

// NewDeploymentController 创建部署控制器
func NewDeploymentController(apiServer *APIServer) *DeploymentController {
	return &DeploymentController{
		apiServer:   apiServer,
		deployments: make(map[string]*Deployment),
		running:     true,
		stopCh:      make(chan struct{}),
	}
}

// CreateDeployment 创建部署
func (dc *DeploymentController) CreateDeployment(dep *Deployment) {
	dc.deployments[dep.Name] = dep
	
	log.Printf("📦 DeploymentController: Creating deployment %s with %d replicas", 
		dep.Name, dep.Replicas)
	
	for i := 0; i < dep.Replicas; i++ {
		podSpec := map[string]interface{}{
			"name":           fmt.Sprintf("%s-pod-%d", dep.Name, i),
			"namespace":      dep.Namespace,
			"image":          dep.Image,
			"cpu_request":    dep.CPU,
			"memory_request": dep.Memory,
		}
		dc.apiServer.CreatePod(podSpec)
	}
}

// Run 运行部署控制器
func (dc *DeploymentController) Run() {
	// 这里可以添加部署状态监控和修复逻辑
	// 实际K8s中会监控实际副本数与期望副本数的差异
	<-dc.stopCh
}

// Stop 停止部署控制器
func (dc *DeploymentController) Stop() {
	close(dc.stopCh)
	dc.running = false
}

// ==================== 事件监视器 ====================

// EventWatcher 事件监视器
type EventWatcher struct {
	apiServer *APIServer
	stopCh    chan struct{}
}

// NewEventWatcher 创建事件监视器
func NewEventWatcher(apiServer *APIServer) *EventWatcher {
	return &EventWatcher{
		apiServer: apiServer,
		stopCh:    make(chan struct{}),
	}
}

// Watch 监视事件
func (ew *EventWatcher) Watch() {
	eventCh := ew.apiServer.SubscribeEvents()
	
	for {
		select {
		case <-ew.stopCh:
			return
		case event := <-eventCh:
			if event.Type == "Warning" {
				log.Printf("🚨 EVENT: %s - %s: %s", event.Type, event.Reason, event.Message)
			} else {
				log.Printf("📋 EVENT: %s - %s: %s", event.Type, event.Reason, event.Message)
			}
		}
	}
}

// Stop 停止监视
func (ew *EventWatcher) Stop() {
	close(ew.stopCh)
}

// ==================== 集群状态显示器 ====================

// ClusterMonitor 集群监视器
type ClusterMonitor struct {
	apiServer *APIServer
	running   bool
	stopCh    chan struct{}
}

// NewClusterMonitor 创建集群监视器
func NewClusterMonitor(apiServer *APIServer) *ClusterMonitor {
	return &ClusterMonitor{
		apiServer: apiServer,
		running:   true,
		stopCh:    make(chan struct{}),
	}
}

// DisplayStatus 显示集群状态
func (cm *ClusterMonitor) DisplayStatus() {
	ticker := time.NewTicker(10 * time.Second)
	defer ticker.Stop()
	
	for {
		select {
		case <-cm.stopCh:
			return
		case <-ticker.C:
			cm.printClusterStatus()
		}
	}
}

func (cm *ClusterMonitor) printClusterStatus() {
	fmt.Println("\n" + "="*60)
	fmt.Println("🏢 KUBERNETES CLUSTER STATUS")
	fmt.Println("="*60)
	
	nodes := cm.apiServer.GetNodes()
	pods := cm.apiServer.ListPods()
	
	fmt.Printf("\n📊 Nodes (%d):\n", len(nodes))
	for name, node := range nodes {
		node.mu.RLock()
		statusIcon := "🟢"
		if node.Status == NotReady {
			statusIcon = "🔴"
		}
		fmt.Printf("  %s %s (%s) - %s\n", statusIcon, name, node.IP, node.Status)
		fmt.Printf("     Resources: CPU: %.1f/%.1f, Memory: %d/%dMB\n",
			node.AllocatableCPU, node.CapacityCPU,
			node.AllocatableMemory, node.CapacityMemory)
		fmt.Printf("     Running Pods: %d\n", len(node.Pods))
		node.mu.RUnlock()
	}
	
	fmt.Printf("\n🐳 Pods (%d):\n", len(pods))
	for _, pod := range pods {
		statusIcon := "⚪"
		switch pod.Status {
		case Pending:
			statusIcon = "🟡"
		case Running:
			statusIcon = "🟢"
		case Succeeded:
			statusIcon = "🔵"
		case Failed:
			statusIcon = "🔴"
		}
		
		nodeInfo := ""
		if pod.NodeName != "" {
			nodeInfo = fmt.Sprintf("on %s", pod.NodeName)
		} else {
			nodeInfo = "unscheduled"
		}
		fmt.Printf("  %s %s - %s %s\n", statusIcon, pod.Name, pod.Status, nodeInfo)
	}
	
	fmt.Println()
}

// Stop 停止监视器
func (cm *ClusterMonitor) Stop() {
	close(cm.stopCh)
	cm.running = false
}

// ==================== 主程序 ====================

func main() {
	rand.Seed(time.Now().UnixNano())
	
	log.Println("🚀 Starting Kubernetes Cluster Demo (Go Implementation)")
	
	// 创建API Server
	apiServer := NewAPIServer()
	
	// 创建事件监视器
	eventWatcher := NewEventWatcher(apiServer)
	go eventWatcher.Watch()
	
	// 创建集群监视器
	clusterMonitor := NewClusterMonitor(apiServer)
	go clusterMonitor.DisplayStatus()
	
	// 创建调度器
	scheduler := NewScheduler(apiServer)
	go scheduler.Run()
	
	// 创建控制器管理器
	controllerManager := NewControllerManager(apiServer)
	go controllerManager.MonitorSystem()
	
	// 创建部署控制器
	deploymentController := NewDeploymentController(apiServer)
	
	// 创建工作节点
	nodes := []*Node{
		{
			Name:              "worker-node-1",
			IP:                "192.168.1.101",
			Status:            Ready,
			CapacityCPU:       4.0,
			CapacityMemory:    8192,
			AllocatableCPU:    4.0,
			AllocatableMemory: 8192,
			Pods:              []string{},
			Labels: map[string]string{
				"env":      "production",
				"node-type": "compute",
			},
		},
		{
			Name:              "worker-node-2",
			IP:                "192.168.1.102",
			Status:            Ready,
			CapacityCPU:       8.0,
			CapacityMemory:    16384,
			AllocatableCPU:    8.0,
			AllocatableMemory: 16384,
			Pods:              []string{},
			Labels: map[string]string{
				"env":      "staging",
				"node-type": "memory-optimized",
			},
		},
		{
			Name:              "worker-node-3",
			IP:                "192.168.1.103",
			Status:            Ready,
			CapacityCPU:       2.0,
			CapacityMemory:    4096,
			AllocatableCPU:    2.0,
			AllocatableMemory: 4096,
			Pods:              []string{},
			Labels: map[string]string{
				"env":      "development",
				"node-type": "general",
			},
		},
	}
	
	// 注册节点并启动Kubelet
	kubelets := make([]*Kubelet, 0)
	for _, node := range nodes {
		apiServer.RegisterNode(node)
		kubelet := NewKubelet(node, apiServer)
		go kubelet.SyncWithAPIServer()
		kubelets = append(kubelets, kubelet)
	}
	
	// 等待系统启动
	time.Sleep(2 * time.Second)
	
	// 创建部署
	log.Println("\n📋 Creating example deployments...")
	
	// 创建nginx部署
	deploymentController.CreateDeployment(&Deployment{
		Name:      "nginx",
		Namespace: "default",
		Replicas:  3,
		Image:     "nginx:latest",
		CPU:       0.5,
		Memory:    128,
	})
	
	time.Sleep(5 * time.Second)
	
	// 创建redis部署
	deploymentController.CreateDeployment(&Deployment{
		Name:      "redis",
		Namespace: "default",
		Replicas:  2,
		Image:     "redis:alpine",
		CPU:       1.0,
		Memory:    256,
	})
	
	time.Sleep(5 * time.Second)
	
	// 创建大内存应用
	deploymentController.CreateDeployment(&Deployment{
		Name:      "memory-intensive",
		Namespace: "default",
		Replicas:  1,
		Image:     "memory-intensive:latest",
		CPU:       2.0,
		Memory:    4096,
	})
	
	// 演示自定义调度示例
	log.Println("\n🎯 Testing advanced scheduling...")
	
	// 创建带有标签的Pod
	podSpec := map[string]interface{}{
		"name":           "custom-pod-1",
		"namespace":      "default",
		"image":          "custom:latest",
		"cpu_request":    1.0,
		"memory_request": 512,
	}
	apiServer.CreatePod(podSpec)
	
	// 运行一段时间
	log.Println("\n⏳ Demo running for 90 seconds...")
	time.Sleep(90 * time.Second)
	
	// 优雅关闭
	log.Println("\n🛑 Shutting down cluster...")
	scheduler.Stop()
	controllerManager.Stop()
	clusterMonitor.Stop()
	eventWatcher.Stop()
	
	for _, kubelet := range kubelets {
		kubelet.Stop()
	}
	
	// 最终状态快照
	fmt.Println("\n" + "="*60)
	fmt.Println("📸 FINAL CLUSTER SNAPSHOT")
	fmt.Println("="*60)
	
	// 输出JSON格式的状态
	nodes = apiServer.GetNodes()
	pods := apiServer.ListPods()
	
	clusterState := map[string]interface{}{
		"nodes": nodes,
		"pods":  pods,
	}
	
	jsonData, err := json.MarshalIndent(clusterState, "", "  ")
	if err != nil {
		log.Printf("Error marshaling cluster state: %v", err)
	} else {
		fmt.Println(string(jsonData))
	}
	
	log.Println("\n🎉 Demo completed successfully!")
	log.Println("This Go implementation demonstrates:")
	log.Println("  - Goroutine-based concurrency for all components")
	log.Println("  - Mutex-based thread safety for shared resources")
	log.Println("  - Channel-based event system")
	log.Println("  - Advanced scheduling algorithms")
	log.Println("  - Real Kubernetes-like architecture")
}

二、简单说明和python比的优势:

  1. 性能:原生并发支持,内存效率更高

  2. 类型安全:编译时类型检查,减少运行时错误

  3. 并发安全:内置的goroutine和channel机制

  4. 可扩展性:易于添加新的控制器和调度策略

  5. 生产就绪:可以轻松部署为真正的微服务

  6. 生态兼容:与真实Kubernetes生态无缝集成

相关推荐
一水鉴天1 小时前
整体设计 定稿 之16 三层智能合约体系实现设计和开发的实时融合
前端·人工智能·架构·智能合约
jyan_敬言2 小时前
【Docker】Kubernetes部署容器化应用程序
c++·笔记·其他·docker·容器·kubernetes·学习方法
b***65322 小时前
Go-Gin Web 框架完整教程
前端·golang·gin
一周困⁸天.2 小时前
K8S-Pod资源对象
linux·容器·kubernetes
皖南大花猪2 小时前
Go 项目中使用 Casbin 实现 RBAC 权限管理完整教程
开发语言·后端·golang·rbac·casbin
智算菩萨2 小时前
《自动驾驶与大模型融合新趋势:端到端感知-决策一体化架构分析》
人工智能·架构·自动驾驶
源代码•宸2 小时前
GoLang写一个火星漫游行动
开发语言·经验分享·后端·golang
xixixi777772 小时前
剖析Agent(代理)攻击面
网络·学习·安全·架构·网络攻击模型·代理
le serein —f3 小时前
用go实现-回文链表
算法·leetcode·golang