├── .dockerignore
├── .editorconfig
├── .gitignore
├── CONTRIBUTING.md
├── DCO
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── _scripts
├── README.md
└── gutenbuild
├── charts
└── workflow
│ ├── Chart.yaml
│ ├── requirements.yaml
│ ├── templates
│ └── objectstorage-secret.yaml
│ └── values.yaml
├── mkdocs.yml
├── requirements.txt
├── src
├── _includes
│ └── install-workflow.md
├── applications
│ ├── deploying-apps.md
│ ├── domains-and-routing.md
│ ├── inter-app-communication.md
│ ├── managing-app-configuration.md
│ ├── managing-app-lifecycle.md
│ ├── managing-app-processes.md
│ ├── managing-resource-limits.md
│ ├── ssl-certificates.md
│ ├── using-buildpacks.md
│ ├── using-docker-images.md
│ └── using-dockerfiles.md
├── changelogs
│ ├── v2.0.0.md
│ ├── v2.1.0.md
│ ├── v2.10.0.md
│ ├── v2.11.0.md
│ ├── v2.12.0.md
│ ├── v2.13.0.md
│ ├── v2.14.0.md
│ ├── v2.15.0.md
│ ├── v2.16.0.md
│ ├── v2.17.0.md
│ ├── v2.18.0.md
│ ├── v2.2.0.md
│ ├── v2.3.0.md
│ ├── v2.4.0.md
│ ├── v2.4.1.md
│ ├── v2.4.2.md
│ ├── v2.5.0.md
│ ├── v2.6.0.md
│ ├── v2.7.0.md
│ ├── v2.8.0.md
│ ├── v2.9.0.md
│ └── v2.9.1.md
├── contributing
│ ├── community.md
│ ├── conduct.md
│ ├── design-documents.md
│ ├── development-environment.md
│ ├── maintainers.md
│ ├── overview.md
│ ├── submitting-a-pull-request.md
│ ├── testing.md
│ └── triaging-issues.md
├── diagrams
│ ├── Application_Layout.png
│ ├── Diagrams.graffle
│ ├── Document_Overview.png
│ ├── Ecosystem_Basic.png
│ ├── Ecosystem_Complex.png
│ ├── Git_Push_Flow.png
│ ├── README.md
│ ├── Workflow_Detail.png
│ └── Workflow_Overview.png
├── index.md
├── installing-workflow
│ ├── chart-provenance.md
│ ├── configuring-object-storage.md
│ ├── configuring-postgres.md
│ ├── configuring-registry.md
│ ├── download-linux-brightgreen.svg
│ ├── download-osx-brightgreen.svg
│ ├── experimental-native-ingress.md
│ ├── index.md
│ └── system-requirements.md
├── managing-workflow
│ ├── configuring-dns.md
│ ├── configuring-load-balancers.md
│ ├── deploy-hooks.md
│ ├── extending-workflow.md
│ ├── platform-logging.md
│ ├── platform-monitoring.md
│ ├── platform-ssl.md
│ ├── production-deployments.md
│ ├── security-considerations.md
│ ├── tuning-component-settings.md
│ └── upgrading-workflow.md
├── quickstart
│ ├── deploy-an-app.md
│ ├── index.md
│ ├── install-cli-tools.md
│ └── provider
│ │ ├── aws
│ │ ├── boot.md
│ │ ├── dns.md
│ │ └── install-aws.md
│ │ ├── azure-acs
│ │ ├── boot.md
│ │ ├── dns.md
│ │ ├── images
│ │ │ ├── cloudshell.png
│ │ │ ├── step1.png
│ │ │ ├── step2.png
│ │ │ ├── step3.png
│ │ │ ├── step4.png
│ │ │ ├── step5.png
│ │ │ └── step6.png
│ │ └── install-azure-acs.md
│ │ ├── gke
│ │ ├── boot.md
│ │ ├── dns.md
│ │ ├── images
│ │ │ ├── first-kubernetes-cluster-gke-2.png
│ │ │ ├── first-kubernetes-cluster-gke-3.png
│ │ │ ├── first-kubernetes-cluster-gke-select.png
│ │ │ ├── gke-cluster-sizing.png
│ │ │ ├── gke-create-container-cluster.png
│ │ │ └── gke-node-version.jpg
│ │ └── install-gke.md
│ │ └── minikube
│ │ ├── boot.md
│ │ ├── dns.md
│ │ └── install-minikube.md
├── reference-guide
│ ├── controller-api
│ │ ├── v2.0.md
│ │ ├── v2.1.md
│ │ ├── v2.2.md
│ │ └── v2.3.md
│ ├── creating-a-self-signed-ssl-certificate.md
│ ├── migration.md
│ └── terms.md
├── roadmap
│ ├── planning-process.md
│ ├── releases.md
│ └── roadmap.md
├── security
│ └── 1d6a97d0.txt
├── troubleshooting
│ ├── applications.md
│ ├── index.md
│ └── kubectl.md
├── understanding-workflow
│ ├── architecture.md
│ ├── components.md
│ └── concepts.md
└── users
│ ├── cli.md
│ ├── registration.md
│ └── ssh-keys.md
└── themes
└── deis
├── base.html
├── bower.json
├── favicon.ico
├── footer.html
├── nav.html
├── offcanvas.html
├── search.html
├── sidebar.html
├── sitemap.xml
├── static
├── css
│ ├── styles.css
│ └── styles.css.map
├── favicon.ico
├── fonts
│ ├── FontAwesome.otf
│ ├── bootstrap
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ ├── fontawesome-webfont.woff2
│ ├── klinicslabbook-webfont.eot
│ ├── klinicslabbook-webfont.svg
│ ├── klinicslabbook-webfont.ttf
│ ├── klinicslabbook-webfont.woff
│ ├── klinicslabbook-webfont.woff2
│ ├── klinicslabmedium-webfont.eot
│ ├── klinicslabmedium-webfont.svg
│ ├── klinicslabmedium-webfont.ttf
│ ├── klinicslabmedium-webfont.woff
│ └── klinicslabmedium-webfont.woff2
├── img
│ ├── 404.png
│ ├── aws-ec2.png
│ ├── blog-social.png
│ ├── cover-image.png
│ ├── deis-graphic.png
│ ├── deis-logo.png
│ ├── deis_builder.png
│ ├── deis_logo.png
│ ├── favicon.ico
│ ├── favicon.png
│ ├── footer-engine-yard.png
│ ├── footer-logo.png
│ ├── fork.png
│ ├── glyphs.png
│ ├── large-social.png
│ ├── logo.png
│ ├── mag_glass.png
│ ├── menu-logo.png
│ ├── social.png
│ └── svg
│ │ ├── circle.svg
│ │ ├── footer-engine-yard.svg
│ │ ├── footer-logo.svg
│ │ ├── helm-logo.svg
│ │ ├── logo.svg
│ │ ├── square.svg
│ │ ├── steward-logo.svg
│ │ ├── triangle.svg
│ │ └── workflow-logo.svg
├── js
│ ├── adjustments.js
│ ├── foundation.dropdown.js
│ ├── foundation.js
│ ├── foundation.offcanvas.js
│ ├── headroom.min.js
│ ├── jquery-1.12.4.min.js
│ └── mc-validate.js
└── scss
│ ├── _buttons.scss
│ ├── _custom-foundation-settings.scss
│ ├── _doc-content.scss
│ ├── _doc-layout.scss
│ ├── _doc-responsive.scss
│ ├── _doc-sidebar.scss
│ ├── _footer.scss
│ ├── _header.scss
│ ├── _media.scss
│ ├── _mixins.scss
│ ├── _offcanvas.scss
│ ├── _shapes.scss
│ ├── _typography.scss
│ ├── app.css
│ ├── app.css.map
│ ├── app.scss
│ └── fontawesome
│ ├── _animated.scss
│ ├── _bordered-pulled.scss
│ ├── _core.scss
│ ├── _fixed-width.scss
│ ├── _icons.scss
│ ├── _larger.scss
│ ├── _list.scss
│ ├── _mixins.scss
│ ├── _path.scss
│ ├── _rotated-flipped.scss
│ ├── _stacked.scss
│ ├── _variables.scss
│ └── font-awesome.scss
├── theme.conf
└── topbar.html
/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | Dockerfile
3 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: http://EditorConfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 | indent_style = space
11 | indent_size = 4
12 |
13 | [Makefile]
14 | indent_style = tab
15 |
16 | [*.go]
17 | indent_style = tab
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.py[cod]
2 |
3 | # Packages
4 | *.egg
5 | *.egg-info
6 | dist
7 | build
8 | eggs
9 | parts
10 | var
11 | sdist
12 | develop-eggs
13 | .installed.cfg
14 | lib
15 | lib64
16 | bower_components
17 | .sass-cache
18 |
19 | # python virtual environments for testing
20 | venv/
21 |
22 | _build/
23 |
24 | .DS_Store
25 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to Deis
2 |
3 | This project is part of Deis. You can find the latest contribution
4 | guidelines [in our documentation](https://deis.com/docs/workflow/contributing/overview/).
5 |
--------------------------------------------------------------------------------
/DCO:
--------------------------------------------------------------------------------
1 | Developer Certificate of Origin
2 | Version 1.1
3 |
4 | Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
5 | 660 York Street, Suite 102,
6 | San Francisco, CA 94110 USA
7 |
8 | Everyone is permitted to copy and distribute verbatim copies of this
9 | license document, but changing it is not allowed.
10 |
11 |
12 | Developer's Certificate of Origin 1.1
13 |
14 | By making a contribution to this project, I certify that:
15 |
16 | (a) The contribution was created in whole or in part by me and I
17 | have the right to submit it under the open source license
18 | indicated in the file; or
19 |
20 | (b) The contribution is based upon previous work that, to the best
21 | of my knowledge, is covered under an appropriate open source
22 | license and I have the right under that license to submit that
23 | work with modifications, whether created in whole or in part
24 | by me, under the same open source license (unless I am
25 | permitted to submit under a different license), as indicated
26 | in the file; or
27 |
28 | (c) The contribution was provided directly to me by some other
29 | person who certified (a), (b) or (c) and I have not modified
30 | it.
31 |
32 | (d) I understand and agree that this project and the contribution
33 | are public and that a record of the contribution (including all
34 | personal information I submit with it, including my sign-off) is
35 | maintained indefinitely and may be redistributed consistent with
36 | this project or the open source license(s) involved.
37 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.5.1-alpine
2 |
3 | COPY . /app
4 | WORKDIR /app
5 |
6 | RUN pip install -r requirements.txt
7 |
8 | EXPOSE 8000
9 | CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) Microsoft Corporation. All rights reserved.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | # Makefile for MkDocs documentation
2 | #
3 |
4 | # You can set these variables from the command line.
5 | BUILDDIR ?= _build/html
6 | MKDOCS = mkdocs
7 | MKDOCSBUILDOPTS = --clean --strict --verbose
8 | MKDOCSBUILD = $(MKDOCS) build $(MKDOCSBUILDOPTS)
9 | MKDOCSSERVE = $(MKDOCS) serve -a 0.0.0.0:8000
10 |
11 | SHORT_NAME ?= workflow
12 | VERSION ?= git-$(shell git rev-parse --short HEAD)
13 | IMAGE := ${SHORT_NAME}:${VERSION}
14 |
15 | REPO_PATH := github.com/deis/${SHORT_NAME}
16 | DEV_ENV_WORK_DIR := /src/${REPO_PATH}
17 | DEV_ENV_PREFIX := docker run --rm -v ${CURDIR}:${DEV_ENV_WORK_DIR} -w ${DEV_ENV_WORK_DIR} -p 8000:8000
18 | DEV_ENV_CMD := ${DEV_ENV_PREFIX} ${DEV_ENV_IMAGE}
19 |
20 | BUILD_CMD := $(MKDOCSBUILD) --site-dir $(BUILDDIR) && \
21 | echo && \
22 | echo "Build finished. The HTML pages are in $(BUILDDIR)."
23 |
24 | TEST_CMD := grep -q "
Deis Workflow Documentation" _build/html/index.html && \
25 | echo && \
26 | echo "Test finished. The HTML pages are in $(BUILDDIR)."
27 |
28 | build:
29 | $(BUILD_CMD)
30 |
31 | serve:
32 | $(MKDOCSSERVE)
33 |
34 | clean:
35 | rm -rf $(BUILDDIR)/*
36 |
37 | deps:
38 | pip install -r requirements.txt
39 |
40 | test: build
41 | $(TEST_CMD)
42 |
43 | docker-build-docs:
44 | $(DEV_ENV_CMD) ${IMAGE} $(BUILD_CMD)
45 |
46 | docker-test: docker-build-docs
47 | ${DEV_ENV_CMD} ${IMAGE} $(TEST_CMD)
48 |
49 | docker-build:
50 | docker build ${DOCKER_BUILD_FLAGS} -t ${IMAGE} .
51 |
52 | docker-serve:
53 | ${DEV_ENV_CMD} ${IMAGE} $(MKDOCSSERVE)
54 |
55 | run: docker-build docker-serve
--------------------------------------------------------------------------------
/_scripts/README.md:
--------------------------------------------------------------------------------
1 | # Workflow Contrib
2 |
3 | Scripts and tools that are not a core part of Deis Workflow v2.
4 |
--------------------------------------------------------------------------------
/_scripts/gutenbuild:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | set -e
4 | set -x
5 |
6 | build_dest=$1
7 |
8 | # ensure we are on the master branch before building
9 | git checkout master
10 |
11 | PATH=$HOME/.local/bin:$PATH BUILDDIR=${build_dest} make deps build
12 |
13 | # build again, this time to /en/dev
14 | dev_build_dest=$1/en/dev
15 | PATH=$HOME/.local/bin:$PATH BUILDDIR=${dev_build_dest} make deps build
16 |
17 | # also build each version of the docs out to /en/
18 | # NOTE(bacongobbler): do not build any pre-release tags
19 | for tag in $(git tag | grep -v -- "-alpha\|-beta\|-rc"); do
20 | tag_build_dest="$build_dest/en/$tag"
21 | git checkout $tag
22 | PATH=$HOME/.local/bin:$PATH BUILDDIR=${tag_build_dest} make deps build
23 | done
24 |
--------------------------------------------------------------------------------
/charts/workflow/Chart.yaml:
--------------------------------------------------------------------------------
1 | name: workflow
2 | home: https://github.com/deis/workflow
3 | version:
4 | description: Deis Workflow
5 | maintainers:
6 | - name: Deis Team
7 | email: engineering@deis.com
8 |
--------------------------------------------------------------------------------
/charts/workflow/requirements.yaml:
--------------------------------------------------------------------------------
1 | dependencies:
2 | - name: builder
3 | version:
4 | repository: https://charts.deis.com/builder
5 | - name: slugbuilder
6 | version:
7 | repository: https://charts.deis.com/slugbuilder
8 | - name: dockerbuilder
9 | version:
10 | repository: https://charts.deis.com/dockerbuilder
11 | - name: controller
12 | version:
13 | repository: https://charts.deis.com/controller
14 | - name: slugrunner
15 | version:
16 | repository: https://charts.deis.com/slugrunner
17 | - name: database
18 | version:
19 | repository: https://charts.deis.com/database
20 | - name: fluentd
21 | version:
22 | repository: https://charts.deis.com/fluentd
23 | - name: redis
24 | version:
25 | repository: https://charts.deis.com/redis
26 | - name: logger
27 | version:
28 | repository: https://charts.deis.com/logger
29 | - name: minio
30 | version:
31 | repository: https://charts.deis.com/minio
32 | - name: monitor
33 | version:
34 | repository: https://charts.deis.com/monitor
35 | - name: nsqd
36 | version:
37 | repository: https://charts.deis.com/nsqd
38 | - name: registry
39 | version:
40 | repository: https://charts.deis.com/registry
41 | - name: registry-proxy
42 | version:
43 | repository: https://charts.deis.com/registry-proxy
44 | - name: registry-token-refresher
45 | version:
46 | repository: https://charts.deis.com/registry-token-refresher
47 | - name: router
48 | version:
49 | repository: https://charts.deis.com/router
50 | - name: workflow-manager
51 | version:
52 | repository: https://charts.deis.com/workflow-manager
53 |
--------------------------------------------------------------------------------
/charts/workflow/templates/objectstorage-secret.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: objectstorage-keyfile
5 | labels:
6 | heritage: deis
7 | annotations:
8 | deis.io/objectstorage: "{{ .Values.global.storage }}"
9 | type: Opaque
10 | data: {{ if eq .Values.global.storage "gcs"}}
11 | key.json: {{.Values.gcs.key_json}}
12 | builder-bucket: {{.Values.gcs.builder_bucket | b64enc }}
13 | registry-bucket: {{.Values.gcs.registry_bucket | b64enc }}
14 | database-bucket: {{.Values.gcs.database_bucket | b64enc }}{{ else if eq .Values.global.storage "azure"}}
15 | accountname: {{.Values.azure.accountname | b64enc }}
16 | accountkey: {{ .Values.azure.accountkey | b64enc }}
17 | builder-container: {{ .Values.azure.builder_container | b64enc }}
18 | database-container: {{ .Values.azure.database_container | b64enc }}
19 | registry-container: {{ .Values.azure.registry_container | b64enc }}{{ else if eq .Values.global.storage "s3"}}
20 | accesskey: {{ .Values.s3.accesskey | b64enc }}
21 | secretkey: {{ .Values.s3.secretkey | b64enc }}
22 | region: {{ .Values.s3.region | b64enc }}
23 | builder-bucket: {{ .Values.s3.builder_bucket | b64enc }}
24 | registry-bucket: {{.Values.s3.registry_bucket | b64enc }}
25 | database-bucket: {{.Values.s3.database_bucket | b64enc }}{{ else if eq .Values.global.storage "swift"}}
26 | username: {{ .Values.swift.username | b64enc }}
27 | password: {{ .Values.swift.password | b64enc }}
28 | authurl: {{ .Values.swift.authurl | b64enc }}
29 | tenant: {{ .Values.swift.tenant | b64enc }}
30 | authversion: {{ .Values.swift.authversion | b64enc }}
31 | builder-container: {{ .Values.swift.builder_container | b64enc }}
32 | database-container: {{ .Values.swift.database_container | b64enc }}
33 | registry-container: {{ .Values.swift.registry_container | b64enc }}{{else if eq .Values.global.storage "minio"}}
34 | accesskey: OFRaUlkySlJXTVBUNlVNWFI2STU=
35 | secretkey: Z2JzdHJPdm90TU1jZzJzTWZHVWhBNWE2RXQvRUk1QUx0SUhzb2JZaw=={{ end }}
36 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | mkdocs==0.15.3
2 | markdown-checklist==0.4.1
3 | markdown-include==0.5.1
4 |
--------------------------------------------------------------------------------
/src/_includes/install-workflow.md:
--------------------------------------------------------------------------------
1 | ## Check Your Setup
2 |
3 | First check that the `helm` command is available and the version is v2.5.0 or newer.
4 |
5 | ```
6 | $ helm version
7 | Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
8 | Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
9 | ```
10 |
11 | Ensure the `kubectl` client is installed and can connect to your Kubernetes cluster.
12 |
13 | ## Add the Deis Chart Repository
14 |
15 | The Deis Chart Repository contains everything needed to install Deis Workflow onto a Kubernetes cluster, with a single `helm install deis/workflow --namespace deis` command.
16 |
17 | Add this repository to Helm:
18 |
19 | ```
20 | $ helm repo add deis https://charts.deis.com/workflow
21 | ```
22 |
23 | ## Install Deis Workflow
24 |
25 | Now that Helm is installed and the repository has been added, install Workflow by running:
26 |
27 | ```
28 | $ helm install deis/workflow --namespace deis
29 | ```
30 |
31 | If you are using [RBAC](https://kubernetes.io/docs/admin/authorization/rbac/):
32 |
33 | ```
34 | $ helm install deis/workflow --namespace deis --set global.use_rbac=true
35 | ```
36 |
37 | Helm will install a variety of Kubernetes resources in the `deis` namespace.
38 | Wait for the pods that Helm launched to be ready. Monitor their status by running:
39 |
40 | ```
41 | $ kubectl --namespace=deis get pods
42 | ```
43 |
44 | If it's preferred to have `kubectl` automatically update as the pod states change, run (type Ctrl-C to stop the watch):
45 |
46 | ```
47 | $ kubectl --namespace=deis get pods -w
48 | ```
49 |
50 | Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the
51 | installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will
52 | automatically restart it.
53 |
54 | Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
55 |
56 | ```
57 | $ kubectl --namespace=deis get pods
58 | NAME READY STATUS RESTARTS AGE
59 | deis-builder-hy3xv 1/1 Running 5 5m
60 | deis-controller-g3cu8 1/1 Running 5 5m
61 | deis-database-rad1o 1/1 Running 0 5m
62 | deis-logger-fluentd-1v8uk 1/1 Running 0 5m
63 | deis-logger-fluentd-esm60 1/1 Running 0 5m
64 | deis-logger-sm8b3 1/1 Running 0 5m
65 | deis-minio-4ww3t 1/1 Running 0 5m
66 | deis-registry-asozo 1/1 Running 1 5m
67 | deis-router-k1ond 1/1 Running 0 5m
68 | deis-workflow-manager-68nu6 1/1 Running 0 5m
69 | ```
70 |
71 | Once all of the pods are in the `READY` state, Deis Workflow is up and running!
72 |
73 | Next, [configure dns](dns.md) so you can register your first user and deploy an application.
74 |
--------------------------------------------------------------------------------
/src/applications/domains-and-routing.md:
--------------------------------------------------------------------------------
1 | ## Domains and Routing
2 |
3 | You can use `deis domains` to add or remove custom domains to the application:
4 |
5 | $ deis domains:add hello.bacongobbler.com
6 | Adding hello.bacongobbler.com to finest-woodshed... done
7 |
8 | Once that's done, you can go into a DNS registrar and set up a CNAME from the new
9 | appname to the old one:
10 |
11 | $ dig hello.deisapp.com
12 | [...]
13 | ;; ANSWER SECTION:
14 | hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.deisapp.com.
15 | finest-woodshed.deisapp.com. 270 IN A 172.17.8.100
16 |
17 | !!! note
18 | Setting a CNAME for a root domain can cause issues. Setting an @ record
19 | to be a CNAME causes all traffic to go to the other domain, including mail and the SOA
20 | ("start-of-authority") records. It is highly recommended that you bind a subdomain to
21 | an application, however you can work around this by pointing the @ record to the
22 | address of the load balancer (if any).
23 |
24 | To add or remove the application from the routing mesh, use `deis routing`:
25 |
26 | $ deis routing:disable
27 | Disabling routing for finest-woodshed... done
28 |
29 | This will make the application unreachable through the [Router][], but the application is still
30 | reachable internally through its [Kubernetes Service][service]. To re-enable routing:
31 |
32 | $ deis routing:enable
33 | Enabling routing for finest-woodshed... done
34 |
35 |
36 | [router]: ../understanding-workflow/components.md#router
37 | [service]: ../reference-guide/terms.md#service
38 |
--------------------------------------------------------------------------------
/src/applications/inter-app-communication.md:
--------------------------------------------------------------------------------
1 | ## Inter-app Communication
2 |
3 | A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Deis Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Deis Workflow router. See [Deis Blog: Private Applications on Workflow](https://deis.com/blog/2016/private-applications-on-deis-workflow/) for more details, which walks through an example of removing an app from the router.
4 |
5 | ### DNS Service Discovery
6 |
7 | Deis Workflow supports deploying a single app composed of a system of processes. Each Deis Workflow app communicates on a single port, so communicating with another Workflow app means finding that app's address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a [Kubernetes Service](https://kubernetes.io/docs/user-guide/services/) for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Deis Workflow apps, then, can simply send requests to the domain name given to the service, which is "app-name.app-namespace".
8 |
--------------------------------------------------------------------------------
/src/applications/managing-resource-limits.md:
--------------------------------------------------------------------------------
1 | ## Managing Application Resource Limits
2 |
3 | Deis Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to
4 | Kubernetes as a requests and limits. Which means you guarantee amount of resource for a process as well as limit
5 | the process from using more than .
6 | By default, Kubernetes will set equal to if we don't explicitly set value. Please keep in mind that `0 <= requests <= limits`.
7 |
8 | ## Limiting Memory
9 |
10 | If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application
11 | processes into the cluster!
12 |
13 | Available units for memory are:
14 |
15 | | Unit | Amount |
16 | | --- | --- |
17 | | B | Bytes |
18 | | K | KiB (Power of 2) |
19 | | M | MiB (Power of 2) |
20 | | G | GiB (Power of 2) |
21 |
22 | !!! important
23 | The minimum memory limit allowed is 4MiB.
24 |
25 | Use `deis limits:set =` to restrict memory by process type, where value can be or / format :
26 |
27 | ```
28 | $ deis limits:set web=64M
29 | Applying limits... done
30 |
31 | === indoor-whitecap Limits
32 |
33 | --- Memory
34 | web 64M
35 |
36 | --- CPU
37 | Unlimited
38 |
39 | $ deis limits:set cmd=32M/64M
40 | Applying limits... done
41 |
42 | === outdoor-whitecap Limits
43 |
44 | --- Memory
45 | cmd 32M/64M
46 |
47 | --- CPU
48 | Unlimited
49 | ```
50 |
51 | If you would like to remove any configured memory limits use `deis limits:unset web`:
52 |
53 | ```
54 | $ deis limits:unset web
55 | Applying limits... done
56 |
57 | === indoor-whitecap Limits
58 |
59 | --- Memory
60 | Unlimited
61 |
62 | --- CPU
63 | Unlimited
64 | ```
65 |
66 | ## Limiting CPU
67 |
68 | You can also use `deis limits:set = --cpu` to restrict CPU shares, where value can be or
69 | / format. CPU shares are tracked in milli-cores. One CPU core is equivalent to 1000 milli-cores.
70 | To dedicate half a core to your process, you would need 500 milli-cores or 500m.
71 |
72 | | Unit | Amount |
73 | | --- | --- |
74 | | 1000m | 1000 milli-cores == 100% CPU core |
75 | | 500m | 500 milli-cores == 50% CPU core |
76 | | 250m | 250 milli-cores == 25% CPU core |
77 | | 100m | 100 milli-cores == 10% CPU core |
78 |
79 | ```
80 | $ deis limits:set web=250m --cpu
81 | Applying limits... done
82 |
83 | === indoor-whitecap Limits
84 |
85 | --- Memory
86 | web 64M
87 |
88 | --- CPU
89 | web 250m
90 |
91 | $ deis limits:set web=1500m/2000m --cpu
92 | Applying limits... done
93 |
94 | === indoor-whitecap Limits
95 |
96 | --- Memory
97 | web 64M
98 |
99 | --- CPU
100 | web 1500m/2000m
101 | ```
102 |
103 | You can verify the CPU and memory limits by inspecting the application process Pod with `kubectl`:
104 |
105 | ```
106 | $ deis ps
107 | === indoor-whitecap Processes
108 | --- web:
109 | indoor-whitecap-v14-web-8slcj up (v14)
110 | $ kubectl --namespace=indoor-whitecap describe po indoor-whitecap-v14-web-8slcj
111 | Name: indoor-whitecap-v14-web-8slcj
112 | Containers:
113 | QoS Tier:
114 | cpu: Guaranteed
115 | memory: Guaranteed
116 | Limits:
117 | cpu: 2000m
118 | memory: 64Mi
119 | Requests:
120 | memory: 64Mi
121 | cpu: 1500m
122 | ```
123 |
124 | !!! important
125 | If you restrict resources to the point where containers do not start,
126 | the `limits:set` command will hang. If this happens, use CTRL-C
127 | to break out of `limits:set` and use `limits:unset` to revert.
128 |
129 | To unset a CPU limit use `deis limits:unset web --cpu`:
130 |
131 | ```
132 | $ deis limits:unset web --cpu
133 | Applying limits... done
134 |
135 | === indoor-whitecap Limits
136 |
137 | --- Memory
138 | Unlimited
139 |
140 | --- CPU
141 | Unlimited
142 | ```
143 |
--------------------------------------------------------------------------------
/src/applications/using-docker-images.md:
--------------------------------------------------------------------------------
1 | # Using Docker Images
2 |
3 | Deis supports deploying applications via an existing [Docker Image][].
4 | This is useful for integrating Deis into Docker-based CI/CD pipelines.
5 |
6 |
7 | ## Prepare an Application
8 |
9 | Start by cloning an example application:
10 |
11 | $ git clone https://github.com/deis/example-dockerfile-http.git
12 | $ cd example-dockerfile-http
13 |
14 | Next use your local `docker` client to build the image and push
15 | it to [DockerHub][].
16 |
17 | $ docker build -t /example-dockerfile-http .
18 | $ docker push /example-dockerfile-http
19 |
20 |
21 | ### Docker Image Requirements
22 |
23 | In order to deploy Docker images, they must conform to the following requirements:
24 |
25 | * The Dockerfile must use the `EXPOSE` directive to expose exactly one port.
26 | * That port must be listening for an HTTP connection.
27 | * The Dockerfile must use the `CMD` directive to define the default process that will run within the container.
28 | * The Docker image must contain [bash](https://www.gnu.org/software/bash/) to run processes.
29 |
30 | !!! note
31 | Note that if you are using a private registry of any kind (`gcr` or other) the application environment must include a `$PORT` config variable that matches the `EXPOSE`'d port, example: `deis config:set PORT=5000`. See [Configuring Registry](../installing-workflow/configuring-registry/#configuring-off-cluster-private-registry) for more info.
32 |
33 | ## Create an Application
34 |
35 | Use `deis create` to create an application on the [controller][].
36 |
37 | $ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
38 | $ deis create example-dockerfile-http --no-remote
39 | Creating application... done, created example-dockerfile-http
40 |
41 | !!! note
42 | For all commands except for `deis create`, the `deis` client uses the name of the current directory
43 | as the app name if you don't specify it explicitly with `--app`.
44 |
45 |
46 | ## Deploy the Application
47 |
48 | Use `deis pull` to deploy your application from [DockerHub][] or
49 | a public registry.
50 |
51 | $ deis pull /example-dockerfile-http:latest
52 | Creating build... done, v2
53 |
54 | $ curl -s http://example-dockerfile-http.local3.deisapp.com
55 | Powered by Deis
56 |
57 | Because you are deploying a Docker image, the `cmd` process type is automatically scaled to 1 on first deploy.
58 |
59 | Use `deis scale cmd=3` to increase `cmd` processes to 3, for example. Scaling a
60 | process type directly changes the number of [Containers][container]
61 | running that process.
62 |
63 | ## Private Registry
64 |
65 | To deploy Docker images from a private registry or from a private repository, use `deis registry`
66 | to attach credentials to your application. These credentials are the same as you'd use when running
67 | `docker login` at your private registry.
68 |
69 | To deploy private Docker images, take the following steps:
70 |
71 | * Gather the username and password for the registry, such as a [Quay.io Robot Account][] or a [GCR.io Long Lived Token][]
72 | * Run `deis registry:set username= password= -a `
73 | * Now perform `deis pull` as normal, against an image in the private registry
74 |
75 | When using a [GCR.io Long Lived Token][], the JSON blob will have to be compacted first using a
76 | tool like [jq][] and then used in the password field in `deis registry:set`. For the username, use
77 | `_json_key`. For example:
78 |
79 | ```
80 | deis registry:set username=_json_key password="$(cat google_cloud_cred.json | jq -c .)"
81 | ```
82 |
83 | When using a private registry the docker images are no longer pulled into the Deis Internal Registry via
84 | the Deis Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed,
85 | however the application `port` information can no longer be discovered. Instead the application `port` information can be set via
86 | `deis config:set PORT=80` prior to setting the registry information.
87 |
88 | !!! note
89 | Currently [GCR.io][] and [ECR][] in short lived auth token mode are not supported.
90 |
91 | [container]: ../reference-guide/terms.md#container
92 | [controller]: ../understanding-workflow/components.md#controller
93 | [Docker Image]: https://docs.docker.com/introduction/understanding-docker/
94 | [DockerHub]: https://registry.hub.docker.com/
95 | [CMD instruction]: https://docs.docker.com/reference/builder/#cmd
96 | [Quay.io Robot Account]: https://docs.quay.io/glossary/robot-accounts.html
97 | [GCR.io Long Lived Token]: https://cloud.google.com/container-registry/docs/auth#using_a_json_key_file
98 | [jq]: https://stedolan.github.io/jq/
99 | [GCR.io]: https://gcr.io
100 | [ECR]: https://aws.amazon.com/ecr/
101 |
--------------------------------------------------------------------------------
/src/changelogs/v2.16.0.md:
--------------------------------------------------------------------------------
1 | ## Workflow v2.15.0 -> v2.16.0
2 |
3 | #### Releases
4 |
5 | - builder v2.11.0 -> v2.12.0
6 | - controller v2.15.0 -> v2.16.0
7 | - monitor v2.10.0 -> v2.10.1
8 | - slugrunner v2.3.0 -> v2.3.1
9 | - workflow v2.15.0 -> v2.16.0
10 | - workflow-cli v2.15.0 -> v2.16.0
11 | - workflow-e2e v2.11.1 -> v2.12.0
12 |
13 | #### Features
14 |
15 | - [`46002f4`](https://github.com/deis/workflow-cli/commit/46002f4440bfbb2614f779375ba12d6a3e0cf80b) (workflow-cli) - cmd: Support Base64 encoded SSH_KEY
16 | - [`88397a1`](https://github.com/deis/workflow-cli/commit/88397a12bf716d788c7b5468d9833a448452d39f) (workflow-cli) - cmd: test SSH_KEY mangling in ConfigSet
17 | - [`f9c6a4a`](https://github.com/deis/workflow-e2e/commit/f9c6a4aa43d990f59e68a0cd40de4f46864584d2) (workflow-e2e) - chart: use upstream stable/spotify-docker-gc chart
18 |
19 | #### Refactors
20 |
21 | - [`ce0e082`](https://github.com/deis/slugrunner/commit/ce0e082a17831285d1fbaf6cd08875a948a64697) (slugrunner) - ci: remove travis; update badge
22 | - [`7e85553`](https://github.com/deis/slugrunner/commit/7e85553cf3a197fc62b706df4262404cf92b37b3) (slugrunner) - LICENSE: switch to MIT license
23 | - [`345d5ae`](https://github.com/deis/workflow/commit/345d5aec07f64c04ccdf0f4fd1ad4622cf89b4b4) (workflow) - mkdocs.yml: alphabetize cloud providers in quickstart
24 |
25 | #### Fixes
26 |
27 | - [`73f844b`](https://github.com/deis/builder/commit/73f844b5a8ac61f5f54422d34b779728db679bf3) *: Remove RC4 based ciphers.
28 | - [`344b43e`](https://github.com/deis/builder/commit/344b43e4c6e4f350706121300910e24160d78b8d) *: Fix linter issues
29 | - [`c81dbf9`](https://github.com/deis/controller/commit/c81dbf97827adf7fd54c9d8a9f055b92211f295e) (controller) - controller: Persist ssl.enforce header on service creation
30 | - [`1f5e242`](https://github.com/deis/workflow-cli/commit/1f5e2424947e75aba94158941d058e589d779916) (workflow-cli) - cmd: fix(cmd) Fix proctype regex for setting limits
31 | - [`f82cf83`](https://github.com/deis/workflow-cli/commit/f82cf8373b2742ac4a354220dd25a458c9bf160d) (workflow-cli) - cmd: fix(cmd) Fix proctype regex for scaling
32 |
33 | #### Documentation
34 |
35 | - [`25329be`](https://github.com/deis/workflow/commit/25329be86bec3bd8b2b9d0dc0ba92c56775284fa) (workflow) - quickstart: update Azure ACS installation steps
36 | - [`4cfa9d5`](https://github.com/deis/workflow/commit/4cfa9d589312e336544ae7dc44bfed09e1a61aab) (workflow) - *: rm no longer needed pipe to sed (#817)
37 | - [`5145f12`](https://github.com/deis/workflow/commit/5145f123417126f7a84873a55ca7db46d59ee1f1) (workflow) - configuring-registry.md: add setup instructions for acr (#818)
38 | - [`b456870`](https://github.com/deis/workflow/commit/b4568706a37b33de33a1fe61ee6040d978fb095a) (workflow) - installing-workflow: helm init upgrade note (#819)
39 | - [`61a5cca`](https://github.com/deis/workflow/commit/61a5cca8b08f50eb08c2f3f1b1324babe8f8d26d) (workflow) - chart-provenance.md: fix chart repo name (#830)
40 | - [`2a7f756`](https://github.com/deis/workflow/commit/2a7f756f883107a0dcc7e0e8aee9d74bb9914f36) (workflow) - *: specify Helm v2.5.0 or later
41 | - [`ef4bc3e`](https://github.com/deis/workflow/commit/ef4bc3eae925558107cb269e5f8b09338a469ee2) (workflow) - *: updates/changelog for v2.16.0 release
42 |
43 | #### Maintenance
44 |
45 | - [`c2fd577`](https://github.com/deis/controller/commit/c2fd5775ee28f0bed00014f0c6b8d2693f14927b) (controller) - requirements: update Django to v1.11.2
46 | - [`fe6e6e5`](https://github.com/deis/controller/commit/fe6e6e5280a83209b626d10492d07073b027ac52) (controller) - requirements: update pyldap to v2.4.35.1
47 | - [`cac5e60`](https://github.com/deis/controller/commit/cac5e602b617c4fd26737f11e87ff10601192146) (controller) - requirements: update jmespath to 0.9.3
48 | - [`1fcf61b`](https://github.com/deis/controller/commit/1fcf61bb7e33dc6da54f6a0d1b1918abab5255ba) (controller) - requirements: update backoff to 1.4.3
49 | - [`410e1d3`](https://github.com/deis/controller/commit/410e1d38f94dede6bab8fc4412380073b638be26) (controller) - requirements: update Django to v1.11.3
50 | - [`516a529`](https://github.com/deis/monitor/commit/516a5291aac544c7bd79a30c276be48d44174343) (monitor) - Dockerfile: update Grafana to 4.3.2
51 | - [`5cd8648`](https://github.com/deis/workflow-e2e/commit/5cd8648b3dc056784e0adc1d52e1b185a6af8adc) (workflow-e2e) - Dockerfile: bump k8s version
52 |
--------------------------------------------------------------------------------
/src/changelogs/v2.18.0.md:
--------------------------------------------------------------------------------
1 | ## Workflow v2.17.0 -> v2.18.0
2 |
3 | #### Releases
4 |
5 | - controller v2.17.1 -> v2.18.0
6 | - fluentd v2.10.0 -> v2.12.0
7 | - logger v2.4.4 -> v2.4.5
8 | - postgres v2.5.4 -> v2.5.6
9 | - router v2.13.1 -> v2.13.3
10 | - workflow v2.17.0 -> v2.18.0
11 | - workflow-cli v2.17.0 -> v2.18.0
12 | - workflow-e2e v2.12.0 -> v2.12.1
13 |
14 | #### Features
15 |
16 | - [`36a11ec`](https://github.com/deis/fluentd/commit/36a11ece3294d9631ab7ab13f42723a12a90a4a8) (fluentd): Added buffer_queue_limit, buffer_chunk_limit and flush_interval to graylog and syslog store configurations
17 | - [`c1b360e`](https://github.com/deis/fluentd/commit/c1b360e1ca3255779e09932c4c0a459dc7abcf03) (fluentd) - fluentd: add TLS support to gelf plugin
18 |
19 | #### Fixes
20 |
21 | - [`d44237f`](https://github.com/deis/postgres/commit/d44237ffb7347d164d258ee91eccf005d7f0c3cb) (postgres) - Dockerfile: bump postgresql version to current Ubuntu patch
22 | - [`08c9ab6`](https://github.com/deis/postgres/commit/08c9ab647397bde33eb54f1e18cff7f482d709a4) (postgres) - Dockerfile: bump postgresql version to current Ubuntu patch
23 | - [`d5c70f4`](https://github.com/deis/workflow-e2e/commit/d5c70f4fedd88855d42ef1a1cfedbd79938b5e7f) (workflow-e2e) - apps_test.go: temporarily disable spec that fails on GKE
24 |
25 | #### Documentation
26 |
27 | - [`cf9552d`](https://github.com/deis/controller/commit/cf9552d4d6bd58d516466486f7314a404a449118) (controller) - README.md: remove outdated license blurb
28 | - [`8837f89`](https://github.com/deis/controller/commit/8837f894017743b6fd912bb34b0e7e571071041b) (controller) - README.md: add notice of final release and maintenance mode
29 | - [`40630b5`](https://github.com/deis/fluentd/commit/40630b5f7117ce90bf30c29782b8227a260bc8f8) (fluentd) - README.md: add notice of final release and maintenance mode
30 | - [`bd82a4e`](https://github.com/deis/logger/commit/bd82a4ecfb63fb4afded80c535a37a7ba08782a4) (logger) - README.md: remove outdated license blurb
31 | - [`1887864`](https://github.com/deis/logger/commit/1887864396ea3f13a0701e61d921f6979e7f7cec) (logger) - README.md: add notice of final release and maintenance mode
32 | - [`0f38b04`](https://github.com/deis/postgres/commit/0f38b0484c702da7fa654bfa8afbcc97d1d18f91) (postgres) - README.md: remove outdated license blurb
33 | - [`f819b2f`](https://github.com/deis/postgres/commit/f819b2f92a0b76cee1a3dbc83dd3e85179152beb) (postgres) - README.md: add notice of final release and maintenance mode
34 | - [`f4665e9`](https://github.com/deis/router/commit/f4665e911bceecf93bc2aa7d56b0cba62a3ddace) (router) - README.md: remove outdated license blurb
35 | - [`c2c6374`](https://github.com/deis/router/commit/c2c637444bed27d1b6c1f85e64ffbc4b26f0646d) (router) - README.md: add notice of final release and maintenance mode
36 | - [`32952bf`](https://github.com/deis/workflow/commit/32952bf8bf5e23d9d8213e9e49010de960a4d125) (workflow) - README.md: remove outdated license blurb
37 | - [`0798c33`](https://github.com/deis/workflow/commit/0798c336c0bce693c46b0ff2da8674bbafe42b80) (workflow) - README.md: add notice of final release and maintenance mode
38 | - [`2d62f21`](https://github.com/deis/workflow/commit/2d62f21e1c7d5d3ae251cf0572a9e32bb1864000) (workflow) - README.md: add timeline to maintenance notice
39 | - [`058058d`](https://github.com/deis/workflow-cli/commit/058058d86259052ee5122bd9af73bbf34c927bf3) (workflow-cli) - README.md: add notice of final release and maintenance mode
40 |
41 | #### Maintenance
42 |
43 | - [`b1f7175`](https://github.com/deis/controller/commit/b1f71752a29aeff381082fc20a40ff1aa52c351e) (controller) - requirements: update Django to v1.11.4
44 | - [`31f709e`](https://github.com/deis/controller/commit/31f709eb7cd3a81a87339aa58336da4110c0cc49) (controller) - requirements: update idna to v2.6
45 | - [`bbf6111`](https://github.com/deis/controller/commit/bbf6111e73bbd1eef912250ec199f922504bd857) (controller) - requirements: update pyasn1 to v0.3.2
46 | - [`7aaa642`](https://github.com/deis/controller/commit/7aaa64298351c8c360c9cd0902a2d41430bed08a) (controller) - requirements: update psycopg2 to v2.7.3
47 | - [`e3dc217`](https://github.com/deis/controller/commit/e3dc217feef099194a1424fabc29385e0ef33ea4) (controller) - requirements: update requests to v2.18.4
48 | - [`cb9a8af`](https://github.com/deis/controller/commit/cb9a8af67eedc78cbb76ece8332fc0ca92a0bd1f) (controller) - dev_requirements: update flake8 to v3.4.1
49 | - [`a16e1d8`](https://github.com/deis/controller/commit/a16e1d833bc5394cb4961cb75beeb176e1011c2c) (controller) - requirements: update Django REST Framework to v3.6.4
50 | - [`116f057`](https://github.com/deis/controller/commit/116f0572cc8f4eb12e540027bc84ef1ec778ff53) (controller) - requirements: update django-auth-ldap to 1.2.15
51 | - [`91e552c`](https://github.com/deis/router/commit/91e552cfb7f37f31bdaef8b2aa5e88781c796868) (router) - Dockerfile: update nginx to 1.13.4
52 |
--------------------------------------------------------------------------------
/src/changelogs/v2.4.1.md:
--------------------------------------------------------------------------------
1 | ## Workflow v2.4.0 -> v2.4.1
2 |
3 | ### Maintenance
4 |
5 | [`af1c969`](https://github.com/deis/charts/commit/af1c96989ad97bbb4eac61ea3c1bf1c6a903f620) workflow-v2.4.1: releasing workflow-v2.4.1(-e2e)
6 |
7 | ### Fixes
8 |
9 | [`3f3be4d`](https://github.com/deis/controller/commit/3f3be4d410c7f6b9e70825179827a7b305998464) controller: scheduler: check if RC exists during a deploy before trying to use Deployments [#996](https://github.com/deis/controller/pull/996)
10 |
--------------------------------------------------------------------------------
/src/changelogs/v2.4.2.md:
--------------------------------------------------------------------------------
1 | ## Workflow v2.4.0 -> v2.4.2
2 |
3 | ### Controller v2.4.1 -> v2.4.2
4 |
5 | #### Fixes
6 | - [`eb2f32b`](https://github.com/deis/controller/commit/eb2f32baeb7442f085f596a10d29bd4bb1e85463) registry: tell a user they need PORT when using off-cluster native iaas registry (#988)
7 | - [`e9352a3`](https://github.com/deis/controller/commit/e9352a38f6c4e9472c89648f9ea61e0fd88daa85) proctypes: update service after all the proctypes are deployed
8 | - [`f7fb2f6`](https://github.com/deis/controller/commit/f7fb2f6026a5727c28010b655ca74c296fe3f0d5) release: during cleanup let pod deletion 404 in case Kubernetes cleaned up as well (#1005)
9 |
--------------------------------------------------------------------------------
/src/changelogs/v2.9.1.md:
--------------------------------------------------------------------------------
1 | ## Workflow v2.9.0 -> v2.9.1
2 |
3 | #### Releases
4 |
5 | - controller v2.9.0 -> v2.9.1
6 | - slugbuilder v2.4.7 -> v2.4.8
7 |
8 | #### Fixes
9 |
10 | - [`d723de6`](https://github.com/deis/controller/commit/d723de618d0a420cfba3c5be7e3d53c17aa9a404) (controller) - api: account for NoneType when resource is gone (#1178)
11 | - [`ebeb922`](https://github.com/deis/slugbuilder/commit/ebeb9223919a9725f570cc26534e525c6e2d0e13) (slugbuilder) - env_dir: Remove directories from the env dir passed to the compile
12 | - [`e058fa2`](https://github.com/deis/slugbuilder/commit/e058fa27b3f8c2e3bf9e20c06374ef4450f0a186) (slugbuilder) - ssh: read the ssh key from dir instead of environment
13 |
14 | #### Maintenance
15 |
16 | - [`673ce82`](https://github.com/deis/slugbuilder/commit/673ce822af983855a3a1565095838bfe0d5b4a08) (slugbuilder) - buildpacks: update heroku-buildpack-php to v115
17 | - [`998b7ce`](https://github.com/deis/slugbuilder/commit/998b7ce2b043c8dfd8787027a33b2e336d37d050) (slugbuilder) - buildpacks: update heroku-buildpack-ruby to v149
18 | - [`195c4f2`](https://github.com/deis/slugbuilder/commit/195c4f28c821048779e471a202f8d9d80d753ce7) (slugbuilder) - buildpacks: update heroku-buildpack-gradle to v19
19 | - [`03ab39a`](https://github.com/deis/slugbuilder/commit/03ab39af4f7e7da944cd46ae2c8da35c28954ae5) (slugbuilder) - buildpacks: update heroku-buildpack-php to v116
20 | - [`51514b1`](https://github.com/deis/slugbuilder/commit/51514b14259bfab0329b372213835bb8d6873451) (slugbuilder) - buildpacks: update heroku-buildpack-go to v54
21 |
--------------------------------------------------------------------------------
/src/contributing/community.md:
--------------------------------------------------------------------------------
1 | # Community
2 |
3 | Deis software is fully open source. As such, the "Deis community" consists of anyone who uses the Deis software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code.
4 |
5 | Deis development is coordinated through numerous project repositories [on GitHub][github]. Anyone can check out the source code for any Deis component, fork it, make improvements, and create a pull request to offer those changes back to the Deis community.
6 |
7 | [Engine Yard][ey] maintains the numerous Deis projects, and as such, decides what ends up in the official GitHub repositories. Deis depends on the contributions of the community; the maintainers will not ignore pull requests or issues.
8 |
9 | Deis uses the timeless, highly efficient, and totally unfair system known as "Benevolent Dictator for Life" ([BDFL][]). [Gabriel Monroy][gabriel], the creator of Deis, is our BDFL and has final say over all decisions related to Deis.
10 |
11 | ## Open Source Bounties
12 |
13 | Deis projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Deis maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.
14 |
15 |
16 | [github]: https://github.com/deis
17 | [ey]: https://deis.com/community
18 | [bdfl]: http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life
19 | [gabriel]: https://github.com/gabrtv
20 |
--------------------------------------------------------------------------------
/src/contributing/conduct.md:
--------------------------------------------------------------------------------
1 | # Conduct
2 |
3 | The Deis community welcomes and encourages participation by **everyone**.
4 |
5 | No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community.
6 |
7 | The Deis developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles:
8 |
9 | 1. **Be welcoming, friendly, and patient.**
10 |
11 | 2. **Be considerate.**
12 |
13 | Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
14 |
15 | 3. **Be respectful.**
16 |
17 | Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
18 |
19 | 4. **Be careful in the words that you choose.**
20 |
21 | Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community.
22 |
23 | (Thanks to the [Debian][] and [Django][] communities for their text and
24 | their inspiration.)
25 |
26 | [debian]: http://www.debian.org/intro/diversity
27 | [django]: https://www.djangoproject.com/conduct/
28 |
--------------------------------------------------------------------------------
/src/contributing/design-documents.md:
--------------------------------------------------------------------------------
1 | # Design Documents
2 |
3 | Before submitting a pull request which will significantly alter the behavior of any Deis component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.
4 |
5 | ## Goals
6 |
7 | Design documents help ensure project contributors:
8 |
9 | * Involve stakeholders as early as possible in a feature's development
10 | * Ensure code changes accomplish the original motivations and design goals
11 | * Establish clear acceptance criteria for a feature or change
12 | * Enforce test-driven design methodology and automated test coverage
13 |
14 | ## Contents
15 |
16 | Design document issues should be named `Design Doc: ` and contain the following sections:
17 |
18 | ### Goal
19 |
20 | This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change.
21 |
22 | This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.
23 |
24 | ### Code Changes
25 |
26 | This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.
27 |
28 | ### Tests
29 |
30 | All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn't introduce any regressions.
31 |
32 | If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase.
33 |
34 | The tests described here also form the acceptance criteria for the change, so that when it's completed maintainers can merge the pull request after confirming the tests pass CI.
35 |
36 | ### Approval
37 |
38 | A design document follows the same [merge approval][approval] review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document.
39 |
40 | Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change.
41 |
42 | See [Submitting a Pull Request][standards] for more information on pull request and commit message formatting.
43 |
44 |
45 | [approval]: submitting-a-pull-request.md#merge-approval
46 | [standards]: submitting-a-pull-request.md
47 |
--------------------------------------------------------------------------------
/src/contributing/maintainers.md:
--------------------------------------------------------------------------------
1 | # Deis Maintainers
2 |
3 | This document serves to describe the leadership structure of the Deis project, and list the current
4 | project maintainers.
5 |
6 | # What is a maintainer?
7 |
8 | (Unabashedly stolen from the [Docker](https://github.com/docker/docker/blob/master/MAINTAINERS) project)
9 |
10 | There are different types of maintainers, with different responsibilities, but
11 | all maintainers have 3 things in common:
12 |
13 | 1. They share responsibility in the project's success.
14 | 2. They have made a long-term, recurring time investment to improve the project.
15 | 3. They spend that time doing whatever needs to be done, not necessarily what
16 | is the most interesting or fun.
17 |
18 | Maintainers are often under-appreciated, because their work is harder to appreciate.
19 | It's easy to appreciate a really cool and technically advanced feature. It's harder
20 | to appreciate the absence of bugs, the slow but steady improvement in stability,
21 | or the reliability of a release process. But those things distinguish a good
22 | project from a great one.
23 |
24 | # Deis maintainers
25 |
26 | Deis has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.
27 |
28 | ## BDFL
29 |
30 | Deis follows the timeless, highly efficient and totally unfair system known as [Benevolent dictator
31 | for life](http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life).
32 |
33 | Gabriel Monroy ([@gabrtv](https://github.com/gabrtv)), as creator of the Deis project, serves as our
34 | project's BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel
35 | serves as the final arbiter of any disputes and has the final say on project direction.
36 |
37 | ## Core maintainers
38 |
39 | Core maintainers are exceptionally knowledgeable about all areas of Deis. Some maintainers work on Deis
40 | full-time, although this is not a requirement.
41 |
42 | The duties of a core maintainer include:
43 |
44 | * Classify and respond to GitHub issues and review pull requests
45 | * Help to shape the Deis roadmap and lead efforts to accomplish roadmap milestones
46 | * Participate actively in feature development and bug fixing
47 | * Answer questions and help users in the [Deis #community Slack channel](https://slack.deis.io)
48 |
49 | The current list of core maintainers can be seen [here](https://github.com/orgs/deis/teams/core-maintainers).
50 |
51 | No pull requests can be merged until at least one core maintainer signs off with an
52 | [LGTM](http://docs.deis.io/en/latest/contributing/standards/#merge-approval). The other LGTM can
53 | come from either a core maintainer or contributing maintainer.
54 |
55 | ## Contributing maintainers
56 |
57 | Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas
58 | of Deis, and are often selected due to specific domain knowledge that complements the project (but
59 | a willingness to continually contribute to the project is most important!). Often,
60 | core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or
61 | conversations where the contributing maintainer is knowledgeable.
62 |
63 | The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Deis project where the contributing maintainer is knowledgeable.
64 |
65 | Contributing maintainers are defined in practice as those who have write access to the Deis repository. All maintainers can review pull requests and add LGTM labels as appropriate.
66 |
67 | ## Becoming a maintainer
68 |
69 | The Deis project wouldn't be where it is today without its community. Many of the project's
70 | community members embody the spirit of maintainership, and have contributed substantially to
71 | the project.
72 |
73 | The contributing maintainers group was created in part so that exceptional members of the community
74 | who have an interest in the continued success of the project have the opportunity to join the
75 | core maintainers in guiding the future of Deis.
76 |
77 | Generally, potential contributing maintainers are selected by the Deis core maintainers based in
78 | part on the following criteria:
79 |
80 | * Sustained contributions to the project over a period of time (usually months)
81 | * A willingness to help Deis users on GitHub and in the [Deis #community Slack channel](https://slack.deis.io)
82 | * A friendly attitude :)
83 |
84 | The Deis core maintainers must unanimously agree before inviting a community member to join as a
85 | contributing maintainer, although in many cases the candidate has already been acting in the
86 | capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests,
87 | etc.
88 |
--------------------------------------------------------------------------------
/src/contributing/overview.md:
--------------------------------------------------------------------------------
1 | # Contributor Overview
2 |
3 | Interested in contributing to a Deis project? There are lots of ways to help.
4 |
5 | ## File Bugs & Enhancements
6 |
7 | Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we’ll get the conversation started.
8 |
9 | Our official support channel is the [Deis #community Slack channel][slack].
10 |
11 | Don't know what the applicable repository for an issue is? Open up in issue in [workflow][] or chat with a maintainer in the [Deis #community Slack channel][slack] and we'll make sure it gets to the right place.
12 |
13 | Additionally, take a look at the [troubleshooting][] documentation for common issues.
14 |
15 | Before opening a new issue, it's helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Deis projects [here][issues].
16 |
17 | ## Write Documentation
18 |
19 | We are always looking to improve and expand our documentation. Most docs reside in the [deis/workflow][workflow] repository. Simply fork the project, update docs and send us a pull request.
20 |
21 | ## Contribute Code
22 |
23 | We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let’s chat in the [Deis #community Slack channel][slack]. Make sure to check out issues tagged [easy fix][] or [help wanted][].
24 |
25 | When you're ready to begin writing code, review [Design Documents][dd] and get your [Development Environment][dev-environment] set up.
26 |
27 | By contributing to any Deis project you agree to its [Developer Certificate of Origin (DCO)][dco]. This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
28 |
29 | ## Triage Issues
30 |
31 | If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See [Triaging Issues](triaging-issues.md) for more info.
32 |
33 | ## Share your Experience
34 |
35 | Interact with the community on our user mailing list or live in our [Deis #community Slack channel](https://slack.deis.io), where you can chat with other Deis Workflow users any time of day.
36 |
37 | [workflow]: https://github.com/deis/workflow
38 | [dd]: design-documents.md
39 | [dev-environment]: development-environment.md
40 | [easy fix]: https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adeis+label%3A%22easy+fix%22+is%3Aopen
41 | [dco]: https://github.com/deis/workflow/blob/master/DCO
42 | [help wanted]: https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adeis+label%3A%22help+wanted%22+is%3Aopen
43 | [troubleshooting]: ../troubleshooting/index.md
44 | [issues]: https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adeis+user%3Ahelm
45 | [slack]: https://slack.deis.io
46 |
--------------------------------------------------------------------------------
/src/contributing/testing.md:
--------------------------------------------------------------------------------
1 | # Testing Deis
2 |
3 | Each Deis component is one among an ecosystem of such components - many of which integrate with one another - which makes testing each component thoroughly a matter of paramount importance.
4 |
5 | Each Deis component includes its own suite of style checks, [unit tests][], and black-box type [functional tests][].
6 |
7 | [Integration tests][] verify the behavior of the Deis components together as a system and are provided separately by the [deis/workflow-e2e][workflow-e2e] project.
8 |
9 | GitHub pull requests for all Deis components are tested automatically by the [Travis CI][travis] [continuous integration][] system. Contributors should run the same tests locally before proposing any changes to the Deis codebase.
10 |
11 | ## Set Up the Environment
12 |
13 | Successfully executing the unit and functional tests for any Deis component requires that the [Development Environment][dev-environment] is set up first.
14 |
15 | ## Run the Tests
16 |
17 | The style checks, unit tests, and functional tests for each component can all be executed via make targets:
18 |
19 | To execute style checks:
20 |
21 | ```
22 | $ make test-style
23 | ```
24 |
25 | To execute unit tests:
26 |
27 | ```
28 | $ make test-unit
29 | ```
30 |
31 | To execute functional tests:
32 |
33 | ```
34 | $ make test-functional
35 | ```
36 |
37 | To execute style checks, unit tests, and functional tests all in one shot:
38 |
39 | ```
40 | $ make test
41 | ```
42 |
43 | To execute integration tests, refer to [deis/workflow-e2e][workflow-e2e] documentation.
44 |
45 | [unit tests]: http://en.wikipedia.org/wiki/Unit_testing
46 | [functional tests]: http://en.wikipedia.org/wiki/Functional_testing
47 | [integration tests]: http://en.wikipedia.org/wiki/Integration_testing
48 | [workflow-e2e]: https://github.com/deis/workflow-e2e
49 | [travis]: https://travis-ci.org/deis
50 | [continuous integration]: http://en.wikipedia.org/wiki/Continuous_integration
51 | [dev-environment]: development-environment.md
52 |
--------------------------------------------------------------------------------
/src/contributing/triaging-issues.md:
--------------------------------------------------------------------------------
1 | # Triaging Issues
2 |
3 | Issue triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by:
4 |
5 | - Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
6 | - Giving a contributor the information they need before they commit to resolving an issue.
7 | - Lowering the issue count by preventing duplicate issues.
8 | - Streamlining the development process by preventing duplicate discussions.
9 |
10 | If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.
11 |
12 | ## Ensure the Issue Contains Basic Information
13 |
14 | Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as:
15 |
16 | - the version(s) of Deis this issue affects
17 | - a reproducible case if this is a bug
18 | - page URL if this is a docs issue or the name of a man page
19 |
20 | Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.
21 |
22 | If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time.
23 |
24 | If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.
25 |
26 | ## Classifying the Issue
27 |
28 | An issue can have multiple of the following labels:
29 |
30 | ### Issue Kind
31 |
32 | Kind | Description
33 | -------------|-----------------------------------------------------------------------------------------------------------------------------
34 | bug | Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.
35 | docs | Writing documentation, man pages, articles, blogs, or other significant word-driven task.
36 | enhancement | Enhancements can drastically improve usability or performance of a component.
37 | question | Contains a user or contributor question requiring a response.
38 | security | Security-related issues such as TLS encryption, network segregation, authn/authz features, etc.
39 |
40 | ### Functional Area
41 |
42 | - builder
43 | - cache
44 | - contrib and provisioning
45 | - client
46 | - controller
47 | - database
48 | - docs
49 | - kubernetes
50 | - registry
51 | - router
52 | - store (Ceph)
53 | - tests
54 |
55 | ## Easy Fix
56 |
57 | "Easy Fix" issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Deis, and possibly Go, and is looking to help while learning the basics.
58 |
59 | ## Prioritizing issues
60 |
61 | When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.
62 |
63 | Priority | Description
64 | -----------|-----------------------------------------------------------------------------------------------------------------------------------
65 | priority 0 | Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.
66 | priority 1 | Serious: Impedes user actions or is a regression. Fix this before the next planned release.
67 |
68 | And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue.
69 |
--------------------------------------------------------------------------------
/src/diagrams/Application_Layout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Application_Layout.png
--------------------------------------------------------------------------------
/src/diagrams/Diagrams.graffle:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Diagrams.graffle
--------------------------------------------------------------------------------
/src/diagrams/Document_Overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Document_Overview.png
--------------------------------------------------------------------------------
/src/diagrams/Ecosystem_Basic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Ecosystem_Basic.png
--------------------------------------------------------------------------------
/src/diagrams/Ecosystem_Complex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Ecosystem_Complex.png
--------------------------------------------------------------------------------
/src/diagrams/Git_Push_Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Git_Push_Flow.png
--------------------------------------------------------------------------------
/src/diagrams/README.md:
--------------------------------------------------------------------------------
1 | # Architecture Diagrams
2 |
3 | This is an [OmniGraffle][] file which holds the source materials for the following
4 | images.
5 |
6 | To update a chart:
7 |
8 | 1. Make your modification!
9 | 2. Select "File > Export"
10 | 3. Select "Entire Document
11 | 4. Choose: Scale: 100%
12 | 5. Set Bitmap Resolution to 72 dpi (for web)
13 | 6. Uncheck "Transparent Background"
14 | 7. Select "images" directory
15 | 8. Click "Export"
16 |
17 | This should update all of the graphics in one go! Commit and pull-request.
18 |
19 | [omnigraffle]: https://www.omnigroup.com/omnigraffle
20 |
--------------------------------------------------------------------------------
/src/diagrams/Workflow_Detail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Workflow_Detail.png
--------------------------------------------------------------------------------
/src/diagrams/Workflow_Overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/diagrams/Workflow_Overview.png
--------------------------------------------------------------------------------
/src/index.md:
--------------------------------------------------------------------------------
1 | # Welcome to Deis Workflow
2 |
3 | Deis (pronounced DAY-iss) Workflow is an open source Platform as a Service (PaaS) that adds a
4 | developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage
5 | applications.
6 |
7 | Deis Workflow includes capabilities for building and deploying from source via `git push`, simple
8 | application configuration, creating and rolling back releases, managing domain names and SSL
9 | certificates, providing seamless edge routing, aggregating logs, and sharing applications with
10 | teams. All of this is exposed through a simple REST API and command line interface.
11 |
12 | Please note that this documentation is for Deis Workflow (v2). For v1 documentation visit
13 | .
14 |
15 | ## Getting Started
16 |
17 | To get started with Workflow, follow our [Quick Start][quickstart] guide.
18 |
19 | Take a deep dive into Deis Workflow in our [Concepts][concepts], [Architecture][arch], and
20 | [Components][components] sections.
21 |
22 | Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an
23 | [easy fix][] or [help wanted][] and start contributing!
24 |
25 | ## Service and Support
26 |
27 | If you are interested in commercial service and support for Deis Workflow, check out the various
28 | [services offerings on deis.com](https://deis.com/services).
29 |
30 |
31 | [arch]: understanding-workflow/architecture.md
32 | [concepts]: understanding-workflow/concepts.md
33 | [components]: understanding-workflow/components.md
34 | [easy fix]: https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adeis+label%3A%22easy+fix%22+is%3Aopen
35 | [help wanted]: https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adeis+label%3A%22help+wanted%22+is%3Aopen
36 | [quickstart]: quickstart/index.md
37 |
--------------------------------------------------------------------------------
/src/installing-workflow/chart-provenance.md:
--------------------------------------------------------------------------------
1 | # Chart Provenance
2 |
3 | As of Workflow [v2.8.0](../changelogs/v2.8.0.md), Deis has released [Kubernetes Helm][helm] charts for Workflow
4 | and for each of its [components](../understanding-workflow/components.md).
5 |
6 | Helm provides tools for establishing and verifying chart integrity. (For an overview, see the [Provenance](https://github.com/kubernetes/helm/blob/master/docs/provenance.md) doc.) All release charts from the Deis Workflow team are now signed using this mechanism.
7 |
8 | The full `Deis, Inc. (Helm chart signing key) ` public key can be found [here](../security/1d6a97d0.txt), as well as the [pgp.mit.edu](http://pgp.mit.edu/pks/lookup?op=vindex&fingerprint=on&search=0x17E526B51D6A97D0) keyserver and the official Deis Keybase [account][deis-keybase]. The key's fingerprint can be cross-checked against all of these sources.
9 |
10 | ## Verifying a signed chart
11 |
12 | The public key mentioned above must exist in a local keyring before a signed chart can be verified.
13 |
14 | To add it to the default `~/.gnupg/pubring.gpg` keyring, any of the following commands will work:
15 |
16 | ```
17 | $ # via our hosted location
18 | $ curl https://deis.com/workflow/docs/security/1d6a97d0.txt | gpg --import
19 |
20 | $ # via the pgp.mit.edu keyserver
21 | $ gpg --keyserver pgp.mit.edu --recv-keys 1D6A97D0
22 |
23 | $ # via Keybase with account...
24 | $ keybase follow deis
25 | $ keybase pgp pull
26 |
27 | $ # via Keybase by curl
28 | $ curl https://keybase.io/deis/key.asc | gpg --import
29 | ```
30 |
31 | Charts signed with this key can then be verified when fetched:
32 |
33 | ```
34 | $ helm repo add deis https://charts.deis.com/workflow
35 | "deis" has been added to your repositories
36 |
37 | $ helm fetch --verify deis/workflow --version v2.18.0
38 | Verification: &{0xc42077e460 sha256:c8fe609e70f6f11299c2e1fa130433254d747fc0a694a2928a1c5d3d3c986ce8 workflow-v2.18.0.tgz}
39 | ```
40 |
41 | One can then inspect the fetched `workflow-v2.18.0.tgz.prov` provenance file.
42 |
43 | If the chart was not signed, the command above would result in:
44 |
45 | ```
46 | Error: Failed to fetch provenance "https://charts.deis.com/workflow/workflow-v2.18.0.tgz.prov"
47 | ```
48 |
49 | Alternatively, the chart can also be verified at install time:
50 |
51 | ```
52 | $ helm install --verify deis/workflow --namespace deis
53 | NAME: exiled-mink
54 | LAST DEPLOYED: Wed Sep 7 08:22:16 2017
55 | NAMESPACE: deis
56 | STATUS: DEPLOYED
57 | ...
58 |
59 | $ helm ls
60 | NAME REVISION UPDATED STATUS CHART
61 | exiled-mink 1 Wed Sep 7 08:22:16 2017 DEPLOYED workflow-v2.18.0
62 | ```
63 |
64 | Having done so, one is assured of the origin and authenticity of any installed Workflow chart released by Deis.
65 |
66 | [helm]: https://github.com/kubernetes/helm/blob/master/docs/install.md
67 | [deis-keybase]: https://keybase.io/deis
68 |
--------------------------------------------------------------------------------
/src/installing-workflow/configuring-object-storage.md:
--------------------------------------------------------------------------------
1 | # Configuring Object Storage
2 |
3 | A variety of Deis Workflow components rely on an object storage system to do their work including storing application slugs, Docker images and database logs.
4 |
5 | Deis Workflow ships with [Minio][minio] by default, which provides in-cluster, ephemeral object storage. This means that _if the Minio server crashes, all data will be lost_. Therefore, **Minio should be used for development or testing only**.
6 |
7 | ## Configuring off-cluster Object Storage
8 |
9 | Every component that relies on object storage uses two inputs for configuration:
10 |
11 | 1. Component-specific environment variables (e.g. `BUILDER_STORAGE` and `REGISTRY_STORAGE`)
12 | 2. Access credentials stored as a Kubernetes secret named `objectstorage-keyfile`
13 |
14 | The helm chart for Deis Workflow can be easily configured to connect Workflow components to off-cluster object storage. Deis Workflow currently supports Google Compute Storage, Amazon S3, [Azure Blob Storage][] and OpenStack Swift Storage.
15 |
16 | ### Step 1: Create storage buckets
17 |
18 | Create storage buckets for each of the Workflow subsystems: `builder`, `registry`, and `database`.
19 |
20 | Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an [ssl certificate validation issue with S3](https://forums.aws.amazon.com/thread.jspa?threadID=105357).
21 |
22 | If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.
23 |
24 | ### Step 2: Generate storage credentials
25 |
26 | If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.
27 |
28 | If you are using AWS S3 and your Kubernetes nodes are configured with appropriate [IAM][aws-iam] API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!
29 |
30 | ### Step 3: Add Deis Repo
31 |
32 | If you haven't already added the Helm repo, do so with `helm repo add deis https://charts.deis.com/workflow`
33 |
34 | ### Step 4: Configure Workflow Chart
35 |
36 | Operators should configure object storage by editing the Helm values file before running `helm install`. To do so:
37 |
38 | * Fetch the Helm values by running `helm inspect values deis/workflow > values.yaml`
39 | * Update the `global/storage` parameter to reference the platform you are using, e.g. `s3`, `azure`, `gcs`, or `swift`
40 | * Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.
41 | * Save your changes.
42 |
43 | !!! note
44 | All values will be automatically (base64) encoded _except_ the `key_json` values under `gcs`/`gcr`. These must be base64-encoded. This is to support cleanly passing said encoded text via `helm --set` cli functionality rather than attempting to pass the raw JSON data. For example:
45 |
46 | $ helm install workflow --namespace deis \
47 | --set global.storage=gcs,gcs.key_json="$(cat /path/to/gcs_creds.json | base64 -w 0)"
48 |
49 | You are now ready to run `helm install deis/workflow --namespace deis -f values.yaml` using your desired object storage.
50 |
51 |
52 | [minio]: ../understanding-workflow/components.md#object-storage
53 | [aws-iam]: http://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html
54 | [Azure Blob Storage]: https://azure.microsoft.com/en-us/services/storage/blobs/
55 |
--------------------------------------------------------------------------------
/src/installing-workflow/configuring-postgres.md:
--------------------------------------------------------------------------------
1 | # Configuring Postgres
2 |
3 | Deis Workflow's controller component relies on a PostgreSQL database to store platform state.
4 |
5 | By default, Deis Workflow ships with the [database] component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster [object storage]. Currently, for object storage, which is utilized by _several_ Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.
6 |
7 | ## Provisioning off-cluster Postgres
8 |
9 | First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component.
10 |
11 | Take note of the following:
12 |
13 | 1. The hostname or public IP of your PostgreSQL RDBMS
14 | 2. The port on which your PostgreSQL RDBMS runs-- typically 5432
15 |
16 | Within the off-cluster RDBMS, manually provision the following:
17 |
18 | 1. A database user (take note of the username and password)
19 | 2. A database owned by that user (take note of its name)
20 |
21 | If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will _typically_ look like this:
22 |
23 | ```
24 | $ psql -h -p -d postgres -U <"postgres" or your own username>
25 | > create user with password '';
26 | > create database with owner ;
27 | > \q
28 | ```
29 |
30 | ## Configuring Workflow
31 |
32 | The Helm chart for Deis Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.
33 |
34 | * **Step 1:** If you haven't already fetched the values, do so with `helm inspect values deis/workflow > values.yaml`
35 | * **Step 2:** Update database connection details by modifying `values.yaml`:
36 | * Update the `database_location` parameter to `off-cluster`.
37 | * Update the values in the `[database]` configuration section to properly reflect all connection details.
38 | * Save your changes.
39 | * Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.
40 |
41 | You are now ready to `helm install deis/workflow --namespace deis -f values.yaml` [as usual][installing].
42 |
43 | [database]: ../understanding-workflow/components.md#database
44 | [object storage]: configuring-object-storage.md
45 | [installing]: ../installing-workflow/index.md
46 |
--------------------------------------------------------------------------------
/src/installing-workflow/download-linux-brightgreen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/installing-workflow/download-osx-brightgreen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/installing-workflow/experimental-native-ingress.md:
--------------------------------------------------------------------------------
1 | # Experimental Native Ingress
2 |
3 | ## Install Deis Workflow (With experimental native ingress support)
4 |
5 | Now that Helm is installed and the repository has been added, install Workflow with a native ingress by running:
6 |
7 | ```
8 | $ helm install deis/workflow --namespace deis --set global.experimental_native_ingress=true,controller.platform_domain=deis.com
9 | ```
10 |
11 | Where `controller.platform_domain` is a **required** parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using `deis.com` for `$hostname`.
12 |
13 | Helm will install a variety of Kubernetes resources in the `deis` namespace.
14 | Wait for the pods that Helm launched to be ready. Monitor their status by running:
15 |
16 | ```
17 | $ kubectl --namespace=deis get pods
18 | ```
19 |
20 | You should also notice that several Kubernetes ingresses has been installed on your cluster. You can view it by running:
21 |
22 | ```
23 | $ kubectl get ingress --namespace deis
24 | ```
25 |
26 | Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the
27 | installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will
28 | automatically restart it.
29 |
30 | Here, it can be seen that the controller, builder and registry all took a few loops waiting for minio before they were able to start:
31 |
32 | ```
33 | $ kubectl --namespace=deis get pods
34 | NAME READY STATUS RESTARTS AGE
35 | deis-builder-hy3xv 1/1 Running 5 5m
36 | deis-controller-g3cu8 1/1 Running 5 5m
37 | deis-database-rad1o 1/1 Running 0 5m
38 | deis-logger-fluentd-1v8uk 1/1 Running 0 5m
39 | deis-logger-fluentd-esm60 1/1 Running 0 5m
40 | deis-logger-sm8b3 1/1 Running 0 5m
41 | deis-minio-4ww3t 1/1 Running 0 5m
42 | deis-registry-asozo 1/1 Running 1 5m
43 | deis-workflow-manager-68nu6 1/1 Running 0 5m
44 | ```
45 |
46 | ## Install a Kubernetes Ingress Controller
47 |
48 | Now that Workflow has been deployed with the `global.experimental_native_ingress` flag set to `true`, we will need a Kubernetes ingress controller in place to begin routing traffic.
49 |
50 | Here is an example of how to use [traefik](https://traefik.io/) as an ingress controller for Workflow. Of course, you are welcome to use any controller you wish.
51 |
52 | ```
53 | $ helm install stable/traefik --name ingress --namespace kube-system
54 | ```
55 |
56 | ## Configure DNS
57 |
58 | The experimental ingress feature requires a user to set up a hostname, and assumes the `deis.$host` convention.
59 |
60 | We need to point the `*.$host` record to the public IP address of your ingress controller. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
61 |
62 | ```
63 | $ kubectl get svc ingress-traefik --namespace kube-system
64 | NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
65 | ingress-traefik 10.0.25.3 138.91.243.152 80:31625/TCP,443:30871/TCP 33m
66 | ```
67 |
68 | Additionally, we need to point the `deis-builder.$host` record to the public IP address of the [Builder][].
69 |
70 | ```
71 | $ kubectl get svc deis-builder --namespace deis
72 | NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
73 | deis-builder 10.0.165.140 40.86.182.187 2222:32488/TCP 33m
74 | ```
75 |
76 | If we were using `deis.com` as a hostname, we would need to create the following A DNS records.
77 |
78 | | Name | Type | Value |
79 | | ---------------------------- |:-------------:| --------------:|
80 | | *.deis.com | A | 138.91.243.152 |
81 | | deis-builder.deis.com | A | 40.86.182.187 |
82 |
83 | Once all of the pods are in the `READY` state, and `deis.$host` resolves to the external IP found above, Workflow is up and running!
84 |
85 | After installing Workflow, [register a user and deploy an application](../quickstart/deploy-an-app.md).
86 |
87 | ##### Feedback
88 |
89 | While this feature is experimental we welcome feedback on the issue. We would like to learn more about use cases, and user experience. Please [open a new issue](https://github.com/deis/workflow/issues/new) for feedback.
90 |
91 |
92 | [builder]: ../understanding-workflow/components.md#builder
93 |
--------------------------------------------------------------------------------
/src/installing-workflow/system-requirements.md:
--------------------------------------------------------------------------------
1 | # Requirements
2 |
3 | To run Deis Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.
4 |
5 | ## Kubernetes Versions
6 |
7 | Deis Workflow requires Kubernetes v1.3.4 or later, or Kubernetes v1.6.2 or later. Kubernetes v1.6.0
8 | and v1.6.1 have [a bug](https://github.com/kubernetes/kubernetes/pull/44406) that can prevent
9 | `git push deis master` from completing successfully.
10 |
11 | ## Storage Requirements
12 |
13 | A variety of Deis Workflow components rely on an object storage system to do their work, including storing application
14 | slugs, Docker images and database logs.
15 |
16 | Deis Workflow ships with Minio by default, which provides in-cluster, ephemeral object storage. This means that if the
17 | Minio server crashes, all data will be lost. Therefore, Minio should be used for development or testing only.
18 |
19 | Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob
20 | Storage. See [configuring object storage](configuring-object-storage) for setup instructions.
21 |
22 | ## Resource Requirements
23 |
24 | When deploying Deis Workflow, it's important to provision machines with adequate resources. Deis is a highly-available
25 | distributed system, which means that Deis components and your deployed applications will move around the cluster onto
26 | healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this,
27 | you should have ample spare resources on any machine in your cluster to withstand the additional load of running
28 | services for failed machines.
29 |
30 | Deis Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk
31 | space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of:
32 |
33 | * At least 4GB of RAM (more is better)
34 | * At least 40GB of hard disk space
35 |
36 | Note that these estimates are for Deis Workflow and Kubernetes only. Be sure to leave enough spare capacity for your
37 | application footprint as well.
38 |
39 | Running smaller machines will likely result in increased system load and has been known to result in component failures
40 | and instability.
41 |
42 | !!! warning
43 | Workflow versions prior to 2.2 require '--insecure-registry' to function properly. Depending on
44 | your Kubernetes and Docker configuration, setting
45 | `EXTRA_DOCKER_OPTS="--insecure-registry=10.0.0.0/8"` may be sufficient.
46 |
47 | ## SELinux + OverlayFS
48 |
49 | If you are using Docker with OverlayFS, you must disable SELinux by adding `--selinux-enabled=false` to
50 | `EXTRA_DOCKER_OPTS`. For more background information, see:
51 |
52 | * [https://github.com/docker/docker/issues/7952](https://github.com/docker/docker/issues/7952)
53 | * [https://github.com/deis/workflow/issues/63](https://github.com/deis/postgres/issues/63)
54 |
--------------------------------------------------------------------------------
/src/managing-workflow/deploy-hooks.md:
--------------------------------------------------------------------------------
1 | # Deploy Hooks
2 |
3 | Deploy hooks allow an external service to receive a notification whenever a new version of your app
4 | is pushed to Workflow. It’s useful to help keep the development team informed about deploys, while
5 | it can also be used to integrate different systems together.
6 |
7 | After one or more hooks are setup, hook output and errors appear in your application’s logs:
8 |
9 | ```
10 | $ deis logs
11 | ...
12 | 2011-03-15T15:07:29-07:00 deis[api]: Deploy hook sent to http://deis.rocks
13 | ```
14 |
15 | Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy
16 | hooks by [tuning the controller settings][controller-settings] via the Helm chart.
17 |
18 | ## HTTP POST Hook
19 |
20 | The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the
21 | same as the variables available in the hook message: `app`, `release`, `release_summary`, `sha` and
22 | `user`. See below for their descriptions:
23 |
24 | ```
25 | app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv
26 | ```
27 |
28 | Optionally, if a deploy hook secret key is added to the controller through
29 | [tuning the controller settings][controller-settings], a new `Authorization` header will be
30 | present in the POST request. The value of this header is computed as the [HMAC][] hex digest of the
31 | request URL, using the secret as the key.
32 |
33 | In order to authenticate that this request came from Workflow, use the secret key, the full URL and
34 | the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like
35 | this:
36 |
37 | ```python
38 | import hashlib
39 | import hmac
40 |
41 | hmac.new("my_secret_key", "http://deis.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv", digestmod=hashlib.sha1).hexdigest()
42 | ```
43 |
44 | If the value of the computed HMAC hex digest and the value in the `Authorization` header are
45 | identical, then the request came from Workflow.
46 |
47 | !!! important
48 | When computing the signature, ensure that the URL parameters are in alphabetic order. This is
49 | critical when computing the cryptographic signature as most web applications don't care about
50 | the order of the HTTP parameters, but the cryptographic signature will not be the same.
51 |
52 |
53 | [controller-settings]: tuning-component-settings.md#customizing-the-controller
54 | [hmac]: https://en.wikipedia.org/wiki/Hash-based_message_authentication_code
55 |
--------------------------------------------------------------------------------
/src/managing-workflow/extending-workflow.md:
--------------------------------------------------------------------------------
1 | # Extending Workflow
2 |
3 | Deis Workflow is an open source project which wouldn't be here without the amazing skill
4 | and enthusiasm of the community that has grown up around it. Several projects have blossomed
5 | which extend Workflow in various ways.
6 |
7 | These links are to community-contributed extensions of Deis Workflow. Deis makes no
8 | guarantees about the functionality, security, or code contained within. As with any software,
9 | use with caution in a production environment.
10 |
11 | ## Workflow Community Projects
12 |
13 | - [alea][] is a backing services manager for Deis Workflow, providing easy
14 | access to PostgreSQL, Redis, MongoDB, and memcached.
15 | - [deisdash][] is a web-based UI supporting many user and app actions without need of the
16 | `deis` command-line interface.
17 | - [deis-cleanup][] is a Deis-friendly, configurable approach to purging unneeded Docker
18 | containers and images.
19 | - [deis-global-config-plugin][] stores config values in [Vault][] for easy use in Workflow apps.
20 | - [deis-node][] is a controller API client for a browser in NodeJS.
21 | - [deis-ui][] is the beginning of a full client-side dashboard that interfaces with the
22 | controller API.
23 | - [deis-workflow-aws][] simplifies installing Workflow on [Amazon Web Services][], backed by
24 | S3 and using ECR as the container registry.
25 | - [deis-workflow-gke][] simplifies installing Workflow on [Google Container Engine][], backed
26 | by Google Cloud Storage and using gcr.io as the container registry.
27 | - [deis-workflow-ruby][] contains Workflow controller API bindings for Ruby programming.
28 | - [heroku-to-deis][] migrates existing Heroku applications to the Workflow platform.
29 | - [kube-solo-osx][] creates a zero-to-Kubernetes development environment for macOS in under
30 | two minutes, with specific support for installing Workflow with [Helm][] or Helm Classic.
31 |
32 | Are we missing something? Please open a [documentation pull request][] to add it.
33 |
34 | [alea]: https://github.com/Codaisseur/alea
35 | [Amazon Web Services]: https://aws.amazon.com/
36 | [deisdash]: https://github.com/olalonde/deisdash
37 | [deis-cleanup]: https://github.com/Ragnarson/deis-cleanup
38 | [deis-global-config-plugin]: https://github.com/Rafflecopter/deis-global-config-plugin
39 | [deis-node]: https://github.com/olalonde/deis-node
40 | [deis-ui]: https://github.com/jumbojett/deis-ui
41 | [deis-workflow-aws]: https://github.com/rimusz/deis-workflow-aws
42 | [deis-workflow-gke]: https://github.com/rimusz/deis-workflow-gke
43 | [deis-workflow-ruby]: https://github.com/thomas0087/deis-workflow-ruby
44 | [documentation pull request]: https://github.com/deis/workflow/pulls
45 | [Google Container Engine]: https://cloud.google.com/container-engine/
46 | [Helm]: https://github.com/kubernetes/helm
47 | [heroku-to-deis]: https://github.com/emartech/heroku-to-deis
48 | [kube-solo-osx]: https://github.com/TheNewNormal/kube-solo-osx
49 | [Vault]: https://www.vaultproject.io/
50 |
--------------------------------------------------------------------------------
/src/managing-workflow/platform-ssl.md:
--------------------------------------------------------------------------------
1 | # Platform SSL
2 |
3 | SSL/TLS is the standard security technology for establishing an encrypted link between a web server
4 | and a browser. This link ensures that all data passed between the web server and browsers remain
5 | private and integral.
6 |
7 | To enable SSL for the Workflow API and all managed apps, you can add an SSL certificate to the Deis Workflow router. You
8 | must provide either an SSL certificate that was registered with a CA or [your own self-signed SSL
9 | certificate](../reference-guide/creating-a-self-signed-ssl-certificate.md).
10 |
11 | Note that the platform SSL certificate also functions as a default certificate for your apps that are deployed via
12 | Workflow. If you would like to attach a specific certificate to an application and domain see [Application SSL
13 | Certificates](../applications/ssl-certificates.md).
14 |
15 | ## Installing SSL on the Deis Router
16 |
17 | To terminate SSL connections on the Deis Router use `kubectl` to create a new Secret at a known name. The Deis Workflow
18 | router will automatically detect this secret and reconfigure itself appropriately.
19 |
20 | The following criteria must be met:
21 |
22 | - The name of the secret must be `deis-router-platform-cert`
23 | - The certificate's public key must be supplied as the value of the `tls.crt` key
24 | - The certificate's private key must be supplied as the value of the `tls.key` key
25 | - Both the certificate and private key must be base64 encoded
26 |
27 | If your certificate has intermediate certs, append the intermediate signing certs to the bottom of the `cert` file
28 | before base64 encoding the combined certificates.
29 |
30 | Prepare your certificate and key files by encoding them in base64:
31 |
32 | ```
33 | $ cat certificate-file.crt
34 | -----BEGIN CERTIFICATE-----
35 | / * your SSL certificate here */
36 | -----END CERTIFICATE-----
37 | -----BEGIN CERTIFICATE-----
38 | /* any intermediate certificates */
39 | -----END CERTIFICATE-----
40 | $ cat certificate-file.crt | base64 -e
41 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi8gKiB5b3VyIFNTTCBjZXJ0aWZpY2F0ZSBoZXJlICovCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi8qIGFueSBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVzICovCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
42 | $ cat certificate.key
43 | -----BEGIN RSA PRIVATE KEY-----
44 | /* your unencrypted private key here */
45 | -----END RSA PRIVATE KEY-----
46 | $ cat certificate.key | base64 -e
47 | LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQovKiB5b3VyIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGhlcmUgKi8KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
48 | ```
49 |
50 | Open your favorite text editor and create the Kubernetes manifest:
51 |
52 | ```
53 | $ $EDITOR deis-router-platform-cert.yaml
54 | ```
55 |
56 | The format of the Secret manifest should match the below example. Make sure you paste the appropriate values for `cert`
57 | and `key` from the above examples:
58 |
59 | ```
60 | $ cat deis-router-platform-cert.yaml
61 | apiVersion: v1
62 | kind: Secret
63 | metadata:
64 | name: deis-router-platform-cert
65 | namespace: deis
66 | type: Opaque
67 | data:
68 | tls.crt: LS0...tCg==
69 | tls.key: LS0...LQo=
70 | ```
71 |
72 | Once you've created the `deis-router-platform-cert.yaml` file, you can install the manifest with `kubectl create -f
73 | deis-router-platform-cert.yaml`. The Deis Workflow router will automatically notice the new secret and update its
74 | configuration on-the-fly.
75 |
76 | ## Installing SSL on a Load Balancer
77 |
78 | Most cloud-based load balancers also support SSL termination in addition to passing traffic through to Deis Router. Any
79 | communication inbound to the load balancer will be encrypted while the internal components of Deis Workflow will still
80 | communicate over HTTP. This offloads SSL processing to the cloud load balancer but also means that any
81 | application-specific SSL certificates must **also** be configured on the cloud load balancer.
82 |
83 | To terminate SSL on the cloud load balancer you will need to modify the load balancer's listener settings:
84 |
85 | - Swap the load balancer protocol on port 443 to use HTTPS instead of TCP
86 | - Swap the backend protocol to use HTTP instead of TCP
87 | - Change the destination backend port to match the port configured for HTTP, usually port 80
88 | - Install the certificate on the listener associated with port 443
89 |
90 | See your vendor's specific instructions on installing SSL on your load balancer. For AWS, see their
91 | documentation on [installing an SSL cert for load balancing](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html).
92 |
--------------------------------------------------------------------------------
/src/managing-workflow/security-considerations.md:
--------------------------------------------------------------------------------
1 | # Security Considerations
2 |
3 | !!! important
4 | Workflow is not suitable for multi-tenant environments or hosting untrusted code.
5 |
6 | A major goal of Workflow is to be operationally secure and trusted by operations engineers in every
7 | deployed environment. There are, however, two notable security-related considerations to be aware
8 | of when deploying Workflow.
9 |
10 | # Application Runtime Segregation
11 |
12 | Users of Workflow often want to deploy their applications to separate environments. Typically,
13 | physical network isolation isn’t the goal, but rather segregation of application environments - if a
14 | region goes haywire, it shouldn’t affect applications that are running in a separate region.
15 |
16 | In Workflow, deployed applications can be segregated by using the `deis tags` command. This enables
17 | you to tag machines in your cluster with arbitrary metadata, then configure your applications to be
18 | scheduled to machines which match the metadata.
19 |
20 | For example, if some machines in your cluster are tagged with `region=us-west-1` and some
21 | with `region=us-east-1`, you can configure an application to be deployed to us-west-1
22 | by using `deis tags set region=us-west-1`. Workflow will pass this configuration
23 | along to Kubernetes, which will schedule your application in different regions.
24 |
25 | See [Isolate the Application][] for more information.
26 |
27 | # Running Workflow on Public Clouds
28 |
29 | If you are running on a public cloud without security group features, you will have to set up
30 | security groups yourself through either `iptables` or a similar tool. The only ports on worker
31 | nodes that should be exposed to the public are:
32 |
33 | - 22: (optional) for remote SSH
34 | - 80: for the routers
35 | - 443: (optional) routers w/ SSL enabled
36 | - 2222: for the routers proxying TCP to the builder
37 | - 9090: for the routers' health check
38 |
39 | # IP Whitelist
40 |
41 | Enforcing a cluster-wide IP whitelist may be advisable for routers governing ingress to a cluster
42 | that hosts applications intended for a limited audience-- e.g. applications for internal use within
43 | an organization. You can enforce cluster-wide IP whitelisting by enabling whitelists, then
44 | attaching an annotation to the router:
45 |
46 | $ kubectl --namespace=deis annotate deployments/deis-router router.deis.io/nginx.enforceWhitelists=true
47 | $ kubectl --namespace=deis annotate deployments/deis-router router.deis.io/nginx.defaultWhitelist="0.0.0.0/0"
48 |
49 | The format is the same for the controller whitelist but you need to specify the whitelist directly
50 | to the controller's service. For example:
51 |
52 | $ kubectl --namespace=deis annotate service deis-controller router.deis.io/whitelist="10.0.1.0/24,121.212.121.212"
53 |
54 | And the same applies to applications. For example, to apply a whitelist to an application named
55 | `example`:
56 |
57 | $ kubectl --namespace=example annotate service example-web router.deis.io/whitelist="10.0.1.0/24,121.212.121.212"
58 |
59 | Application level whitelisting can also be done using the Deis client. To add/remove/list addresses of an application whitelist, use `deis whitelist`:
60 |
61 | $ deis whitelist:add 10.0.1.0/24,121.212.121.212 -a drafty-zaniness
62 | Adding 10.0.1.0/24,121.212.121.212 to drafty-zaniness whitelist...done
63 |
64 | $ deis whitelist:remove 121.212.121.212 -a drafty-zaniness
65 | Removing 121.212.121.212 from drafty-zaniness whitelist... done
66 |
67 | $ deis whitelist -a drafty-zaniness
68 | === drafty-zaniness Whitelisted Addresses
69 | 10.0.1.0/24
70 |
71 |
72 | [Isolate the Application]: ../applications/managing-app-configuration.md#isolate-the-application
73 |
--------------------------------------------------------------------------------
/src/quickstart/index.md:
--------------------------------------------------------------------------------
1 | # Quick Start
2 |
3 | Get started with Deis Workflow in three easy steps.
4 |
5 | 1. Install CLI tools for Helm and Deis Workflow
6 | 2. Boot a Kubernetes and install Deis Workflow
7 | 3. Deploy your first application
8 |
9 | This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our [production checklist](../managing-workflow/production-deployments.md).
10 |
11 | ## Step 1: Install CLI tools
12 |
13 | For the quickstart we will [install both Helm and Deis Workflow CLI](install-cli-tools.md).
14 |
15 | ## Step 2: Boot Kubernetes and Install Deis Workflow
16 |
17 | There are many ways to boot and run Kubernetes. You may choose to get up and running in cloud environments or locally on
18 | your laptop.
19 |
20 | Cloud-based options:
21 |
22 | * [Google Container Engine](provider/gke/boot.md): provides a managed Kubernetes environment, available with a few clicks.
23 | * [Amazon Web Services](provider/aws/boot.md): uses Kubernetes upstream `kube-up.sh` to boot a cluster on AWS EC2.
24 | * [Azure Container Service](provider/azure-acs/boot.md): uses Azure Container Service to provision Kubernetes and install Workflow.
25 |
26 | If you would like to test on your local machine follow, our guide for [Minikube](provider/minikube/boot.md).
27 |
28 | If you have already created a Kubernetes cluster, check out the [system requirements](../installing-workflow/system-requirements.md) and then proceed to [install Deis Workflow on your own Kubernetes cluster](../installing-workflow/index.md).
29 |
30 | ## Step 3: Deploy your first app
31 |
32 | Last but not least, [register a user and deploy your first application](deploy-an-app.md).
33 |
--------------------------------------------------------------------------------
/src/quickstart/install-cli-tools.md:
--------------------------------------------------------------------------------
1 | ## Deis Workflow Client CLI
2 |
3 | The Deis command-line interface (CLI), lets you interact with Deis Workflow.
4 | Use the CLI to create and configure and manage applications.
5 |
6 | Install the latest `deis` client for Linux or Mac OS X with:
7 |
8 | $ curl -sSL http://deis.io/deis-cli/install-v2.sh | bash
9 |
10 | The installer places the `deis` binary in your current directory, but you
11 | should move it somewhere in your $PATH:
12 |
13 | $ sudo ln -fs $PWD/deis /usr/local/bin/deis
14 |
15 | *or*:
16 |
17 | $ sudo mv $PWD/deis /usr/local/bin/deis
18 |
19 | Check your work by running `deis version`:
20 |
21 | $ deis version
22 | v2.18.0
23 |
24 | !!! note
25 | Note that version numbers may vary as new releases become available
26 |
27 | ## Helm Installation
28 |
29 | We will install Deis Workflow using Helm which is a tool for installing and managing software in a
30 | Kubernetes cluster.
31 |
32 | Install the latest `helm` cli for Linux or Mac OS X by following the
33 | [installation instructions][helm-install].
34 |
35 | ## Step 2: Boot a Kubernetes Cluster and Install Deis Workflow
36 |
37 | There are many ways to boot and run Kubernetes. You may choose to get up and running in cloud environments or locally on your laptop.
38 |
39 | Cloud-based options:
40 |
41 | * [Google Container Engine](provider/gke/boot.md): provides a managed Kubernetes environment, available with a few clicks.
42 | * [Amazon Web Services](provider/aws/boot.md): uses Kubernetes upstream [kops](https://github.com/kubernetes/kops) to boot a cluster on AWS EC2.
43 | * [Azure Container Service](provider/azure-acs/boot.md): provides a managed Kubernetes environment.
44 |
45 | If you would like to test on your local machine follow our guide for [Minikube](provider/minikube/boot.md).
46 |
47 |
48 | [helm-install]: https://github.com/kubernetes/helm#install
49 |
--------------------------------------------------------------------------------
/src/quickstart/provider/aws/install-aws.md:
--------------------------------------------------------------------------------
1 | # Installing Deis Workflow on Amazon Web Services
2 |
3 | {!install-workflow.md!}
4 |
5 | ## Configure your AWS Load Balancer
6 |
7 | After installing Workflow on your cluster, you will need to adjust your load balancer
8 | configuration. By default, the connection timeout for Elastic Load Blancers is 60 seconds.
9 | Unfortunately, this timeout is too short for long running connections when using `git push`
10 | functionality of Deis Workflow.
11 |
12 | Deis Workflow will automatically provision and attach a Elastic Loadbalancer to the router
13 | component. This component is responsible for routing HTTP and HTTPS requests from the public
14 | internet to applications that are deployed and managed by Deis Workflow.
15 |
16 | By describing the `deis-router` service, you can see what IP hostname has been allocated by AWS for
17 | your Deis Workflow cluster:
18 |
19 | ```
20 | $ kubectl --namespace=deis describe svc deis-router | egrep LoadBalancer
21 | Type: LoadBalancer
22 | LoadBalancer Ingress: abce0d48217d311e69a470643b4d9062-2074277678.us-west-1.elb.amazonaws.com
23 | ```
24 |
25 | The AWS name for the ELB is the first part of hostname, before the `-`. List all of your ELBs by
26 | name to confirm:
27 |
28 | ```
29 | $ aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].LoadBalancerName'
30 | abce0d48217d311e69a470643b4d9062
31 | ```
32 |
33 | Set the connection timeout to 1200 seconds, make sure you use your load balancer name:
34 |
35 | ```
36 | $ aws elb modify-load-balancer-attributes \
37 | --load-balancer-name abce0d48217d311e69a470643b4d9062 \
38 | --load-balancer-attributes "{\"ConnectionSettings\":{\"IdleTimeout\":1200}}"
39 | abce0d48217d311e69a470643b4d9062
40 | CONNECTIONSETTINGS 1200
41 | ```
42 |
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/dns.md:
--------------------------------------------------------------------------------
1 | ## Find the Load Balancer Address
2 |
3 | On Azure Container Engine, Deis Workflow will automatically provision and
4 | attach a Azure Load Balancer to the router component. This component is
5 | responsible for routing HTTP and HTTPS requests from the public internet to
6 | applications that are deployed and managed by Deis Workflow.
7 |
8 | Discover the ip address assigned to the `deis-router`, by describing the
9 | `deis-router` service:
10 |
11 | ```
12 | $ kubectl --namespace=deis get service deis-router
13 | NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
14 | deis-router 10.0.60.172 13.82.148.57 80/TCP,443/TCP,2222/TCP,9090/TCP 54m
15 | ```
16 |
17 | If the `EXTERNAL-IP` column shows `` instead of an ip address continue
18 | to wait until Azure finishes provisioning and attaching the load balancer.
19 |
20 | ## Prepare the Hostname
21 |
22 | Now that an ip address has been attached to the load balancer use the `nip.io`
23 | DNS service to route arbitrary hostnames to the Deis Workflow edge router.
24 | Usage of `nip.io` is not recommended for long-term use and is intended here as
25 | a short cut to prevent fiddling with DNS.
26 |
27 | To verify connectivity to the Workflow API server and nip.io, construct the
28 | hostname by taking the ip address of load balancer and adding `nip.io`.
29 |
30 | For our example above, the address would be: `13.82.148.57.nip.io`.
31 |
32 | Nip answers with the ip address no matter the hostname:
33 | ```
34 | $ host 13.82.148.57.nip.io
35 | 13.82.148.57.nip.io has address 13.82.148.57
36 | $ host something-random.13.82.148.57.nip.io
37 | something-random.13.82.148.57.nip.io has address 13.82.148.57
38 | ```
39 |
40 | By default, any HTTP traffic destined for the hostname `deis` is automatically sent to the Workflow API service. To test that everything is connected properly use `curl`:
41 |
42 | ```
43 | $ curl http://deis.13.82.148.57.nip.io/v2/ && echo
44 | {"detail":"Authentication credentials were not provided."}
45 | ```
46 |
47 | Since no authentication information has been provided, `curl` will return an error. However this does validate that `curl` has reached the Workflow API service.
48 |
49 | Remember the hostname, it will used in the next step.
50 |
51 | You are now ready to [register an admin user and deploy your first app](../../deploy-an-app.md).
52 |
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/cloudshell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/cloudshell.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step1.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step2.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step3.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step4.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step5.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/images/step6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/azure-acs/images/step6.png
--------------------------------------------------------------------------------
/src/quickstart/provider/azure-acs/install-azure-acs.md:
--------------------------------------------------------------------------------
1 | # Install Deis Workflow on Azure Container Service
2 |
3 | ## Check Your Setup
4 |
5 | First check that the `helm` command is available and the version is v2.5.0 or newer.
6 |
7 | ```
8 | $ helm version
9 | Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
10 | Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
11 | ```
12 |
13 | Finally, initialize Helm:
14 | ```
15 | helm init
16 | ```
17 |
18 | Ensure the `kubectl` client is installed and can connect to your Kubernetes cluster.
19 |
20 | ## Add the Deis Chart Repository
21 |
22 | The Deis Chart Repository contains everything needed to install Deis Workflow onto a Kubernetes cluster, with a single `helm install deis/workflow --namespace deis` command.
23 |
24 | Add this repository to Helm:
25 |
26 | ```
27 | $ helm repo add deis https://charts.deis.com/workflow
28 | ```
29 |
30 | ## Create New Azure Storage Account
31 |
32 | It is recommended to use a dedicated storage account for the operational aspects of Workflow, which includes storing slug and container images, database backups, and disaster recovery. This storage account is passed as parameters during the `helm install` command in the next step. Replace the `AZURE_SA_NAME` variable with a unique name for your storage account and execute these commands.
33 | ```
34 | $ export AZURE_SA_NAME=YourGlobalUniqueName
35 | $ az storage account create -n $AZURE_SA_NAME -l $AZURE_DC_LOCATION -g $AZURE_RG_NAME --sku Standard_LRS
36 | $ export AZURE_SA_KEY=`az storage account keys list -n $AZURE_SA_NAME -g $AZURE_RG_NAME --query [0].value --output tsv`
37 |
38 | ```
39 |
40 | > Note: Premium Storage skus are not supported yet due to [lack of block blob storage support](https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/using-blob-service-operations-with-azure-premium-storage) required for the deis database to function.
41 |
42 | ## Install Deis Workflow
43 |
44 | Now that Helm is installed and the repository has been added, install Workflow by running:
45 |
46 | ```
47 | $ helm install deis/workflow --namespace=deis --set global.storage=azure,azure.accountname=$AZURE_SA_NAME,azure.accountkey=$AZURE_SA_KEY,azure.registry_container=registry,azure.database_container=database,azure.builder_container=builder
48 | ```
49 |
50 | Helm will install a variety of Kubernetes resources in the `deis` namespace.
51 | Wait for the pods that Helm launched to be ready. Monitor their status by running:
52 |
53 | ```
54 | $ kubectl --namespace=deis get pods
55 | ```
56 |
57 | If it's preferred to have `kubectl` automatically update as the pod states change, run (type Ctrl-C to stop the watch):
58 |
59 | ```
60 | $ kubectl --namespace=deis get pods -w
61 | ```
62 |
63 | Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the
64 | installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will
65 | automatically restart it.
66 |
67 | Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
68 |
69 | ```
70 | $ kubectl --namespace=deis get pods
71 | NAME READY STATUS RESTARTS AGE
72 | deis-builder-hy3xv 1/1 Running 5 5m
73 | deis-controller-g3cu8 1/1 Running 5 5m
74 | deis-database-rad1o 1/1 Running 0 5m
75 | deis-logger-fluentd-1v8uk 1/1 Running 0 5m
76 | deis-logger-fluentd-esm60 1/1 Running 0 5m
77 | deis-logger-sm8b3 1/1 Running 0 5m
78 | deis-minio-4ww3t 1/1 Running 0 5m
79 | deis-registry-asozo 1/1 Running 1 5m
80 | deis-router-k1ond 1/1 Running 0 5m
81 | deis-workflow-manager-68nu6 1/1 Running 0 5m
82 | ```
83 |
84 | Once all of the pods are in the `READY` state, Deis Workflow is up and running!
85 |
86 | Next, [configure dns](dns.md) so you can register your first user and deploy an application.
87 |
88 |
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/dns.md:
--------------------------------------------------------------------------------
1 | ## Find Your Load Balancer Address
2 |
3 | On Google Container Engine, Deis Workflow will automatically provision and
4 | attach a Google Cloud Loadbalancer to the router copmonent. This component is
5 | responsible for routing HTTP and HTTPS requests from the public internet to
6 | applications that are deployed and managed by Deis Workflow.
7 |
8 | By describing the `deis-router` service, you can see what IP address has been
9 | allocated by Google Cloud for your Deis Workflow cluster:
10 |
11 | ```
12 | $ kubectl --namespace=deis describe svc deis-router | grep LoadBalancer
13 | Type: LoadBalancer
14 | LoadBalancer Ingress: 104.197.125.75
15 | ```
16 |
17 | ## Prepare the Hostname
18 |
19 | Now that you have the ip address of your load balancer we can use the `nip.io`
20 | DNS service to route arbitrary hostnames to the Deis Workflow edge router. This
21 | lets us point the Workflow CLI at your cluster without having to either use
22 | your own domain or update DNS!
23 |
24 | To verify the Workflow API server and nip.io, construct your hostname by taking
25 | the ip address for your load balancer and adding `nip.io`. For our example
26 | above, the address would be: `104.197.125.75.nip.io`.
27 |
28 | Nip answers with the ip address no matter the hostname:
29 | ```
30 | $ host 104.197.125.75.nip.io
31 | 104.197.125.75.nip.io has address 104.197.125.75
32 | $ host something-random.104.197.125.75.nip.io
33 | something-random.104.197.125.75.nip.io has address 104.197.125.75
34 | ```
35 |
36 | By default, any HTTP traffic for the hostname `deis` will be sent to the Workflow API service. To test that everything is connected properly you may validate connectivity using `curl`:
37 |
38 | ```
39 | $ curl http://deis.104.197.125.75.nip.io/v2/ && echo
40 | {"detail":"Authentication credentials were not provided."}
41 | ```
42 |
43 | You should see a failed request because we provided no credentials to the API server.
44 |
45 | Remember the hostname, we will use it in the next step.
46 |
47 | You are now ready to [register an admin user and deploy your first app](../../deploy-an-app.md).
48 |
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-2.png
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-3.png
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/first-kubernetes-cluster-gke-select.png
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/gke-cluster-sizing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/gke-cluster-sizing.png
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/gke-create-container-cluster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/gke-create-container-cluster.png
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/images/gke-node-version.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/deis/workflow/889f6ce1633dddc52c84eba168f76f57d18bab3e/src/quickstart/provider/gke/images/gke-node-version.jpg
--------------------------------------------------------------------------------
/src/quickstart/provider/gke/install-gke.md:
--------------------------------------------------------------------------------
1 | # Install Deis Workflow on Google Compute Engine
2 |
3 | {!install-workflow.md!}
4 |
--------------------------------------------------------------------------------
/src/quickstart/provider/minikube/boot.md:
--------------------------------------------------------------------------------
1 | # Booting Kubernetes Using Minikube
2 |
3 | This guide will walk you through the process of installing a small development
4 | Kubernetes cluster on your local machine using [minikube](https://github.com/kubernetes/minikube).
5 |
6 | ## Pre-requisites
7 |
8 | * OS X
9 | * [xhyve driver](https://github.com/kubernetes/minikube/blob/master/DRIVERS.md#xhyve-driver), [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or [VMware Fusion](https://www.vmware.com/products/fusion) installation
10 | * Linux
11 | * [VirtualBox](https://www.virtualbox.org/wiki/Downloads) or [KVM](http://www.linux-kvm.org/) installation
12 | * Windows
13 | * [Hyper-V](https://github.com/kubernetes/minikube/blob/master/DRIVERS.md#hyperv-driver)
14 | * VT-x/AMD-v virtualization must be enabled in BIOS
15 | * The most recent version of `kubectl`. You can install kubectl following
16 | [these steps](https://kubernetes.io/docs/user-guide/prereqs/).
17 | * Internet connection
18 | * You will need a decent internet connection running `minikube start` for the first time for
19 | Minikube to pull its Docker images. It might take Minikube some time to start.
20 |
21 | ## Download and Unpack Minikube
22 |
23 | See the installation instructions for the
24 | [latest release of minikube](https://github.com/kubernetes/minikube/releases).
25 |
26 | ## Set your VM driver (optional)
27 |
28 | You can set your preferred driver (virtualbox - default, vmwarefusion, kvm, xhyve) using the following command:
29 |
30 | ```
31 | minikube config set vm-driver virtualbox
32 | ```
33 |
34 | ## Boot Your First Cluster
35 |
36 | We are now ready to boot our first Kubernetes cluster using Minikube!
37 |
38 | ```
39 | $ minikube start --disk-size=60g --memory=4096
40 | Starting local Kubernetes cluster...
41 | Kubectl is now configured to use the cluster.
42 | ```
43 |
44 | Now that the cluster is up and ready, `minikube` automatically configures `kubectl` on your machine
45 | with the appropriate authentication and endpoint information.
46 |
47 | ```
48 | $ kubectl cluster-info
49 | Kubernetes master is running at https://192.168.99.100:8443
50 | KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns
51 | kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
52 |
53 | To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
54 | ```
55 |
56 | You are now ready to [install Deis Workflow](install-minikube.md)
57 |
--------------------------------------------------------------------------------
/src/quickstart/provider/minikube/dns.md:
--------------------------------------------------------------------------------
1 | ## Find Your Load Balancer Address
2 |
3 | During installation, Deis Workflow specifies that Kubernetes should provision and attach a load
4 | balancer to the router component. The router component is responsible for routing HTTP and HTTPS
5 | requests from outside the cluster to applications that are managed by Deis Worfklow. In cloud
6 | environments, Kubernetes provisions and attaches a load balancer for you. Since we are running in a
7 | local environment, we need to do a little bit of extra work to send requests to the router.
8 |
9 | First, determine the ip address allocated to the worker node.
10 |
11 | ```
12 | $ minikube ip
13 | 192.168.99.100
14 | ```
15 |
16 | ## Prepare the Hostname
17 |
18 | Now that you have the ip address of your virtual machine, we can use the `nip.io` DNS service or `dnsmasq` to
19 | route arbitrary hostnames to the Deis Workflow edge router. This lets us point the Workflow CLI at
20 | your cluster without having to either use your own domain or update DNS!
21 |
22 | ### Using `nip.io`
23 |
24 | To verify the Workflow API server and nip.io, construct your hostname by taking the ip address for
25 | your load balancer and adding `nip.io`. For our example above, the address would be `192.168.99.100`.
26 |
27 | Nip answers with the ip address no matter the hostname:
28 |
29 | ```
30 | $ host 192.168.99.100.nip.io
31 | 192.168.99.100.nip.io has address 192.168.99.100
32 | $ host something-random.192.168.99.100.nip.io
33 | something-random.192.168.99.100.nip.io has address 192.168.99.100
34 | ```
35 |
36 | ### Using DNSMasq
37 |
38 | If `nip.io` is working for you, you can skip this section, and proceed to verify the hostname.
39 |
40 | If you prefer not to use `nip.io` or cannot (because your DNS provider might have blocked it), you can use `dnsmasq` on Linux and macOS or `Acrylic` on Windows.
41 |
42 | You can install and configure `dnsmasq` on macOS with [Homebrew](https://brew.sh) with the following commands:
43 |
44 | ```sh
45 | # Installing dnsmasq
46 | $ brew install dnsmasq
47 |
48 | # Configure `.minikube` subdomains to always use minikube IP:
49 | $ echo "address=/.minikube/`minikube ip`" >> /usr/local/etc/dnsmasq.conf
50 | $ sudo brew services start dnsmasq
51 |
52 | # Make the system resolver use dnsmasq to resolve addresses:
53 | $ sudo mkdir /etc/resolver
54 | $ echo nameserver 127.0.0.1 | sudo tee /etc/resolver/minikube
55 |
56 | # You might need to clear the DNS resolver cache:
57 | $ sudo killall -HUP mDNSResponder
58 | ```
59 |
60 | You may need to ensure that the `dnsmasq` service at 127.0.0.1 is listed as a DNS server for your network connection. You may check this using the following command:
61 |
62 | ```sh
63 | $ scutil --dns | grep minikube -B 1 -A 3
64 | resolver #8
65 | domain : minikube
66 | nameserver[0] : 127.0.0.1
67 | flags : Request A records, Request AAAA records
68 | reach : Reachable, Local Address, Directly Reachable Address
69 | ```
70 |
71 | To verify the hostname, you will need to use `deis.minikube` as hostname instead of `deis.192.168.99.100.nip.io` in the next section. We will also use it in the next step.
72 |
73 | ### Verify the hostname
74 |
75 | By default, any HTTP traffic for the hostname `deis` will be sent to the Workflow API service. To test that everything is connected properly you may validate connectivity using `curl`:
76 |
77 | ```
78 | $ curl http://deis.192.168.99.100.nip.io/v2/ && echo
79 | {"detail":"Authentication credentials were not provided."}
80 | ```
81 |
82 | You should see a failed request because we provided no credentials to the API server.
83 |
84 | Remember the hostname, we will use it in the next step.
85 |
86 | [next: deploy your first app](../../deploy-an-app.md)
87 |
--------------------------------------------------------------------------------
/src/quickstart/provider/minikube/install-minikube.md:
--------------------------------------------------------------------------------
1 | # Install Deis Workflow on Minikube
2 |
3 | ## Check Your Setup
4 |
5 | First check that the `helm` command is available and the version is v2.5.0 or newer.
6 |
7 | ```
8 | $ helm version
9 | Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
10 | Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
11 | ```
12 |
13 | Ensure the `kubectl` client is installed and can connect to your Kubernetes cluster.
14 |
15 | ## Add the Deis Chart Repository
16 |
17 | The Deis Chart Repository contains everything needed to install Deis Workflow onto a Kubernetes cluster, with a single `helm install deis/workflow --namespace deis` command.
18 |
19 | Add this repository to Helm:
20 |
21 | ```
22 | $ helm repo add deis https://charts.deis.com/workflow
23 | ```
24 |
25 | ## Install Deis Workflow
26 |
27 | Now that Helm is installed and the repository has been added, install Workflow by running:
28 |
29 | ```
30 | $ helm install deis/workflow --namespace deis --set router.host_port.enabled=true
31 | ```
32 |
33 | Helm will install a variety of Kubernetes resources in the `deis` namespace.
34 | Wait for the pods that Helm launched to be ready. Monitor their status by running:
35 |
36 | ```
37 | $ kubectl --namespace=deis get pods
38 | ```
39 |
40 | If it's preferred to have `kubectl` automatically update as the pod states change, run (type Ctrl-C to stop the watch):
41 |
42 | ```
43 | $ kubectl --namespace=deis get pods -w
44 | ```
45 |
46 | Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the
47 | installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will
48 | automatically restart it.
49 |
50 | Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
51 |
52 | ```
53 | $ kubectl --namespace=deis get pods
54 | NAME READY STATUS RESTARTS AGE
55 | deis-builder-hy3xv 1/1 Running 5 5m
56 | deis-controller-g3cu8 1/1 Running 5 5m
57 | deis-database-rad1o 1/1 Running 0 5m
58 | deis-logger-fluentd-1v8uk 1/1 Running 0 5m
59 | deis-logger-fluentd-esm60 1/1 Running 0 5m
60 | deis-logger-sm8b3 1/1 Running 0 5m
61 | deis-minio-4ww3t 1/1 Running 0 5m
62 | deis-registry-asozo 1/1 Running 1 5m
63 | deis-router-k1ond 1/1 Running 0 5m
64 | deis-workflow-manager-68nu6 1/1 Running 0 5m
65 | ```
66 |
67 | Once all of the pods are in the `READY` state, Deis Workflow is up and running!
68 |
69 | Next, [configure dns](dns.md) so you can register your first user and deploy an application.
70 |
--------------------------------------------------------------------------------
/src/reference-guide/creating-a-self-signed-ssl-certificate.md:
--------------------------------------------------------------------------------
1 | # Creating a Self-Signed SSL Certificate
2 |
3 | When [using the app ssl][app ssl] feature for non-production applications or when [installing SSL for the platform][platform ssl], you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.
4 |
5 | ## Prerequisites
6 |
7 | The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed.
8 |
9 | $ which openssl
10 | /usr/bin/openssl
11 |
12 | If the which command does not return a path then you will need to install openssl yourself:
13 |
14 | If you have... | Install with...
15 | ---------------|------------------------
16 | Mac OS X | Homebrew: `brew install openssl`
17 | Windows | complete package .exe installed
18 | Ubuntu Linux | `apt-get install openssl`
19 |
20 | ## Generate Private Key and Certificate Signing Request
21 |
22 | A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty.
23 |
24 | $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
25 | ...
26 | $ openssl rsa -passin pass:x -in server.pass.key -out server.key
27 | writing RSA key
28 | $ rm server.pass.key
29 | $ openssl req -new -key server.key -out server.csr
30 | ...
31 | Country Name (2 letter code) [AU]:US
32 | State or Province Name (full name) [Some-State]:California
33 | ...
34 | A challenge password []:
35 | ...
36 |
37 | ## Generate SSL Certificate
38 |
39 | The self-signed SSL certificate is generated from the server.key private key and server.csr files.
40 |
41 | $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
42 |
43 | The server.crt file is your site certificate suitable for use with [Deis's SSL endpoint][app ssl] along with the server.key private key.
44 |
45 | [app ssl]: ../applications/ssl-certificates.md
46 | [platform ssl]: ../managing-workflow/platform-ssl.md
47 |
--------------------------------------------------------------------------------
/src/reference-guide/migration.md:
--------------------------------------------------------------------------------
1 | # Migrating from Deis v1
2 |
3 | Workflow uses [`kubectl`][kubectl] and [`helm`][helm] to manage the cluster. These tools are
4 | equivalent to Deis v1's [`fleetctl`][fleetctl] and [`deisctl`][deisctl]. These two tools are used
5 | for managing the cluster's state, installing the platform and inspecting its state.
6 |
7 | This document is a "cheat sheet" for users migrating from Deis v1 to Workflow (v2). It lists most of
8 | the known commands administrators would use with `deisctl` and translates their usage in Workflow.
9 |
10 | ## Listing all Components
11 |
12 | ```
13 | # Deis v1
14 | $ deisctl list
15 |
16 | # Workflow
17 | $ kubectl --namespace=deis get deployments
18 | ```
19 |
20 | ## Listing all Nodes
21 |
22 | ```
23 | # Deis v1
24 | $ fleetctl list-machines
25 |
26 | # Workflow
27 | $ kubectl get nodes
28 | ```
29 |
30 | ## Custom Configuration
31 |
32 | ```
33 | # Deis v1
34 | $ deisctl config controller set registrationMode=admin_only
35 |
36 | # Workflow
37 | $ kubectl --namespace=deis patch deployment deis-controller -p '{"spec":{"containers":{"env":[{"name":"REGISTRATION_MODE","value":"admin_only"}]}}}'
38 | ```
39 |
40 | ## View Component Configuration
41 |
42 | ```
43 | # Deis v1
44 | $ deisctl config router get bodySize
45 |
46 | # Workflow
47 | $ kubectl --namespace=deis get deployment deis-router -o yaml
48 | ```
49 |
50 | ## Running a Command Within a Component
51 |
52 | ```
53 | # Deis v1
54 | $ deisctl dock router@1
55 |
56 | # Workflow
57 | $ kubectl get po --namespace=deis -l app=deis-router --output="jsonpath={.items[0].metadata.name}"
58 | deis-router-1930478716-iz6oq
59 | $ kubectl --namespace=deis exec -it deis-router-1930478716-iz6oq bash
60 | ```
61 |
62 | ## Follow the Logs for a Component
63 |
64 | ```
65 | # Deis v1
66 | $ fleetctl journal -f deis-builder
67 |
68 | # Workflow
69 | $ kubectl get po --namespace=deis -l app=deis-builder --output="jsonpath={.items[0].metadata.name}"
70 | deis-builder-1851090495-5n0sn
71 | $ kubectl --namespace=deis logs -f deis-builder-1851090495-5n0sn
72 | ```
73 |
74 |
75 | [deisctl]: http://docs.deis.io/en/latest/installing_deis/install-deisctl/
76 | [fleetctl]: https://github.com/coreos/fleet/blob/master/Documentation/using-the-client.md
77 | [kubectl]: http://kubernetes.io/docs/user-guide/kubectl-overview/
78 | [helm]: https://github.com/kubernetes/helm
79 |
--------------------------------------------------------------------------------
/src/reference-guide/terms.md:
--------------------------------------------------------------------------------
1 | # Terms
2 |
3 |
4 | ## Application
5 |
6 | An application services requests and background jobs for a deployed git repository. Each application includes a set of Containers used to run isolated processes, and a Release that defines the current Build and Config deployed by containers.
7 |
8 |
9 | ## Build
10 |
11 | Deis builds are created automatically on the controller when a developer uses `git push deis master`. When a new build is created, a new Release is created automatically.
12 |
13 |
14 | # Config
15 |
16 | Config refers to a set of environment variables used by Containers in as Application.
17 |
18 | When Config is changed, a new Release is created automatically.
19 |
20 |
21 | ## Container
22 |
23 | Deis containers are instances of Docker containers used to run Applications. Containers perform the actual work of an Application by servicing requests or by running background tasks as part of the cluster.
24 |
25 |
26 | ### Ephemeral Filesystem
27 |
28 | Each container gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the container’s lifetime, its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other container. Any files written to the ephemeral filesystem will be discarded the moment the container is either stopped or restarted.
29 |
30 |
31 | ### Container States
32 |
33 | There are several states that a container can be in at any time. The states are:
34 |
35 | - initialized - the state of the container before it is created
36 | - created - the container is built and ready for operation
37 | - up - the container is running
38 | - down - the container crashed or is stopped
39 | - destroyed - the container has been destroyed
40 |
41 |
42 | ## Controller
43 |
44 | The controller is the "brain" of the Deis platform. A controller manages Applications and their lifecycle.
45 |
46 | The controller is in charge of:
47 |
48 | - Authenticating and authorizing clients
49 | - Processing client API calls
50 | - Managing containers that perform work for applications
51 | - Managing proxies that route traffic to containers
52 | - Managing users, keys and other base configuration
53 |
54 | The Controller stack includes:
55 |
56 | - Django API Server for handling API calls
57 |
58 |
59 | ## Key
60 |
61 | Deis keys are SSH Keys used during the git push process. Each user can use the client to manage a list of keys on the Controller.
62 |
63 |
64 | ## Release
65 |
66 | A Deis release is a combination of a Build with a Config. Each Application is associated with one release at a time. Deis releases are numbered and new releases always increment by one (e.g. v1, v2, v3).
67 |
68 | Containers that host an application use these release versions to pull the correct code and configuration.
69 |
70 |
71 | ## Scheduler
72 |
73 | The Scheduler is responsible for creating, starting, stopping, and destroying Containers. For example, a command such as `deis scale cmd=10` tells the Scheduler to run ten Containers from the Docker image for your Application.
74 |
75 | The Scheduler must decide which machines are eligible to run these container jobs. Scheduler backends vary in the details of their job allocation policies and whether or not they are resource-aware, among other features.
76 |
77 | The Deis scheduler client is implemented in the Controller component.
78 |
79 |
80 | ## Service
81 |
82 | A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. In Workflow, a Service is used to load-balance an application's [Containers](#containers) internally through a virtual IP address.
83 |
--------------------------------------------------------------------------------
/src/roadmap/planning-process.md:
--------------------------------------------------------------------------------
1 | # Planning Process
2 |
3 | Deis features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.
4 |
5 | ## The Role of Maintainers
6 |
7 | [Maintainers][] lead the Deis projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.
8 |
9 | ## Open Roadmap
10 |
11 | The [Deis Roadmap](roadmap.md) is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.
12 |
13 | ## Contributing to the Roadmap
14 |
15 | Proposals and issues can be opened by anyone. Every member of the [community][] is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.
16 |
17 | ## Release Milestones
18 |
19 | The Roadmap gets delivered progressively via the [Release Schedule][]. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.
20 |
21 | ## Release Planning Meetings
22 |
23 | Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the [Release Schedule][].
24 |
25 | Release Planning Meetings are open to the public with access coordinated via the [Deis #community Slack channel](https://slack.deis.io).
26 | Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.
27 |
28 | ## Credits
29 |
30 | Thanks to [Amy Lindburg][] and our friends at [Docker][] for their inspiration.
31 |
32 | [Amy Lindburg]: https://twitter.com/amylindburg
33 | [community]: ../contributing/community.md
34 | [Docker]: https://www.docker.com/
35 | [event]: https://goo.gl/q27Jyh
36 | [Maintainers]: ../contributing/maintainers.md
37 | [Release Schedule]: releases.md
38 |
--------------------------------------------------------------------------------
/src/roadmap/roadmap.md:
--------------------------------------------------------------------------------
1 | # Deis Workflow Roadmap
2 |
3 | The Deis Workflow Roadmap is a community document created as part of the open
4 | [Planning Process](planning-process.md). Each roadmap item describes a high-level capability or
5 | grouping of features that are deemed important to the future of Deis.
6 |
7 | Given the project's rapid [Release Schedule](releases.md), roadmap
8 | items are designed to provide a sense of direction over many releases.
9 |
10 | ## Interactive `deis run /bin/bash`
11 |
12 | Provide the ability for developers to launch an interactive terminal session in
13 | their application environment.
14 |
15 | Related issues:
16 |
17 | *
18 | *
19 |
20 | ## Log Streaming
21 |
22 | Stream application logs via `deis logs -f`
23 |
24 | ## Teams and Permissions
25 |
26 | Teams and Permissions represents a more flexible permissions model to allow
27 | more nuanced control to applications, capabilities and resources on the
28 | platform. There have been a number of proposals in this area which need to be
29 | reconciled for Deis Workflow before we begin implementation.
30 |
31 | Related issues:
32 |
33 | * Deploy Keys:
34 | * Teams:
35 | * Fine grained permissions:
36 | * Admins create apps only:
37 | * Admin Certificate Permissions:
38 |
39 | ## Monitoring
40 |
41 | * [ ] Define and deliver alerts with Kapacitor:
42 |
43 | ## Workflow Addons/Services
44 |
45 | Developers should be able to quickly and easily provision application
46 | dependencies using a services or addon abstraction.
47 |
48 |
49 | ## Inbound/Outbound Webhooks
50 |
51 | Deis Workflow should be able to send and receive webhooks from external
52 | systems. Facilitating integration with third party services like GitHub,
53 | Gitlab, Slack, Hipchat.
54 |
55 | * [X] Send webhook on platform events: (Workflow v2.10)
56 |
--------------------------------------------------------------------------------
/src/troubleshooting/applications.md:
--------------------------------------------------------------------------------
1 | # Troubleshooting Applications
2 |
3 | This document describes how one can troubleshoot common issues when deploying or debugging an
4 | application that fails to start or deploy.
5 |
6 |
7 | ## Application has a Dockerfile, but a Buildpack Deployment Occurs
8 |
9 | When you deploy an application to Workflow using `git push deis master` and the [Builder][]
10 | attempts to deploy using the Buildpack workflow, check the following steps:
11 |
12 | 1. Are you deploying the correct project?
13 | 2. Are you pushing the correct git branch (`git push deis `)?
14 | 3. Is the `Dockerfile` in the project's root directory?
15 | 4. Have you committed the `Dockerfile` to the project?
16 |
17 | ## Application was Deployed, but is Failing to Start
18 |
19 | If you deployed your application but it is failing to start, you can use `deis logs` to check
20 | why the application fails to boot. Sometimes, the application container may fail to boot without
21 | logging any information about the error. This typically occurs when the healthcheck configured for
22 | the application fails. In this case, you can start by
23 | [troubleshooting using kubectl][troubleshooting-kubectl]. You can inspect the application's current
24 | state by examining the pod deployed in the application's namespace. To do that, run
25 |
26 | $ kubectl --namespace=myapp get pods
27 | NAME READY STATUS RESTARTS AGE
28 | myapp-cmd-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s
29 |
30 | We can then describe the pod and determine why it is failing to boot:
31 |
32 |
33 | Events:
34 | FirstSeen LastSeen Count From SubobjectPath Type Reason Message
35 | --------- -------- ----- ---- ------------- -------- ------ -------
36 | 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-cmd-1585713350-3brbo to kubernetes-node-1
37 | 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Created Created container with docker id b86bd851a61f
38 | 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Started Started container with docker id b86bd851a61f
39 | 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused
40 |
41 | In this instance, we set the healthcheck initial delay timeout for the application at 1 second,
42 | which is too aggressive. The application needs some time to set up the API server after the
43 | container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the
44 | application is able to boot and is responding correctly.
45 |
46 | See [Custom Health Checks][healthchecks] for more information on how to customize the application's
47 | health checks to better suit the application's needs.
48 |
49 |
50 | [builder]: ../understanding-workflow/components.md#builder
51 | [healthchecks]: ../applications/managing-app-configuration.md#custom-health-checks
52 | [troubleshooting-kubectl]: kubectl.md
53 |
--------------------------------------------------------------------------------
/src/troubleshooting/index.md:
--------------------------------------------------------------------------------
1 | # Troubleshooting Workflow
2 |
3 | Common issues that users have run into when provisioning Workflow are detailed below.
4 |
5 | ## A Component Fails to Start
6 |
7 | For information on troubleshooting a failing component, see
8 | [Troubleshooting with Kubectl][kubectl].
9 |
10 | ## An Application Fails to Start
11 |
12 | For information on troubleshooting application deployment issues, see
13 | [Troubleshooting Applications][troubleshooting-app].
14 |
15 |
16 | ## Permission denied (publickey)
17 |
18 | The most common problem for this issue is the user forgetting to run `deis keys:add` or add their
19 | private key to their SSH agent. To do so, run `ssh-add ~/.ssh/id_rsa` and try running
20 | `git push deis master` again.
21 |
22 | If you happen get a `Could not open a connection to your authentication agent`
23 | error after trying to run `ssh-add` command above, you may need to load the SSH
24 | agent environment variables issuing the `eval "$(ssh-agent)"` command before.
25 |
26 | ## Other Issues
27 |
28 | Running into something not detailed here? Please [open an issue][issue] or hop into
29 | [#community on Slack][slack] for help!
30 |
31 | [kubectl]: kubectl.md
32 | [issue]: https://github.com/deis/workflow/issues/new
33 | [slack]: http://slack.deis.io/
34 | [troubleshooting-app]: applications.md
35 |
--------------------------------------------------------------------------------
/src/troubleshooting/kubectl.md:
--------------------------------------------------------------------------------
1 | # Troubleshooting using Kubectl
2 |
3 | This document describes how one can use `kubectl` to debug any issues with the cluster.
4 |
5 | ## Diving into the Components
6 |
7 | Using `kubectl`, one can inspect the cluster's current state. When Workflow is installed
8 | with `helm`, Workflow is installed into the `deis` namespace. To inspect if Workflow is
9 | running, run:
10 |
11 | $ kubectl --namespace=deis get pods
12 | NAME READY STATUS RESTARTS AGE
13 | deis-builder-gqum7 0/1 ContainerCreating 0 4s
14 | deis-controller-h6lk6 0/1 ContainerCreating 0 4s
15 | deis-database-56v39 0/1 ContainerCreating 0 4s
16 | deis-logger-fluentd-xihr1 0/1 Pending 0 2s
17 | deis-logger-grupg 0/1 ContainerCreating 0 3s
18 | deis-minio-c2exb 0/1 Pending 0 3s
19 | deis-monitor-grafana-9ccur 0/1 Pending 0 3s
20 | deis-monitor-influxdb-f9ftm 0/1 Pending 0 3s
21 | deis-monitor-stdout-novxs 0/1 Pending 0 3s
22 | deis-monitor-telegraf-dc3y3 0/1 Pending 0 2s
23 | deis-registry-5bor6 0/1 Pending 0 3s
24 | deis-router-r02sd 0/1 Pending 0 2s
25 | deis-workflow-manager-hizv6 0/1 Pending 0 2s
26 |
27 | !!! tip
28 | To save precious keystrokes, alias `kubectl --namespace=deis` to `kd` so it is easier to type
29 | in the future.
30 |
31 | To fetch the logs of a specific component, use `kubectl logs`:
32 |
33 | $ kubectl --namespace=deis logs deis-controller-h6lk6
34 | system information:
35 | Django Version: 1.9.6
36 | Python 3.5.1
37 | addgroup: gid '0' in use
38 | Django checks:
39 | System check identified no issues (2 silenced).
40 | [...]
41 |
42 | To dive into a running container to inspect its environment, use `kubectl exec`:
43 |
44 | $ kubectl --namespace=deis exec -it deis-database-56v39 gosu postgres psql
45 | psql (9.4.7)
46 | Type "help" for help.
47 |
48 | postgres=# \l
49 | List of databases
50 | Name | Owner | Encoding | Collate | Ctype | Access privileges
51 | ----------------------------------+----------+----------+------------+------------+-----------------------
52 | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
53 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
54 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
55 | | | | | | postgres=CTc/postgres
56 | template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
57 | | | | | | postgres=CTc/postgres
58 | (4 rows)
59 | postgres=# \connect V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
60 | You are now connected to database "V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc" as user "postgres".
61 | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc=# \dt
62 | List of relations
63 | Schema | Name | Type | Owner
64 | --------+--------------------------------+-------+----------------------------------
65 | public | api_app | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
66 | public | api_build | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
67 | public | api_certificate | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
68 | public | api_config | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
69 | public | api_domain | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
70 | public | api_key | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
71 | public | api_push | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
72 | public | api_release | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
73 | public | auth_group | table | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc
74 | --More--
75 | V7wckOHIAn3MZ7mO5du4q5IRq7yib1Oc=# SELECT COUNT(*) from api_app;
76 | count
77 | -------
78 | 0
79 | (1 row)
80 |
--------------------------------------------------------------------------------
/src/understanding-workflow/architecture.md:
--------------------------------------------------------------------------------
1 | # Architecture
2 |
3 | Deis Workflow is built using a service oriented architecture. All components
4 | are published as a set of container images which can be deployed to any
5 | compliant Kubernetes cluster.
6 |
7 | ## Overview
8 |
9 | 
10 |
11 | Operators use [Helm][] to configure and install the Workflow components which
12 | interface directly with the underlying Kubernetes cluster. Service discovery,
13 | container availability and networking are all delegated to Kubernetes, while
14 | Workflow provides a clean and simple developer experience.
15 |
16 | ## Platform Services
17 |
18 | 
19 |
20 | Deis Workflow provides additional functionality to your Kubernetes cluster, including:
21 |
22 | * [Source to Image Builder][builder] which compiles your Application code via Buildpacks or Dockerfiles
23 | * [Cross-Pod Log Aggregation][logger] which gathers logs from all of your Application processes
24 | * [Simple REST API][controller] which powers the CLI and any external integrations
25 | * Application release and rollback
26 | * Authentication and Authorization to Application resources
27 | * [HTTP/HTTPS edge routing][router] for your Applications
28 |
29 | ## Kubernetes-Native
30 |
31 | All platform components and applications deployed via Workflow expect to be
32 | running on an existing Kubernetes cluster. This means that you can happily run
33 | your Kubernetes-native workloads next to applications that are managed through
34 | Deis Workflow.
35 |
36 | 
37 |
38 | ## Application Layout and Edge Routing
39 |
40 | By default Workflow creates per-application Namespaces and Services so you can
41 | easily connect your applications to other on-cluster services through standard
42 | Kubernetes mechanisms.
43 |
44 | 
45 |
46 | The router component is responsible for routing HTTP/s traffic to your
47 | Applications as well as proxying `git push` and platform API traffic.
48 |
49 | By default, the router component is deployed as a Kubernetes service with type
50 | `LoadBalancer`; which, depending on your configuration, will provision a
51 | cloud-native load balancer automatically.
52 |
53 | The router automatically discovers routable Applications, SSL/TLS certificates
54 | and application-specific configurations through the use of Kubernetes
55 | annotations. Any changes to router configuration or certificates are applied
56 | within seconds.
57 |
58 | ## Topologies
59 |
60 | Deis Workflow no longer dictates a specific topology or server count for your
61 | deployment. The platform components will happily run on single-server
62 | configurations as well as multi-server production clusters.
63 |
64 | [builder]: components.md#builder
65 | [components]: components.md
66 | [controller]: components.md#controller
67 | [helm]: https://github.com/kubernetes/helm
68 | [logger]: components.md#logger
69 | [router]: components.md#router
70 |
--------------------------------------------------------------------------------
/src/users/cli.md:
--------------------------------------------------------------------------------
1 | # Deis Workflow CLI
2 |
3 | The Deis Workflow command-line interface (CLI), or client, allows you to interact
4 | with Deis Workflow.
5 |
6 | ## Installation
7 |
8 | Install the latest `deis` client for Linux or Mac OS X with:
9 |
10 | $ curl -sSL http://deis.io/deis-cli/install-v2.sh | bash
11 |
12 | The installer puts `deis` in your current directory, but you should move it
13 | somewhere in your $PATH:
14 |
15 | $ ln -fs $PWD/deis /usr/local/bin/deis
16 |
17 | ## Getting Help
18 |
19 | The Deis client comes with comprehensive documentation for every command.
20 | Use `deis help` to explore the commands available to you:
21 |
22 | $ deis help
23 | The Deis command-line client issues API calls to a Deis controller.
24 |
25 | Usage: deis [...]
26 |
27 | Auth commands::
28 |
29 | register register a new user with a controller
30 | login login to a controller
31 | logout logout from the current controller
32 |
33 | Subcommands, use `deis help [subcommand]` to learn more::
34 | ...
35 |
36 | To get help on subcommands, use `deis help [subcommand]`:
37 |
38 | $ deis help apps
39 | Valid commands for apps:
40 |
41 | apps:create create a new application
42 | apps:list list accessible applications
43 | apps:info view info about an application
44 | apps:open open the application in a browser
45 | apps:logs view aggregated application logs
46 | apps:run run a command in an ephemeral app container
47 | apps:destroy destroy an application
48 |
49 | Use `deis help [command]` to learn more
50 |
51 |
52 | ## Support for Multiple Profiles
53 |
54 | The CLI reads from the default `client` profile, which is located on your
55 | workstation at `$HOME/.deis/client.json`.
56 |
57 | Easily switch between multiple Deis Workflow installations or users by setting
58 | the `$DEIS_PROFILE` environment variable or by using the `-c` flag.
59 |
60 | There are two ways to set the `$DEIS_PROFILE` option.
61 |
62 | 1. Path to a json configuration file.
63 | 2. Profile name. If you set profile to just a name, it will be saved alongside the default profile,
64 | in `$HOME/.deis/.json`.
65 |
66 | Examples:
67 |
68 | $ DEIS_PROFILE=production deis login deis.production.com
69 | ...
70 | Configuration saved to /home/testuser/.deis/production.json
71 | $ DEIS_PROFILE=~/config.json deis login deis.example.com
72 | ...
73 | Configuration saved to /home/testuser/config.json
74 |
75 | The configuration flag works identically to and overrides `$DEIS_PROFILE`:
76 |
77 | $ deis whoami -c ~/config.json
78 | You are deis at deis.example.com
79 |
80 | ## Proxy Support
81 |
82 | If your workstation uses a proxy to reach the network where the cluster lies,
83 | set the `http_proxy` or `https_proxy` environment variable to enable proxy support:
84 |
85 | $ export http_proxy="http://proxyip:port"
86 | $ export https_proxy="http://proxyip:port"
87 |
88 | !!! note
89 | Configuring a proxy is generally not necessary for local Minikube clusters.
90 |
91 | ## CLI Plugins
92 |
93 | Plugins allow developers to extend the functionality of the Deis Client, adding new commands or features.
94 |
95 | If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, `deis resource:command` will execute `deis-resource` with the argument list `command`. In full form:
96 |
97 | $ # these two are identical
98 | $ deis accounts:list
99 | $ deis-accounts list
100 |
101 | Any flags after the command will also be sent to the plugin as an argument:
102 |
103 | $ # these two are identical
104 | $ deis accounts:list --debug
105 | $ deis-accounts list --debug
106 |
107 | But flags preceding the command will not:
108 |
109 | $ # these two are identical
110 | $ deis --debug accounts:list
111 | $ deis-accounts list
112 |
--------------------------------------------------------------------------------
/src/users/ssh-keys.md:
--------------------------------------------------------------------------------
1 | # Users and SSH Keys
2 |
3 | For **Dockerfile** and **Buildpack** based application deploys via `git push`, Deis Workflow identifies users via SSH
4 | keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed.
5 |
6 | ## Generate an SSH Key
7 |
8 | If you do not already have an SSH key or would like to create a new key for Deis Workflow, generate a new key using
9 | `ssh-keygen`:
10 |
11 | ```
12 | $ ssh-keygen -f ~/.ssh/id_deis -t rsa
13 | Generating public/private rsa key pair.
14 | Enter passphrase (empty for no passphrase):
15 | Enter same passphrase again:
16 | Your identification has been saved in /Users/admin/.ssh/id_deis.
17 | Your public key has been saved in /Users/admin/.ssh/id_deis.pub.
18 | The key fingerprint is:
19 | 3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local
20 | The key's randomart image is:
21 | +--[ RSA 2048]----+
22 | | .. |
23 | | ..|
24 | | . o. .|
25 | | o. E .o.|
26 | | S == o..o|
27 | | o +. .o|
28 | | . o + o .|
29 | | . o = |
30 | | . . |
31 | +-----------------+
32 | $ ssh-add ~/.ssh/id_deis
33 | Identity added: /Users/admin/.ssh/id_deis (/Users/admin/.ssh/id_deis)
34 | ```
35 |
36 | ## Adding and Removing SSH Keys
37 |
38 | By publishing the **public** half of your SSH key to Deis Workflow the component responsible for receiving `git push`
39 | will be able to authenticate the user and ensure that they have access to the destination application.
40 |
41 | ```
42 | $ deis keys:add ~/.ssh/id_deis.pub
43 | Uploading id_deis.pub to deis... done
44 | ```
45 |
46 | You can always view the keys associated with your user as well:
47 |
48 | ```
49 | $ deis keys:list
50 | === admin Keys
51 | admin@plinth-23437.local ssh-rsa AAAAB3Nz...3437.local
52 | admin@subgenius.local ssh-rsa AAAAB3Nz...nius.local
53 | ```
54 |
55 | Remove keys by their name:
56 | ```
57 | $ deis keys:remove admin@plinth-23437.local
58 | Removing admin@plinth-23437.local SSH Key... don
59 | ```
60 |
--------------------------------------------------------------------------------
/themes/deis/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | {% if canonical_url %}{% endif %}
14 |
15 |
16 |
17 |
18 | {% if page_title %}{{ page_title }} - {% endif %}{{ site_name }}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |