Istio pilot-discovery服务发现源码解析(1.13版本)

Istio pilot-discovery服务发现

  • 介绍
  • 工作机制
    • 初始化
    • 初始化Config控制器
    • 初始化Service控制器
      • controller初始化
        • Namespace
        • Service
        • Node
        • Pod
      • Pilot Discovery各组件启动流程
      • DiscoveryServer接收Envoy的gRPC连接请求流程
      • Config变化后向Envoy推送更新的流程
  • 总结
    • 参考

介绍

Istio Pilot的代码分为Pilot-Discovery和Pilot-Agent,其中Pilot-Agent用于在数据面负责Envoy的生命周期管理,Pilot-Discovery才是控制面进行流量管理的组件,本文将重点分析控制面部分,即Pilot-Discovery的代码。

工作机制

Istio源码分支: release-1.13

初始化

func newDiscoveryCommand() *cobra.Command {
   
	return &cobra.Command{
   
		Use:   "discovery",
		Short: "Start Istio proxy discovery service.",
		// ...
		RunE: func(c *cobra.Command, args []string) error {
   
			// ...
			// 创建xDS服务器
			discoveryServer, err := bootstrap.NewServer(serverArgs)
			if err != nil {
   
				return fmt.Errorf("failed to create discovery service: %v", err)
			}

			// 启动xDS服务器
			if err := discoveryServer.Start(stop); err != nil {
   
				return fmt.Errorf("failed to start discovery service: %v", err)
			}

			cmd.WaitSignal(stop)
			// Wait until we shut down. In theory this could block forever; in practice we will get
			// forcibly shut down after 30s in Kubernetes.
			discoveryServer.WaitUntilCompletion()
			return nil
		},
	}
}

其中bootstrap.NewServer创建服务发现服务器数据结构,

// NewServer creates a new Server instance based on the provided arguments.
func NewServer(args *PilotArgs, initFuncs ...func(*Server)) (*Server, error) {
   
	// ...
	ac := aggregate.NewController(aggregate.Options{
   
		MeshHolder: e,
	})
	e.ServiceDiscovery = ac

	s := &Server{
   
		// ...
		fileWatcher:             filewatcher.NewWatcher(),
		// ...
		server:                  server.New(),
		// ...
	}
	// ...
	
	// 创建DiscoveryServer
	// DiscoveryServer is Pilot's gRPC implementation for Envoy's xds APIs
	s.XDSServer = xds.NewDiscoveryServer(e, args.Plugins, args.PodName, args.Namespace, args.RegistryOptions.KubeOptions.ClusterAliases)

	// ...

	// 初始化各种控制器
	if err := s.initControllers(args); err != nil {
   
		return nil, err
	}

	// ...

	// This should be called only after controllers are initialized.
	// 初始化注册事件处理器,在其中注册了SE与配置变更时全量更新的处理器;
	// 添加了ServiceEntry类型资源的配置更新处理函数,即当外部资源配置发生更改时的响应处理流程。
	s.initRegistryEventHandlers()

	// 初始化发现服务,添加了xDS Server启动函数
	s.initDiscoveryService(args)

	s.initSDSServer()

	// ...

	return s, nil
}

xDS指的是Envoy里定义的一系列服务发现协议,如cds, eds, lds, rds等,

  • Overview见xDS configuration API overview
  • Proto见Envoy Proto。

配置控制器与服务控制器对各类资源的监控实际上实现了K8S的List/Watch机制

// initControllers initializes the controllers.
func (s *Server) initControllers

你可能感兴趣的:(#,Istio,istio,云原生,服务发现)