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

Propose Keptn for Sandbox #250

Closed
wants to merge 11 commits into from
306 changes: 306 additions & 0 deletions proposals/keptn.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,306 @@
=== Keptn CNCF Incubator Project Proposal

*Name of Project:* keptn

*Description:*

Keptn is a control plane for continuous delivery and operations providing
a declarative approach towards day 1 to day n operations of cloud-native
applications.

Keptn is built based on the framework used internally at Dynatrace which allows
us to run hundreds of production cluster without a dedicated operations team in
a fully automated "NoOps" approach.

Keptn solves the problem that traditional release pipelines are stitched together
by point-to-point integrations between a number of tools. The average
pipeline and operations automation toolchain consists of at least 7+ tools that
are integrated. The current approach of building toolchains comes with a number
of problems:

* Integrations are hard to maintain as they are spread across the entire
infrastructure
* Onboarding a new service results in a lot of manual work for pipeline and
operations automation definition
* Most toolchains today make it hard to define enterprise-wide best practices
for application delivery that can simply be applied across different
applications.

Keptn solves these problems by providing a configurable control plane to define
day 1 to day n operations. The design is inspired by SDN stacks:

* The application stack defines how the delivery and operations process should
work using a shipyard file. Shipyard files define stages, release strategies,
testing strategies, etc.
* Keptn than provides a control plane that manages a GitOps repository for the
stages defined in the shipyard file as well as managing Kubernetes namespaces
and yaml files for services. Additionally, keptn uses a set of well-defined
lifecycle events for each potential event that services can subscribe to. All
events are defined as cloud events.
* The integration layer used knative services to connect the Keptn control plane
to all required tools to manage application delivery and operations. The
configuration which tools to use is defined in a keptn uniform file.

The approach of keptn has a number of advantages over traditional delivery pipelines and operation automation stacks:

* The behavior of a delivery and automation workflow can be easily changed and
is managed in a central place.
* Using shipyard and uniform files the "how" is decoupled from the "what" which
enables greater flexibility in defining operational procedures.
* The declarative approach allows to even change automation at runtime without
any need for manual reconfiguration or touching tool integrations.

In the current version keptn focussed on three major use cases for day 1 and day
2 operations:

* Declarative multistage delivery pipelines with automated quality gates.
Uniform files allow creating any multi-stage pipeline including defining the
deployment strategy (e.g. direct, blue/green) and definition of testing strategy
for propagation.
* Deployment-based self-healing by automatically rolling back blue/green
deployment in case of problems without the need for manual intervention.
* Event-driven runbook automation for auto-remediation and self-healing at the
application level.

You can read more about the high-level goals of keptn in
https://medium.com/keptn/how-your-delivery-pipeline-will-become-your-next-big-legacy-code-challenge-4e520999693f?source=friends_link&sk=6bf8dcbff647e3912ca381a39035bf7a[this
blog post]


**Statement on alignment with CNCF mission:**

The Keptn project provides an easy and standardized way to deliver and operate
cloud-native applications. Kubernetes has massively simplified this process from
a platform perspective. Keptn provides the same simplicity at the application
level using a declarative approach to delivery and operations.

Keptn also builds on top of exiting CNCF projects:

- Kubernetes is used as the core runtime and deployment platform
- Istio and Envoy are used for traffic routing and deployment strategies (blue/green,
canary)
- Prometheus is used as a monitoring source
- Helm is used for deployment definition
- CloudEvents are the basis for all application lifecycle-related events

*Roadmap:*

* May 2019 - v 0.2.5. Latest version of Keptn providing all core functionality
to support key use cases. First version of keptn's bridge UI.
* September 2019 - v 0.3.0. Improved version of keptn's brige UI. Infrastructure fully upgraded to
latest version of knative. Removal of Third Party tooling dependency (Jenkins, ...). Keptn
operator. Improved uniform support with first version of uniform hub.
* December 2019 - v 0.4.0. Support for multi-cluster deployment. Improved
supporte across multiple Kubernetes distributions.
* June 2020 - planned v 1.0 release. This is the planned releases date for the
first version that has been hardened after multiple production deployments in
different settings.


*Sponsors from TOC:*

No sponsors yet.

*Preferred maturity level:* Sandbox

*License:* Apache 2.0

*Source control:* GitHub https://github.com/keptn

*External Dependencies:*

External dependencies of keptn are listed below:

(Will be updated based on the latest release, before presenting to TOC)

|===
|*Software*|*License*|*Project Page*
|curl|MIT/X|https://curl.haxx.se/[https://curl.haxx.se/]
|gcloud|Apache-2.0|https://github.com/google-cloud-sdk/google-cloud-sdk[https://github.com/google-cloud-sdk/google-cloud-sdk]
|git|GPLv2|https://git-scm.com/[https://git-scm.com/]
|helm|Apache-2.0|https://helm.sh/[https://helm.sh/]
|jq|MIT|https://stedolan.github.io/jq/[https://stedolan.github.io/jq/]
|kubectl|Apache-2.0|https://github.com/kubernetes/kubernetes[https://github.com/kubernetes/kubernetes]
|wget|GPLv3|https://github.com/mirror/wget[https://github.com/mirror/wget]
|yq|MIT|https://mikefarah.github.io/yq/[https://mikefarah.github.io/yq/]
|===

External dependencies of Go projects are listed below:
|===
|*Software*|*License*|*Project Page*
|cloudevents/sdk-go|Apache-2.0|https://github.com/cloudevents/sdk-go[https://github.com/cloudevents/sdk-go]
|cobra|Apache-2.0|https://github.com/spf13/cobra[https://github.com/spf13/cobra]
|docker-credential-helpers|MIT|https://github.com/docker/docker-credential-helpers[https://github.com/docker/docker-credential-helpers]
|go-github|BSD-3-Clause|https://github.com/google/go-github[https://github.com/google/go-github]
|go-homedir|MIT|https://github.com/mitchellh/go-homedir[https://github.com/mitchellh/go-homedir]
|go-lang|BSD|https://github.com/golang/go[https://github.com/golang/go]
|uuid|BSD-3-Clause|https://github.com/google/uuid[https://github.com/google/uuid]
|viper|MIT|https://github.com/spf13/viper[https://github.com/spf13/viper]
|websocket|BSD-2-Clause|https://github.com/gorilla/websocket[https://github.com/gorilla/websocket]
|yaml.v2|Apache-2.0|https://github.com/go-yaml/yaml[https://github.com/go-yaml/yaml]
|===

Go projects are:

* keptn/cli
* dynatrace-service
* deploy-service

External dependencies of all TypeScript projects are listed below:
|===
|*Software*|*License*|*Project Page*
|axios|MIT|https://www.npmjs.com/package/axios[https://www.npmjs.com/package/axios]
|base64url|MIT|https://www.npmjs.com/package/base64url[https://www.npmjs.com/package/base64url]
|body-parser|MIT|https://www.npmjs.com/package/body-parser[https://www.npmjs.com/package/body-parser]
|buffer-equal-constant-time|BSD-3-Clause|https://www.npmjs.com/package/buffer-equal-constant-time[https://www.npmjs.com/package/buffer-equal-constant-time]
|camelize|MIT|https://www.npmjs.com/package/camelize[https://www.npmjs.com/package/camelize]
|chai|MIT|https://www.npmjs.com/package/chai[https://www.npmjs.com/package/chai]
|cloudevent|Apache-2.0|https://www.npmjs.com/package/cloudevent[https://www.npmjs.com/package/cloudevent]
|cloudevents-sdk|Apache-2.0|https://www.npmjs.com/package/cloudevents-sdk[https://www.npmjs.com/package/cloudevents-sdk]
|copyfiles|MIT|https://www.npmjs.com/package/copyfiles[https://www.npmjs.com/package/copyfiles]
|crypto|ISC|https://www.npmjs.com/package/crypto[https://www.npmjs.com/package/crypto]
|decamelize|MIT|https://www.npmjs.com/package/decamelize[https://www.npmjs.com/package/decamelize]
|express|MIT|https://www.npmjs.com/package/express[https://www.npmjs.com/package/express]
|express-ws|BSD-2-Clause|https://www.npmjs.com/package/express-ws[https://www.npmjs.com/package/express-ws]
|express-ws-routes|MIT|https://www.npmjs.com/package/express-ws-routes[https://www.npmjs.com/package/express-ws-routes]
|github-api|BSD-3-Clause-Clear|https://www.npmjs.com/package/github-api[https://www.npmjs.com/package/github-api]
|inversify|MIT|https://www.npmjs.com/package/inversify[https://www.npmjs.com/package/inversify]
|inversify-express-utils|MIT|https://www.npmjs.com/package/inversify-express-utils[https://www.npmjs.com/package/inversify-express-utils]
|jenkins|MIT|https://www.npmjs.com/package/jenkins[https://www.npmjs.com/package/jenkins]
|js-base64|BSD-3-Clause|https://www.npmjs.com/package/js-base64[https://www.npmjs.com/package/js-base64]
|jsonwebtoken|MIT|https://www.npmjs.com/package/jsonwebtoken[https://www.npmjs.com/package/jsonwebtoken]
|kubernetes-client|MIT|https://www.npmjs.com/package/kubernetes-client[https://www.npmjs.com/package/kubernetes-client]
|mocha|MIT|https://www.npmjs.com/package/mocha[https://www.npmjs.com/package/mocha]
|moment|MIT|https://www.npmjs.com/package/moment[https://www.npmjs.com/package/moment]
|mustache|MIT|https://www.npmjs.com/package/mustache[https://www.npmjs.com/package/mustache]
|nock|MIT|https://www.npmjs.com/package/nock[https://www.npmjs.com/package/nock]
|nodejs-base64|Unlicense|https://www.npmjs.com/package/nodejs-base64[https://www.npmjs.com/package/nodejs-base64]
|nodemon|MIT|https://www.npmjs.com/package/nodemon[https://www.npmjs.com/package/nodemon]
|nyc|ISC|https://www.npmjs.com/package/nyc[https://www.npmjs.com/package/nyc]
|postinstall|MIT|https://www.npmjs.com/package/postinstall[https://www.npmjs.com/package/postinstall]
|reflect-metadata|Apache-2.0|https://www.npmjs.com/package/reflect-metadata[https://www.npmjs.com/package/reflect-metadata]
|sinon|BSD-3-Clause|https://www.npmjs.com/package/sinon[https://www.npmjs.com/package/sinon]
|snyk|Apache-2.0|https://www.npmjs.com/package/snyk[https://www.npmjs.com/package/snyk]
|socket.io|MIT|https://www.npmjs.com/package/socket.io[https://www.npmjs.com/package/socket.io]
|source-map-support|MIT|https://www.npmjs.com/package/source-map-support[https://www.npmjs.com/package/source-map-support]
|swagger-express-ts|MIT|https://www.npmjs.com/package/swagger-express-ts[https://www.npmjs.com/package/swagger-express-ts]
|swagger-ui-dist|Apache-2.0|https://www.npmjs.com/package/swagger-ui-dist[https://www.npmjs.com/package/swagger-ui-dist]
|ts-base-64|ISC|https://www.npmjs.com/package/ts-base-64[https://www.npmjs.com/package/ts-base-64]
|tslint|Apache-2.0|https://www.npmjs.com/package/tslint[https://www.npmjs.com/package/tslint]
|tslint-config-airbnb|Apache-2.0|https://www.npmjs.com/package/tslint-config-airbnb[https://www.npmjs.com/package/tslint-config-airbnb]
|ts-node|MIT|https://www.npmjs.com/package/ts-node[https://www.npmjs.com/package/ts-node]
|typescript|Apache-2.0|https://www.npmjs.com/package/typescript[https://www.npmjs.com/package/typescript]
|uuid|MIT|https://www.npmjs.com/package/uuid[https://www.npmjs.com/package/uuid]
|verify-github-webhook|MIT|https://www.npmjs.com/package/verify-github-webhook[https://www.npmjs.com/package/verify-github-webhook]
|ws|MIT|https://www.npmjs.com/package/ws[https://www.npmjs.com/package/ws]
|yamljs|MIT|https://www.npmjs.com/package/yamljs[https://www.npmjs.com/package/yamljs]
|===

TypeScript projects are:

* github-service
* jenkins-service
* pitometer-service
* servicenow-service
* keptn/auth
* keptn/control
* keptn/eventbroker
* keptn/eventbroker-ext

External dependencies of JavaScript projects are listed below:
|===
|*Software*|*License*|*Project Page*
|axios|MIT|https://www.npmjs.com/package/axios[https://www.npmjs.com/package/axios]
|babel-eslint|MIT|https://www.npmjs.com/package/babel-eslint[https://www.npmjs.com/package/babel-eslint]
|body-parser|MIT|https://www.npmjs.com/package/body-parser[https://www.npmjs.com/package/body-parser]
|bootstrap|MIT|https://www.npmjs.com/package/bootstrap[https://www.npmjs.com/package/bootstrap]
|bootstrap-vue|MIT|https://www.npmjs.com/package/bootstrap[https://www.npmjs.com/package/bootstrap]
|cookie-parser|MIT|https://www.npmjs.com/package/cookie-parser[https://www.npmjs.com/package/cookie-parser]
|core-js|MIT|https://www.npmjs.com/package/core-js[https://www.npmjs.com/package/core-js]
|debug|MIT|https://www.npmjs.com/package/debug[https://www.npmjs.com/package/debug]
|eslint|MIT|https://www.npmjs.com/package/eslint[https://www.npmjs.com/package/eslint]
|eslint-plugin-vue|MIT|https://www.npmjs.com/package/eslint-plugin-vue[https://www.npmjs.com/package/eslint-plugin-vue]
|express|MIT|https://www.npmjs.com/package/express[https://www.npmjs.com/package/express]
|http-errors|MIT|https://www.npmjs.com/package/http-errors[https://www.npmjs.com/package/http-errors]
|less|Apache-2.0|https://www.npmjs.com/package/less[https://www.npmjs.com/package/less]
|less-loader|MIT|https://www.npmjs.com/package/less-loader[https://www.npmjs.com/package/less-loader]
|momen|MIT|https://www.npmjs.com/package/moment[https://www.npmjs.com/package/moment]
|morgan|MIT|https://www.npmjs.com/package/morgan[https://www.npmjs.com/package/morgan]
|vue|MIT|https://www.npmjs.com/package/vue[https://www.npmjs.com/package/vue]
|vue-router|MIT|https://www.npmjs.com/package/vue-router[https://www.npmjs.com/package/vue-router]
|vue-template-compiler|MIT|https://www.npmjs.com/package/vue-template-compiler[https://www.npmjs.com/package/vue-template-compiler]
|vuex|MIT|https://www.npmjs.com/package/vuex[https://www.npmjs.com/package/vuex]
|===

JavaScript projects are:

* bridge

External dependencies of Ballerina projects are listed below:
|===
|*Software*|*License*|*Project Page*
|ballerina-lang|Apache-2.0|https://github.com/ballerina-platform/ballerina-lang[https://github.com/ballerina-platform/ballerina-lang]
|===

Ballerina projects are:

* slack-service

External dependencies of the jenkins-service are listed below:
|===
|*Software*|*License*|*Project Page*
|Jenkins|MIT|https://jenkins.io/
|_Jenkins Plugins:_| |
|credentials-binding|MIT|https://github.com/jenkinsci/credentials-binding-plugin[https://github.com/jenkinsci/credentials-binding-plugin]
|git|MIT|https://github.com/jenkinsci/git-plugin[https://github.com/jenkinsci/git-plugin]
|github-branch-source|MIT|https://github.com/jenkinsci/github-branch-source-plugin[https://github.com/jenkinsci/github-branch-source-plugin]
|google-oauth-plugin|Apache-2.0|https://github.com/jenkinsci/google-oauth-plugin[https://github.com/jenkinsci/google-oauth-plugin]
|google-source-plugin|Apache-2.0|https://github.com/jenkinsci/google-source-plugin[https://github.com/jenkinsci/google-source-plugin]
|kubernetes|Apache-2.0|https://github.com/jenkinsci/kubernetes-plugin[https://github.com/jenkinsci/kubernetes-plugin]
|kubernetes-credentials-provider|MIT|https://github.com/jenkinsci/kubernetes-credentials-provider-plugin[https://github.com/jenkinsci/kubernetes-credentials-provider-plugin]
|performance|MIT|https://github.com/jenkinsci/performance-plugin[https://github.com/jenkinsci/performance-plugin]
|performance-signature-dynatracesaas|Apache-2.0|https://github.com/jenkinsci/performance-signature-dynatrace-plugin[https://github.com/jenkinsci/performance-signature-dynatrace-plugin]
|performance-signature-ui|Apache-2.0|https://github.com/jenkinsci/performance-signature-dynatrace-plugin[https://github.com/jenkinsci/performance-signature-dynatrace-plugin]
|workflow-aggregator|n/a|https://github.com/jenkinsci/workflow-aggregator-plugin[https://github.com/jenkinsci/workflow-aggregator-plugin]
|workflow-job|n/a|https://github.com/jenkinsci/workflow-aggregator-plugin[https://github.com/jenkinsci/workflow-aggregator-plugin]
|_Container tool:_| |
|tini|MIT|https://github.com/krallin/tini[https://github.com/krallin/tini]
|===

*Maintainers:*

* Alois Reitbauer (Dynatrace)
* Dirk Wallerstorfer (Dynatrace)

*Infrastructure requests (CI / CNCF Cluster):* none


*Communication Channels:*

* Slack: https://keptn.slack.com/
* Issue tracker: https://github.com/keptn/keptn/issues

*Website:* https://keptn.sh/

*Release methodology and mechanics:*

keptn uses link:https://semver.org/[semantic versioning] for releases. Releases
are announced using GitHub. We aim at releasing updates every spring (two weeks)
while following a quarterly release cycle for major features.

*Social media accounts:*

* Twitter: https://twitter.com/keptnproject

*Existing sponsorship*: Dynatrace

*Adopters*:
* Dynatrace

*Community size:*

68 stars

7 contributors

15 forks