Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: SMI TrafficSplit Support for Canary #520

Merged
merged 14 commits into from
Jun 16, 2020
13 changes: 10 additions & 3 deletions cmd/rollouts-controller/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"strconv"
"time"

smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -30,8 +31,9 @@ import (

const (
// CLIName is the name of the CLI
cliName = "argo-rollouts"
defaultIstioVersion = "v1alpha3"
cliName = "argo-rollouts"
defaultIstioVersion = "v1alpha3"
defaultTrafficSplitVersion = "v1alpha1"
)

func newCommand() *cobra.Command {
Expand All @@ -48,6 +50,7 @@ func newCommand() *cobra.Command {
serviceThreads int
ingressThreads int
istioVersion string
trafficSplitVersion string
albIngressClasses []string
nginxIngressClasses []string
)
Expand Down Expand Up @@ -84,6 +87,7 @@ func newCommand() *cobra.Command {
checkError(err)
dynamicClient, err := dynamic.NewForConfig(config)
checkError(err)
smiClient, err := smiclientset.NewForConfig(config)
resyncDuration := time.Duration(rolloutResyncPeriod) * time.Second
kubeInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(
kubeClient,
Expand All @@ -109,6 +113,7 @@ func newCommand() *cobra.Command {
kubeClient,
rolloutClient,
dynamicClient,
smiClient,
kubeInformerFactory.Apps().V1().ReplicaSets(),
kubeInformerFactory.Core().V1().Services(),
kubeInformerFactory.Extensions().V1beta1().Ingresses(),
Expand All @@ -122,7 +127,8 @@ func newCommand() *cobra.Command {
instanceID,
metricsPort,
k8sRequestProvider,
defaultIstioVersion,
istioVersion,
trafficSplitVersion,
nginxIngressClasses,
albIngressClasses)

Expand Down Expand Up @@ -154,6 +160,7 @@ func newCommand() *cobra.Command {
command.Flags().IntVar(&serviceThreads, "service-threads", controller.DefaultServiceThreads, "Set the number of worker threads for the Service controller")
command.Flags().IntVar(&ingressThreads, "ingress-threads", controller.DefaultIngressThreads, "Set the number of worker threads for the Ingress controller")
command.Flags().StringVar(&istioVersion, "istio-api-version", defaultIstioVersion, "Set the default Istio apiVersion that controller should look when manipulating VirtualServices.")
command.Flags().StringVar(&trafficSplitVersion, "traffic-split-api-version", defaultTrafficSplitVersion, "Set the default TrafficSplit apiVersion that controller uses when creating TrafficSplits.")
command.Flags().StringArrayVar(&albIngressClasses, "alb-ingress-classes", defaultALBIngressClass, "Defines all the ingress class annotations that the alb ingress controller operates on. Defaults to alb")
command.Flags().StringArrayVar(&nginxIngressClasses, "nginx-ingress-classes", defaultNGINXIngressClass, "Defines all the ingress class annotations that the nginx ingress controller operates on. Defaults to nginx")
return &command
Expand Down
87 changes: 47 additions & 40 deletions controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"time"

"github.com/pkg/errors"
smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned"
log "github.com/sirupsen/logrus"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/runtime"
Expand Down Expand Up @@ -83,7 +84,8 @@ type Manager struct {
experimentWorkqueue workqueue.RateLimitingInterface
analysisRunWorkqueue workqueue.RateLimitingInterface

defaultIstioVersion string
defaultIstioVersion string
defaultTrafficSplitVersion string
}

// NewManager returns a new manager to manage all the controllers
Expand All @@ -92,6 +94,7 @@ func NewManager(
kubeclientset kubernetes.Interface,
argoprojclientset clientset.Interface,
dynamicclientset dynamic.Interface,
smiclientset smiclientset.Interface,
replicaSetInformer appsinformers.ReplicaSetInformer,
servicesInformer coreinformers.ServiceInformer,
ingressesInformer extensionsinformers.IngressInformer,
Expand All @@ -106,6 +109,7 @@ func NewManager(
metricsPort int,
k8sRequestProvider *metrics.K8sRequestsCountProvider,
defaultIstioVersion string,
defaultTrafficSplitVersion string,
nginxIngressClasses []string,
albIngressClasses []string,
) *Manager {
Expand Down Expand Up @@ -136,24 +140,26 @@ func NewManager(
ingressWorkqueue := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Ingresses")

rolloutController := rollout.NewController(rollout.ControllerConfig{
Namespace: namespace,
KubeClientSet: kubeclientset,
ArgoProjClientset: argoprojclientset,
DynamicClientSet: dynamicclientset,
ExperimentInformer: experimentsInformer,
AnalysisRunInformer: analysisRunInformer,
AnalysisTemplateInformer: analysisTemplateInformer,
ReplicaSetInformer: replicaSetInformer,
ServicesInformer: servicesInformer,
IngressInformer: ingressesInformer,
RolloutsInformer: rolloutsInformer,
ResyncPeriod: resyncPeriod,
RolloutWorkQueue: rolloutWorkqueue,
ServiceWorkQueue: serviceWorkqueue,
IngressWorkQueue: ingressWorkqueue,
MetricsServer: metricsServer,
Recorder: recorder,
DefaultIstioVersion: defaultIstioVersion,
Namespace: namespace,
KubeClientSet: kubeclientset,
ArgoProjClientset: argoprojclientset,
DynamicClientSet: dynamicclientset,
SmiClientSet: smiclientset,
ExperimentInformer: experimentsInformer,
AnalysisRunInformer: analysisRunInformer,
AnalysisTemplateInformer: analysisTemplateInformer,
ReplicaSetInformer: replicaSetInformer,
ServicesInformer: servicesInformer,
IngressInformer: ingressesInformer,
RolloutsInformer: rolloutsInformer,
ResyncPeriod: resyncPeriod,
RolloutWorkQueue: rolloutWorkqueue,
ServiceWorkQueue: serviceWorkqueue,
IngressWorkQueue: ingressWorkqueue,
MetricsServer: metricsServer,
Recorder: recorder,
DefaultIstioVersion: defaultIstioVersion,
DefaultTrafficSplitVersion: defaultTrafficSplitVersion,
})

experimentController := experiments.NewController(experiments.ControllerConfig{
Expand Down Expand Up @@ -207,27 +213,28 @@ func NewManager(
})

cm := &Manager{
metricsServer: metricsServer,
rolloutSynced: rolloutsInformer.Informer().HasSynced,
serviceSynced: servicesInformer.Informer().HasSynced,
ingressSynced: ingressesInformer.Informer().HasSynced,
secretSynced: secretInformer.Informer().HasSynced,
jobSynced: jobInformer.Informer().HasSynced,
experimentSynced: experimentsInformer.Informer().HasSynced,
analysisRunSynced: analysisRunInformer.Informer().HasSynced,
analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced,
replicasSetSynced: replicaSetInformer.Informer().HasSynced,
rolloutWorkqueue: rolloutWorkqueue,
experimentWorkqueue: experimentWorkqueue,
analysisRunWorkqueue: analysisRunWorkqueue,
serviceWorkqueue: serviceWorkqueue,
ingressWorkqueue: ingressWorkqueue,
rolloutController: rolloutController,
serviceController: serviceController,
ingressController: ingressController,
experimentController: experimentController,
analysisController: analysisController,
defaultIstioVersion: defaultIstioVersion,
metricsServer: metricsServer,
rolloutSynced: rolloutsInformer.Informer().HasSynced,
serviceSynced: servicesInformer.Informer().HasSynced,
ingressSynced: ingressesInformer.Informer().HasSynced,
secretSynced: secretInformer.Informer().HasSynced,
jobSynced: jobInformer.Informer().HasSynced,
experimentSynced: experimentsInformer.Informer().HasSynced,
analysisRunSynced: analysisRunInformer.Informer().HasSynced,
analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced,
replicasSetSynced: replicaSetInformer.Informer().HasSynced,
rolloutWorkqueue: rolloutWorkqueue,
experimentWorkqueue: experimentWorkqueue,
analysisRunWorkqueue: analysisRunWorkqueue,
serviceWorkqueue: serviceWorkqueue,
ingressWorkqueue: ingressWorkqueue,
rolloutController: rolloutController,
serviceController: serviceController,
ingressController: ingressController,
experimentController: experimentController,
analysisController: analysisController,
defaultIstioVersion: defaultIstioVersion,
defaultTrafficSplitVersion: defaultTrafficSplitVersion,
}

return cm
Expand Down
11 changes: 5 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ require (
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
github.com/go-openapi/spec v0.19.3
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff // indirect
github.com/googleapis/gnostic v0.2.0 // indirect
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
github.com/imdario/mergo v0.3.6 // indirect
github.com/jstemmer/go-junit-report v0.9.1
Expand All @@ -21,20 +19,21 @@ require (
github.com/pkg/errors v0.8.1
github.com/prometheus/client_golang v1.5.0
github.com/prometheus/common v0.9.1
github.com/servicemeshinterface/smi-sdk-go v0.3.0
github.com/sirupsen/logrus v1.4.2
github.com/spaceapegames/go-wavefront v1.6.2
github.com/spf13/cobra v0.0.5
github.com/stretchr/testify v1.4.0
github.com/valyala/fasttemplate v1.0.1
github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5
gopkg.in/yaml.v2 v2.2.8
k8s.io/api v0.17.3
k8s.io/api v0.17.4
k8s.io/apiextensions-apiserver v0.17.0
k8s.io/apimachinery v0.17.3
k8s.io/apimachinery v0.17.4
k8s.io/apiserver v0.17.3
k8s.io/cli-runtime v0.17.3
k8s.io/client-go v0.17.3
k8s.io/code-generator v0.17.3
k8s.io/client-go v0.17.4
k8s.io/code-generator v0.17.4
k8s.io/component-base v0.17.3
k8s.io/klog v1.0.0
k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg=
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
Expand Down Expand Up @@ -501,6 +503,8 @@ github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/servicemeshinterface/smi-sdk-go v0.3.0 h1:tJ2D0u5KnbtmbZLfJNJtMZg4EqofyLTdmeQekSlgLSA=
github.com/servicemeshinterface/smi-sdk-go v0.3.0/go.mod h1:/jM1BV6xy7OgcmHuZ5cyMO4IC4dG2+ska2KsL1/8MLE=
github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
Expand Down
7 changes: 7 additions & 0 deletions manifests/crds/rollout-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,13 @@ spec:
required:
- stableIngress
type: object
smi:
properties:
rootService:
type: string
trafficSplitName:
type: string
type: object
type: object
type: object
type: object
Expand Down
7 changes: 7 additions & 0 deletions manifests/install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8594,6 +8594,13 @@ spec:
required:
- stableIngress
type: object
smi:
properties:
rootService:
type: string
trafficSplitName:
type: string
type: object
type: object
type: object
type: object
Expand Down
7 changes: 7 additions & 0 deletions manifests/namespace-install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8594,6 +8594,13 @@ spec:
required:
- stableIngress
type: object
smi:
properties:
rootService:
type: string
trafficSplitName:
type: string
type: object
type: object
type: object
type: object
Expand Down
36 changes: 35 additions & 1 deletion pkg/apis/rollouts/v1alpha1/openapi_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions pkg/apis/rollouts/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,18 @@ type RolloutTrafficRouting struct {
Nginx *NginxTrafficRouting `json:"nginx,omitempty"`
// Nginx holds ALB Ingress specific configuration to route traffic
ALB *ALBTrafficRouting `json:"alb,omitempty"`
// SMI holds TrafficSplit specific configuration to route traffic
SMI *SMITrafficRouting `json:"smi,omitempty"`
}

// SMITrafficRouting configuration for TrafficSplit Custom Resource to control traffic routing
type SMITrafficRouting struct {
// RootService holds the name of that clients use to communicate.
// +optional
RootService string `json:"rootService,omitempty"`
// TrafficSplitName holds the name of the TrafficSplit.
// +optional
TrafficSplitName string `json:"trafficSplitName,omitempty"`
}

// NginxTrafficRouting configuration for Nginx ingress controller to control traffic routing
Expand Down
21 changes: 21 additions & 0 deletions pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading