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

Initial step towards v2 #731

Merged
merged 8 commits into from
Apr 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
##################################################
# Variables #
##################################################
VERSION ?= master
VERSION ?= 2.0.0-alpha1
IMAGE_REGISTRY ?= docker.io
IMAGE_REPO ?= kedacore

Expand Down Expand Up @@ -93,7 +93,7 @@ build-adapter: generate-api pkg/scalers/liiklus/LiiklusService.pb.go
.PHONY: generate-api
generate-api:
$(GO_BUILD_VARS) operator-sdk generate k8s
$(GO_BUILD_VARS) operator-sdk generate openapi
$(GO_BUILD_VARS) operator-sdk generate crds

pkg/scalers/liiklus/LiiklusService.pb.go: hack/LiiklusService.proto
protoc -I hack/ hack/LiiklusService.proto --go_out=plugins=grpc:pkg/scalers/liiklus
Expand Down
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
<p style="font-size: 30px" align="center"><b>This branch contains unstable KEDA v2.0.0-alpha1, currently under development</b></p>

## How can I try KEDA v2 alpha version?
Make sure to remove previous KEDA (including CRD) from the cluster. Switch to the `v2` branch and deploy yaml files:
```bash
git fetch --all
git checkout v2
kubectl apply -f deploy/crds/keda.sh_scaledobjects_crd.yaml
kubectl apply -f deploy/crds/keda.sh_scaledjob_crd.yaml
kubectl apply -f deploy/crds/keda.sh_triggerauthentications_crd.yaml
kubectl apply -f deploy/
```


<p align="center"><img src="images/keda-logo-transparent.png" width="300"/></p>
<p style="font-size: 25px" align="center"><b>Kubernetes-based Event Driven Autoscaling</b></p>
<p style="font-size: 25px" align="center">
Expand Down Expand Up @@ -120,8 +134,9 @@ To be KEDA to be fully operational we need to deploy Metrics Server first.

1. Deploy CRDs and KEDA into `keda` namespace
```bash
kubectl apply -f deploy/crds/keda.k8s.io_scaledobjects_crd.yaml
kubectl apply -f deploy/crds/keda.k8s.io_triggerauthentications_crd.yaml
kubectl apply -f deploy/crds/keda.sh_scaledobjects_crd.yaml
kubectl apply -f deploy/crds/keda.sh_scaledjob_crd.yaml
kubectl apply -f deploy/crds/keda.sh_triggerauthentications_crd.yaml
kubectl apply -f deploy/
```
2. Scale down `keda-operator` Deployment
Expand Down
8 changes: 0 additions & 8 deletions build/bin/entrypoint
Original file line number Diff line number Diff line change
@@ -1,11 +1,3 @@
#!/bin/sh -e

# This is documented here:
# https://docs.openshift.com/container-platform/3.11/creating_images/guidelines.html#openshift-specific-guidelines

if ! whoami &>/dev/null; then
if [ -w /etc/passwd ]; then
echo "${USER_NAME:-keda}:x:$(id -u):$(id -g):${USER_NAME:-keda} user:${HOME}:/sbin/nologin" >> /etc/passwd
fi
fi
exec ${OPERATOR} $@
4 changes: 1 addition & 3 deletions build/bin/user_setup
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@
set -x

# ensure $HOME exists and is accessible by group 0 (we don't know what the runtime UID will be)
echo "${USER_NAME}:x:${USER_UID}:0:${USER_NAME} user:${HOME}:/sbin/nologin" >> /etc/passwd
mkdir -p ${HOME}
chown ${USER_UID}:0 ${HOME}
chmod ug+rwx ${HOME}

# runtime user will need to be able to self-insert in /etc/passwd
chmod g+rw /etc/passwd

# no need for this script to remain in the image after running
rm $0
2 changes: 1 addition & 1 deletion cmd/adapter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func (a *Adapter) makeProviderOrDie() provider.MetricsProvider {
os.Exit(1)
}

handler := handler.NewScaleHandler(kubeclient, scheme)
handler := handler.NewScaleHandler(kubeclient, nil, scheme)

