blob: 86ccd27578a6b893ab9250f6551b6d4f482ca208 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package app
import (
"fmt"
"strings"
"time"
)
import (
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
"istio.io/pkg/collateral"
"istio.io/pkg/ctrlz"
"istio.io/pkg/log"
"istio.io/pkg/version"
)
import (
"github.com/apache/dubbo-go-pixiu/pilot/pkg/bootstrap"
"github.com/apache/dubbo-go-pixiu/pilot/pkg/features"
"github.com/apache/dubbo-go-pixiu/pilot/pkg/serviceregistry/provider"
"github.com/apache/dubbo-go-pixiu/pkg/cmd"
"github.com/apache/dubbo-go-pixiu/pkg/config/constants"
)
var (
serverArgs *bootstrap.PilotArgs
loggingOptions = log.DefaultOptions()
)
// NewRootCommand returns the root cobra command of pilot-discovery.
func NewRootCommand() *cobra.Command {
rootCmd := &cobra.Command{
Use: "pilot-discovery",
Short: "Istio Pilot.",
Long: "Istio Pilot provides fleet-wide traffic management capabilities in the Istio Service Mesh.",
SilenceUsage: true,
PreRunE: func(c *cobra.Command, args []string) error {
cmd.AddFlags(c)
return nil
},
}
discoveryCmd := newDiscoveryCommand()
addFlags(discoveryCmd)
rootCmd.AddCommand(discoveryCmd)
rootCmd.AddCommand(version.CobraCommand())
rootCmd.AddCommand(collateral.CobraCommand(rootCmd, &doc.GenManHeader{
Title: "Istio Pilot Discovery",
Section: "pilot-discovery CLI",
Manual: "Istio Pilot Discovery",
}))
rootCmd.AddCommand(requestCmd)
return rootCmd
}
func newDiscoveryCommand() *cobra.Command {
return &cobra.Command{
Use: "discovery",
Short: "Start Istio proxy discovery service.",
Args: cobra.ExactArgs(0),
PreRunE: func(c *cobra.Command, args []string) error {
if err := log.Configure(loggingOptions); err != nil {
return err
}
if err := validateFlags(serverArgs); err != nil {
return err
}
if err := serverArgs.Complete(); err != nil {
return err
}
return nil
},
RunE: func(c *cobra.Command, args []string) error {
cmd.PrintFlags(c.Flags())
// Create the stop channel for all of the servers.
stop := make(chan struct{})
// Create the server for the discovery service.
discoveryServer, err := bootstrap.NewServer(serverArgs)
if err != nil {
return fmt.Errorf("failed to create discovery service: %v", err)
}
// Start the server
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
},
}
}
var ignored []string
func addFlags(c *cobra.Command) {
serverArgs = bootstrap.NewPilotArgs(func(p *bootstrap.PilotArgs) {
// Set Defaults
p.CtrlZOptions = ctrlz.DefaultOptions()
// TODO replace with mesh config?
p.InjectionOptions = bootstrap.InjectionOptions{
InjectionDirectory: "./var/lib/istio/inject",
}
})
// Process commandline args.
c.PersistentFlags().StringSliceVar(&serverArgs.RegistryOptions.Registries, "registries",
[]string{string(provider.Kubernetes)},
fmt.Sprintf("Comma separated list of platform service registries to read from (choose one or more from {%s, %s})",
provider.Kubernetes, provider.Mock))
c.PersistentFlags().StringVar(&serverArgs.RegistryOptions.ClusterRegistriesNamespace, "clusterRegistriesNamespace",
serverArgs.RegistryOptions.ClusterRegistriesNamespace, "Namespace for ConfigMap which stores clusters configs")
c.PersistentFlags().StringVar(&serverArgs.RegistryOptions.KubeConfig, "kubeconfig", "",
"Use a Kubernetes configuration file instead of in-cluster configuration")
c.PersistentFlags().StringVar(&serverArgs.MeshConfigFile, "meshConfig", "./etc/istio/config/mesh",
"File name for Istio mesh configuration. If not specified, a default mesh will be used.")
c.PersistentFlags().StringVar(&serverArgs.NetworksConfigFile, "networksConfig", "./etc/istio/config/meshNetworks",
"File name for Istio mesh networks configuration. If not specified, a default mesh networks will be used.")
c.PersistentFlags().StringVarP(&serverArgs.Namespace, "namespace", "n", bootstrap.PodNamespace,
"Select a namespace where the controller resides. If not set, uses ${POD_NAMESPACE} environment variable")
c.PersistentFlags().StringSliceVar(&ignored, "plugins", nil,
"comma separated list of networking plugins to enable")
_ = c.PersistentFlags().MarkDeprecated("plugins", "no effect")
c.PersistentFlags().DurationVar(&serverArgs.ShutdownDuration, "shutdownDuration", 10*time.Second,
"Duration the discovery server needs to terminate gracefully")
// RegistryOptions Controller options
c.PersistentFlags().StringVar(&serverArgs.RegistryOptions.FileDir, "configDir", "",
"Directory to watch for updates to config yaml files. If specified, the files will be used as the source of config, rather than a CRD client.")
c.PersistentFlags().StringVar(&serverArgs.RegistryOptions.KubeOptions.DomainSuffix, "domain", constants.DefaultKubernetesDomain,
"DNS domain suffix")
c.PersistentFlags().StringVar((*string)(&serverArgs.RegistryOptions.KubeOptions.ClusterID), "clusterID", features.ClusterName,
"The ID of the cluster that this Istiod instance resides")
c.PersistentFlags().StringToStringVar(&serverArgs.RegistryOptions.KubeOptions.ClusterAliases, "clusterAliases", map[string]string{},
"Alias names for clusters")
// using address, so it can be configured as localhost:.. (possibly UDS in future)
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.HTTPAddr, "httpAddr", ":8080",
"Discovery service HTTP address")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.HTTPSAddr, "httpsAddr", ":15017",
"Injection and validation service HTTPS address")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.GRPCAddr, "grpcAddr", ":15010",
"Discovery service gRPC address")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.SecureGRPCAddr, "secureGRPCAddr", ":15012",
"Discovery service secured gRPC address")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.MonitoringAddr, "monitoringAddr", ":15014",
"HTTP address to use for pilot's self-monitoring information")
c.PersistentFlags().BoolVar(&serverArgs.ServerOptions.EnableProfiling, "profile", true,
"Enable profiling via web interface host:port/debug/pprof")
// Use TLS certificates if provided.
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.TLSOptions.CaCertFile, "caCertFile", "",
"File containing the x509 Server CA Certificate")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.TLSOptions.CertFile, "tlsCertFile", "",
"File containing the x509 Server Certificate")
c.PersistentFlags().StringVar(&serverArgs.ServerOptions.TLSOptions.KeyFile, "tlsKeyFile", "",
"File containing the x509 private key matching --tlsCertFile")
c.PersistentFlags().StringSliceVar(&serverArgs.ServerOptions.TLSOptions.TLSCipherSuites, "tls-cipher-suites", nil,
"Comma-separated list of cipher suites for istiod TLS server. "+
"If omitted, the default Go cipher suites will be used. \n"+
"Preferred values: "+strings.Join(secureTLSCipherNames(), ", ")+". \n"+
"Insecure values: "+strings.Join(insecureTLSCipherNames(), ", ")+".")
c.PersistentFlags().Float32Var(&serverArgs.RegistryOptions.KubeOptions.KubernetesAPIQPS, "kubernetesApiQPS", 80.0,
"Maximum QPS when communicating with the kubernetes API")
c.PersistentFlags().IntVar(&serverArgs.RegistryOptions.KubeOptions.KubernetesAPIBurst, "kubernetesApiBurst", 160,
"Maximum burst for throttle when communicating with the kubernetes API")
// Attach the Istio logging options to the command.
loggingOptions.AttachCobraFlags(c)
// Attach the Istio Ctrlz options to the command.
serverArgs.CtrlZOptions.AttachCobraFlags(c)
// Attach the Istio Keepalive options to the command.
serverArgs.KeepaliveOptions.AttachCobraFlags(c)
}