mirror of
https://github.com/alibaba/higress.git
synced 2026-02-21 22:40:59 +08:00
144 lines
6.6 KiB
Go
144 lines
6.6 KiB
Go
// Copyright (c) 2022 Alibaba Group Holding Ltd.
|
|
//
|
|
// 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 cmd
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/alibaba/higress/pkg/bootstrap"
|
|
innerconstants "github.com/alibaba/higress/pkg/config/constants"
|
|
"github.com/spf13/cobra"
|
|
"istio.io/istio/pilot/pkg/features"
|
|
"istio.io/istio/pkg/cmd"
|
|
"istio.io/istio/pkg/config/constants"
|
|
"istio.io/istio/pkg/env"
|
|
"istio.io/istio/pkg/keepalive"
|
|
"istio.io/istio/pkg/log"
|
|
)
|
|
|
|
var (
|
|
serverArgs *bootstrap.ServerArgs
|
|
loggingOptions = log.DefaultOptions()
|
|
|
|
serverProvider = func(args *bootstrap.ServerArgs) (bootstrap.ServerInterface, error) {
|
|
return bootstrap.NewServer(args)
|
|
}
|
|
|
|
waitForMonitorSignal = func(stop chan struct{}) {
|
|
cmd.WaitSignal(stop)
|
|
}
|
|
|
|
keepConfigLabels = env.Register(
|
|
"CONTROLLER_KEEP_XDS_CONFIG_LABELS",
|
|
true,
|
|
"If enabled, Higress Controller will keep all the labels when converting configs to xDS resources."+
|
|
" By default this is enabled. So far, this feature only works for Gateway resource.",
|
|
).Get()
|
|
|
|
keepConfigAnnotations = env.Register(
|
|
"CONTROLLER_KEEP_XDS_CONFIG_ANNOTATIONS",
|
|
true,
|
|
"If enabled, Higress Controller will keep the annotations when converting configs to xDS resources."+
|
|
" By default this is enabled. So far, this feature only works for Gateway resource.",
|
|
).Get()
|
|
)
|
|
|
|
// getServerCommand returns the server cobra command to be executed.
|
|
func getServerCommand() *cobra.Command {
|
|
serveCmd := &cobra.Command{
|
|
Use: "serve",
|
|
Aliases: []string{"serve"},
|
|
Short: "Starts the higress ingress controller",
|
|
Example: "higress serve",
|
|
PreRunE: func(c *cobra.Command, args []string) error {
|
|
return log.Configure(loggingOptions)
|
|
},
|
|
RunE: func(c *cobra.Command, args []string) error {
|
|
cmd.PrintFlags(c.Flags())
|
|
|
|
stop := make(chan struct{})
|
|
|
|
server, err := serverProvider(serverArgs)
|
|
if err != nil {
|
|
return fmt.Errorf("fail to create higress server: %v", err)
|
|
}
|
|
|
|
if err := server.Start(stop); err != nil {
|
|
return fmt.Errorf("fail to start higress server: %v", err)
|
|
}
|
|
|
|
waitForMonitorSignal(stop)
|
|
|
|
server.WaitUntilCompletion()
|
|
return nil
|
|
},
|
|
}
|
|
|
|
serverArgs = &bootstrap.ServerArgs{
|
|
Debug: true,
|
|
NativeIstio: true,
|
|
HttpAddress: ":8888",
|
|
CertHttpAddress: ":8889",
|
|
GrpcAddress: ":15051",
|
|
GrpcKeepAliveOptions: keepalive.DefaultOption(),
|
|
XdsOptions: bootstrap.XdsOptions{
|
|
DebounceAfter: features.DebounceAfter,
|
|
DebounceMax: features.DebounceMax,
|
|
EnableEDSDebounce: features.EnableEDSDebounce,
|
|
KeepConfigLabels: keepConfigLabels,
|
|
KeepConfigAnnotations: keepConfigAnnotations,
|
|
},
|
|
}
|
|
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.GatewaySelectorKey, "gatewaySelectorKey", "higress", "gateway resource selector label key")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.GatewaySelectorValue, "gatewaySelectorValue", "higress-system-higress-gateway", "gateway resource selector label value")
|
|
serveCmd.PersistentFlags().BoolVar(&serverArgs.EnableStatus, "enableStatus", true, "enable the ingress status syncer which use to update the ip in ingress's status")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.IngressClass, "ingressClass", innerconstants.DefaultIngressClass, "if not empty, only watch the ingresses have the specified class, otherwise watch all ingresses")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.WatchNamespace, "watchNamespace", "", "if not empty, only wath the ingresses in the specified namespace, otherwise watch in all namespacees")
|
|
serveCmd.PersistentFlags().BoolVar(&serverArgs.Debug, "debug", serverArgs.Debug, "if true, enables more debug http api")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.HttpAddress, "httpAddress", serverArgs.HttpAddress, "the http address")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.GrpcAddress, "grpcAddress", serverArgs.GrpcAddress, "the grpc address")
|
|
serveCmd.PersistentFlags().BoolVar(&serverArgs.KeepStaleWhenEmpty, "keepStaleWhenEmpty", false, "keep the stale service entry when there are no endpoints in the service")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.RegistryOptions.ClusterRegistriesNamespace, "clusterRegistriesNamespace",
|
|
serverArgs.RegistryOptions.ClusterRegistriesNamespace, "Namespace for ConfigMap which stores clusters configs")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.RegistryOptions.KubeConfig, "kubeconfig", "",
|
|
"Use a Kubernetes configuration file instead of in-cluster configuration")
|
|
// RegistryOptions Controller options
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.RegistryOptions.KubeOptions.DomainSuffix, "domain", constants.DefaultClusterLocalDomain,
|
|
"DNS domain suffix")
|
|
serveCmd.PersistentFlags().StringVar((*string)(&serverArgs.RegistryOptions.KubeOptions.ClusterID), "clusterID", "Kubernetes",
|
|
"The ID of the cluster that this instance resides")
|
|
serveCmd.PersistentFlags().StringToStringVar(&serverArgs.RegistryOptions.KubeOptions.ClusterAliases, "clusterAliases", map[string]string{},
|
|
"Alias names for clusters")
|
|
serveCmd.PersistentFlags().Float32Var(&serverArgs.RegistryOptions.KubeOptions.KubernetesAPIQPS, "kubernetesApiQPS", 80.0,
|
|
"Maximum QPS when communicating with the kubernetes API")
|
|
|
|
serveCmd.PersistentFlags().IntVar(&serverArgs.RegistryOptions.KubeOptions.KubernetesAPIBurst, "kubernetesApiBurst", 160,
|
|
"Maximum burst for throttle when communicating with the kubernetes API")
|
|
serveCmd.PersistentFlags().Uint32Var(&serverArgs.GatewayHttpPort, "gatewayHttpPort", 80,
|
|
"Http listening port of gateway pod")
|
|
serveCmd.PersistentFlags().Uint32Var(&serverArgs.GatewayHttpsPort, "gatewayHttpsPort", 443,
|
|
"Https listening port of gateway pod")
|
|
|
|
serveCmd.PersistentFlags().BoolVar(&serverArgs.EnableAutomaticHttps, "enableAutomaticHttps", false, "if true, enables automatic https")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.AutomaticHttpsEmail, "automaticHttpsEmail", "", "email for automatic https")
|
|
serveCmd.PersistentFlags().StringVar(&serverArgs.CertHttpAddress, "certHttpAddress", serverArgs.CertHttpAddress, "the cert http address")
|
|
|
|
loggingOptions.AttachCobraFlags(serveCmd)
|
|
serverArgs.GrpcKeepAliveOptions.AttachCobraFlags(serveCmd)
|
|
|
|
return serveCmd
|
|
}
|