namespace, err := k8sutil.GetWatchNamespace()
if err != nil {
Expand Down
80 changes: 58 additions & 22 deletions cmd/manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,31 @@ package main

import (
"context"
"errors"
"flag"
"fmt"
"os"
"runtime"
"strings"

// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/client-go/rest"

"github.com/kedacore/keda/pkg/apis"
"github.com/kedacore/keda/pkg/controller"
"github.com/kedacore/keda/version"

"github.com/operator-framework/operator-sdk/pkg/k8sutil"
kubemetrics "github.com/operator-framework/operator-sdk/pkg/kube-metrics"
"github.com/operator-framework/operator-sdk/pkg/leader"
"github.com/operator-framework/operator-sdk/pkg/log/zap"
"github.com/operator-framework/operator-sdk/pkg/metrics"
"github.com/operator-framework/operator-sdk/pkg/restmapper"
sdkVersion "github.com/operator-framework/operator-sdk/version"
"github.com/spf13/pflag"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client/config"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/manager"
Expand All @@ -40,6 +43,7 @@ var (
var log = logf.Log.WithName("cmd")

func printVersion() {
log.Info(fmt.Sprintf("Operator Version: %s", version.Version))
log.Info(fmt.Sprintf("Go Version: %s", runtime.Version()))
log.Info(fmt.Sprintf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH))
log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version))
Expand Down Expand Up @@ -90,12 +94,23 @@ func main() {
os.Exit(1)
}

// Create a new Cmd to provide shared dependencies and start components
mgr, err := manager.New(cfg, manager.Options{
// Set default manager options
options := manager.Options{
Namespace: namespace,
MapperProvider: restmapper.NewDynamicRESTMapper,
MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort),
})
}

// Add support for MultiNamespace set in WATCH_NAMESPACE (e.g ns1,ns2)
// Note that this is not intended to be used for excluding namespaces, this is better done via a Predicate
// Also note that you may face performance issues when using this with a high number of namespaces.
// More Info: https://godoc.org/github.com/kubernetes-sigs/controller-runtime/pkg/cache#MultiNamespacedCacheBuilder
if strings.Contains(namespace, ",") {
options.Namespace = ""
options.NewCache = cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ","))
}

// Create a new manager to provide shared dependencies and start components
mgr, err := manager.New(cfg, options)
if err != nil {
log.Error(err, "")
os.Exit(1)
Expand All @@ -115,7 +130,31 @@ func main() {
os.Exit(1)
}

if err = serveCRMetrics(cfg); err != nil {
// Add the Metrics Service
addMetrics(ctx, cfg)

log.Info("Starting the Cmd.")

// Start the Cmd
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
log.Error(err, "Manager exited non-zero")
os.Exit(1)
}
}

// addMetrics will create the Services and Service Monitors to allow the operator export the metrics by using
// the Prometheus operator
func addMetrics(ctx context.Context, cfg *rest.Config) {
// Get the namespace the operator is currently deployed in.
operatorNs, err := k8sutil.GetOperatorNamespace()
if err != nil {
if errors.Is(err, k8sutil.ErrRunLocal) {
log.Info("Skipping CR metrics server creation; not running in a cluster.")
return
}
}

if err := serveCRMetrics(cfg, operatorNs); err != nil {
log.Info("Could not generate and serve custom resource metrics", "error", err.Error())
}

Expand All @@ -124,6 +163,7 @@ func main() {
{Port: metricsPort, Name: metrics.OperatorPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: metricsPort}},
{Port: operatorMetricsPort, Name: metrics.CRPortName, Protocol: v1.ProtocolTCP, TargetPort: intstr.IntOrString{Type: intstr.Int, IntVal: operatorMetricsPort}},
}

// Create Service object to expose the metrics port(s).
service, err := metrics.CreateMetricsService(ctx, cfg, servicePorts)
if err != nil {
Expand All @@ -133,7 +173,9 @@ func main() {
// CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources
// necessary to configure Prometheus to scrape metrics from this operator.
services := []*v1.Service{service}
_, err = metrics.CreateServiceMonitors(cfg, namespace, services)

// The ServiceMonitor is created in the same namespace where the operator is deployed
_, err = metrics.CreateServiceMonitors(cfg, operatorNs, services)
if err != nil {
log.Info("Could not create ServiceMonitor object", "error", err.Error())
// If this operator is deployed to a cluster without the prometheus-operator running, it will return
Expand All @@ -142,32 +184,26 @@ func main() {
log.Info("Install prometheus-operator in your cluster to create ServiceMonitor objects", "error", err.Error())
}
}

log.Info("Starting the Cmd.")

// Start the Cmd
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
log.Error(err, "Manager exited non-zero")
os.Exit(1)
}
}

// serveCRMetrics gets the Operator/CustomResource GVKs and generates metrics based on those types.
// It serves those metrics on "http://metricsHost:operatorMetricsPort".
func serveCRMetrics(cfg *rest.Config) error {
// Below function returns filtered operator/CustomResource specific GVKs.
// For more control override the below GVK list with your own custom logic.
func serveCRMetrics(cfg *rest.Config, operatorNs string) error {
// The function below returns a list of filtered operator/CR specific GVKs. For more control, override the GVK list below
// with your own custom logic. Note that if you are adding third party API schemas, probably you will need to
// customize this implementation to avoid permissions issues.
filteredGVK, err := k8sutil.GetGVKsFromAddToScheme(apis.AddToScheme)
if err != nil {
return err
}
// Get the namespace the operator is currently deployed in.
operatorNs, err := k8sutil.GetOperatorNamespace()

// The metrics will be generated from the namespaces which are returned here.
// NOTE that passing nil or an empty list of namespaces in GenerateAndServeCRMetrics will result in an error.
ns, err := kubemetrics.GetNamespacesForMetrics(operatorNs)
if err != nil {
return err
}
// To generate metrics in other namespaces, add the values below.
ns := []string{operatorNs}

// Generate and serve custom resource specific metrics.
err = kubemetrics.GenerateAndServeCRMetrics(cfg, ns, filteredGVK, metricsHost, operatorMetricsPort)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion deploy/00-namespace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ kind: Namespace
metadata:
labels:
app.kubernetes.io/name: keda
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda
2 changes: 1 addition & 1 deletion deploy/01-service_account.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: keda-operator
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-operator
namespace: keda
11 changes: 9 additions & 2 deletions deploy/10-cluster_role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: ClusterRole
metadata:
labels:
app.kubernetes.io/name: keda-operator
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
creationTimestamp: null
name: keda-operator
Expand All @@ -28,6 +28,7 @@ rules:
- deployments
- deployments/finalizers
- replicasets
- statefulsets
verbs:
- '*'
- apiGroups:
Expand All @@ -44,7 +45,7 @@ rules:
- get
- create
- apiGroups:
- keda.k8s.io
- keda.sh
resources:
- '*'
verbs:
Expand All @@ -55,3 +56,9 @@ rules:
- horizontalpodautoscalers
verbs:
- '*'
- apiGroups:
- "*"
resources:
- "*/scale"
verbs:
- "*"
2 changes: 1 addition & 1 deletion deploy/11-role_binding.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/name: keda-operator
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-operator
roleRef:
Expand Down
4 changes: 2 additions & 2 deletions deploy/12-operator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ metadata:
labels:
app: keda-operator
app.kubernetes.io/name: keda-operator
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/component: operator
app.kubernetes.io/part-of: keda-operator
name: keda-operator
Expand All @@ -23,7 +23,7 @@ spec:
serviceAccountName: keda-operator
containers:
- name: keda-operator
image: docker.io/kedacore/keda:1.3.0
image: docker.io/kedacore/keda:2.0.0-alpha1
command:
- keda
args:
Expand Down
2 changes: 1 addition & 1 deletion deploy/20-metrics-cluster_role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: ClusterRole
metadata:
labels:
app.kubernetes.io/name: keda-external-metrics-reader
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
creationTimestamp: null
name: keda-external-metrics-reader
Expand Down
6 changes: 3 additions & 3 deletions deploy/21-metrics-role_binding.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/name: keda-system-auth-delegator
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda:system:auth-delegator
roleRef:
Expand All @@ -20,7 +20,7 @@ kind: RoleBinding
metadata:
labels:
app.kubernetes.io/name: keda-auth-reader
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-auth-reader
namespace: kube-system
Expand All @@ -38,7 +38,7 @@ kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/name: keda-hpa-controller-external-metrics
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-hpa-controller-external-metrics
roleRef:
Expand Down
4 changes: 2 additions & 2 deletions deploy/22-metrics-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ metadata:
labels:
app: keda-metrics-apiserver
app.kubernetes.io/name: keda-metrics-apiserver
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-metrics-apiserver
namespace: keda
Expand All @@ -22,7 +22,7 @@ spec:
serviceAccountName: keda-operator
containers:
- name: keda-metrics-apiserver
image: docker.io/kedacore/keda-metrics-adapter:1.3.0
image: docker.io/kedacore/keda-metrics-adapter:2.0.0-alpha1
imagePullPolicy: Always
env:
- name: WATCH_NAMESPACE
Expand Down
2 changes: 1 addition & 1 deletion deploy/23-metrics-service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ kind: Service
metadata:
labels:
app.kubernetes.io/name: keda-metrics-apiserver
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: keda-metrics-apiserver
namespace: keda
Expand Down
2 changes: 1 addition & 1 deletion deploy/24-metrics-api_service.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: APIService
metadata:
labels:
app.kubernetes.io/name: v1beta1.external.metrics.k8s.io
app.kubernetes.io/version: "1.3.0"
app.kubernetes.io/version: "2.0.0-alpha1"
app.kubernetes.io/part-of: keda-operator
name: v1beta1.external.metrics.k8s.io
spec:
Expand Down
Loading