Kubectl Book updates for 1.14
This commit is contained in:
parent
2a31209eeb
commit
b9f105d4aa
|
|
@ -3,8 +3,8 @@
|
||||||
## Running Locally
|
## Running Locally
|
||||||
|
|
||||||
- Install [GitBook Toolchain](https://toolchain.gitbook.com/setup.html)
|
- Install [GitBook Toolchain](https://toolchain.gitbook.com/setup.html)
|
||||||
- From `docs/book` run `gitbook install` to install node_modules locally
|
- From `docs/book` run `npm ci` to install node_modules locally (don't run install, it updates the shrinkwrap.json)
|
||||||
- Retry if this fails, it is flaky
|
- From `docs/book` run `npm audit` to make sure there are no vulnerabilities
|
||||||
- From `docs/book` run `gitbook serve`
|
- From `docs/book` run `gitbook serve`
|
||||||
- Go to `http://localhost:4000` in a browser
|
- Go to `http://localhost:4000` in a browser
|
||||||
|
|
||||||
|
|
@ -50,4 +50,13 @@ Notes may have the following styles:
|
||||||
## Adding GitBook plugins
|
## Adding GitBook plugins
|
||||||
|
|
||||||
- Update `book.json` with the plugin
|
- Update `book.json` with the plugin
|
||||||
- Run `gitbook install`
|
- Run `npm i <npm-plugin-name>`
|
||||||
|
- Run `npm strinkwrap`
|
||||||
|
- Run `npm audit` - fix issues by hand updating `npm-shrinkwrap.json` libraries with the fixed versions
|
||||||
|
- Run `npm ci` - install the new version
|
||||||
|
- Run `npm audit` - verify the fixes
|
||||||
|
- Commit `npm-shrinkwrap.json` and `package.json`
|
||||||
|
|
||||||
|
### Cool plugins
|
||||||
|
|
||||||
|
See https://github.com/swapagarwal/awesome-gitbook-plugins for more plugins.
|
||||||
|
|
@ -1,47 +1,50 @@
|
||||||
# Introduction
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Kubernetes runs Containerized Workloads in a cluster
|
- Kubernetes runs Containerized Workloads in a cluster
|
||||||
- The Kubectl Book explains Kubernetes tools and workflows
|
- The Kubectl Book explains Kubernetes tools and workflows
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
The goal of this book is to document how users should configure, deploy and manage their
|
# Introduction
|
||||||
containerized Workloads in Kubernetes.
|
|
||||||
|
|
||||||
It is broken into the following sections:
|
The goal of this book is to document how to configure, deploy and manage their containerized
|
||||||
|
Workloads in Kubernetes using Kubectl.
|
||||||
|
|
||||||
- Introduction to Kubernetes & Kubectl
|
It covers the following topics:
|
||||||
- How to configure Applications through Resource Config
|
|
||||||
- How to debug Applications using Kubectl
|
|
||||||
- How to configure Projects composed of multiple Applications
|
|
||||||
- How to rollout changes with CICD
|
|
||||||
- How to perform cluster maintenance operations using Kubectl
|
|
||||||
|
|
||||||
## Background
|
- Introduction to Kubernetes Workload APIs & Kubectl
|
||||||
|
- Declarative Configuration
|
||||||
|
- Deployment Techniques
|
||||||
|
- Printing information about Workloads
|
||||||
|
- Debugging Workloads
|
||||||
|
- Imperative Porcelain Commands
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
Kubernetes is a set of APIs to run containerized Workloads in a cluster.
|
Kubernetes is a set of APIs to run containerized Workloads in a cluster.
|
||||||
|
|
||||||
Users define API objects (i.e. Resources) in files checked into source control, and use kubectl
|
Users define API objects (i.e. Resources) in files which are typically checked into source control.
|
||||||
to Apply (i.e. create, update, delete) configuration files to cluster Resources.
|
They then use kubectl to Apply (i.e. create, update, delete) to update cluster state.
|
||||||
|
|
||||||
### Pods
|
### Pods
|
||||||
|
|
||||||
Containers are run in [*Pods*](https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/) which are scheduled to *Nodes* (i.e. worker machines) in a cluster.
|
Containers are run in [*Pods*](https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/) which are
|
||||||
|
scheduled to run on *Nodes* (i.e. worker machines) in a cluster.
|
||||||
|
|
||||||
Pods provide the following a Pod running a *single instance* of an Application:
|
Pods run a *single replica* of an Application and provide:
|
||||||
|
|
||||||
- Compute Resources (cpu, memory, disk)
|
- Compute Resources (cpu, memory, disk)
|
||||||
- Environment Variables
|
- Environment Variables
|
||||||
- Readiness and Health Checking
|
- Readiness and Health Checking
|
||||||
- Network (IP address shared by containers in the Pod)
|
- Network (IP address shared by containers in the Pod)
|
||||||
- Mounting Shared Configuration and Secrets
|
- Mounting Shared Configuration and Secrets
|
||||||
|
- Mounting Storage Volumes
|
||||||
|
- Initialization
|
||||||
|
|
||||||
{% panel style="info", title="Multi Container Pods" %}
|
{% panel style="warning", title="Multi Container Pods" %}
|
||||||
Multiple identical instances of an Application should be run by creating multiple copies of
|
Multiple replicas of an Application should be created using a Workload API to manage
|
||||||
the same Pod using a Workload API.
|
creation and deletion of Pod replicas using a PodTemplate.
|
||||||
|
|
||||||
A Pod may contain multiple Containers which are a single instance of an Application. These
|
In some cases a Pod may contain multiple Containers forming a single instance of an Application. These
|
||||||
containers may coordinate with one another through shared network (IP) and files.
|
containers may coordinate with one another through shared network (IP) and storage.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
### Workloads
|
### Workloads
|
||||||
|
|
@ -62,15 +65,15 @@ The most common out-of-the-box Workload APIs (manage Pods) are:
|
||||||
- [DaemonSets](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) (Per-Machine)
|
- [DaemonSets](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) (Per-Machine)
|
||||||
- per-Node scheduling
|
- per-Node scheduling
|
||||||
|
|
||||||
{% panel style="info", title="Abstraction Layers" %}
|
{% panel style="success", title="API Abstraction Layers" %}
|
||||||
High-level Workload APIs may manage lower-level Workload APIs instead of directly managing Pods
|
High-level Workload APIs may manage lower-level Workload APIs instead of directly managing Pods
|
||||||
(e.g. Deployments manage ReplicaSets).
|
(e.g. Deployments manage ReplicaSets).
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
### Service Discovery and Load Balancing
|
### Service Discovery and Load Balancing
|
||||||
|
|
||||||
Service discovery and Load Balancing is managed by a *Service* object. Services provide a single
|
Service discovery and Load Balancing may be managed by a *Service* object. Services provide a single
|
||||||
IP address and dns name to talk to a collection of Pods.
|
virtual IP address and dns name load balanced to a collection of Pods matching Labels.
|
||||||
|
|
||||||
{% panel style="info", title="Internal vs External Services" %}
|
{% panel style="info", title="Internal vs External Services" %}
|
||||||
- [Services Resources](https://kubernetes.io/docs/concepts/services-networking/service/)
|
- [Services Resources](https://kubernetes.io/docs/concepts/services-networking/service/)
|
||||||
|
|
@ -81,9 +84,9 @@ IP address and dns name to talk to a collection of Pods.
|
||||||
|
|
||||||
### Configuration and Secrets
|
### Configuration and Secrets
|
||||||
|
|
||||||
Shared Configuration and Secret data may be provided by Secrets and ConfigMaps. This allows
|
Shared Configuration and Secret data may be provided by ConfigMaps and Secrets. This allows
|
||||||
Environment Variables, Commandline Arguments and Files to be setup and decoupled from
|
Environment Variables, Commandline Arguments and Files to be loosely injected into
|
||||||
the Pods and Containers.
|
the Pods and Containers that consume them.
|
||||||
|
|
||||||
{% panel style="info", title="ConfigMaps vs Secrets" %}
|
{% panel style="info", title="ConfigMaps vs Secrets" %}
|
||||||
- [ConfigMaps](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/)
|
- [ConfigMaps](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/)
|
||||||
|
|
|
||||||
|
|
@ -1,67 +1,58 @@
|
||||||
## The Kubectl Book
|
## Kubectl Book
|
||||||
|
|
||||||
* [Resources and Controllers](pages/book_resources.md)
|
* [Resources and Controllers](pages/kubectl_book/resources_and_controllers.md)
|
||||||
* [Kubectl](pages/book_kubectl.md)
|
* [Kubectl](pages/kubectl_book/kubectl.md)
|
||||||
|
|
||||||
## Declarative Application Management
|
## App Management
|
||||||
|
|
||||||
* [Introduction](pages/dam_introduction.md)
|
* [Introduction](pages/app_management/introduction.md)
|
||||||
* [Apply](pages/dam_apply.md)
|
* [Apply](pages/app_management/apply.md)
|
||||||
* [Secret and ConfigMap Generation](pages/dam_generators.md)
|
* [Secrets and ConfigMaps](pages/app_management/secrets_and_configmaps.md)
|
||||||
* [Container Image Tags](pages/dam_images.md)
|
* [Container Images](pages/app_management/container_images.md)
|
||||||
* [Namespaces and Names](pages/dam_namespaces.md)
|
* [Namespaces and Names](pages/app_management/namespaces_and_names.md)
|
||||||
* [Labels and Annotations](pages/dam_labels.md)
|
* [Labels and Annotations](pages/app_management/labels_and_annotations.md)
|
||||||
* [Config Reflection](pages/dam_variables.md)
|
* [Field Merge Semantics](pages/app_management/field_merge_semantics.md)
|
||||||
|
|
||||||
## Debugging Workloads
|
## App Customization
|
||||||
|
|
||||||
* Viewing Resource State
|
* [Introduction](pages/app_customization/introduction.md)
|
||||||
* Container Logs
|
* [Bases and Variations](pages/app_customization/bases_and_variants.md)
|
||||||
* Container Files
|
* [Customizing Pod Templates](pages/app_customization/customizing_pod_templates.md)
|
||||||
* Container Shell
|
* [Customizing Metadata](pages/app_customization/customizing_metadata.md)
|
||||||
* Accessing Services
|
* [Customizing Arbitrary Fields](pages/app_customization/customizing_arbitrary_fields.md)
|
||||||
* RBAC Permissions
|
* [Config Reflection](pages/app_customization/config_reflection.md)
|
||||||
|
|
||||||
## Project Composition and Variation
|
## App Composition and Deployment
|
||||||
|
|
||||||
* [Bases and Variations](pages/project_variants.md)
|
* [Diffing Local and Remote State](pages/app_composition_and_deployment/diffing_local_and_remote_resources.md)
|
||||||
* [Customizing Whitebox Bases](pages/project_whitebox.md)
|
* [Accessing Multiple Clusters](pages/app_composition_and_deployment/accessing_multiple_clusters.md)
|
||||||
* [Composing Multiple Bases](pages/project_composition.md)
|
* [Structure: Multi-Tier Apps](pages/app_composition_and_deployment/structure_multi_tier_apps.md)
|
||||||
* [Overlay Merge Semantics](pages/project_merge.md)
|
* [Structure: Directories](pages/app_composition_and_deployment/structure_directories.md)
|
||||||
|
* [Structure: Branches](pages/app_composition_and_deployment/structure_branches.md)
|
||||||
|
* [Structure: Repositories](pages/app_composition_and_deployment/structure_repositories.md)
|
||||||
|
* [Publishing Bases](pages/app_composition_and_deployment/publishing_bases.md)
|
||||||
|
|
||||||
## CICD
|
## Resource Printing
|
||||||
|
|
||||||
* [Project Structure](pages/cicd_structure.md)
|
* [Summaries](pages/resource_printing/summaries.md)
|
||||||
* [Linting Resource Config](pages/cicd_linting.md)
|
* [Raw](pages/resource_printing/raw.md)
|
||||||
* [Builds](pages/cicd_builds.md)
|
* [Fields](pages/resource_printing/fields.md)
|
||||||
* [Rollouts](pages/cicd_rollouts.md)
|
* [Describe](pages/resource_printing/describe.md)
|
||||||
* [Auditing and Reviewing Changes](pages/cicd_audit.md)
|
* [Queries and Options](pages/resource_printing/queries_and_options.md)
|
||||||
* [Rolling out Across Environments](pages/cicd_environments.md)
|
* [Watch](pages/resource_printing/watch.md)
|
||||||
* [Rolling out Across Clusters](pages/cdicd_clusters.md)
|
* [Cluster Information](pages/resource_printing/cluster_information.md)
|
||||||
* [Rollout Errors and Rolling Back](pages/cicd_rollback.md)
|
|
||||||
|
|
||||||
## Cluster Management
|
## Container Debugging
|
||||||
|
|
||||||
* Viewing Cluster Metadata
|
* [Container Logs](pages/container_debugging/container_logs.md)
|
||||||
* Setting Node Availability
|
* [Copying Container Files](pages/container_debugging/copying_container_files.md)
|
||||||
* Viewing Node Resource Usage
|
* [Executing a Command in a Container](pages/container_debugging/executing_a_command_in_a_container.md)
|
||||||
* Managing the Client Config
|
* [Port Forward to Pods](pages/container_debugging/port_forward_to_pods.md)
|
||||||
* Checking Authorization
|
* [Proxying Traffic to Services](pages/container_debugging/proxying_traffic_to_services.md)
|
||||||
|
|
||||||
## Porcelain
|
## Imperative Porcelain
|
||||||
|
|
||||||
* Creating Resources
|
* [Introduction](pages/imperative_porcelain/introduction.md)
|
||||||
* Setting Fields
|
* [Creating Resources](pages/imperative_porcelain/creating_resources.md)
|
||||||
* Setting Labels and Annotations
|
* [Setting Fields](pages/imperative_porcelain/setting_fields.md)
|
||||||
* Modifying Live Resources Directly
|
* [Editing Workloads](pages/imperative_porcelain/editing_workloads.md)
|
||||||
|
|
||||||
## Plugins
|
|
||||||
|
|
||||||
* Discovering Plugins
|
|
||||||
* Managing Plugins
|
|
||||||
* Developing Plugins
|
|
||||||
* Publishing Plugins
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
* apply.yaml
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,138 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Target a cluster for a rollout with the `--context` flag
|
||||||
|
- Target a cluster for a rollout with the `--kubeconfig` flag
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Multi-Cluster Targeting
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It is common for users to need to deploy **different Variants of an Application to different clusters**.
|
||||||
|
This can be done by configuring the different Variants using different `kustomization.yaml`'s,
|
||||||
|
and targeting each variant using the `--context` or `--kubeconfig` flag.
|
||||||
|
|
||||||
|
**Note:** The examples shown in this chapter store the Resource Config in a directory
|
||||||
|
matching the name of the cluster (i.e. as it is referred to be context)
|
||||||
|
|
||||||
|
|
||||||
|
## Targeting a Cluster via Context
|
||||||
|
|
||||||
|
The kubeconfig file allows multiple contexts to be specified, each with a different cluster + auth.
|
||||||
|
|
||||||
|
### List Contexts
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
List the contexts in the kubeconfig file
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
```sh
|
||||||
|
$ kubectl config get-contexts
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
|
||||||
|
us-central1-c us-central1-c us-central1-c
|
||||||
|
* us-east1-c us-east1-c us-east1-c
|
||||||
|
us-west2-c us-west2-c us-west2-c
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
### Print a Context
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print information about the current context
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
```sh
|
||||||
|
$ kubectl config --kubeconfig=config-demo view --minify
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
certificate-authority: fake-ca-file
|
||||||
|
server: https://1.2.3.4
|
||||||
|
name: development
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: development
|
||||||
|
namespace: frontend
|
||||||
|
user: developer
|
||||||
|
name: dev-frontend
|
||||||
|
current-context: dev-frontend
|
||||||
|
kind: Config
|
||||||
|
preferences: {}
|
||||||
|
users:
|
||||||
|
- name: developer
|
||||||
|
user:
|
||||||
|
client-certificate: fake-cert-file
|
||||||
|
client-key: fake-key-file
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
### Specify a Context Flag
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Specify the kubeconfig context as part of the command.
|
||||||
|
|
||||||
|
**Note:** In this example the `kustomization.yaml` exists in a directory whose name matches
|
||||||
|
the name of the context.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ export CLUSTER=us-west2-c; kubectl apply -k ${CLUSTER} --context=${CLUSTER}
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
### Switch to use a Context
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Switch the current context before running the command.
|
||||||
|
|
||||||
|
**Note:** In this example the `kustomization.yaml` exists in a directory whose name matches
|
||||||
|
the name of the context.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# change the context to us-west2-c
|
||||||
|
$ kubectl config use-context us-west2-c
|
||||||
|
# deploy Resources from the ./us-west2-c/kustomization.yaml
|
||||||
|
$ kubectl apply -k ./us-west2-c
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
## Targeting a Cluster via Kubeconfig
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Alternatively, different kubeconfig files may be used for different clusters. The
|
||||||
|
kubeconfig may be specified with the `--kubeconfig` flag.
|
||||||
|
|
||||||
|
**Note:** In this example the `kustomization.yaml` exists in a directory whose name matches
|
||||||
|
the name of the directory containing the kubeconfig.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ kubectl apply -k ./us-west2-c --kubeconfig /path/to/us-west2-c/config
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="More Info" %}
|
||||||
|
For more information on configuring kubeconfig and contexts, see the
|
||||||
|
[Configure Access to Multiple Clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)
|
||||||
|
k8s.io document.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- View diff of changes before they are Applied to the cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Diffing Local and Cluster State
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
The ability to view what changes will be made before applying them to a cluster can be useful.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Generating a Diff
|
||||||
|
|
||||||
|
Use the `diff` program in a user's path to display a diff of the changes that will be
|
||||||
|
made by Apply.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ kubectl diff -k ./dir/
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Setting the Diff Program
|
||||||
|
|
||||||
|
The `KUBECTL_EXTERNAL_DIFF` environment variable can be used to select your own diff command.
|
||||||
|
By default, the "diff" command available in your path will be run with "-u" (unicode) and "-N"
|
||||||
|
(treat new files as empty) options.
|
||||||
|
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ export KUBECTL_EXTERNAL_DIFF=meld; kubectl diff -k ./dir/
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
@ -1,10 +1,14 @@
|
||||||
# Customizing White Box Bases
|
{% panel style="warning", title="Alpha Recommendations" %}
|
||||||
|
This chapter contains recommendations that are still being actively evaluated, and may
|
||||||
|
be changed in the future.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Run a White Box Application as a Base
|
- Publish a White Box Application as a Base for other users to Kustomize
|
||||||
- Customize a White Box Application
|
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Publishing Bases
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
Users may want to run a common White Box Application without writing the Resource Config
|
Users may want to run a common White Box Application without writing the Resource Config
|
||||||
|
|
@ -15,18 +19,19 @@ their specific needs.
|
||||||
- Run a White Box Application (e.g. Cassandra, MongoDB) instance from ready-made Resource Config
|
- Run a White Box Application (e.g. Cassandra, MongoDB) instance from ready-made Resource Config
|
||||||
- Publish Resource Config to run an Application
|
- Publish Resource Config to run an Application
|
||||||
|
|
||||||
## Consuming a White Box Base
|
## Publishing a White Box Base
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
White Box Applications may be published to a URL and consumed as Bases in an `apply.yaml`
|
White Box Applications may be published to a URL and consumed as Bases in an `kustomization.yaml`. It
|
||||||
|
can then be consumed in the following manner.
|
||||||
|
|
||||||
**Use Case:** Run a White Box Application published to GitHub.
|
**Use Case:** Run a White Box Application published to GitHub.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml file
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
bases:
|
bases:
|
||||||
# GitHub URL
|
# GitHub URL
|
||||||
- github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6
|
- github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6
|
||||||
|
|
@ -52,7 +57,7 @@ spec:
|
||||||
## Customizing White Box Bases
|
## Customizing White Box Bases
|
||||||
|
|
||||||
The White Box Application may be customized using the same techniques described in
|
The White Box Application may be customized using the same techniques described in
|
||||||
[Bases and Variations](project_variants.md)
|
[Bases and Variations](../app_customization/bases_and_variants.md)
|
||||||
|
|
||||||
## Versioning White Box Bases
|
## Versioning White Box Bases
|
||||||
|
|
||||||
|
|
@ -0,0 +1,241 @@
|
||||||
|
{% panel style="warning", title="Warning: Alpha Recommendations" %}
|
||||||
|
This chapter contains recommendations that are still being actively evaluated, and may
|
||||||
|
be changed in the future.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Use separate branches for separate Environments to
|
||||||
|
- **Decouple release specific and operational specific changes** to Resource Config
|
||||||
|
- Clean audit log of changes to the Environment
|
||||||
|
- Facilitate Rollbacks to an Environment
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Branch Structure Based Composition
|
||||||
|
|
||||||
|
The are several techniques for users to structure their Resource Config files.
|
||||||
|
|
||||||
|
| Type | Summary | Benefits |
|
||||||
|
|----------------------------------------|-----------------------|----------------------------------------------------|
|
||||||
|
| [Directories](structure_directories.md) | *Simplest approach* | Easy to get started and understand |
|
||||||
|
| **[Branches](structure_branches.md)** | **More flexible** | **Loose coupling between release specific and operation changes** |
|
||||||
|
| [Repositories](structure_repositories.md) | *Fine grain control* | Isolated permissions model |
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
This chapter describes conventions for using **Branches** with Directories.
|
||||||
|
|
||||||
|
**Advantages:**
|
||||||
|
|
||||||
|
- Flexibility
|
||||||
|
- Decouple release specific changes (e.g. images) from operational specific changes (e.g. cpu reservations)
|
||||||
|
- Trigger Webhooks scoped to specific Environments
|
||||||
|
- Simple to view changes for a specific Environment in *git*
|
||||||
|
- Simple to rollback changes for a specific Environment using *git*
|
||||||
|
|
||||||
|
**Drawbacks:**
|
||||||
|
|
||||||
|
- More complicated to setup and configure
|
||||||
|
- Additional steps for merging release specific changes into and Environment branches
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
## Branch Structure
|
||||||
|
|
||||||
|
### Resource Config
|
||||||
|
|
||||||
|
The convention shown here should be changed and adapted as needed.
|
||||||
|
|
||||||
|
Structure:
|
||||||
|
|
||||||
|
- Use a Base (e.g. master, release-version, etc) branch for configuration tightly coupled to releasing new code
|
||||||
|
- Looks like [Directories](structure_directories.md) approach
|
||||||
|
- Create separate branches for deploying to different Environments
|
||||||
|
- Create a **new Directory for the operational overlays** - e.g. `release-<env>`
|
||||||
|
- Uses Bases that point to Directories merged from the Base branch
|
||||||
|
|
||||||
|
Techniques:
|
||||||
|
|
||||||
|
- Add new required flags and environment variables to the Resource Config in the base branch at the
|
||||||
|
time they are added to the code.
|
||||||
|
- Will be rolled out when the code is rolled out.
|
||||||
|
- Adjust flags and configuration to the Resource Config in the Operational branch in the release directory
|
||||||
|
- Will be rolled out immediately independent of releases
|
||||||
|
- Merge code from the Base branch to the Operational branches to perform a Rollout
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
**Base Branch:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases
|
||||||
|
│ ├── ...
|
||||||
|
├── prod
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── ...
|
||||||
|
│ ├── us-central
|
||||||
|
│ │ ├── kustomization.yaml
|
||||||
|
│ │ └── backend
|
||||||
|
│ │ └── deployment-patch.yaml
|
||||||
|
│ ├── us-east
|
||||||
|
│ │ └── kustomization.yaml
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml
|
||||||
|
├── staging
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── ...
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml
|
||||||
|
└── test
|
||||||
|
├── bases
|
||||||
|
│ ├── ...
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Operational Branches:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases # From Base Branch
|
||||||
|
│ ├── ...
|
||||||
|
├── prod # From Base Branch
|
||||||
|
│ ├── ...
|
||||||
|
└── release-prod # Prod release folder
|
||||||
|
├── us-central
|
||||||
|
│ ├── kustomization.yaml # Uses bases: ["../../prod/us-central"]
|
||||||
|
├── us-east
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../../prod/us-east"]
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml # Uses bases: ["../../prod/us-west"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases # From Base Branch
|
||||||
|
│ ├── ...
|
||||||
|
├── release-staging # Staging release folder
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../../staging/us-west"]
|
||||||
|
└── staging # From Base Branch
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases # From Base Branch
|
||||||
|
│ ├── ...
|
||||||
|
├──release-test # Test release folder
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../../test/us-west"]
|
||||||
|
└── test # From Base Branch
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="success", title="Better Merging" %}
|
||||||
|
|
||||||
|
- If a user's application source code and Resource Config are both in the Base branch, user's may want
|
||||||
|
to only merge the Resource Config. This could be done using `git checkout` - e.g.
|
||||||
|
`git checkout <base-branch> bases/ prod/`
|
||||||
|
|
||||||
|
- Instead of merging from the Base branch directly, users can create release branches of the Base.
|
||||||
|
Alternatively, users can tag the Base branch commits as releases and check these out.
|
||||||
|
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
## Alternative Branch Structure
|
||||||
|
|
||||||
|
An alternative to the above structure is to use branches similar to how *GitHub Pages* branches
|
||||||
|
functions - where code is not merged between branches and is similar to having a new repository.
|
||||||
|
|
||||||
|
This approach looks very similar to the [Repository Based Structure](structure_repositories.md), but
|
||||||
|
using branches instead of Repositories.
|
||||||
|
|
||||||
|
- Use a Base (e.g. master, release-version, etc) branch for configuration tightly coupled to releasing new code
|
||||||
|
- Looks like [Directories](structure_directories.md) approach
|
||||||
|
- Create separate branches for deploying to different Environments
|
||||||
|
- Create a **new Directory for the operational overlays** - e.g. `release-<env>`
|
||||||
|
- Base Branch is never merge. Operational overlays refer to Bases as remote urls.
|
||||||
|
|
||||||
|
Techniques:
|
||||||
|
|
||||||
|
- Add new required flags and environment variables to the Resource Config in the base branch at the
|
||||||
|
time they are added to the code.
|
||||||
|
- Will be rolled out when the code is rolled out.
|
||||||
|
- Adjust flags and configuration to the Resource Config in the Operational branch in the release directory
|
||||||
|
- Will be rolled out immediately independent of releases
|
||||||
|
- Tag the base branch with releases
|
||||||
|
- Operational branches use tagged references as their bases
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
**Base Branch:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases
|
||||||
|
│ ├── ...
|
||||||
|
├── prod
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── ...
|
||||||
|
│ ├── us-central
|
||||||
|
│ │ ├── kustomization.yaml
|
||||||
|
│ │ └── backend
|
||||||
|
│ │ └── deployment-patch.yaml
|
||||||
|
│ ├── us-east
|
||||||
|
│ │ └── kustomization.yaml
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml
|
||||||
|
├── staging
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── ...
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml
|
||||||
|
└── test
|
||||||
|
├── bases
|
||||||
|
│ ├── ...
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Operational Branches:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
└── release-prod
|
||||||
|
├── us-central
|
||||||
|
│ ├── kustomization.yaml
|
||||||
|
├── us-east
|
||||||
|
│ └── kustomization.yaml
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
└── release-staging
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
└── release-test
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,123 @@
|
||||||
|
{% panel style="warning", title="Warning: Alpha Recommendations" %}
|
||||||
|
This chapter contains recommendations that are still being actively evaluated, and may
|
||||||
|
be changed in the future.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Use **directory hierarchy to structure Resource Config**
|
||||||
|
- Separate directories for separate Environment and Cluster [Config Variants](../app_customization/bases_and_variants.md)
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Directory Structure Based Composition
|
||||||
|
|
||||||
|
The are several techniques for users to structure their Resource Config files.
|
||||||
|
|
||||||
|
| Type | Summary | Benefits |
|
||||||
|
|----------------------------------------|-----------------------|----------------------------------------------------|
|
||||||
|
| **[Directories](structure_directories.md)** | **Simplest approach** | **Easy to get started and understand** |
|
||||||
|
| [Branches](structure_branches.md) | *More flexible* | Loose coupling between release specific and operation changes |
|
||||||
|
| [Repositories](structure_repositories.md) | *Fine grain control* | Isolated permissions model |
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
This chapter describes conventions for using **Directories** alone.
|
||||||
|
|
||||||
|
**Advantages:**
|
||||||
|
|
||||||
|
- Simplicity
|
||||||
|
- Simple to learn
|
||||||
|
- Simple to navigate using conventional tools
|
||||||
|
- Simple to audit
|
||||||
|
|
||||||
|
**Drawbacks:**
|
||||||
|
|
||||||
|
- Limited permissions and ownership models
|
||||||
|
- Read/Write access typically given at a per-repo model
|
||||||
|
- Less granular event triggers
|
||||||
|
- Webhooks triggered for repo+branch can't be focused on a specific environment + cluster
|
||||||
|
- Harder to decouple release related changes from operational related changes
|
||||||
|
- Changes to scale or cpu should be rolled out immediately
|
||||||
|
- Changes to image or flags should be rolled out with the release
|
||||||
|
|
||||||
|
{% panel style="info", title="Config Repo or Mono Repo?" %}
|
||||||
|
The techniques and conventions in this Chapter work regardless of whether or not the Resource Config
|
||||||
|
exists in the same Repository as the source code that is being deployed.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
### Resource Config
|
||||||
|
|
||||||
|
The convention shown here should be changed and adapted as needed.
|
||||||
|
|
||||||
|
Structure:
|
||||||
|
|
||||||
|
- Put reusable bases under `*/bases/`
|
||||||
|
- `<project-name>/bases/`
|
||||||
|
- `<project-name>/<environment>/bases/`
|
||||||
|
- Put deployable targets under `<project-name>/<environment>/<cluster>/`
|
||||||
|
|
||||||
|
Techniques:
|
||||||
|
|
||||||
|
- Each Layer adds a [namePrefix](../app_management/namespaces_and_names.md#setting-a-name-prefix-or-suffix-for-all-resources) and [commonLabels](../app_management/labels_and_annotations.md#setting-labels-for-all-resources).
|
||||||
|
- Each deployable target sets a [namespace](../app_management/namespaces_and_names.md#setting-the-namespace-for-all-resources).
|
||||||
|
- Override [Pod Environment Variables and Arguments](../app_customization/customizing_pod_templates.md) using `configMapGenerator`s with `behavior: merge`.
|
||||||
|
- Perform Last-mile customizations with [patches / overlays](../app_customization/customizing_arbitrary_fields.md)
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases # Used as a Base only
|
||||||
|
│ ├── kustomization.yaml
|
||||||
|
│ ├── backend
|
||||||
|
│ │ ├── deployment.yaml
|
||||||
|
│ │ └── service.yaml
|
||||||
|
│ ├── frontend
|
||||||
|
│ │ ├── deployment.yaml
|
||||||
|
│ │ ├── ingress.yaml
|
||||||
|
│ │ └── service.yaml
|
||||||
|
│ └── storage
|
||||||
|
│ ├── service.yaml
|
||||||
|
│ └── statefulset.yaml
|
||||||
|
├── prod # Production
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
│ │ ├── backend
|
||||||
|
│ │ │ └── deployment-patch.yaml # Production Env specific backend overrides
|
||||||
|
│ │ ├── frontend
|
||||||
|
│ │ │ └── deployment-patch.yaml # Production Env specific frontend overrides
|
||||||
|
│ │ └── storage
|
||||||
|
│ │ └── statefulset-patch.yaml # Production Env specific storage overrides
|
||||||
|
│ ├── us-central
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
│ │ └── backend
|
||||||
|
│ │ └── deployment-patch.yaml # us-central cluster specific backend overrides
|
||||||
|
│ ├── us-east
|
||||||
|
│ │ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
├── staging # Staging
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
└── test # Test
|
||||||
|
├── bases
|
||||||
|
│ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="warning", title="Applying Environment + Cluster" %}
|
||||||
|
Though the directory structure contains the cluster in the path, this won't be used by
|
||||||
|
Apply to determine the cluster context. To Apply a specific cluster, add that cluster to the
|
||||||
|
kubectl config`, and specify the corresponding context when running Apply.
|
||||||
|
|
||||||
|
For more information see [Multi-Cluster](accessing_multiple_clusters.md).
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
# Composing Bases
|
{% panel style="warning", title="Warning: Alpha Recommendations" %}
|
||||||
|
This chapter contains recommendations that are still being actively evaluated, and may
|
||||||
|
be changed in the future.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- The same Base may be used multiple times for different Applications within the same project.
|
- The same Base may be used multiple times for different Applications within the same project.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Advanced Composition
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
Users may want to reuse the same base multiple times within the same Apply Project. Examples:
|
Users may want to reuse the **same base multiple times within the same Apply Project**. Examples:
|
||||||
|
|
||||||
- Define a very generic base (e.g. "Java Application") used by multiple Applications within a Project.
|
- Define a very generic base (e.g. "Java Application") used by multiple Applications within a Project.
|
||||||
- Define multiple Environments (e.g. Staging, Canary, Prod) within a Project.
|
- Define multiple Environments (e.g. Staging, Canary, Prod) within a Project.
|
||||||
|
|
@ -17,19 +22,18 @@ Users may want to reuse the same base multiple times within the same Apply Proje
|
||||||
It is possible to reuse the same base multiple times within the same project by using a 3-tier
|
It is possible to reuse the same base multiple times within the same project by using a 3-tier
|
||||||
structure to compose multiple Variants of the base.
|
structure to compose multiple Variants of the base.
|
||||||
|
|
||||||
1. Generic Base.
|
1. Generic Base in a `kustomization.yaml`.
|
||||||
1. Variants on the Generic Base.
|
1. Variants of the Generic Base in multiple `kustomization.yaml`s.
|
||||||
1. Composition of Variants.
|
1. Compose Variants as Bases to a single `kustomization.yaml`.
|
||||||
|
|
||||||
Each layer may add customizations and resources to the preceding layers.
|
Each layer may add customizations and resources to the preceding layers.
|
||||||
|
|
||||||
**apply.yaml**
|
Generic Base Layer: **../base/java**
|
||||||
|
|
||||||
- compose the 2 apps as bases
|
- define the java app base Deployment
|
||||||
- set the namespace for Resources in the project
|
- define the java app base Service
|
||||||
- set a namePrefix for Resources in the project
|
|
||||||
|
|
||||||
**../app1/ & ../app2/**
|
Variant Layers: **../app1/ + ../app2/**
|
||||||
|
|
||||||
- inherit the generic base
|
- inherit the generic base
|
||||||
- set a namePrefix
|
- set a namePrefix
|
||||||
|
|
@ -37,74 +41,23 @@ Each layer may add customizations and resources to the preceding layers.
|
||||||
- overlay an image on the base
|
- overlay an image on the base
|
||||||
- set the image tag
|
- set the image tag
|
||||||
|
|
||||||
**../base/java**
|
Composition Layer: **kustomization.yaml**
|
||||||
|
|
||||||
|
- compose the 2 apps as bases
|
||||||
|
- set the namespace for Resources in the project
|
||||||
|
- set a namePrefix for Resources in the project
|
||||||
|
|
||||||
- define the java app base Deployment
|
|
||||||
- define the java app base Service
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:**
|
**Generic Base Layer:**
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# base/java/kustomization.yaml
|
||||||
namePrefix: app-
|
|
||||||
namespace: app
|
|
||||||
bases:
|
|
||||||
- app1
|
|
||||||
- app2
|
|
||||||
|
|
||||||
# app1/apply.yaml
|
|
||||||
namePrefix: 1-
|
|
||||||
commonLabels:
|
|
||||||
app: app1
|
|
||||||
bases:
|
|
||||||
- ../base/java
|
|
||||||
patchesStrategicMerge:
|
|
||||||
- overlay.yaml
|
|
||||||
imageTags:
|
|
||||||
- name: myapp2
|
|
||||||
newTag: v2
|
|
||||||
|
|
||||||
# app1/overlay.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: java
|
|
||||||
spec:
|
|
||||||
template:
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: myapp2
|
|
||||||
name: java
|
|
||||||
|
|
||||||
# ../app2/apply.yaml
|
|
||||||
namePrefix: 2-
|
|
||||||
commonLabels:
|
|
||||||
app: app2
|
|
||||||
bases:
|
|
||||||
- ../base/java
|
|
||||||
patchesStrategicMerge:
|
|
||||||
- overlay.yaml
|
|
||||||
imageTags:
|
|
||||||
- name: myapp1
|
|
||||||
newTag: v1
|
|
||||||
|
|
||||||
# app2/overlay.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: java
|
|
||||||
spec:
|
|
||||||
template:
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: myapp1
|
|
||||||
name: java
|
|
||||||
|
|
||||||
# base/java/apply.yaml
|
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
- service.yaml
|
- service.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# base/java/deployment.yaml
|
# base/java/deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -138,7 +91,9 @@ spec:
|
||||||
port: 8010
|
port: 8010
|
||||||
initialDelaySeconds: 30
|
initialDelaySeconds: 30
|
||||||
timeoutSeconds: 1
|
timeoutSeconds: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# base/java/service.yaml
|
# base/java/service.yaml
|
||||||
kind: Service
|
kind: Service
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
|
|
@ -152,13 +107,83 @@ spec:
|
||||||
port: 8080
|
port: 8080
|
||||||
targetPort: 8080
|
targetPort: 8080
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Variant Layers 1 and 2:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# app1/kustomization.yaml
|
||||||
|
namePrefix: 1-
|
||||||
|
commonLabels:
|
||||||
|
app: app1
|
||||||
|
bases:
|
||||||
|
- ../base/java
|
||||||
|
patchesStrategicMerge:
|
||||||
|
- overlay.yaml
|
||||||
|
images:
|
||||||
|
- name: myapp1
|
||||||
|
newTag: v2
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# app1/overlay.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: java
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: myapp1
|
||||||
|
name: java
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../app2/kustomization.yaml
|
||||||
|
namePrefix: 2-
|
||||||
|
commonLabels:
|
||||||
|
app: app2
|
||||||
|
bases:
|
||||||
|
- ../base/java
|
||||||
|
patchesStrategicMerge:
|
||||||
|
- overlay.yaml
|
||||||
|
images:
|
||||||
|
- name: myapp2
|
||||||
|
newTag: v1
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# app2/overlay.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: java
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: myapp2
|
||||||
|
name: java
|
||||||
|
```
|
||||||
|
|
||||||
|
**Composition Layer:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
namePrefix: app-
|
||||||
|
namespace: app
|
||||||
|
bases:
|
||||||
|
- app1
|
||||||
|
- app2
|
||||||
|
```
|
||||||
|
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Result**:
|
**Result**:
|
||||||
|
|
||||||
- 2 Deployments are created
|
- 2 Deployments are created
|
||||||
- Each Deployment has a different image and imageTag
|
- Each Deployment has a different images
|
||||||
- Each Deployment has different labels / selectors
|
- Each Deployment has different labels / selectors
|
||||||
- Each Deployment has a different name
|
- Each Deployment has a different name
|
||||||
- 2 Services are created
|
- 2 Services are created
|
||||||
|
|
@ -185,11 +210,11 @@ spec:
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
# name has both app1 and project apply.yaml namePrefixes
|
# name has both app1 and project kustomization.yaml namePrefixes
|
||||||
name: app-1-java
|
name: app-1-java
|
||||||
# namespace updated by namespace in project apply.yaml
|
# namespace updated by namespace in project kustomization.yaml
|
||||||
namespace: app
|
namespace: app
|
||||||
# labels updated by commonLabels in app1 apply.yaml
|
# labels updated by commonLabels in app1 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app1
|
app: app1
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -197,18 +222,18 @@ spec:
|
||||||
- port: 8080
|
- port: 8080
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 8080
|
targetPort: 8080
|
||||||
# selector updated by commonLabels in app1 apply.yaml
|
# selector updated by commonLabels in app1 kustomization.yaml
|
||||||
selector:
|
selector:
|
||||||
app: app1
|
app: app1
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
# name has both app2 and project apply.yaml namePrefixes
|
# name has both app2 and project kustomization.yaml namePrefixes
|
||||||
name: app-2-java
|
name: app-2-java
|
||||||
# namespace updated by namespace in project apply.yaml
|
# namespace updated by namespace in project kustomization.yaml
|
||||||
namespace: app
|
namespace: app
|
||||||
# labels updated by commonLabels in app2 apply.yaml
|
# labels updated by commonLabels in app2 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app2
|
app: app2
|
||||||
spec:
|
spec:
|
||||||
|
|
@ -216,35 +241,35 @@ spec:
|
||||||
- port: 8080
|
- port: 8080
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 8080
|
targetPort: 8080
|
||||||
# selector updated by commonLabels in app2 apply.yaml
|
# selector updated by commonLabels in app2 kustomization.yaml
|
||||||
selector:
|
selector:
|
||||||
app: app2
|
app: app2
|
||||||
---
|
---
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
# namespace updated by namespace in project apply.yaml
|
# namespace updated by namespace in project kustomization.yaml
|
||||||
namespace: app
|
namespace: app
|
||||||
# name has both app1 and project apply.yaml namePrefixes
|
# name has both app1 and project kustomization.yaml namePrefixes
|
||||||
name: app-1-java
|
name: app-1-java
|
||||||
# labels updated by commonLabels in app1 apply.yaml
|
# labels updated by commonLabels in app1 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app1
|
app: app1
|
||||||
spec:
|
spec:
|
||||||
# selector updated by commonLabels in app1 apply.yaml
|
# selector updated by commonLabels in app1 kustomization.yaml
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: app1
|
app: app1
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
# labels updated by commonLabels in app1 apply.yaml
|
# labels updated by commonLabels in app1 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app1
|
app: app1
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
# Image is updated by Overlay
|
# Image is updated by Overlay
|
||||||
# ImageTag is updated by imageTag in app1 apply.yaml
|
# ImageTag is updated by images in app1 kustomization.yaml
|
||||||
- image: myapp2:v2
|
- image: myapp1:v2
|
||||||
name: java
|
name: java
|
||||||
# ports and probes inherited from the base
|
# ports and probes inherited from the base
|
||||||
ports:
|
ports:
|
||||||
|
|
@ -265,28 +290,28 @@ spec:
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
# namespace updated by namespace in project apply.yaml
|
# namespace updated by namespace in project kustomization.yaml
|
||||||
namespace: app
|
namespace: app
|
||||||
# name has both app2 and project apply.yaml namePrefixes
|
# name has both app2 and project kustomization.yaml namePrefixes
|
||||||
name: app-2-java
|
name: app-2-java
|
||||||
# labels updated by commonLabels in app2 apply.yaml
|
# labels updated by commonLabels in app2 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app2
|
app: app2
|
||||||
spec:
|
spec:
|
||||||
# selector updated by commonLabels in app2 apply.yaml
|
# selector updated by commonLabels in app2 kustomization.yaml
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: app2
|
app: app2
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
# labels updated by commonLabels in app2 apply.yaml
|
# labels updated by commonLabels in app2 kustomization.yaml
|
||||||
labels:
|
labels:
|
||||||
app: app2
|
app: app2
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
# Image is updated by Overlay
|
# Image is updated by Overlay
|
||||||
# ImageTag is updated by imageTag in app2 apply.yaml
|
# ImageTag is updated by images in app2 kustomization.yaml
|
||||||
- image: myapp1:v1
|
- image: myapp2:v1
|
||||||
name: java
|
name: java
|
||||||
# ports and probes inherited from the base
|
# ports and probes inherited from the base
|
||||||
ports:
|
ports:
|
||||||
|
|
@ -0,0 +1,144 @@
|
||||||
|
{% panel style="warning", title="Warning: Alpha Recommendations" %}
|
||||||
|
This chapter contains recommendations that are still being actively evaluated, and may
|
||||||
|
be changed in the future.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Finer grain management using separate repos for separate Team
|
||||||
|
- Separate permissions for committing changes to separate environments
|
||||||
|
- Separate Issue, Project and PR tracking
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Repository Structure Based Composition
|
||||||
|
|
||||||
|
The are several techniques for users to structure their Resource Config files.
|
||||||
|
|
||||||
|
| Type | Summary | Benefits |
|
||||||
|
|---------------------------------------------|-----------------------|----------------------------------------------------|
|
||||||
|
| [Directories](structure_directories.md) | *Simplest approach* | Easy to get started and understand |
|
||||||
|
| [Branches](structure_branches.md) | *More flexible* | Loose coupling between release specific and operation changes |
|
||||||
|
| **[Repositories](structure_repositories.md)** | **Fine grain control** | **Isolated permissions model** |
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
This chapter describes conventions for using **Repositories** with Directories.
|
||||||
|
|
||||||
|
**Advantages:**
|
||||||
|
|
||||||
|
- **Isolation between teams** managing separate Environments
|
||||||
|
- Permissions
|
||||||
|
- **Fine grain control** over
|
||||||
|
- PRs
|
||||||
|
- Issues
|
||||||
|
- Projects
|
||||||
|
- Automation
|
||||||
|
|
||||||
|
**Drawbacks:**
|
||||||
|
|
||||||
|
- Tools designed to work with files and directories don't work across Repositories
|
||||||
|
- Complicated to setup and manage
|
||||||
|
- **Harder to reason about the system as a whole**
|
||||||
|
- State spread across multiple Repositories
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
### Resource Config
|
||||||
|
|
||||||
|
The convention shown here should be changed and adapted as needed.
|
||||||
|
|
||||||
|
Structure:
|
||||||
|
|
||||||
|
- Create a base Repository for shared configuration
|
||||||
|
- Looks like [Directories](structure_directories.md) approach
|
||||||
|
- For each **separate Team, create a separate Repository**
|
||||||
|
- References the base Repository in Bases
|
||||||
|
|
||||||
|
Techniques:
|
||||||
|
|
||||||
|
- Use techniques described in [Directories](structure_directories.md) and [Branches](structure_branches.md)
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
|
||||||
|
**Base Repository:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── bases # Used as a Base only
|
||||||
|
│ ├── kustomization.yaml
|
||||||
|
│ ├── backend
|
||||||
|
│ │ ├── deployment.yaml
|
||||||
|
│ │ └── service.yaml
|
||||||
|
│ ├── frontend
|
||||||
|
│ │ ├── deployment.yaml
|
||||||
|
│ │ ├── ingress.yaml
|
||||||
|
│ │ └── service.yaml
|
||||||
|
│ └── storage
|
||||||
|
│ ├── service.yaml
|
||||||
|
│ └── statefulset.yaml
|
||||||
|
├── prod # Production
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
│ │ ├── backend
|
||||||
|
│ │ │ └── deployment-patch.yaml # Production Env specific backend overrides
|
||||||
|
│ │ ├── frontend
|
||||||
|
│ │ │ └── deployment-patch.yaml # Production Env specific frontend overrides
|
||||||
|
│ │ └── storage
|
||||||
|
│ │ └── statefulset-patch.yaml # Production Env specific storage overrides
|
||||||
|
│ ├── us-central
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
│ │ └── backend
|
||||||
|
│ │ └── deployment-patch.yaml # us-central cluster specific backend overrides
|
||||||
|
│ ├── us-east
|
||||||
|
│ │ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
├── staging # Staging
|
||||||
|
│ ├── bases
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
└── test # Test
|
||||||
|
├── bases
|
||||||
|
│ ├── kustomization.yaml # Uses bases: ["../../bases"]
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml # Uses bases: ["../bases"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Team Repositories:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# sre team
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── prod
|
||||||
|
│ ├── us-central
|
||||||
|
│ │ ├── kustomization.yaml # Uses bases: ["https://<your-repo>/prod/us-central?ref=<prod-release>"]
|
||||||
|
│ ├── us-east
|
||||||
|
│ │ └── kustomization.yaml # Uses bases: ["https://<your-repo>/prod/us-east?ref=<prod-release>"]
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["https://<your-repo>/prod/us-west?ref=<prod-release>"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# qa team
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
├── staging # Staging
|
||||||
|
│ └── us-west
|
||||||
|
│ └── kustomization.yaml # Uses bases: ["https://<your-repo>/staging/us-west?ref=<staging-release>"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# dev team
|
||||||
|
$ tree
|
||||||
|
.
|
||||||
|
└── test # Test
|
||||||
|
└── us-west
|
||||||
|
└── kustomization.yaml # Uses bases: ["https://<your-repo>/test/us-west?ref=<test-release>"]
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,131 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Reuse Resource Config as Bases to `kustomization.yaml`'s.
|
||||||
|
- Customize Base for different Environments.
|
||||||
|
- Reuse a Base across multiple Projects.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Bases and Variations
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It is common for users to deploy several **Variants of the same Resource Config**, or for different projects
|
||||||
|
to **reuse the same Resource Config**. The Resource Config produced by a `kustomization.yaml` can be
|
||||||
|
reused across multiple project using the `kustomization.yaml` as a *Base*.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
- a project may be deployed to **dev, test, staging, canary and production environments**,
|
||||||
|
but with variants between the environments.
|
||||||
|
- a project may be deployed to **different clusters** that are tuned differently or running
|
||||||
|
different versions of the project.
|
||||||
|
|
||||||
|
## Referring to a Base
|
||||||
|
|
||||||
|
A project can add a Base by adding a path (relative to the `kustomization.yaml`) to **`base` that
|
||||||
|
points to a directory** containing another `kustomization.yaml` file. This will automatically
|
||||||
|
add and kustomize all of the Resources from the base project to the current project.
|
||||||
|
|
||||||
|
Bases can be:
|
||||||
|
|
||||||
|
- Relative paths from the `kustomization.yaml` - e.g. `../base`
|
||||||
|
- Urls - e.g. `github.com/kubernetes-sigs/kustomize/examples/multibases?ref=v1.0.6`
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Example:** Add a `kustomization.yaml` as a Base.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base: kustomization.yaml and Resource Config**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
configMapGenerator:
|
||||||
|
- name: myJavaServerEnvVars
|
||||||
|
literals:
|
||||||
|
- JAVA_HOME=/opt/java/jdk
|
||||||
|
- JAVA_TOOL_OPTIONS=-agentlib:hprof
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /etc/config
|
||||||
|
name: config-volume
|
||||||
|
volumes:
|
||||||
|
- configMap:
|
||||||
|
name: myJavaServerEnvVars
|
||||||
|
name: config-volume
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Unmodified Generated Base Resource
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: myJavaServerEnvVars-k44mhd6h5f
|
||||||
|
data:
|
||||||
|
JAVA_HOME: /opt/java/jdk
|
||||||
|
JAVA_TOOL_OPTIONS: -agentlib:hprof
|
||||||
|
---
|
||||||
|
# Unmodified Config Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /etc/config
|
||||||
|
name: config-volume
|
||||||
|
volumes:
|
||||||
|
- configMap:
|
||||||
|
name: myJavaServerEnvVars-k44mhd6h5f
|
||||||
|
name: config-volume
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Bases in Bases" %}
|
||||||
|
Bases themselves may also be Variants and have their own Bases. See [Advanced Composition](../app_composition_and_deployment/structure_multi_tier_apps.md)
|
||||||
|
for more information.
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
# Config Reflection
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Inject the values of other Resource Config fields into Pod Env Vars and Command Args.
|
- Inject the values of other Resource Config fields into Pod Env Vars and Command Args with `vars`.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Config Reflection
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
Pods may need to refer to the values of Resource Config fields. For example
|
Applications running in Pods may need to know about Application context or configuration.
|
||||||
a Pod may take the name of Service defined in the Project as a command argument.
|
For example, a **Pod may take the name of Service defined in the Project as a command argument**.
|
||||||
Instead of hard coding the value directly into the PodSpec, it is preferable
|
Instead of hard coding the value of the Service directly into the PodSpec, users can **reference
|
||||||
to use a `vars` entry to reference the value by path. This will ensure
|
the Service value using a `vars` entry**. If the value is updated or transformed by the
|
||||||
if the value is updated or transformed by the `apply.yaml` file, the
|
`kustomization.yaml` file (e.g. by setting a `namePrefix`), the value will be propagated
|
||||||
value will be propagated to where it is referenced in the PodSpec.
|
to where it is referenced in the PodSpec.
|
||||||
|
|
||||||
## Vars
|
## Vars
|
||||||
|
|
||||||
|
|
@ -31,22 +31,45 @@ Apply will set the resolve $(BACKEND_SERVICE_NAME) to a value using the path
|
||||||
specified in `vars`.
|
specified in `vars`.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml, deployment.yaml and service.yaml files
|
**Input:** The kustomization.yaml, deployment.yaml and service.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
namePrefix: "test-"
|
||||||
vars:
|
vars:
|
||||||
|
# Name of the variable so it can be referenced
|
||||||
- name: BACKEND_SERVICE_NAME
|
- name: BACKEND_SERVICE_NAME
|
||||||
|
# GVK of the object with the field
|
||||||
objref:
|
objref:
|
||||||
kind: Service
|
kind: Service
|
||||||
name: backend-service
|
name: backend-service
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
|
# Path to the field
|
||||||
fieldref:
|
fieldref:
|
||||||
fieldpath: metadata.name
|
fieldpath: metadata.name
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
- service.yaml
|
- service.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# service.yaml
|
||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
# Value of the variable. This will be customized with
|
||||||
|
# a namePrefix, and change the Variable value.
|
||||||
|
name: backend-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: backend
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 80
|
||||||
|
targetPort: 9376
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -66,20 +89,8 @@ spec:
|
||||||
containers:
|
containers:
|
||||||
- name: curl
|
- name: curl
|
||||||
image: ubuntu
|
image: ubuntu
|
||||||
command: ["curl", "$(BACKEND_SERVICE)"]
|
# Reference the Service name field value as a variable
|
||||||
|
command: ["curl", "$(BACKEND_SERVICE_NAME)"]
|
||||||
# service.yaml
|
|
||||||
kind: Service
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: backend-service
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
app: backend
|
|
||||||
ports:
|
|
||||||
- protocol: TCP
|
|
||||||
port: 80
|
|
||||||
targetPort: 9376
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Applied:** The Resources that are Applied to the cluster
|
**Applied:** The Resources that are Applied to the cluster
|
||||||
|
|
@ -88,7 +99,7 @@ spec:
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: backend-service
|
name: test-backend-service
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- port: 80
|
- port: 80
|
||||||
|
|
@ -100,9 +111,9 @@ spec:
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
|
name: test-curl-deployment
|
||||||
labels:
|
labels:
|
||||||
app: curl
|
app: curl
|
||||||
name: curl-deployment
|
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
|
|
@ -116,15 +127,15 @@ spec:
|
||||||
- command:
|
- command:
|
||||||
- curl
|
- curl
|
||||||
# $(BACKEND_SERVICE_NAME) has been resolved to
|
# $(BACKEND_SERVICE_NAME) has been resolved to
|
||||||
# backend-service
|
# test-backend-service
|
||||||
- backend-service
|
- test-backend-service
|
||||||
image: ubuntu
|
image: ubuntu
|
||||||
name: curl
|
name: curl
|
||||||
```
|
```
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
{% panel style="info", title="Referencing Variables" %}
|
{% panel style="warning", title="Referencing Variables" %}
|
||||||
Variables are intended to allow Pods to access Resource Config values from. They are
|
Variables are intended only to inject Resource Config into Pods. They are
|
||||||
**not** intended as a general templating mechanism. Overriding values should be done with
|
**not** intended as a general templating mechanism. Overriding values should be done with
|
||||||
patches instead of variables. See [Bases and Variations](project_variants.md).
|
patches instead of variables. See [Bases and Variations](bases_and_variants.md).
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,226 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Customize arbitrary fields from arbitrary Resources in a Base.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Customizing Resource Fields
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It is often necessary for users to want to **modify arbitrary fields** from a Base, such
|
||||||
|
as resource reservations for Pods, replicas on Deployments, etc. Overlays and patches can
|
||||||
|
be used by Variants to specify fields values which will override the Base field values.
|
||||||
|
|
||||||
|
## Customizing Arbitrary Fields with Overlays
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
Arbitrary **fields may be added, changed, or deleted** by supplying *Overlays* against the
|
||||||
|
Resources provided by the Base. **Overlays are sparse Resource definitions** that
|
||||||
|
allow arbitrary customizations to be performed without requiring a base to expose
|
||||||
|
the customization as a template.
|
||||||
|
|
||||||
|
Overlays require the *Group, Version, Kind* and *Name* of the Resource to be specified, as
|
||||||
|
well as any fields that should be set on the base Resource. Overlays are applied using
|
||||||
|
*StrategicMergePatch*.
|
||||||
|
|
||||||
|
**Use Case:** Different Environments (test, dev, staging, canary, prod) require fields such as
|
||||||
|
replicas or resources to be overridden.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file and overlay
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
patchesStrategicMerge:
|
||||||
|
- overlay.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# overlay.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# override replicas
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
# override resources
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "1"
|
||||||
|
requests:
|
||||||
|
cpu: "0.5"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "0.2"
|
||||||
|
requests:
|
||||||
|
cpu: "0.1"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Overlayed Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# replicas field has been added
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
# resources have been overridden
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: "1"
|
||||||
|
requests:
|
||||||
|
cpu: "0.5"
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Merge Semantics for Overlays" %}
|
||||||
|
Overlays use the same [merge semantics](../app_management/field_merge_semantics.md) as Applying Resource Config to cluster. One difference
|
||||||
|
is that there is no *Last Applied Resource Config* when merging overlays, so fields may only be deleted
|
||||||
|
if they are explicitly set to nil.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Customizing Arbitrary Fields with JsonPatch
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
Arbitrary fields may be added, changed, or deleted by supplying *Json 6902 Patches* against the
|
||||||
|
Resources provided by the base.
|
||||||
|
|
||||||
|
**Use Case:** Different Environments (test, dev, staging, canary, prod) require fields such as
|
||||||
|
replicas or resources to be overridden.
|
||||||
|
|
||||||
|
Json 6902 Patches are [rfc6902](https://tools.ietf.org/html/rfc6902) patches that are applied
|
||||||
|
to resources. Patches require the *Group, Version, Kind* and *Name* of the Resource to be
|
||||||
|
specified in addition to the Patch. Patches offer a number of powerful imperative operations
|
||||||
|
for modifying the base Resources.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
patchesJson6902:
|
||||||
|
- target:
|
||||||
|
group: apps
|
||||||
|
version: v1
|
||||||
|
kind: Deployment
|
||||||
|
name: nginx-deployment
|
||||||
|
path: patch.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# patch.yaml
|
||||||
|
- op: add
|
||||||
|
path: /spec/replicas
|
||||||
|
value: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Patched Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# replicas field has been added
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,271 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Customize Base Resource Namespaces
|
||||||
|
- Customize Base Resource Names with Prefixes or Suffixes
|
||||||
|
- Customize Base Resource Labels or Annotations
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Customizing Resource Metadata
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It is common for users to customize the metadata of their Applications - including
|
||||||
|
the **names, namespaces, labels and annotations**.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
- Overriding the Namespace
|
||||||
|
- Overriding the Names of Resources by supplying a Prefix or Suffix
|
||||||
|
- Overriding Labels and Annotations
|
||||||
|
- Running **multiple instances of the same White-Box Base** using the above techniques
|
||||||
|
|
||||||
|
## Customizing Resource Namespaces
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Use Case:**
|
||||||
|
- Change the Namespace for Resources from Base.
|
||||||
|
|
||||||
|
Customize the Namespace of all Resources in the Base by adding `namespace`.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
namespace: test
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Modified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
# Namepace has been changed to test
|
||||||
|
namespace: test
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
## Customizing Resource Name Prefixes and Suffixes
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Use Case:**
|
||||||
|
- Run multiple instances of the same Base.
|
||||||
|
- Create naming conventions for different Environments (test, dev, staging, canary, prod).
|
||||||
|
|
||||||
|
Customize the Name of all Resources in the Base by adding `namePrefix` or `nameSuffix` in Variants.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
namePrefix: test-
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Modified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
# Name has been prefixed with the environment
|
||||||
|
name: test-nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
See [Namespaces and Names](../app_management/namespaces_and_names.md).
|
||||||
|
|
||||||
|
{% panel style="success", title="Chaining Name Prefixes" %}
|
||||||
|
Name Prefix's and Suffix's in Bases will be concatenated with Name Prefix's
|
||||||
|
and Suffix's specified in Variants - e.g. if a Base has a Name Prefix of `app-name-`
|
||||||
|
and the Variant has a Name Prefix of `test-` the Applied Resources will have
|
||||||
|
a Name Prefix of `test-app-name-`.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Customizing Resource Labels and Annotations
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Use Case:**
|
||||||
|
- Create Label or Annotation conventions for different Environments (test, dev, staging, canary, prod).
|
||||||
|
|
||||||
|
Customize the Labels and Annotations of all Resources in the Base by adding a
|
||||||
|
`commonLabels` or `commonAnnotations` in the variants.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
commonLabels:
|
||||||
|
app: test-nginx
|
||||||
|
environment: test
|
||||||
|
commonAnnotations:
|
||||||
|
oncallPager: 800-555-1212
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
base: label
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Modified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# labels have been overridden
|
||||||
|
labels:
|
||||||
|
app: test-nginx
|
||||||
|
environment: test
|
||||||
|
base: label
|
||||||
|
# annotations have been overridden
|
||||||
|
annotations:
|
||||||
|
oncallPager: 800-555-1212
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: test-nginx
|
||||||
|
environment: test
|
||||||
|
base: label
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: test-nginx
|
||||||
|
environment: test
|
||||||
|
base: label
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
name: nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,338 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Override Base Pod and PodTemplate Image Tags
|
||||||
|
- Override Base Pod and PodTemplate Environment Variables and Arguments
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Customizing Pods
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It is common for users to customize their Applications for specific environments.
|
||||||
|
Simple customizations to Pod Templates may be through **Images, Environment Variables and
|
||||||
|
Command Line Arguments**.
|
||||||
|
|
||||||
|
Common examples include:
|
||||||
|
|
||||||
|
- Running **different versions of an Image** for dev, test, canary, production
|
||||||
|
- Configuring **different Pod Environment Variables and Arguments** for dev, test, canary, production
|
||||||
|
|
||||||
|
## Customizing Images
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Use Case:** Different Environments (test, dev, staging, canary, prod) use images with different tags.
|
||||||
|
|
||||||
|
Override the tag for an `image` field from a Pod Template in a base by specifying the `images` field in the
|
||||||
|
`kustomization.yaml`. The `newTag` may be specified to override the image tag for images whose image
|
||||||
|
name matches `name`.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The `kustomization.yaml` file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
images:
|
||||||
|
- name: nginx-pod
|
||||||
|
newTag: 1.15
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base:** Resources to be modified by the `kustomization.yaml`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx-pod
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resource that is Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Modified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
# The image image tag has been changed for the container
|
||||||
|
- name: nginx
|
||||||
|
image: nginx-pod:1.15
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
|
{% panel style="info", title="More Info" %}
|
||||||
|
For more information on customizing images, see [Container Images](../app_management/container_images.md).
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Customizing Pod Environment Variables
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
**Use Case:** Different Environments (test, dev, staging, canary, prod) are configured with
|
||||||
|
different Environment Variables.
|
||||||
|
|
||||||
|
Override Pod Environment Variables.
|
||||||
|
|
||||||
|
- Base uses ConfigMap data in Pods as Environment Variables
|
||||||
|
- Each Variant overrides or extends ConfigMap data
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
configMapGenerator:
|
||||||
|
- name: special-config
|
||||||
|
behavior: merge
|
||||||
|
literals:
|
||||||
|
- special.how=very # override the base value
|
||||||
|
- special.type=charm # add a value to the base
|
||||||
|
```
|
||||||
|
|
||||||
|
**Base: kustomization.yaml and Resources**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
configMapGenerator:
|
||||||
|
- name: special-config
|
||||||
|
behavior: merge
|
||||||
|
literals:
|
||||||
|
- special.how=some # this value is overridden
|
||||||
|
- special.other=that # this value is kept
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: special-config
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resources that are Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Generated Variant Resource
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: special-config-82tc88cmcg
|
||||||
|
data:
|
||||||
|
special.how: very
|
||||||
|
special.type: charm
|
||||||
|
special.other: that
|
||||||
|
---
|
||||||
|
# Unmodified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
envFrom:
|
||||||
|
# Container env will have the overridden ConfigMap values
|
||||||
|
- configMapRef:
|
||||||
|
name: special-config-82tc88cmcg
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
See [ConfigMaps and Secrets](../app_management/secrets_and_configmaps.md).
|
||||||
|
|
||||||
|
|
||||||
|
## Customizing Pod Command Arguments
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Use Case:** Different Environments (test, dev, staging, canary, prod) provide different Commandline
|
||||||
|
Arguments to a Pod.
|
||||||
|
|
||||||
|
Override Pod Command Arguments.
|
||||||
|
|
||||||
|
- Base uses ConfigMap data in Pods as Command Arguments
|
||||||
|
- Each Variant defines different ConfigMap data
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
bases:
|
||||||
|
- ../base
|
||||||
|
configMapGenerator:
|
||||||
|
- name: special-config
|
||||||
|
behavior: merge
|
||||||
|
literals:
|
||||||
|
- SPECIAL_LEVEL=very
|
||||||
|
- SPECIAL_TYPE=charm
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/kustomization.yaml
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
|
||||||
|
configMapGenerator:
|
||||||
|
- name: special-config
|
||||||
|
literals:
|
||||||
|
- SPECIAL_LEVEL=override.me
|
||||||
|
- SPECIAL_TYPE=override.me
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# ../base/deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: test-container
|
||||||
|
image: k8s.gcr.io/busybox
|
||||||
|
command: [ "/bin/sh" ]
|
||||||
|
# Use the ConfigMap Environment Variables in the Command
|
||||||
|
args: ["-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
|
||||||
|
env:
|
||||||
|
- name: SPECIAL_LEVEL_KEY
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: special-config
|
||||||
|
key: SPECIAL_LEVEL
|
||||||
|
- name: SPECIAL_TYPE_KEY
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: special-config
|
||||||
|
key: SPECIAL_TYPE
|
||||||
|
```
|
||||||
|
|
||||||
|
**Applied:** The Resources that are Applied to the cluster
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Generated Variant Resource
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: special-config-82tc88cmcg
|
||||||
|
data:
|
||||||
|
SPECIAL_LEVEL: very
|
||||||
|
SPECIAL_TYPE: charm
|
||||||
|
---
|
||||||
|
# Unmodified Base Resource
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: k8s.gcr.io/busybox
|
||||||
|
name: test-container
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
args:
|
||||||
|
- -c
|
||||||
|
# Container args will have the overridden ConfigMap values
|
||||||
|
- echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)
|
||||||
|
env:
|
||||||
|
- name: SPECIAL_LEVEL_KEY
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
key: SPECIAL_LEVEL
|
||||||
|
name: special-config-82tc88cmcg
|
||||||
|
- name: SPECIAL_TYPE_KEY
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
key: SPECIAL_TYPE
|
||||||
|
name: special-config-82tc88cmcg
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="More Info" %}
|
||||||
|
See [Secrets and ConfigMaps](../app_management/secrets_and_configmaps.md) for more information on ConfigMap and Secret generation.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
This section of the book covers how to build Projects and Applications with multiple subcomponents
|
||||||
|
partially defined by multiple teams or organizations. Apply kustomizations allow the authoring
|
||||||
|
of Resource Config to be a collaboration across teams.
|
||||||
|
|
||||||
|
Kustomizations facilitate:
|
||||||
|
|
||||||
|
- Developing Variations of Resource Config for multiple Environments with different configurations
|
||||||
|
- Developing Variations of Resource Config for multiple Clusters with different configurations
|
||||||
|
- Developing and Publishing Ready-Made Resource Config for users to extend and customize
|
||||||
|
- Composing Resource Config from multiple sources
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Apply Creates and Updates Resources in a cluster through running `kubectl apply` on Resource Config.
|
||||||
|
- Apply manages complexity such as ordering of operations and merging user defined and cluster defined state.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Apply
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Apply will update a Kubernetes cluster to match state defined locally in files.
|
||||||
|
|
||||||
|
- Fully declarative - don't need to specify create or update - just manage files
|
||||||
|
- Merges user owned state (e.g. Service `selector`) with state owned by the cluster (e.g. Service `clusterIp`)
|
||||||
|
|
||||||
|
## Definitions
|
||||||
|
|
||||||
|
- **Resources**: *Objects* in a cluster - e.g. Deployments, Services, etc.
|
||||||
|
- **Resource Config**: *Files* declaring the desired state for Resources - e.g. deployment.yaml.
|
||||||
|
Resources are created and updated using Apply with these files.
|
||||||
|
|
||||||
|
*kubectl apply* Creates and Updates Resources through local or remote files. This may be through
|
||||||
|
either raw Resource Config or *kustomization.yaml*.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
It is recommended to use a `kustomization.yaml` with Apply. `kustomization.yaml` provides low-level
|
||||||
|
tooling to simplify managing collections of Resources Configs.
|
||||||
|
|
||||||
|
This `kustomization.yaml` file contains a Deployment Resource Config which will be Applied.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
|
||||||
|
resources:
|
||||||
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.15.4
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
Users run Apply on directories containing `kustomization.yaml` files using `-k` or on raw
|
||||||
|
ResourceConfig files using `-f`.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
```bash
|
||||||
|
# Apply the Resource Config
|
||||||
|
$ kubectl apply -k .
|
||||||
|
|
||||||
|
# View the Resources
|
||||||
|
$ kubectl get -k .
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Multi-Resource Configs" %}
|
||||||
|
A single Resource Config file may declare multiple Resources separated by `\n---\n`.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## CRUD Operations
|
||||||
|
|
||||||
|
### Creating Resources
|
||||||
|
|
||||||
|
Any Resources that do not exist and are declared in Resource Config when Apply is run will be Created.
|
||||||
|
|
||||||
|
### Updating Resources
|
||||||
|
|
||||||
|
Any Resources that already exist and are declared in Resource Config when Apply is run may be Updated.
|
||||||
|
|
||||||
|
**Added Fields**
|
||||||
|
|
||||||
|
Any fields that have been added to the Resource Config will be set on the Resource.
|
||||||
|
|
||||||
|
**Updated Fields**
|
||||||
|
|
||||||
|
Any fields that contain different values for the fields specified locally in the Resource Config from what is
|
||||||
|
in the Resource will be updated by merging the Resource Config into the live Resource. See [merging](field_merge_semantics.md)
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
**Deleted Fields**
|
||||||
|
|
||||||
|
Fields that were in the Resource Config the last time Apply was run, will be deleted from the Resource, and
|
||||||
|
return to their default values.
|
||||||
|
|
||||||
|
**Unmanaged Fields**
|
||||||
|
|
||||||
|
Fields that were not specified in the Resource Config but are set on the Resource will be left unmodified.
|
||||||
|
|
||||||
|
### Deleting Resources
|
||||||
|
|
||||||
|
Declarative deletion of Resources does not yet exist in a usable form, but is under development.
|
||||||
|
|
||||||
|
{% panel style="info", title="Continuously Applying The Hard Way" %}
|
||||||
|
In some cases, it may be useful to automatically Apply changes when ever the Resource Config is changed.
|
||||||
|
|
||||||
|
This example uses the unix `watch` command to periodically invoke Apply against a target.
|
||||||
|
`watch -n 60 kubectl apply -k https://github.com/myorg/myrepo`
|
||||||
|
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Resource Creation Ordering
|
||||||
|
|
||||||
|
Certain Resource Types may be dependent on other Resource Types being created first. e.g. Namespaced
|
||||||
|
Resources on the Namespaces, RoleBindings on Roles, CustomResources on the CRDs, etc.
|
||||||
|
|
||||||
|
When used with a `kustomization.yaml`, Apply sorts the Resources by Resource type to ensure Resources
|
||||||
|
with these dependencies are created in the correct order.
|
||||||
|
|
@ -1,47 +1,53 @@
|
||||||
# Container Image Tags
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Set the Tag for all Container Images matching a Name
|
- Override or set the Tag for Container Images
|
||||||
- Set the Tag for Container Images from another source (e.g. Git Hash)
|
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Container Images
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
It may be useful to specify the tags that are used for specific container images across many Workloads.
|
It may be useful to define the tags of container images which are
|
||||||
|
used across many Workloads.
|
||||||
|
|
||||||
- The same image tag is used for multiple different container images
|
- Update the container image tag for multiple Workloads at once
|
||||||
- The same container image is used in multiple containers or Workloads
|
- Increase visibility of the versions of container images being used within
|
||||||
- Increase visibility of the versions of container images being used within the project
|
the project
|
||||||
- Setting the image tag from external sources - such as environment variables
|
- Set the image tag from external sources - such as environment variables
|
||||||
- Copy or Fork an existing Project and change the Image Tag for a container
|
- Copy or Fork an existing Project and change the Image Tag for a container
|
||||||
|
- Change the registry used for an image
|
||||||
|
|
||||||
See [Bases and Variations](project_variants.md) for more details on Copying Projects.
|
See [Bases and Variations](../app_customization/bases_and_variants.md) for more details on Copying Projects.
|
||||||
|
|
||||||
## imageTags
|
## images
|
||||||
|
|
||||||
It is possible to set image tags for container images by name through `apply.yaml` using the `imageTags`
|
It is possible to set image image tags for container images through
|
||||||
field. When `imageTags` are specified, Apply will set the image tag for all images
|
the `kustomization.yaml` using the `images` field. When `images` are
|
||||||
that match the name and **do not** have a tag already specified.
|
specified, Apply will override the images whose image name matches `name` with a new
|
||||||
|
tag.
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
|
|
||||||
**Example:** Set the `imageTags` specified in the `apply.yaml` on the container images specified
|
**Example:** Use `images` in the `kustomization.yaml` to update the container
|
||||||
in `deployment.yaml`
|
images in `deployment.yaml`
|
||||||
|
|
||||||
Apply will set the `nginx` image to have the tag `1.8.0` - e.g. `nginx:1.8.0`.
|
Apply will set the `nginx` image to have the tag `1.8.0` - e.g. `nginx:1.8.0`.
|
||||||
This will set the tag for *all* untagged images matching the *name*.
|
This will set the tag for *all* images matching the *name*.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
imageTags:
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
- name: nginx
|
kind: Kustomization
|
||||||
newTag: 1.8.0
|
images:
|
||||||
|
- name: nginx # match images with this name
|
||||||
|
newTag: 1.8.0 # override the tag
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -95,8 +101,10 @@ spec:
|
||||||
The tag for an image may be set by specifying `newTag` and the name of the container image.
|
The tag for an image may be set by specifying `newTag` and the name of the container image.
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
imageTags:
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
images:
|
||||||
- name: mycontainerregistry/myimage
|
- name: mycontainerregistry/myimage
|
||||||
newTag: v1
|
newTag: v1
|
||||||
```
|
```
|
||||||
|
|
@ -108,13 +116,16 @@ imageTags:
|
||||||
The digest for an image may be set by specifying `digest` and the name of the container image.
|
The digest for an image may be set by specifying `digest` and the name of the container image.
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
imageTags:
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
images:
|
||||||
- name: alpine
|
- name: alpine
|
||||||
digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
|
digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
|
||||||
```
|
```
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
## Setting a Tag from the latest commit SHA
|
## Setting a Tag from the latest commit SHA
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
|
|
@ -122,7 +133,8 @@ A common CICD pattern is to tag container images with the git commit SHA of sour
|
||||||
the image name is `foo` and an image was built for the source code at commit `1bb359ccce344ca5d263cd257958ea035c978fd3`
|
the image name is `foo` and an image was built for the source code at commit `1bb359ccce344ca5d263cd257958ea035c978fd3`
|
||||||
then the conatiner image would be `foo:1bb359ccce344ca5d263cd257958ea035c978fd3`.
|
then the conatiner image would be `foo:1bb359ccce344ca5d263cd257958ea035c978fd3`.
|
||||||
|
|
||||||
A simple way to push an image that was just build without manually updating the image tags is to use the
|
A simple way to push an image that was just built without manually updating the image tags is to
|
||||||
|
download the [kustomize standalone](https://github.com/kubernetes-sigs/kustomize/) tool and run
|
||||||
`kustomize edit set imagetag` command to update the tags for you.
|
`kustomize edit set imagetag` command to update the tags for you.
|
||||||
|
|
||||||
**Example:** Set the latest git commit SHA as the image tag for `foo` images.
|
**Example:** Set the latest git commit SHA as the image tag for `foo` images.
|
||||||
|
|
@ -143,13 +155,14 @@ It is also possible to set a Tag from an environment variable using the same tec
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
```bash
|
```bash
|
||||||
$ kustomize edit set imagetag foo:$FOO_IMAGE_TAG
|
$ kustomize edit set image foo:$FOO_IMAGE_TAG
|
||||||
$ kubectl apply -f .
|
$ kubectl apply -f .
|
||||||
```
|
```
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
{% panel style="info", title="Committing Image Tag Updates" %}
|
{% panel style="info", title="Committing Image Tag Updates" %}
|
||||||
The `apply.yaml` changes *may* be committed back to git so that they can be audited. When committing the image tag
|
The `kustomization.yaml` changes *may* be committed back to git so that they
|
||||||
updates that have already been pushed by a CICD system, be careful not to trigger new builds + deployments for
|
can be audited. When committing the image tag updates that have already
|
||||||
these changes.
|
been pushed by a CICD system, be careful not to trigger new builds +
|
||||||
|
deployments for these changes.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,473 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Fields set and deleted from Resource Config are merged into Resources by Apply
|
||||||
|
- If a Resource already exists, Apply updates the Resources by merging the local Resource Config into the remote Resources
|
||||||
|
- Fields removed from the Resource Config will be deleted from the remote Resource
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Merging Fields
|
||||||
|
|
||||||
|
## When are fields merged?
|
||||||
|
|
||||||
|
This page describes how Resource Config is merged with Resources or other Resource Config. This
|
||||||
|
may occur when:
|
||||||
|
|
||||||
|
- Applying Resource Config updates to the live Resources in the cluster
|
||||||
|
- Defining Patches in the `kustomization.yaml` which are overlayed on `resources` and [bases](../app_customization/bases_and_variants.md)
|
||||||
|
|
||||||
|
### Applying Resource Config Updates
|
||||||
|
|
||||||
|
Rather than replacing the Resource with the new Resource Config, **Apply will merge the new Resource Config
|
||||||
|
into the live Resource**. This retains values which may be set by the control plane - such as `replicas` values
|
||||||
|
set by auto scalers
|
||||||
|
|
||||||
|
### Defining Patches
|
||||||
|
|
||||||
|
`patches` are sparse Resource Config which **contain a subset of fields that override values
|
||||||
|
defined in other Resource Config** with the same Group/Version/Kind/Namespace/Name.
|
||||||
|
This is used to alter values defined on Resource Config without having to fork it.
|
||||||
|
|
||||||
|
## Motivation (Apply)
|
||||||
|
|
||||||
|
This page describes the semantics for merging Resource Config.
|
||||||
|
|
||||||
|
Ownership of Resource fields are shared between declarative Resource Config authored by human
|
||||||
|
users, and values set by Controllers running in the cluster. Some fields, such as the `status`
|
||||||
|
and `clusterIp` fields, are owned exclusively by Controllers. Fields, such as the `name`
|
||||||
|
and `namespace` fields, are owned exclusively by the human user managing the Resource.
|
||||||
|
|
||||||
|
Other fields, such as `replicas`, may be owned by either human users, the apiserver or
|
||||||
|
Controllers. For example, `replicas` may be explicitly set by a user, implicitly set
|
||||||
|
to a default value by the apiserver, or continuously adjusted by a Controller such as
|
||||||
|
and HorizontalPodAutoscaler.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Last Applied Resource Condfig
|
||||||
|
|
||||||
|
When Apply creates or updates a Resource, it writes the Resource Config it Applied to an annotation on the
|
||||||
|
Resource. This allows it to compare the last Resource Config it Applied to the current Resource
|
||||||
|
Config and identify fields that have been deleted.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# deployment.yaml (Resource Config)
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.7.9
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Original Resource
|
||||||
|
Doesn't Exist
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
# ...
|
||||||
|
# This is the deployment.yaml Resource Config written as an annotation on the object
|
||||||
|
# It was written by kubectl apply when the object was created
|
||||||
|
kubectl.kubernetes.io/last-applied-configuration: |
|
||||||
|
{"apiVersion":"apps/v1","kind":"Deployment",
|
||||||
|
"metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
|
||||||
|
"spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
|
||||||
|
"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx"}]}}}}
|
||||||
|
# ...
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
## Merging Resources
|
||||||
|
|
||||||
|
Following are the merge semantics for Resources:
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Adding Fields:**
|
||||||
|
|
||||||
|
- Fields present in the Resource Config that are missing from the Resource will be added to the
|
||||||
|
Resource.
|
||||||
|
- Fields will be added to the Last Applied Resource Config
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# deployment.yaml (Resource Config)
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
minReadySeconds: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Original Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
minReadySeconds: 3
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Updating Fields**
|
||||||
|
|
||||||
|
- Fields present in the Resource Config that are also present in the Resource will be merged recursively
|
||||||
|
until a primitive field is updated, or a field is added / deleted.
|
||||||
|
- Fields will be updated in the Last Applied Resource Config
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# deployment.yaml (Resource Config)
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
replicas: 2
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Original Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
# could be defaulted or set by Resource Config
|
||||||
|
replicas: 1
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
# updated
|
||||||
|
replicas: 2
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
**Deleting Fields**
|
||||||
|
|
||||||
|
- Fields present in the **Last Applied Resource Config** that have been removed from the Resource Config
|
||||||
|
will be deleted from the Resource.
|
||||||
|
- Fields set to *null* in the Resource Config that are present in the Resource Config will be deleted from the
|
||||||
|
Resource.
|
||||||
|
- Fields will be removed from the Last Applied Resource Config
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# deployment.yaml (Resource Config)
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Original Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
# Containers replicas and minReadySeconds
|
||||||
|
kubectl.kubernetes.io/last-applied-configuration: |
|
||||||
|
{"apiVersion":"apps/v1","kind":"Deployment", "spec":{"replicas": "2", "minReadySeconds": "3", ...}, "metadata": {...}}
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
minReadySeconds: 3
|
||||||
|
replicas: 2
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
# ...
|
||||||
|
name: nginx-deployment
|
||||||
|
kubectl.kubernetes.io/last-applied-configuration: |
|
||||||
|
{"apiVersion":"apps/v1","kind":"Deployment", "spec":{...}, "metadata": {...}}
|
||||||
|
spec:
|
||||||
|
# ...
|
||||||
|
# deleted and then defaulted, but not in Last Applied
|
||||||
|
replicas: 1
|
||||||
|
# minReadySeconds deleted
|
||||||
|
status:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="danger", title="Removing Fields from Resource Config" %}
|
||||||
|
Simply removing a field from the Resource Config will *not* transfer the ownership to the cluster.
|
||||||
|
Instead it will delete the field from the Resource. If a field is set in the Resource Config and
|
||||||
|
the user wants to give up ownership (e.g. removing `replicas` from the Resource Config and using
|
||||||
|
and autoscaler), the user must first remove it from the last Applied Resource Config stored by the
|
||||||
|
cluster.
|
||||||
|
|
||||||
|
This can be performed using `kubectl apply edit-last-applied` to delete the `replicas` field from
|
||||||
|
the **Last Applied Resource Config**, and then deleting it from the **Resource Config.**
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Field Merge Semantics
|
||||||
|
|
||||||
|
### Merging Primitives
|
||||||
|
|
||||||
|
Primitive fields are merged by replacing the current value with the new value.
|
||||||
|
|
||||||
|
**Field Creation:** Add the primitive field
|
||||||
|
|
||||||
|
**Field Update:** Change the primitive field value
|
||||||
|
|
||||||
|
**Field Deletion:** Delete the primitive field
|
||||||
|
|
||||||
|
| Field in Resource Config | Field in Resource | Field in Last Applied | Action |
|
||||||
|
|---------------------------|-------------------|-----------------------|-----------------------------------------|
|
||||||
|
| Yes | Yes | - | Set live to the Resource Config value. |
|
||||||
|
| Yes | No | - | Set live to the Resource Config value. |
|
||||||
|
| No | - | Yes | Remove from Resource. |
|
||||||
|
| No | - | No | Do nothing. |
|
||||||
|
|
||||||
|
|
||||||
|
### Merging Objects
|
||||||
|
|
||||||
|
Objects fields are updated by merging the sub-fields recursively (by field name) until a primitive field is found or
|
||||||
|
the field is added / deleted.
|
||||||
|
|
||||||
|
**Field Creation:** Add the object field
|
||||||
|
|
||||||
|
**Field Update:** Recursively compare object sub-field values and merge them
|
||||||
|
|
||||||
|
**Field Deletion:** Delete the object field
|
||||||
|
|
||||||
|
**Merge Table:** For each field merge Resource Config and Resource values with the same name
|
||||||
|
|
||||||
|
| Field in Resource Config | Field in Resource | Field in Last Applied | Action |
|
||||||
|
|---------------------------|-------------------|-----------------------|-------------------------------------------|
|
||||||
|
| Yes | Yes | - | Recursively merge the Resource Config and Resource values. |
|
||||||
|
| Yes | No | - | Set live to the Resource Config value. |
|
||||||
|
| No | - | Yes | Remove field from Resource. |
|
||||||
|
| No | - | No | Do nothing. |
|
||||||
|
|
||||||
|
### Merging Maps
|
||||||
|
|
||||||
|
Map fields are updated by merging the elements (by key) until a primitive field is found or the value is
|
||||||
|
added / deleted.
|
||||||
|
|
||||||
|
**Field Creation:** Add the map field
|
||||||
|
|
||||||
|
**Field Update:** Recursively compare map values by key and merge them
|
||||||
|
|
||||||
|
**Field Deletion:** Delete the map field
|
||||||
|
|
||||||
|
**Merge Table:** For each map element merge Resource Config and Resource values with the same key
|
||||||
|
|
||||||
|
| Key in Resource Config | Key in Resource | Key in Last Applied | Action |
|
||||||
|
|---------------------------|-------------------|-----------------------|-------------------------------------------|
|
||||||
|
| Yes | Yes | - | Recursively merge the Resource Config and Resource values. |
|
||||||
|
| Yes | No | - | Set live to the Resource Config value. |
|
||||||
|
| No | - | Yes | Remove map element from Resource. |
|
||||||
|
| No | - | No | Do nothing. |
|
||||||
|
|
||||||
|
### Merging Lists of Primitives
|
||||||
|
|
||||||
|
Lists of primitives will be merged if they have a `patch strategy: merge` on the field otherwise they will
|
||||||
|
be replaced. [Finalizer list example](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#objectmeta-v1-meta)
|
||||||
|
|
||||||
|
**Merge Strategy:**
|
||||||
|
|
||||||
|
- Merged primitive lists behave like ordered sets
|
||||||
|
- Replace primitive lists are replaced when merged
|
||||||
|
|
||||||
|
**Ordering:** Uses the ordering specified in the Resource Config. Elements not specified in the Resource Config
|
||||||
|
do not have ordering guarantees with respect to the elements in the Resource Config.
|
||||||
|
|
||||||
|
**Merge Table:** For each list element merge Resource Config and Resource element with the same value
|
||||||
|
|
||||||
|
| Element in Resource Config | Element in Resource | Element in Last Applied | Action |
|
||||||
|
|---------------------------|-------------------|-----------------------|-----------------------------------------|
|
||||||
|
| Yes | Yes | - | Do nothing |
|
||||||
|
| Yes | No | - | Add to list. |
|
||||||
|
| No | - | Yes | Remove from list. |
|
||||||
|
| No | - | No | Do nothing. |
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
This merge strategy uses the patch merge key to identify container elements in a list and merge them.
|
||||||
|
The `patch merge key` is defined in the [Kubernetes API](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podspec-v1-core)
|
||||||
|
on the field.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Last Applied
|
||||||
|
args: ["a", "b"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Resource Config (Local)
|
||||||
|
args: ["a", "c"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Resource (Live)
|
||||||
|
args: ["a", "b", "d"]
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
args: ["a", "c", "d"]
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
### Merging Lists of Objects
|
||||||
|
|
||||||
|
**Merge Strategy:** Lists of primitives may be merged or replaced. Lists are merged if the list has a `patch strategy` of *merge*
|
||||||
|
and a `patch merge key` on the list field. [Container list example](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podspec-v1-core).
|
||||||
|
|
||||||
|
**Merge Key:** The `patch merge key` is used to identify same elements in a list. Unlike map elements (keyed by key) and object fields
|
||||||
|
(keyed by field name), lists don't have a built-in merge identity for elements (index does not define identity).
|
||||||
|
Instead an object field is used as a synthetic *key/value* for merging elements. This fields is the
|
||||||
|
`patch merge key`. List elements with the same patch merge key will be merged when lists are merged.
|
||||||
|
|
||||||
|
**Ordering:** Uses the ordering specified in the Resource Config. Elements not specified in the Resource Config
|
||||||
|
do not have ordering guarantees.
|
||||||
|
|
||||||
|
**Merge Table:** For each list element merge Resource Config and Resource element where the elements have the same
|
||||||
|
value for the `patch merge key`
|
||||||
|
|
||||||
|
| Element in Resource Config | Element in Resource | Element in Last Applied | Action |
|
||||||
|
|---------------------------|-------------------|-----------------------|-----------------------------------------|
|
||||||
|
| Yes | - | - | Recursively merge the Resource Config and Resource values. |
|
||||||
|
| Yes | No | - | Add to list. |
|
||||||
|
| No | - | Yes | Remove from list. |
|
||||||
|
| No | - | No | Do nothing. |
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
This merge strategy uses the patch merge key to identify container elements in a list and merge them.
|
||||||
|
The `patch merge key` is defined in the [Kubernetes API](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#podspec-v1-core)
|
||||||
|
on the field.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Last Applied Resource Config
|
||||||
|
containers:
|
||||||
|
- name: nginx # key: nginx
|
||||||
|
image: nginx:1.10
|
||||||
|
- name: nginx-helper-a # key: nginx-helper-a; will be deleted in result
|
||||||
|
image: helper:1.3
|
||||||
|
- name: nginx-helper-b # key: nginx-helper-b; will be retained
|
||||||
|
image: helper:1.3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Resource Config (Local)
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.10
|
||||||
|
- name: nginx-helper-b
|
||||||
|
image: helper:1.3
|
||||||
|
- name: nginx-helper-c # key: nginx-helper-c; will be added in result
|
||||||
|
image: helper:1.3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Resource (Live)
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.10
|
||||||
|
- name: nginx-helper-a
|
||||||
|
image: helper:1.3
|
||||||
|
- name: nginx-helper-b
|
||||||
|
image: helper:1.3
|
||||||
|
args: ["run"] # Field will be retained
|
||||||
|
- name: nginx-helper-d # key: nginx-helper-d; will be retained
|
||||||
|
image: helper:1.3
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Applied Resource
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.10
|
||||||
|
# Element nginx-helper-a was Deleted
|
||||||
|
- name: nginx-helper-b
|
||||||
|
image: helper:1.3
|
||||||
|
# Field was Ignored
|
||||||
|
args: ["run"]
|
||||||
|
# Element was Added
|
||||||
|
- name: nginx-helper-c
|
||||||
|
image: helper:1.3
|
||||||
|
# Element was Ignored
|
||||||
|
- name: nginx-helper-d
|
||||||
|
image: helper:1.3
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Edit and Set" %}
|
||||||
|
While `kubectl edit` and `kubectl set` ignore the Last Applied Resource Config, Apply will
|
||||||
|
change any values in the Resource Config set by either `kubectl edit` or `kubectl set`.
|
||||||
|
To ignore values set by `kubectl edit` or `kubectl set`:
|
||||||
|
|
||||||
|
- Use `kubectl apply edit-last-applied` to remove the value from the Last Applied (if it is present)
|
||||||
|
- Remove the field from the Resource Config
|
||||||
|
|
||||||
|
This is the same technique for retaining values set by cluster components such as autoscalers.
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Apply manages Applications through files defining Kubernetes Resources (i.e. Resource Config)
|
||||||
|
- Kustomize is used to author Resource Config
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
# Declarative Application Management
|
||||||
|
|
||||||
|
This section covers how to declaratively manage Workloads and Applications.
|
||||||
|
|
||||||
|
Workloads in a cluster may be configured through files called *Resource Config*. These files are
|
||||||
|
typically checked into source control, and allow cluster state changes to be reviewed before they
|
||||||
|
are Applied, and audited.
|
||||||
|
|
||||||
|
There are 2 components to Application Management.
|
||||||
|
|
||||||
|
## Server Component
|
||||||
|
|
||||||
|
The server component consists of a human applying the authored Resource Config to the cluster
|
||||||
|
to create or update Resources. Once Applied, the Kubernetes cluster will set additional desired
|
||||||
|
state on the Resource - e.g. *defaulting unspecified fields, filling in IP addresses, autoscaling
|
||||||
|
replica count, etc.*
|
||||||
|
|
||||||
|
Note that the process of Application Management is a collaborative one between users and the
|
||||||
|
Kubernetes system itself - where each may contribute to defining the desired state.
|
||||||
|
|
||||||
|
**Example**: An Autoscaler Controller in the cluster may set the scale field on a Deployment managed by a user.
|
||||||
|
|
||||||
|
## Client Component
|
||||||
|
|
||||||
|
The client component consists of one or more humans collectively authoring the desired
|
||||||
|
state of an Application as Resource Config. This may be done as a collection of
|
||||||
|
raw Resource Config files, or by composing and overlaying Resource Config authored
|
||||||
|
by separate parties (using the `-k` flag with a `kustomization.yaml`).
|
||||||
|
|
||||||
|
Kustomize offers low-level tooling for simplifying the authoring of Resource Config. It provides:
|
||||||
|
|
||||||
|
- **Generating Resource Config** from other canonical sources - e.g. ConfigMaps, Secrets
|
||||||
|
- **Reusing and Composing one or more collections of Resource Config**
|
||||||
|
- **Customizing Resource Config**
|
||||||
|
- **Setting cross-cutting fields** - e.g. namespace, labels, annotations, name-prefixes, etc
|
||||||
|
|
||||||
|
**Example:** One user may define a Base for an application, while another user may customize
|
||||||
|
a specific instance of the Base.
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
# Setting Labels and Annotations
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Set Labels for all Resources declared within a Project
|
- Set Labels for all Resources declared within a Project with `commonLables`
|
||||||
- Set Annotations for all Resources declared within a Project
|
- Set Annotations for all Resources declared within a Project with `commonAnnotations`
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Setting Labels and Annotations
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
Users may want to define a common set of labels or annotations for all the Resource in a project.
|
Users may want to define a common set of labels or annotations for all the Resource in a project.
|
||||||
|
|
@ -13,24 +13,28 @@ Users may want to define a common set of labels or annotations for all the Resou
|
||||||
- Set metadata for all Resources within a project (e.g. environment=test)
|
- Set metadata for all Resources within a project (e.g. environment=test)
|
||||||
- Copy or Fork an existing Project and add or change labels and annotations
|
- Copy or Fork an existing Project and add or change labels and annotations
|
||||||
|
|
||||||
See [Bases and Variations](project_variants.md) for more details on Copying Projects.
|
See [Bases and Variations](../app_customization/bases_and_variants.md) for more details on Copying Projects.
|
||||||
|
|
||||||
## Setting a Labels for all Resources
|
## Setting Labels for all Resources
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Add the labels declared in `commonLabels` to all Resources in the project.
|
**Example:** Add the labels declared in `commonLabels` to all Resources in the project.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
commonLabels:
|
commonLabels:
|
||||||
app: foo
|
app: foo
|
||||||
environment: test
|
environment: test
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -91,22 +95,38 @@ labels. e.g. the selectors for Services in the project will be updated to inclu
|
||||||
*in addition* to the other labels.
|
*in addition* to the other labels.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% panel style="success", title="Effective Labeling Strategies" %}
|
||||||
|
A common practice is to label Resources with metadata about the environment, application,
|
||||||
|
tier and version. Labeling Workload Resources makes it simpler to query Pods - e.g. for the
|
||||||
|
purpose of getting their logs.
|
||||||
|
|
||||||
## Setting an annotation for all Resources
|
- `app=nginx`
|
||||||
|
- `tier=frontend`
|
||||||
|
- `env=prod`
|
||||||
|
- `version=1.16`
|
||||||
|
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
## Setting Annotations for all Resources
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Add the annotations declared in `commonAnnotations` to all Resources in the project.
|
**Example:** Add the annotations declared in `commonAnnotations` to all Resources in the project.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
commonAnnotations:
|
commonAnnotations:
|
||||||
oncallPager: 800-555-1212
|
oncallPager: 800-555-1212
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
# Setting Namespaces and Names
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Set the Namespace for all Resources within a Project
|
- Set the Namespace for all Resources within a Project with `namespace`
|
||||||
- Prefix the Names of all Resources within a Project
|
- Prefix the Names of all Resources within a Project with `namePrefix`
|
||||||
|
- Suffix the Names of all Resources within a Project with `nameSuffix`
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Setting Namespaces and Names
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
It may be useful to enforce consistency across the namespace and names of all Resources within
|
It may be useful to enforce consistency across the namespace and names of all Resources within
|
||||||
|
|
@ -14,7 +15,7 @@ a Project.
|
||||||
- Ensure all Resources share a common naming convention
|
- Ensure all Resources share a common naming convention
|
||||||
- Copy or Fork an existing Project and change the Namespace / Names
|
- Copy or Fork an existing Project and change the Namespace / Names
|
||||||
|
|
||||||
See [Bases and Variations](project_variants.md) for more details on Copying Projects.
|
See [Bases and Variations](../app_customization/bases_and_variants.md) for more details on Copying Projects.
|
||||||
|
|
||||||
## Setting the Namespace for all Resources
|
## Setting the Namespace for all Resources
|
||||||
|
|
||||||
|
|
@ -23,17 +24,21 @@ This sets the namespace for both generated Resources (e.g. ConfigMaps and Secret
|
||||||
Resources.
|
Resources.
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Set the `namespace` specified in the `apply.yaml` on the namespaced Resources.
|
**Example:** Set the `namespace` specified in the `kustomization.yaml` on the namespaced Resources.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
namespace: my-namespace
|
namespace: my-namespace
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -82,20 +87,27 @@ spec:
|
||||||
|
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
## Setting a Name prefix for all Resources
|
## Setting a Name prefix or suffix for all Resources
|
||||||
|
|
||||||
|
A name prefix or suffix can be set for all resources using `namePrefix` or
|
||||||
|
`nameSuffix`.
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Prefix the names of all Resources.
|
**Example:** Prefix the names of all Resources.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
namePrefix: foo-
|
namePrefix: foo-
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -146,10 +158,11 @@ spec:
|
||||||
Resources such as Deployments and StatefulSets may reference other Resources such as
|
Resources such as Deployments and StatefulSets may reference other Resources such as
|
||||||
ConfigMaps and Secrets in the Pod Spec.
|
ConfigMaps and Secrets in the Pod Spec.
|
||||||
|
|
||||||
This sets a name prefix for both generated Resources (e.g. ConfigMaps and Secrets) and non-generated
|
This sets a name prefix or suffix for both generated Resources (e.g. ConfigMaps
|
||||||
Resources.
|
and Secrets) and non-generated Resources.
|
||||||
|
|
||||||
The namePrefix that is applied is propagated to references within the Project.
|
The namePrefix or nameSuffix that is applied is propagated to references within
|
||||||
|
the Project.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
|
|
@ -158,10 +171,12 @@ The namePrefix that is applied is propagated to references within the Project.
|
||||||
This will update the ConfigMap reference in the Deployment to have the `foo` prefix.
|
This will update the ConfigMap reference in the Deployment to have the `foo` prefix.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
namePrefix: foo-
|
namePrefix: foo-
|
||||||
configMapGenerator:
|
configMapGenerator:
|
||||||
- name: props
|
- name: props
|
||||||
|
|
@ -169,7 +184,9 @@ configMapGenerator:
|
||||||
- BAR=baz
|
- BAR=baz
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -1,26 +1,29 @@
|
||||||
# ConfigMaps and Secrets
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- Generate Secrets and Configmaps from files and literals
|
- Generate Secrets from files and literals with `secretGenerator`
|
||||||
|
- Generate ConfigMaps from files and literals with `configMapGenerator`
|
||||||
- Rolling out changes to Secrets and ConfigMaps
|
- Rolling out changes to Secrets and ConfigMaps
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Secrets and ConfigMaps
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
The source of truth for ConfigMap and Secret Resources typically resides somewhere else, such as a `.properties`
|
The source of truth for Secret and ConfigMap Resources typically resides
|
||||||
or `.pem` file. Apply offers native support for generating both ConfigMaps and Secrets from other sources
|
somewhere else, such as a `.properties` file. Apply offers native support
|
||||||
such as files, literals and command outputs.
|
for generating both Secrets and ConfigMaps from other sources such as files and
|
||||||
|
literals.
|
||||||
|
|
||||||
Additionally, ConfigMaps and Secrets require roll outs to be performed differently than for most
|
Additionally, Secrets and ConfigMaps require roll outs to be performed
|
||||||
other Resources in order for the changes to be rolled out to Pods consuming them.
|
differently than for most other Resources in order for the changes to be
|
||||||
|
rolled out to Pods consuming them.
|
||||||
|
|
||||||
## Generators
|
## Generators
|
||||||
|
|
||||||
ConfigMap and Secret Resources can be generated by adding `configMapGenerator` and `secretGenerator`
|
Secret and ConfigMap Resources can be generated by adding `secretGenerator`
|
||||||
entries to the `apply.yaml` file. `configMapGenerator` and `secretGenerator` each take a list of items.
|
or `configMapGenerator` entries to the `kustomization.yaml` file.
|
||||||
Each item generates a different Resources.
|
|
||||||
|
|
||||||
**The generated Resources name's will have suffixes as hashes of their data. See [Rollouts](#rollouts) for more on this.**
|
**The generated Resources name's will have suffixes that change when their data
|
||||||
|
changes. See [Rollouts](#rollouts) for more on this.**
|
||||||
|
|
||||||
### ConfigMaps From Files
|
### ConfigMaps From Files
|
||||||
|
|
||||||
|
|
@ -34,15 +37,19 @@ The ConfigMaps will have data values populated from the file contents. The cont
|
||||||
appear as a single data item in the ConfigMap keyed by the filename.
|
appear as a single data item in the ConfigMap keyed by the filename.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml file
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
configMapGenerator:
|
configMapGenerator:
|
||||||
- name: myApplicationProperties
|
- name: myApplicationProperties
|
||||||
files:
|
files:
|
||||||
- application.properties
|
- application.properties
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# application.properties
|
# application.properties
|
||||||
FOO=Bar
|
FOO=Bar
|
||||||
```
|
```
|
||||||
|
|
@ -77,10 +84,12 @@ list of `literals`.
|
||||||
**Example:** Create a ConfigMap with 2 data items generated from literals.
|
**Example:** Create a ConfigMap with 2 data items generated from literals.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml file
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
configMapGenerator:
|
configMapGenerator:
|
||||||
- name: myJavaServerEnvVars
|
- name: myJavaServerEnvVars
|
||||||
literals:
|
literals:
|
||||||
|
|
@ -103,30 +112,37 @@ data:
|
||||||
```
|
```
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
### Secrets from Commands
|
{% panel style="success", title="Overriding Base ConfigMap Values" %}
|
||||||
|
ConfigMaps Values from Bases may be overridden by adding another generator for the ConfigMap
|
||||||
|
in the Variant and specifying the `behavior` field. `behavior` may be
|
||||||
|
one of `create` (default value), `replace` (replace the base ConfigMap),
|
||||||
|
or `merge` (add or update the values the ConfigMap). See [Bases and Variantions](../app_customization/bases_and_variants.md)
|
||||||
|
for more on using Bases. e.g. `behavior: "merge"`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
Secret Resources may be generated from commands that output the data items. Commands may simply output
|
### Secrets from Files
|
||||||
the contents of a file as data, but may do more complicate actions such as fetching data from a remote
|
|
||||||
location, or decrypting files.
|
Secret Resources may be generated from files much like ConfigMaps can.
|
||||||
|
|
||||||
{% panel style="info", title="Secret Syntax" %}
|
{% panel style="info", title="Secret Syntax" %}
|
||||||
- Secret type is set using the `type` field.
|
Secret type is set using the `type` field.
|
||||||
- Timeout for the command output maybe set using the `timeoutSeconds` field.
|
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Generate a `kubernetes.io/tls` Secret from local files
|
**Example:** Generate a `kubernetes.io/tls` Secret from local files
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml file
|
**Input:** The kustomization.yaml file
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
secretGenerator:
|
secretGenerator:
|
||||||
- name: app-tls
|
- name: app-tls
|
||||||
commands:
|
files:
|
||||||
tls.crt: "cat secret/tls.cert"
|
- "secret/tls.cert"
|
||||||
tls.key: "cat secret/tls.key"
|
- "secret/tls.key"
|
||||||
type: "kubernetes.io/tls"
|
type: "kubernetes.io/tls"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -146,99 +162,54 @@ data:
|
||||||
```
|
```
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
{% method %}
|
### Generator Options
|
||||||
|
|
||||||
**Example:** Generate an `Opaque` Secret from downloading remote files
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
secretGenerator:
|
|
||||||
- name: downloaded_secret
|
|
||||||
timeoutSeconds: 30
|
|
||||||
commands:
|
|
||||||
username: "curl -s https://path/to/username"
|
|
||||||
password: "curl -s https://path/to/password"
|
|
||||||
type: "kubernetes.io/tls"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Secret
|
|
||||||
metadata:
|
|
||||||
# The name has had a suffix applied
|
|
||||||
name: downloaded_secret-gm74hh58b5
|
|
||||||
type: Opaque
|
|
||||||
# The data has been populated from each command's output
|
|
||||||
data:
|
|
||||||
password: YmFyCg==
|
|
||||||
username: Zm9vCg==
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
### Secrets from Env Commands
|
|
||||||
|
|
||||||
Secret Resources may also be generated from commands that output multiple data items as key value pairs.
|
|
||||||
This is useful for encoding the elements of Docker .env files or .ini files as separate data items within
|
|
||||||
Secrets.
|
|
||||||
|
|
||||||
{% panel style="info", title="Commands vs EnvCommands" %}
|
|
||||||
The difference between `commands` and `envCommand` is that **with a command, each item creates a different data
|
|
||||||
item** whereas **with an envCommand each output line creates a different data item.**
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
**Example:** Generate an `Opaque` Secret from the environment
|
It is also possible to specify cross-cutting options for generated objects
|
||||||
|
using `generatorOptions`.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
secretGenerator:
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
- name: env_file_secret
|
kind: Kustomization
|
||||||
envCommand: printf "DB_USERNAME=admin\nDB_PASSWORD=somepw"
|
generatorOptions:
|
||||||
type: Opaque
|
# labels to add to all generated resources
|
||||||
|
labels:
|
||||||
|
kustomize.generated.resources: somevalue
|
||||||
|
# annotations to add to all generated resources
|
||||||
|
annotations:
|
||||||
|
kustomize.generated.resource: somevalue
|
||||||
|
# disableNameSuffixHash is true disables the default behavior of adding a
|
||||||
|
# suffix to the names of generated resources that is a hash of
|
||||||
|
# the resource contents.
|
||||||
|
disableNameSuffixHash: true
|
||||||
```
|
```
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Secret
|
|
||||||
metadata:
|
|
||||||
# The name has had a suffix applied
|
|
||||||
name: env_file_secret-hc4d62fgb8
|
|
||||||
type: Opaque
|
|
||||||
# The data has been populated from the command output lines
|
|
||||||
data:
|
|
||||||
DB_PASSWORD: c29tZXB3
|
|
||||||
DB_USERNAME: YWRtaW4=
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
### Propagating the Name Suffix
|
### Propagating the Name Suffix
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
Workloads that reference the ConfigMap or Secret will need to know the name of the generated Resource
|
Workloads that reference the ConfigMap or Secret will need to know the name of the generated Resource
|
||||||
including the suffix, however Apply solves this automatically for users. Apply will identify
|
including the suffix, however Apply takes care of this automatically for users. Apply will identify
|
||||||
references to generated ConfigMaps and Secrets, and update their them.
|
references to generated ConfigMaps and Secrets, and update them.
|
||||||
|
|
||||||
The generated ConfigMap name will be `myJavaServerEnvVars` with a suffix unique to its contents.
|
The generated ConfigMap name will be `myJavaServerEnvVars` with a suffix unique to its contents.
|
||||||
Changes to the contents will change the name suffix, resulting in the creation of a new ConfigMap.
|
Changes to the contents will change the name suffix, resulting in the creation of a new ConfigMap,
|
||||||
|
and transform Workloads to point to this one.
|
||||||
|
|
||||||
The PodTemplate volume references the ConfigMap by the name specified in the generator (excluding the suffix).
|
The PodTemplate volume references the ConfigMap by the name specified in the generator (excluding the suffix).
|
||||||
Apply will update the name to include the suffix applied to the ConfigMap name.
|
Apply will update the name to include the suffix applied to the ConfigMap name.
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
**Input:** The apply.yaml and deployment.yaml files
|
**Input:** The kustomization.yaml and deployment.yaml files
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# apply.yaml
|
# kustomization.yaml
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
configMapGenerator:
|
configMapGenerator:
|
||||||
- name: myJavaServerEnvVars
|
- name: myJavaServerEnvVars
|
||||||
literals:
|
literals:
|
||||||
|
|
@ -246,7 +217,9 @@ configMapGenerator:
|
||||||
- JAVA_TOOL_OPTIONS=-agentlib:hprof
|
- JAVA_TOOL_OPTIONS=-agentlib:hprof
|
||||||
resources:
|
resources:
|
||||||
- deployment.yaml
|
- deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
# deployment.yaml
|
# deployment.yaml
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
|
|
@ -324,35 +297,23 @@ spec:
|
||||||
|
|
||||||
## Rollouts
|
## Rollouts
|
||||||
|
|
||||||
ConfigMap and Secret values are consumed by Pods as: environment variables, commandline arguments and files.
|
ConfigMap values are consumed by Pods as: environment variables, commandline arguments and files.
|
||||||
|
|
||||||
This is important because Updating a ConfigMap or Secret will:
|
This is important because Updating a ConfigMap will:
|
||||||
|
|
||||||
- immediately update the files mounted by *all* Pods consuming them
|
- immediately update the files mounted by *all* Pods consuming them
|
||||||
- not update the environment variables or commandline arguments until the Pod is restarted
|
- not update the environment variables or commandline arguments until the Pod is restarted
|
||||||
|
|
||||||
Typically users want to perform a rolling update of the ConfigMap or Secret changes to Pods as soon as
|
Typically users want to perform a rolling update of the ConfigMap changes to Pods as soon as
|
||||||
the ConfigMap or Secret changes are pushed.
|
the ConfigMap changes are pushed.
|
||||||
|
|
||||||
Apply facilitates rolling updates for ConfigMaps and Secrets by creating a new ConfigMap or Secret
|
Apply facilitates rolling updates for ConfigMaps by creating a new ConfigMap
|
||||||
for each change to the data. Workloads (e.g. Deployments, StatefulSets, etc) are updated to point to a new
|
for each change to the data. Workloads (e.g. Deployments, StatefulSets, etc) are updated to point to a new
|
||||||
ConfigMap or Secret instead of the old one. This allows the change to be gradually rolled the same way
|
ConfigMap instead of the old one. This allows the change to be gradually rolled the same way
|
||||||
other Pod Template changes are rolled out.
|
other Pod Template changes are rolled out.
|
||||||
|
|
||||||
Each generated Resources name has a suffix appended by hashing the contents. This approach ensures a new
|
Each generated Resources name has a suffix appended by hashing the contents. This approach ensures a new
|
||||||
ConfigMap or Secret is generated each time the contents is modified.
|
ConfigMap is generated each time the contents is modified.
|
||||||
|
|
||||||
**Note:** Because the Resource names will contain a suffix, when looking for them with `kubectl get`,
|
**Note:** Because the Resource names will contain a suffix, when looking for them with `kubectl get`,
|
||||||
their names will not match exactly what is specified in the apply.yaml file.
|
their names will not match exactly what is specified in the kustomization.yaml file.
|
||||||
|
|
||||||
### Deletion and Cleanup
|
|
||||||
|
|
||||||
Apply will not automatically delete generated ConfigMaps or Secrets as long as they are in use by Resources within
|
|
||||||
the project. This may mean that they are not deleted until Apply is run again after the rollouts are complete.
|
|
||||||
e.g. both the old ConfigMap and new ConfigMap will continue to exist until only the new ConfigMap is used and Apply is
|
|
||||||
run again.
|
|
||||||
|
|
||||||
{% panel style="info", title="Blocking Apply" %}
|
|
||||||
If Apply is run with `--wait` it will block until the Rollouts have completed. In this situtation, the old generated
|
|
||||||
ConfigMaps and Secrets should not longer be in use, and will be deleted by Apply before exiting.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
# Kubectl
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
|
||||||
- Kubectl is the Kubernetes CLI.
|
|
||||||
- Kubectl has different command groups for different types of user workflows.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
Kubectl is the Kubernetes CLI and used to manage Resources.
|
|
||||||
|
|
||||||
## Command Families
|
|
||||||
|
|
||||||
While Kubectl has many different commands, they fall into only a few categories.
|
|
||||||
|
|
||||||
- Declaratively Creating, Updating, Deleting Resources (Apply)
|
|
||||||
- Debugging Workloads and Reading Cluster State
|
|
||||||
- Managing the cluster itself
|
|
||||||
- Porcelain commands for working with Resources
|
|
||||||
|
|
||||||
## Declaratively Creating, Updating, Deleting Resources (Apply)
|
|
||||||
|
|
||||||
Creating, Updating and Deleting Resources is done through declarative files called Resource Config
|
|
||||||
and the Kubectl *Apply* command. This command reads a local (or remote) file structure and modifies
|
|
||||||
cluster state to reflect the declared intent.
|
|
||||||
|
|
||||||
{% panel style="info", title="Apply" %}
|
|
||||||
Apply is the preferred mechanism for managing Resources in a Kubernetes cluster.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
## Debugging Workloads and Reading Cluster State
|
|
||||||
|
|
||||||
Users will need to debug and view Workloads running in a cluster. Kubectl supports debugging
|
|
||||||
by providing commands for:
|
|
||||||
|
|
||||||
- printing state and information about Resources
|
|
||||||
- printing Container logs
|
|
||||||
- printing cluster events
|
|
||||||
- exec or attaching to a Container
|
|
||||||
- copying files from Containers in the cluster to a user's filesystem
|
|
||||||
|
|
||||||
## Cluster Management
|
|
||||||
|
|
||||||
On occasion, users may need to perform operations to the Nodes of cluster. Kubectl supports
|
|
||||||
commands to drain Workloads from a Node so that it can be decommission or debugged.
|
|
||||||
|
|
||||||
## Porcelain
|
|
||||||
|
|
||||||
Users may find using Resource Config overly verbose for *Development* and prefer to work with
|
|
||||||
the cluster *imperatively* with a shell-like workflow. Kubectl offers porcelain commands for
|
|
||||||
generating and modifying Resources.
|
|
||||||
|
|
||||||
- generating + creating Resources such as Deployments, StatefulSets, Services, ConfigMaps, etc
|
|
||||||
- setting fields on Resources
|
|
||||||
- editing (live) Resources in a text editor
|
|
||||||
|
|
||||||
{% panel style="info", title="Porcelain For Dev Only" %}
|
|
||||||
Porcelain commands are time saving for experimenting with workloads in a dev cluster, but
|
|
||||||
shouldn't be used for production.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
# Rolling out Across Clusters
|
|
||||||
|
|
||||||
## Targeting a Cluster
|
|
||||||
|
|
||||||
## Sequentially Rolling Out
|
|
||||||
|
|
||||||
## Concurrently Rolling Out
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
# Auditing and Reviewing Changes
|
|
||||||
|
|
||||||
## Automatic Deployment vs Manual Deployment
|
|
||||||
|
|
||||||
## Git PR
|
|
||||||
|
|
||||||
- Description Template
|
|
||||||
- Labeling conventions
|
|
||||||
|
|
||||||
## Reviewing Changes Before they are pushed
|
|
||||||
|
|
||||||
### Resource Config Diffs
|
|
||||||
|
|
||||||
Reviewing the changes to Resource Config
|
|
||||||
|
|
||||||
### Resource Diffs
|
|
||||||
|
|
||||||
Reviewing the changes to the live Resources
|
|
||||||
|
|
||||||
## Auditing Past Changes
|
|
||||||
|
|
||||||
Auditing changes that have been merged
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
# Builds
|
|
||||||
|
|
||||||
## Building Containers from Source
|
|
||||||
|
|
||||||
- Multi-Stage Builds
|
|
||||||
|
|
||||||
## Triggering Builds
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
# Rolling out Across Environments
|
|
||||||
|
|
||||||
## Automatic Sequential Rollouts
|
|
||||||
|
|
||||||
**Immediate:** Rollout one environment immediately after the previous
|
|
||||||
|
|
||||||
**Delayed:** Pause between rollouts
|
|
||||||
|
|
||||||
## Manual Sequential Rollouts
|
|
||||||
|
|
||||||
Require humans to push
|
|
||||||
|
|
||||||
## Incorporating Application Metrics
|
|
||||||
|
|
||||||
Use Application metrics to identify issues and pause or rollback.
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
# Linting Resource Config
|
|
||||||
|
|
||||||
## Configuring the Linter
|
|
||||||
|
|
||||||
## Error Types
|
|
||||||
|
|
||||||
## Ignoring Linter Errors
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
# Rolling Back Changes
|
|
||||||
|
|
||||||
## Types of Errors
|
|
||||||
|
|
||||||
## Notification of an Error
|
|
||||||
|
|
||||||
## How to Rollback
|
|
||||||
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
# Rollouts
|
|
||||||
|
|
||||||
## Triggering a Rollout
|
|
||||||
|
|
||||||
## Sequentially Rolling out Components
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
# Project Structure
|
|
||||||
|
|
||||||
## Definitions
|
|
||||||
|
|
||||||
- **Project:** TODO: Define this
|
|
||||||
- **Application:** TODO: Define this
|
|
||||||
- **Bespoke:** TODO: Define this
|
|
||||||
- **Ready-Made:** TODO: Define this
|
|
||||||
|
|
||||||
## Application with Bespoke Components
|
|
||||||
|
|
||||||
**Example:** An application whose images and Resource Config are owned by user.
|
|
||||||
|
|
||||||
### Organizing Components
|
|
||||||
|
|
||||||
### Use of Namespaces
|
|
||||||
|
|
||||||
## Application with Ready-Made Components
|
|
||||||
|
|
||||||
**Example:** An application built from components whose images and Resource Config are owned by a different group.
|
|
||||||
|
|
||||||
### Referencing Ready-Made Bases
|
|
||||||
|
|
||||||
### Organizing Components
|
|
||||||
|
|
||||||
## Multi Application
|
|
||||||
|
|
||||||
**Example:** Multiple applications owned and operated by the same group.
|
|
||||||
|
|
||||||
### Organizing Applications
|
|
||||||
|
|
||||||
### Use of Namespaces
|
|
||||||
|
|
||||||
## Multi Environment
|
|
||||||
|
|
||||||
**Example:** Multiple applications owned and operated by the same group rolledout across multiple environments -
|
|
||||||
e.g. dev, test, staging, canary, production.
|
|
||||||
|
|
||||||
### Organizing Environments
|
|
||||||
|
|
||||||
### Use of Namespaces
|
|
||||||
|
|
||||||
### Organizing Bespoke Bases + Variants
|
|
||||||
|
|
||||||
## Multi Cluster
|
|
||||||
|
|
||||||
**Example:** An application that is rolledout to multiple Kubernetes clusters sequentially or in parallel.
|
|
||||||
|
|
||||||
### Organizing Bespoke Bases + Variants
|
|
||||||
|
|
||||||
### Use of KubeConfigs
|
|
||||||
|
|
||||||
## Multi Project
|
|
||||||
|
|
||||||
**Example:** Multiple projects developed by separate teams whose Resource Config lives in the same repository or
|
|
||||||
in multiple repositories.
|
|
||||||
|
|
||||||
### Organizing Groups
|
|
||||||
|
|
||||||
### Publishing Shared Bases
|
|
||||||
|
|
||||||
## Resource Config and Source Code Repositories
|
|
||||||
|
|
||||||
### Separate Repositories
|
|
||||||
|
|
||||||
### Shared Repository
|
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Print the Logs of a Container in a cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Summarizing Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Debugging Workloads by printing out the Logs of containers in a cluster.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Print Logs for a Container in a Pod
|
||||||
|
|
||||||
|
Print the logs for a Pod running a single Container
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl logs echo-c6bc8ccff-nnj52
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hello
|
||||||
|
hello
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
|
{% panel style="success", title="Crash Looping Containers" %}
|
||||||
|
If a container is crash looping and you want to print its logs after it
|
||||||
|
exits, use the `-p` flag to look at the **logs from containers that have
|
||||||
|
exited**. e.g. `kubectl logs -p -c ruby web-1`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Print Logs for all Pods for a Workload
|
||||||
|
|
||||||
|
Print the logs for all Pods for a Workload
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs from all containers matching label
|
||||||
|
$ kubectl logs -l app=nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="success", title="Workloads Logs" %}
|
||||||
|
Print all logs from **all containers for a Workload** by passing the
|
||||||
|
Workload label selector to the `-l` flag. e.g. if your Workload
|
||||||
|
label selector is `app=nginx` usie `-l "app=nginx"` to print logs
|
||||||
|
for all the Pods from that Workload.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Follow Logs for a Container
|
||||||
|
|
||||||
|
Stream logs from a container.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Follow logs from container
|
||||||
|
$ kubectl logs nginx-78f5d695bd-czm8z -f
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Printing Logs for a Container that has exited
|
||||||
|
|
||||||
|
Print the logs for the previously running container. This is useful for printing containers that have
|
||||||
|
crashed or are crash looping.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs from exited container
|
||||||
|
$ kubectl logs nginx-78f5d695bd-czm8z -p
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Selecting a Container in a Pod
|
||||||
|
|
||||||
|
Print the logs from a specific container within a Pod. This is necessary for Pods running multiple
|
||||||
|
containers.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs from the nginx container in the nginx-78f5d695bd-czm8z Pod
|
||||||
|
$ kubectl logs nginx-78f5d695bd-czm8z -c nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Printing Logs After a Time
|
||||||
|
|
||||||
|
Print the logs that occurred after an absolute time.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs since a date
|
||||||
|
$ kubectl logs nginx-78f5d695bd-czm8z --since-time=2018-11-01T15:00:00Z
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Printing Logs Since a Time
|
||||||
|
|
||||||
|
Print the logs that are newer than a duration.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
- 0s: 0 seconds
|
||||||
|
- 1m: 1 minute
|
||||||
|
- 2h: 2 hours
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs for the past hour
|
||||||
|
$ kubectl logs nginx-78f5d695bd-czm8z --since=1h
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Include Timestamps
|
||||||
|
|
||||||
|
Include timestamps in the log lines
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Print logs with timestamps
|
||||||
|
$ kubectl logs -l app=echo --timestamps
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
2018-11-16T05:26:31.38898405Z hello
|
||||||
|
2018-11-16T05:27:13.363932497Z hello
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Copy files to and from Containers in a cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Copying Container Files
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
- Copying files from Containers in a cluster to a local filesystem
|
||||||
|
- Copying files from a local filesystem to Containers in a cluster
|
||||||
|
|
||||||
|
{% panel style="warning", title="Install Tar" %}
|
||||||
|
Copy requires that *tar* be installed on the local filesystem and is on the user's
|
||||||
|
PATH.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Local to Remote
|
||||||
|
|
||||||
|
Copy a local file to a remote Pod in a cluster.
|
||||||
|
|
||||||
|
- Local file format is `<path>`
|
||||||
|
- Remote file format is `<pod-name>:<path>`
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Remote to Local
|
||||||
|
|
||||||
|
Copy a remote file from a Pod to a local file.
|
||||||
|
|
||||||
|
- Local file format is `<path>`
|
||||||
|
- Remote file format is `<pod-name>:<path>`
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo <some-pod>:/tmp/bar
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Specify the Conainer
|
||||||
|
|
||||||
|
Specify the Container within a Pod running multiple containers.
|
||||||
|
|
||||||
|
- `-c <container-name>`
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Namespaces
|
||||||
|
|
||||||
|
Set the Pod namespace by prefixing the Pod name with `<namespace>/` .
|
||||||
|
|
||||||
|
- `<pod-namespace>/<pod-name>:<path>`
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Execute a Command in a Container
|
||||||
|
- Get a Shell in a Container
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Executing Commands
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Debugging Workloads by running commands within the Container. Commands may be a Shell with
|
||||||
|
a tty.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Exec Command
|
||||||
|
|
||||||
|
Run a command in a Container in the cluster by specifying the **Pod name**.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl exec nginx-78f5d695bd-czm8z ls
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin
|
||||||
|
boot
|
||||||
|
dev
|
||||||
|
etc
|
||||||
|
home
|
||||||
|
lib
|
||||||
|
lib64
|
||||||
|
media
|
||||||
|
mnt
|
||||||
|
opt
|
||||||
|
proc
|
||||||
|
root
|
||||||
|
run
|
||||||
|
sbin
|
||||||
|
srv
|
||||||
|
sys
|
||||||
|
tmp
|
||||||
|
usr
|
||||||
|
var
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Exec Shell
|
||||||
|
|
||||||
|
To get a Shell in a Container, use the `-t -i` options to get a tty and attach STDIN.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl exec -t -i nginx-78f5d695bd-czm8z bash
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
root@nginx-78f5d695bd-czm8z:/# ls
|
||||||
|
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Specifying the Container" %}
|
||||||
|
For Pods running multiple Containers, the Container should be specified with `-c <container-name>`
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Port Forward local connections to Pods running in a cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Port Forward
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Connect to ports of Pods running a cluster by port forwarding local ports.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Forward Multiple Ports
|
||||||
|
|
||||||
|
Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl port-forward pod/mypod 5000 6000
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Pod in a Workload
|
||||||
|
|
||||||
|
Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the
|
||||||
|
deployment
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl port-forward deployment/mydeployment 5000 6000
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Different Local and Remote Ports
|
||||||
|
|
||||||
|
Listen on port 8888 locally, forwarding to 5000 in the pod
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl port-forward pod/mypod 8888:5000
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Random Local Port
|
||||||
|
|
||||||
|
Listen on a random port locally, forwarding to 5000 in the pod
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl port-forward pod/mypod :5000
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Specify the Conainer
|
||||||
|
|
||||||
|
Specify the Container within a Pod running multiple containers.
|
||||||
|
|
||||||
|
- `-c <container-name>`
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Namespaces
|
||||||
|
|
||||||
|
Set the Pod namespace by prefixing the Pod name with `<namespace>/` .
|
||||||
|
|
||||||
|
- `<pod-namespace>/<pod-name>:<path>`
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Proxy local connections to Services running in the cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Connecting to Services
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Not all Services running a Kubernetes cluster are exposed externally. However Services
|
||||||
|
only exposed internally to a cluster with a *clusterIp* are accessible through an
|
||||||
|
apiserver proxy.
|
||||||
|
|
||||||
|
Users may use Proxy to **connect to Kubernetes Services in a cluster that are not
|
||||||
|
externally exposed**.
|
||||||
|
|
||||||
|
|
||||||
|
**Note:** Services running a type LoadBalancer or type NodePort may be exposed externally and
|
||||||
|
accessed without the need for a Proxy.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Connecting to an internal Service
|
||||||
|
|
||||||
|
Connect to a internal Service using the Proxy command, and the Service Proxy url.
|
||||||
|
|
||||||
|
To visit the nginx service go to the Proxy URL at
|
||||||
|
`http://127.0.0.1:8001/api/v1/namespaces/default/services/nginx/proxy/`
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl proxy
|
||||||
|
|
||||||
|
Starting to serve on 127.0.0.1:8001
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ curl http://127.0.0.1:8001/api/v1/namespaces/default/services/nginx/proxy/
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Literal Syntax" %}
|
||||||
|
To connect to a Service through a proxy the user must build the Proxy URL. The Proxy URL format is:
|
||||||
|
|
||||||
|
`http://<apiserver-address>/api/v1/namespaces/<service-namespace>/services/[https:]<service-name>[:<port-name>]/proxy`
|
||||||
|
|
||||||
|
- The apiserver-address should be the URL printed by the Proxy command
|
||||||
|
- The Port is optional if you haven’t specified a name for your port
|
||||||
|
- The Protocol is optional if you are using `http`
|
||||||
|
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Builtin Cluster Services
|
||||||
|
|
||||||
|
A common usecase is to connect to Services running as part of the cluster itself. A user can print out these
|
||||||
|
Services and their Proxy Urls with `kubectl cluster-info`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cluster-info
|
||||||
|
|
||||||
|
Kubernetes master is running at https://104.197.5.247
|
||||||
|
GLBCDefaultBackend is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
|
||||||
|
Heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/heapster/proxy
|
||||||
|
KubeDNS is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
|
||||||
|
Metrics-server is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
|
||||||
|
```
|
||||||
|
|
||||||
|
{% panel style="info", title="More Info" %}
|
||||||
|
For more information on connecting to a cluster, see the
|
||||||
|
[Accessing Clusters](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/)
|
||||||
|
k8s.io doc.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
# Apply
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
|
||||||
- Apply Creates, Updates and Deletes Resources in a cluster through declarative files.
|
|
||||||
- Apply merges user owned state with state owned by the cluster when Updating Resources.
|
|
||||||
- Apply ensures the correct ordering when creating Resources.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
Apply will update a Kubernetes cluster to match state defined locally in files.
|
|
||||||
|
|
||||||
- Fully declarative - don't need to specify create, update or delete - just manage files
|
|
||||||
- Merges user owned state (e.g. Service `selector`) with state owned by the cluster (e.g. Service `clusterIp`)
|
|
||||||
|
|
||||||
## Definitions
|
|
||||||
|
|
||||||
- **Resources**: *Objects* in a cluster - e.g. Deployments, Services, etc.
|
|
||||||
- **Resource Config**: *Files* declaring the desired state for Resources - e.g. deployment.yaml.
|
|
||||||
Resources are created and updated using Apply with these files.
|
|
||||||
|
|
||||||
*kubectl apply* Creates, Updates and Deletes Resources using Resource Config with a *apply.yaml*.
|
|
||||||
|
|
||||||
## Applying a Project
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
apply.yaml defines and transforms a collection of Resources Configs. `kubectl apply`
|
|
||||||
takes a list of directories containing `apply.yaml` files.
|
|
||||||
|
|
||||||
This `apply.yaml` file contains a list of Resource Configs that will be applied.
|
|
||||||
The file paths are relative to the `apply.yaml` file.
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
resources:
|
|
||||||
- some-service.yaml
|
|
||||||
- ../some-dir/some-deployment.yaml
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Users run Apply on directories containing `apply.yaml` files.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```bash
|
|
||||||
$ kubectl apply -f /path/to/project1/ -f /path/to/project2/
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
{% panel style="info", title="Multi-Resource Configs" %}
|
|
||||||
A single Resource Config file may declare multiple Resources separated by `\n---\n`.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
## CRUD Operations
|
|
||||||
|
|
||||||
### Creating Resources
|
|
||||||
|
|
||||||
Any Resources that do not exist and are declared in Resource Config when Apply is run will be Created.
|
|
||||||
|
|
||||||
### Updating Resources
|
|
||||||
|
|
||||||
Any Resources that already exist and are declaraed in Resource Config when Apply is run may be updated.
|
|
||||||
|
|
||||||
**Added Fields**
|
|
||||||
|
|
||||||
Any fields that have been added to the Resource Config will be set on the Resource.
|
|
||||||
|
|
||||||
**Updated Fields**
|
|
||||||
|
|
||||||
Any fields that contain different values for the fields specified locally in the Resource Config from what is
|
|
||||||
in the Resource will be updated by Apply.
|
|
||||||
|
|
||||||
|
|
||||||
Apply will overwrite any fields that are defined in the Resource Config, and whose values do not match. For
|
|
||||||
example, if a Resource was modified by another source (e.g. an Autoscaler), it will be changed back to have the
|
|
||||||
values that are specified in the Resource Config.
|
|
||||||
|
|
||||||
**Deleted Fields**
|
|
||||||
|
|
||||||
If a field is deleted from the Resource Config:
|
|
||||||
|
|
||||||
- Fields that were *most recently* set by Apply, will be deleted from the Resource, and return to their default values.
|
|
||||||
- Fields that were set by Apply, but have been set by another source more recently (e.g. an Autoscaler), will
|
|
||||||
be left unmodified.
|
|
||||||
|
|
||||||
**Unmanaged Fields**
|
|
||||||
|
|
||||||
Fields that have not been specified in the Resource Config but are set on the Resource will be left unmodified.
|
|
||||||
|
|
||||||
|
|
||||||
### Deleting Resources
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Any Resources that exist and are not declared in the Resource Config when Apply is run will be deleted
|
|
||||||
if and only if all of the following are true:
|
|
||||||
|
|
||||||
- A `pruneSelector` field is set in the `apply.yaml`
|
|
||||||
- The Resource matches the `pruneSelector` label selector
|
|
||||||
- If the Resource is Namespaced and the `namespace` field is set in the `apply.yaml` and the namespace matches
|
|
||||||
- The Resource is not a ConfigMap or Secret that is currently in use
|
|
||||||
|
|
||||||
ConfigMaps and Secrets are not deleted immediately because they may be in use by Workloads even if they are not
|
|
||||||
directly referenced in the newest Resource Config.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
namespace: foo
|
|
||||||
pruneSelector:
|
|
||||||
app: my-app
|
|
||||||
labels:
|
|
||||||
app: my-app
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
## Resource Creation Ordering
|
|
||||||
|
|
||||||
Certain Resource Types may be dependent on other Resource Types being created first. e.g. Namespaced
|
|
||||||
Resources on the Namespaces, RoleBindings on Roles, CustomResources on the CRDs, etc.
|
|
||||||
|
|
||||||
Apply sorts the Resources by Resource type to ensure Resources with these dependencies
|
|
||||||
are created in the correct order.
|
|
||||||
|
|
||||||
## Blocking on Completion
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
|
|
||||||
By default, Apply exists immediately after all changes have been sent to the apiserver, but before
|
|
||||||
the changes have been fully rolled out by the Controllers.
|
|
||||||
|
|
||||||
Using `--wait` will cause Apply to wait until the Controllers have rolled out all changes before
|
|
||||||
exiting. When used with `--wait`, Apply will output the status of roll outs.
|
|
||||||
|
|
||||||
|
|
||||||
It is possible to Apply updates to Resources *sequentially* by using `--wait` and structuring the
|
|
||||||
Resource Config so Apply is called separately for each sequential collection of Resources.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```bash
|
|
||||||
kubectl apply -f /path/to/project1/ --wait
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
# Rollout Status
|
|
||||||
|
|
||||||
## Apply
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```bash
|
|
||||||
$ kubectl apply -f dir/ --wait
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
|
|
||||||
## Checking on the Status of an existing Rollout
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
```bash
|
|
||||||
$ kubectl rollout status -f dir/
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
## Conditions and Fields
|
|
||||||
|
|
||||||
### Rollout Completion
|
|
||||||
|
|
||||||
### Rollout Health
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
# Declarative Application Management
|
|
||||||
|
|
||||||
This section of the book describes who to run Workloads in a Kubernetes cluster by declaring
|
|
||||||
the desired state of the cluster in files called *Resource Config*. This is the preferred
|
|
||||||
approach for managing Production workloads.
|
|
||||||
|
|
@ -0,0 +1,177 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Imperatively Create a Resources
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Creating Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Create Resources directly from the commandline for the purposes of development or debugging.
|
||||||
|
Not for production Application Management.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
A Deployment can be created by either the `create deployment` command or the `run` command.
|
||||||
|
While `run` may also create other types of resources, `create deployment` will only create
|
||||||
|
Deployments.
|
||||||
|
|
||||||
|
While `run` has a variety of flags and options, `create deployment` is intended to stay
|
||||||
|
very simple.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create deployment my-dep --image=busybox
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl run my-dep --image=busybox
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="success", title="Running and Attaching" %}
|
||||||
|
It is possible to run a container and immediately attach to it using the `-i -t` flags. e.g.
|
||||||
|
`kubectl run -t -i my-dep --image ubuntu -- bash`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## ConfigMap
|
||||||
|
|
||||||
|
Create a configmap based on a file, directory, or specified literal value.
|
||||||
|
|
||||||
|
A single configmap may package one or more key/value pairs.
|
||||||
|
|
||||||
|
When creating a configmap based on a file, the key will default to the basename of the file, and the value will default
|
||||||
|
to the file content. If the basename is an invalid key, you may specify an alternate key.
|
||||||
|
|
||||||
|
When creating a configmap based on a directory, each file whose basename is a valid key in the directory will be
|
||||||
|
packaged into the configmap. Any directory entries except regular files are ignored (e.g. subdirectories, symlinks,
|
||||||
|
devices, pipes, etc).
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new configmap named my-config based on folder bar
|
||||||
|
kubectl create configmap my-config --from-file=path/to/bar
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new configmap named my-config with specified keys instead of file basenames on disk
|
||||||
|
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new configmap named my-config with key1=config1 and key2=config2
|
||||||
|
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a new configmap named my-config from an env file
|
||||||
|
kubectl create configmap my-config --from-env-file=path/to/bar.env
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Secret
|
||||||
|
|
||||||
|
Create a new secret named my-secret with keys for each file in folder bar
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create secret generic my-secret --from-file=path/to/bar
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="success", title="Bootstrapping Config" %}
|
||||||
|
Imperative commands can be used to bootstrap config by using `--dry-run -o yaml`.
|
||||||
|
`kubectl create secret generic my-secret --from-file=path/to/bar --dry-run -o yaml`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Namespace
|
||||||
|
|
||||||
|
Create a new namespace named my-namespace
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create namespace my-namespace
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
## Auth Resources
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### ClusterRole
|
||||||
|
|
||||||
|
Create a ClusterRole named "foo" with API Group specified.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create clusterrole foo --verb=get,list,watch --resource=rs.extensions
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### ClusterRoleBinding
|
||||||
|
|
||||||
|
Create a role binding to give a user cluster admin permissions.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create clusterrolebinding <choose-a-name> --clusterrole=cluster-admin --user=<your-cloud-email-account>
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Required Admin Permissions" %}
|
||||||
|
The cluster-admin role maybe required for creating new RBAC bindings.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Role
|
||||||
|
|
||||||
|
Create a Role named "foo" with API Group specified.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create role foo --verb=get,list,watch --resource=rs.extensions
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### RoleBinding
|
||||||
|
|
||||||
|
Create a RoleBinding for user1, user2, and group1 using the admin ClusterRole.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### ServiceAccount
|
||||||
|
|
||||||
|
Create a new service account named my-service-account
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl create serviceaccount my-service-account
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Edit a live Resource in an editor
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Editing Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Directly modify a Resource in the cluster by opening its Config in an editor.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Edit
|
||||||
|
|
||||||
|
Edit allows a user to directly edit a Resource in a cluster rather than
|
||||||
|
editing it through a local file.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Edit the service named 'docker-registry':
|
||||||
|
kubectl edit svc/docker-registry
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Use an alternative editor
|
||||||
|
KUBE_EDITOR="nano" kubectl edit svc/docker-registry
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Edit the job 'myjob' in JSON using the v1 API format:
|
||||||
|
kubectl edit job.v1.batch/myjob -o json
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Edit the deployment 'mydeployment' in YAML and save the modified config in its annotation:
|
||||||
|
kubectl edit deployment/mydeployment -o yaml --save-config
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
While Declarative Management of Applications is the recommended pattern for production
|
||||||
|
use cases, imperative porcelain commands may be helpful for development or debugging
|
||||||
|
issues. These commands are particularly helpful for learning about Kubernetes when coming
|
||||||
|
from an imperative system.
|
||||||
|
|
||||||
|
**Note:** Some imperative commands can by run with `--dry-run -o yaml` to display the declarative
|
||||||
|
form.
|
||||||
|
|
||||||
|
This section describes imperative commands that will generate or patch Resource Config.
|
||||||
|
|
@ -0,0 +1,168 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Imperatively Set fields on Resources
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Creating Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Set fields on Resources directly from the commandline for the purposes of development or debugging.
|
||||||
|
Not for production Application Management.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Scale
|
||||||
|
|
||||||
|
The Replicas field on a Resource can be set using the `kubectl scale` command
|
||||||
|
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Scale a replicaset named 'foo' to 3.
|
||||||
|
kubectl scale --replicas=3 rs/foo
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Scale a resource identified by type and name specified in "foo.yaml" to 3.
|
||||||
|
kubectl scale --replicas=3 -f foo.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# If the deployment named mysql's current size is 2, scale mysql to 3.
|
||||||
|
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Scale multiple replication controllers.
|
||||||
|
kubectl scale --replicas=5 rc/foo rc/bar rc/baz
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Scale statefulset named 'web' to 3.
|
||||||
|
kubectl scale --replicas=3 statefulset/web
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Conditional Scale Update" %}
|
||||||
|
It is possible to conditionally update the replicas if and only if the
|
||||||
|
replicas haven't changed from their last known value using the `--current-replicas` flag.
|
||||||
|
e.g. `kubectl scale --current-replicas=2 --replicas=3 deployment/mysql`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Labels
|
||||||
|
|
||||||
|
Labels can be set using the `kubectl label` command. Multiple Resources can
|
||||||
|
be updated in a single command using the `-l` flag.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' with the label 'unhealthy' and the value 'true'.
|
||||||
|
kubectl label pods foo unhealthy=true
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value.
|
||||||
|
kubectl label --overwrite pods foo status=unhealthy
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update all pods in the namespace
|
||||||
|
kubectl label pods --all status=unhealthy
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update a pod identified by the type and name in "pod.json"
|
||||||
|
kubectl label -f pod.json status=unhealthy
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' only if the resource is unchanged from version 1.
|
||||||
|
kubectl label pods foo status=unhealthy --resource-version=1
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' by removing a label named 'bar' if it exists.
|
||||||
|
# Does not require the --overwrite flag.
|
||||||
|
kubectl label pods foo bar-
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Annotations
|
||||||
|
|
||||||
|
Annotations can be set using the `kubectl annotate` command.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' with the annotation 'description' and the value 'my frontend'.
|
||||||
|
# If the same annotation is set multiple times, only the last value will be applied
|
||||||
|
kubectl annotate pods foo description='my frontend'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update a pod identified by type and name in "pod.json"
|
||||||
|
kubectl annotate -f pod.json description='my frontend'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' with the annotation 'description' and the value 'my frontend running nginx', overwriting any
|
||||||
|
existing value.
|
||||||
|
kubectl annotate --overwrite pods foo description='my frontend running nginx'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update all pods in the namespace
|
||||||
|
kubectl annotate pods --all description='my frontend running nginx'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' only if the resource is unchanged from version 1.
|
||||||
|
kubectl annotate pods foo description='my frontend running nginx' --resource-version=1
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update pod 'foo' by removing an annotation named 'description' if it exists.
|
||||||
|
# Does not require the --overwrite flag.
|
||||||
|
kubectl annotate pods foo description-
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Patches
|
||||||
|
|
||||||
|
Arbitrary fields can be set using the `kubectl patch` command.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Partially update a node using a strategic merge patch. Specify the patch as JSON.
|
||||||
|
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Partially update a node using a strategic merge patch. Specify the patch as YAML.
|
||||||
|
kubectl patch node k8s-node-1 -p $'spec:\n unschedulable: true'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Partially update a node identified by the type and name specified in "node.json" using strategic merge patch.
|
||||||
|
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update a container's image; spec.containers[*].name is required because it's a merge key.
|
||||||
|
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Update a container's image using a json patch with positional arrays.
|
||||||
|
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"newimage"}]'
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Kubectl is the Kubernetes CLI and Tooling
|
||||||
|
- Kubectl provides a swiss army knife of functionality for working with Kubernetes
|
||||||
|
- Kubectl may be used to deploy and manage applications on Kubernetes
|
||||||
|
- Kubectl may be used for scripting and building higher-level frameworks
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Kubectl
|
||||||
|
|
||||||
|
Kubectl is the Kubernetes cli version of a swiss army knife.
|
||||||
|
|
||||||
|
## Command Families
|
||||||
|
|
||||||
|
While Kubectl has many different commands, they typically fall into one of a few categories:
|
||||||
|
|
||||||
|
| Type | Used For | Description |
|
||||||
|
|----------------------------------------|-----------------------|----------------------------------------------------|
|
||||||
|
| Declarative Resource Management | Production Operations and GitOps | Declaratively manage Kubernetes Workloads using Resource Config |
|
||||||
|
| Imperative Resource Management | Development | Run commands to manage Kubernetes Workloads using Command Line arguments and flags |
|
||||||
|
| Printing Workload State | Debugging | Print information about Workloads |
|
||||||
|
| Interacting with Containers | Debugging | Exec, Attach, Cp, Logs |
|
||||||
|
| Cluster Management | Cluster Ops | Drain and Cordon Nodes |
|
||||||
|
|
||||||
|
## Declarative Application Management
|
||||||
|
|
||||||
|
The preferred approach for managing Resources is through
|
||||||
|
declarative files called Resource Config used with the Kubectl *Apply* command.
|
||||||
|
This command reads a local (or remote) file structure and modifies cluster state to
|
||||||
|
reflect the declared intent.
|
||||||
|
|
||||||
|
{% panel style="info", title="Apply" %}
|
||||||
|
Apply is the preferred mechanism for managing Resources in a Kubernetes cluster.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Printing state about Workloads
|
||||||
|
|
||||||
|
Users will need to view Workload state.
|
||||||
|
|
||||||
|
- Printing summarize state and information about Resources
|
||||||
|
- Printing complete state and information about Resources
|
||||||
|
- Printing specific fields from Resources
|
||||||
|
- Query Resources matching labels
|
||||||
|
|
||||||
|
## Debugging Workloads
|
||||||
|
|
||||||
|
Kubectl supports debugging by providing commands for:
|
||||||
|
|
||||||
|
- Printing Container logs
|
||||||
|
- Printing cluster events
|
||||||
|
- Exec or attaching to a Container
|
||||||
|
- Copying files from Containers in the cluster to a user's filesystem
|
||||||
|
|
||||||
|
## Cluster Management
|
||||||
|
|
||||||
|
On occasion, users may need to perform operations to the Nodes of cluster. Kubectl supports
|
||||||
|
commands to drain Workloads from a Node so that it can be decommission or debugged.
|
||||||
|
|
||||||
|
## Porcelain
|
||||||
|
|
||||||
|
Users may find using Resource Config overly verbose for *Development* and prefer to work with
|
||||||
|
the cluster *imperatively* with a shell-like workflow. Kubectl offers porcelain commands for
|
||||||
|
generating and modifying Resources.
|
||||||
|
|
||||||
|
- Generating + creating Resources such as Deployments, StatefulSets, Services, ConfigMaps, etc
|
||||||
|
- Setting fields on Resources
|
||||||
|
- Editing (live) Resources in a text editor
|
||||||
|
|
||||||
|
{% panel style="danger", title="Porcelain For Dev Only" %}
|
||||||
|
Porcelain commands are time saving for experimenting with workloads in a dev cluster, but shouldn't
|
||||||
|
be used for production.
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
# The Kubernetes Resource Model
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
{% panel style="info", title="TL;DR" %}
|
||||||
- A Kubernetes API has 2 parts - a Resource Type and a Controller
|
- A Kubernetes API has 2 parts - a Resource Type and a Controller
|
||||||
- Resources are object declared as json or yaml and written to a cluster
|
- Resources are objects declared as json or yaml and written to a cluster
|
||||||
- Controllers asynchronously actuate Resources after they are stored
|
- Controllers asynchronously actuate Resources after they are stored
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
# The Kubernetes Resource Model
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
Instances of Kubernetes objects such as
|
Instances of Kubernetes objects such as
|
||||||
|
|
@ -13,27 +13,26 @@ Instances of Kubernetes objects such as
|
||||||
[StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/),
|
[StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/),
|
||||||
[Jobs](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/),
|
[Jobs](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/),
|
||||||
[CronJobs](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/) and
|
[CronJobs](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/) and
|
||||||
[DaemonSets](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) are called Resources.
|
[DaemonSets](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) are called **Resources**.
|
||||||
|
|
||||||
It is important to understand the structure of Resources, as Resources are how users interact
|
**Users work with Resource APIs by declaring them in files called Resource Config.** Resource Config is
|
||||||
with Kubernetes.
|
*Applied* (declarative Create/Update/Delete) to a Kubernetes cluster, and actuated by a *Controller*.
|
||||||
|
|
||||||
Users work with Resource APIs by declaring the desired state of Kubernetes Resources in
|
|
||||||
files called Resource Config. *After* Resource Config is Applied to a cluster and the
|
|
||||||
request completes, a Controller actuates the API.
|
|
||||||
|
|
||||||
Resources are keyed by:
|
Resources are keyed by:
|
||||||
|
|
||||||
- **apiVersion**
|
- **apiVersion** (API Type Group and Version)
|
||||||
- **kind**
|
- **kind** (API Type Name)
|
||||||
- (metadata) **namespace**
|
- **metadata.namespace** (Instance namespace)
|
||||||
- (metadata) **name**
|
- **metadata.name** (Instance name)
|
||||||
|
|
||||||
{% panel style="info", title="Default Namespace" %}
|
{% panel style="warning", title="Default Namespace" %}
|
||||||
If namespace is omitted from the Resource Config, the *default* namespace is used.
|
If namespace is omitted from the Resource Config, the *default* namespace is used. Users
|
||||||
|
should almost always explicitly specify the namespace for their Application using a
|
||||||
|
`kustomization.yaml`.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
{% method %}
|
{% method %}
|
||||||
|
|
||||||
### Resources Structure
|
### Resources Structure
|
||||||
|
|
||||||
Resources have the following components.
|
Resources have the following components.
|
||||||
|
|
@ -42,11 +41,11 @@ Resources have the following components.
|
||||||
|
|
||||||
**ObjectMeta:** Resource **name** and **namespace** + other metadata (labels, annotations, etc).
|
**ObjectMeta:** Resource **name** and **namespace** + other metadata (labels, annotations, etc).
|
||||||
|
|
||||||
**Spec:** the desired state of the Resource - declared by the user.
|
**Spec:** the desired state of the Resource - intended state the user provides to the cluster.
|
||||||
|
|
||||||
**Status:** the observed state of the object - recorded by the Controller.
|
**Status:** the observed state of the object - recorded state the cluster provides to the user.
|
||||||
|
|
||||||
Resource Config omits the Status.
|
Resource Config written by the user omits the Status field.
|
||||||
|
|
||||||
**Example Deployment Resource Config**
|
**Example Deployment Resource Config**
|
||||||
{% sample lang="yaml" %}
|
{% sample lang="yaml" %}
|
||||||
|
|
@ -75,7 +74,7 @@ spec:
|
||||||
{% endmethod %}
|
{% endmethod %}
|
||||||
|
|
||||||
{% panel style="info", title="Spec and Status" %}
|
{% panel style="info", title="Spec and Status" %}
|
||||||
Resources such as ConfigMaps and Secrets do not have a Status written by a Controller,
|
Resources such as ConfigMaps and Secrets do not have a Status,
|
||||||
and as a result their Spec is implicit (i.e. they don't have a spec field).
|
and as a result their Spec is implicit (i.e. they don't have a spec field).
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
@ -88,25 +87,33 @@ changes either to desired state of Resources (create, update, delete) or the sys
|
||||||
Controllers then make changes to the cluster to fulfill the intent specified by the user
|
Controllers then make changes to the cluster to fulfill the intent specified by the user
|
||||||
(e.g. in Resource Config) or automation (e.g. changes from Autoscalers).
|
(e.g. in Resource Config) or automation (e.g. changes from Autoscalers).
|
||||||
|
|
||||||
{% panel style="info", title="Asynchronous Actuation" %}
|
**Example:** After a user creates a Deployment, the Deployment Controller will see
|
||||||
|
that the Deployment exists and verify that the corresponding ReplicaSet it expects
|
||||||
|
to find exists. The Controller will see that the ReplicaSet does not exist and will
|
||||||
|
create one.
|
||||||
|
|
||||||
|
{% panel style="warning", title="Asynchronous Actuation" %}
|
||||||
Because Controllers run asynchronously, issues such as a bad
|
Because Controllers run asynchronously, issues such as a bad
|
||||||
Container Image or unschedulable Pods will not be present in the CRUD response.
|
Container Image or unschedulable Pods will not be present in the CRUD response.
|
||||||
Tools must facilitate watching the state of the system until changes are
|
Tooling must facilitate processes for watching the state of the system until changes are
|
||||||
completely actuated by Controllers.
|
completely actuated by Controllers. Once the changes have been fully actuated such
|
||||||
|
that the desired state matches the observed state, the Resource is considered *Settled*.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
||||||
### Controller Structure
|
### Controller Structure
|
||||||
|
|
||||||
**Reconcile**
|
**Reconcile**
|
||||||
|
|
||||||
Controllers actuate Resources by reading the Resource they are Reconciling + related Resources.
|
Controllers actuate Resources by reading the Resource they are Reconciling + related Resources,
|
||||||
Controllers **do not** Reconcile events, instead they compare the expected
|
such as those that they create and delete.
|
||||||
cluster state to the observed cluster state, and make changes.
|
|
||||||
|
|
||||||
- Deployment Controller creates/deletes ReplicaSets
|
**Controllers *do not* Reconcile events, rather they Reconcile the expected
|
||||||
- ReplicaSet Controller creates/delete Pods
|
cluster state to the observed cluster state at the time Reconcile is run.**
|
||||||
- Scheduler (Controller) writes Nodes to Pods
|
|
||||||
- Node (Controller) runs Containers specifid in Pods on the Node
|
1. Deployment Controller creates/deletes ReplicaSets
|
||||||
|
1. ReplicaSet Controller creates/delete Pods
|
||||||
|
1. Scheduler (Controller) writes Nodes to Pods
|
||||||
|
1. Node (Controller) runs Containers specifid in Pods on the Node
|
||||||
|
|
||||||
**Watch**
|
**Watch**
|
||||||
|
|
||||||
|
|
@ -123,7 +130,7 @@ the Event for this information).
|
||||||
|
|
||||||
{% panel style="info", title="Level vs Edge Based Reconciliation" %}
|
{% panel style="info", title="Level vs Edge Based Reconciliation" %}
|
||||||
Because Controllers don't respond to individual Events, but instead Reconcile the state
|
Because Controllers don't respond to individual Events, but instead Reconcile the state
|
||||||
of the system at the time the Controller is run, several different changes may be observed
|
of the system at the time that Reconcile is run, **changes from several different events may be observed
|
||||||
and Reconciled together. This is referred to as a **Level Based** system, whereas a system that
|
and Reconciled together.** This is referred to as a *Level Based* system, whereas a system that
|
||||||
responds to each requested state would be an **Edge Based** system.
|
responds to each event individually would be referred to as an *Edge Based* system.
|
||||||
{% endpanel %}
|
{% endpanel %}
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
# Merging Fields
|
|
||||||
|
|
||||||
## Shared Ownership of Fields
|
|
||||||
|
|
||||||
### User Owned Fields
|
|
||||||
|
|
||||||
### Cluster Owned Fields
|
|
||||||
|
|
||||||
### Transferring Field Ownership
|
|
||||||
|
|
||||||
## Merging Resources
|
|
||||||
|
|
||||||
### Adding Fields
|
|
||||||
|
|
||||||
### Updating Fields
|
|
||||||
|
|
||||||
### Deleting Fields
|
|
||||||
|
|
||||||
## Field Merge Semantics
|
|
||||||
|
|
||||||
### Merging Primitives
|
|
||||||
|
|
||||||
**Field Creation:**
|
|
||||||
|
|
||||||
**Field Update:**
|
|
||||||
|
|
||||||
**Field Deletion:**
|
|
||||||
|
|
||||||
### Merging Structures
|
|
||||||
|
|
||||||
### Merging Maps
|
|
||||||
|
|
||||||
### Merging Lists of Primitives
|
|
||||||
|
|
||||||
**Merge Strategy:**
|
|
||||||
|
|
||||||
**Ordering:**
|
|
||||||
|
|
||||||
### Merging Lists of Structures
|
|
||||||
|
|
||||||
**Merge Strategy:**
|
|
||||||
|
|
||||||
**Merge Key:**
|
|
||||||
|
|
||||||
**Ordering:**
|
|
||||||
|
|
@ -1,768 +0,0 @@
|
||||||
# Creating Bases and Variations
|
|
||||||
|
|
||||||
{% panel style="info", title="TL;DR" %}
|
|
||||||
- Create Variants of a Project for different Environments.
|
|
||||||
- Customize Resource Config shared across multiple Projects.
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
It is common for users to deploy several variants of the same project.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
- a project may be deployed to dev, test, staging, canary and production environments,
|
|
||||||
but with variants between the environments.
|
|
||||||
- a project may be deployed to different clusters that are tuned differently or running
|
|
||||||
different versions of the project.
|
|
||||||
|
|
||||||
Apply allows users to refer to another project as *Base*, and then apply additional customizations
|
|
||||||
to it.
|
|
||||||
|
|
||||||
Examples of changes between variants:
|
|
||||||
|
|
||||||
- Change replica count and resource
|
|
||||||
- Change image tag
|
|
||||||
- Change Environment Variables and Command Args
|
|
||||||
|
|
||||||
## Referring to a Base
|
|
||||||
|
|
||||||
A project can refer by adding a path (relative to the `apply.yaml`) to `base` that
|
|
||||||
points to a directory containing another `apply.yaml` file. This will automatically
|
|
||||||
add all of the Resources from the base project to the current project.
|
|
||||||
|
|
||||||
Bases can be:
|
|
||||||
|
|
||||||
- Relative paths from the `apply.yaml` - e.g. `../base`
|
|
||||||
- Urls - e.g. `github.com/kubernetes-sigs/kustomize/examples/multibases?ref=v1.0.6`
|
|
||||||
|
|
||||||
{% panel style="info", title="URL Syntax" %}
|
|
||||||
The Base URLs should follow
|
|
||||||
[hashicorp/go-getter URL format](https://github.com/hashicorp/go-getter#url-format).
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
**Example:** Add the Resource Config from a base.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
configMapGenerator:
|
|
||||||
- name: myJavaServerEnvVars
|
|
||||||
literals:
|
|
||||||
- JAVA_HOME=/opt/java/jdk
|
|
||||||
- JAVA_TOOL_OPTIONS=-agentlib:hprof
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
volumeMounts:
|
|
||||||
- mountPath: /etc/config
|
|
||||||
name: config-volume
|
|
||||||
volumes:
|
|
||||||
- configMap:
|
|
||||||
name: myJavaServerEnvVars
|
|
||||||
name: config-volume
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Unmodified Generated Base Resource
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: myJavaServerEnvVars-k44mhd6h5f
|
|
||||||
data:
|
|
||||||
JAVA_HOME: /opt/java/jdk
|
|
||||||
JAVA_TOOL_OPTIONS: -agentlib:hprof
|
|
||||||
---
|
|
||||||
# Unmodified Config Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
volumeMounts:
|
|
||||||
- mountPath: /etc/config
|
|
||||||
name: config-volume
|
|
||||||
volumes:
|
|
||||||
- configMap:
|
|
||||||
name: myJavaServerEnvVars-k44mhd6h5f
|
|
||||||
name: config-volume
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
## Customizing Each Variant
|
|
||||||
|
|
||||||
When users have multiple similar projects with a shared base, they will want
|
|
||||||
to create variants that customize the original base.
|
|
||||||
|
|
||||||
### Customizing Pod Environment Variables
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Customizing Pod Command arguments may be performed by generating different ConfigMaps
|
|
||||||
in each Variant and using the ConfigMap values in the Pod Environment Variables.
|
|
||||||
|
|
||||||
- Base uses ConfigMap data in Pods as Environment Variables
|
|
||||||
- Each Variant defines different ConfigMap data
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) provide different Environment
|
|
||||||
Variables to a Pod.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
configMapGenerator:
|
|
||||||
- name: special-config
|
|
||||||
literals:
|
|
||||||
- special.how=very
|
|
||||||
- special.type=charm
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: nginx-deployment
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: nginx
|
|
||||||
image: nginx
|
|
||||||
env:
|
|
||||||
- name: SPECIAL_LEVEL_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: special-config
|
|
||||||
key: special.how
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resources that are Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Generated Variant Resource
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: special-config-82tc88cmcg
|
|
||||||
data:
|
|
||||||
special.how: very
|
|
||||||
special.type: charm
|
|
||||||
---
|
|
||||||
# Unmodified Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- env:
|
|
||||||
- name: SPECIAL_LEVEL_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
key: special.how
|
|
||||||
name: special-config-82tc88cmcg
|
|
||||||
image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
See [ConfigMaps and Secrets](dam_generators.md).
|
|
||||||
|
|
||||||
|
|
||||||
### Customizing Pod Command Arguments
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Customizing Pod Command arguments may be performed by generating different ConfigMaps
|
|
||||||
in each Variant and using the ConfigMap values in the Pod Command Arguments.
|
|
||||||
|
|
||||||
- Base uses ConfigMap data in Pods as Command Arguments
|
|
||||||
- Each Variant defines different ConfigMap data
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) provide different Commandline
|
|
||||||
Arguments to a Pod.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
configMapGenerator:
|
|
||||||
- name: special-config
|
|
||||||
literals:
|
|
||||||
- special.how=very
|
|
||||||
- special.type=charm
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: nginx-deployment
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: test-container
|
|
||||||
image: k8s.gcr.io/busybox
|
|
||||||
# Use the ConfigMap Environment Variables in the Command
|
|
||||||
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
|
|
||||||
env:
|
|
||||||
- name: SPECIAL_LEVEL_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: special-config
|
|
||||||
key: SPECIAL_LEVEL
|
|
||||||
- name: SPECIAL_TYPE_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: special-config
|
|
||||||
key: SPECIAL_TYPE
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resources that are Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Generated Variant Resource
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: special-config-82tc88cmcg
|
|
||||||
data:
|
|
||||||
special.how: very
|
|
||||||
special.type: charm
|
|
||||||
---
|
|
||||||
# Unmodified Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- command:
|
|
||||||
- /bin/sh
|
|
||||||
- -c
|
|
||||||
# Use the ConfigMap Environment Variables in the Command
|
|
||||||
- echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)
|
|
||||||
env:
|
|
||||||
- name: SPECIAL_LEVEL_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
key: SPECIAL_LEVEL
|
|
||||||
name: special-config-82tc88cmcg
|
|
||||||
- name: SPECIAL_TYPE_KEY
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
key: SPECIAL_TYPE
|
|
||||||
name: special-config-82tc88cmcg
|
|
||||||
image: k8s.gcr.io/busybox
|
|
||||||
name: test-container
|
|
||||||
```
|
|
||||||
|
|
||||||
{% endmethod %}
|
|
||||||
See [ConfigMaps and Secrets](dam_generators.md).
|
|
||||||
|
|
||||||
### Customizing Image Tags
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Customizing the Image Tag run in each Variant can be performed by specifying `imageTags`
|
|
||||||
in each Variant `apply.yaml`.
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) can use images with different tags.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
imageTags:
|
|
||||||
- name: nginx
|
|
||||||
newTag: 1.8.0
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: nginx-deployment
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: nginx
|
|
||||||
image: nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Modified Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
# The image has been changed to include the tag
|
|
||||||
- image: nginx:1.8.0
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
See [Image Tags](dam_images.md).
|
|
||||||
|
|
||||||
### Customizing Namespace
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Customizing the Namespace in each Variant can be performed by specifying `namespace` in each
|
|
||||||
Variant `apply.yaml`.
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) run in different Namespaces.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
namespace: test
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Modified Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
# Namespace has been set
|
|
||||||
namespace: test
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
See [Namespaces and Names](dam_namespaces.md).
|
|
||||||
|
|
||||||
### Customizing Resource Name Prefixes
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Customizing the Name by adding a prefix in each Variant can be performed by specifying `namePrefix` in each
|
|
||||||
Variant `apply.yaml`.
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) have different Naming conventions.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
namePrefix: test-
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Modified Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
# Name has been prefixed with the environment
|
|
||||||
name: test-nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
See [Namespaces and Names](dam_namespaces.md).
|
|
||||||
|
|
||||||
### Customizing Arbitrary Fields with Overlays
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Arbitrary fields may be added, changed, or deleted by supplying *Overlays* against the
|
|
||||||
Resources provided by the base. Overlays are sparse Resource definitions that
|
|
||||||
allow arbitrary customizations to be performed without requiring a base to expose
|
|
||||||
the customization as a template.
|
|
||||||
|
|
||||||
Overlays require the *Group, Version, Kind* and *Name* of the Resource to be specified, as
|
|
||||||
well as any fields that should be set on the base Resource. Overlays are applied using
|
|
||||||
*StrategicMergePatch*.
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) require fields such as
|
|
||||||
replicas or resources to be overridden.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
patchesStrategicMerge:
|
|
||||||
- overlay.yaml
|
|
||||||
|
|
||||||
# overlay.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
# override replicas
|
|
||||||
replicas: 3
|
|
||||||
template:
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: nginx
|
|
||||||
# override resources
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpu: "1"
|
|
||||||
requests:
|
|
||||||
cpu: "0.5"
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpu: "0.2"
|
|
||||||
requests:
|
|
||||||
cpu: "0.1"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Overlayed Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
# replicas field has been added
|
|
||||||
replicas: 3
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
# resources have been overridden
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpu: "1"
|
|
||||||
requests:
|
|
||||||
cpu: "0.5"
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
{% panel style="info", title="Overlay URLs" %}
|
|
||||||
Like Bases, Overlays may also be URLs and should follow the
|
|
||||||
[hashicorp/go-getter URL format](https://github.com/hashicorp/go-getter#url-format).
|
|
||||||
{% endpanel %}
|
|
||||||
|
|
||||||
|
|
||||||
### Customizing Arbitrary Fields with JsonPatch
|
|
||||||
|
|
||||||
{% method %}
|
|
||||||
Arbitrary fields may be added, changed, or deleted by supplying *Json 6902 Patches* against the
|
|
||||||
Resources provided by the base.
|
|
||||||
|
|
||||||
**Use Case:** Different Environments (test, dev, staging, canary, prod) require fields such as
|
|
||||||
replicas or resources to be overridden.
|
|
||||||
|
|
||||||
Json 6902 Patches are [rfc6902](https://tools.ietf.org/html/rfc6902) patches that are applied
|
|
||||||
to resources. Patches require the *Group, Version, Kind* and *Name* of the Resource to be
|
|
||||||
specified in addition to the Patch. Patches offer a number of powerful imperative operations
|
|
||||||
for modifying the base Resources.
|
|
||||||
|
|
||||||
{% sample lang="yaml" %}
|
|
||||||
**Input:** The apply.yaml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# apply.yaml
|
|
||||||
bases:
|
|
||||||
- ../base
|
|
||||||
patchesJson6902:
|
|
||||||
- target:
|
|
||||||
group: apps
|
|
||||||
version: v1
|
|
||||||
kind: Deployment
|
|
||||||
name: nginx-deployment
|
|
||||||
path: patch.yaml
|
|
||||||
|
|
||||||
# patch.yaml
|
|
||||||
- op: add
|
|
||||||
path: /spec/replicas
|
|
||||||
value: 3
|
|
||||||
|
|
||||||
# ../base/apply.yaml
|
|
||||||
resources:
|
|
||||||
- deployment.yaml
|
|
||||||
|
|
||||||
# ../base/deployment.yaml
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
**Applied:** The Resource that is Applied to the cluster
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# Patched Base Resource
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
name: nginx-deployment
|
|
||||||
spec:
|
|
||||||
# replicas field has been added
|
|
||||||
replicas: 3
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: nginx
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: nginx
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- image: nginx
|
|
||||||
name: nginx
|
|
||||||
```
|
|
||||||
{% endmethod %}
|
|
||||||
|
|
||||||
### Adding Resources to a Base
|
|
||||||
|
|
||||||
Additional Resources not specified in the Base may be added to Variants by
|
|
||||||
Variants specifying them as `resources` in their `apply.yaml`.
|
|
||||||
|
|
@ -0,0 +1,197 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Print information about the Cluster and Client versions
|
||||||
|
- Print information about the Control Plane
|
||||||
|
- Print information about Nodes
|
||||||
|
- Print information about APIs
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Cluster Info
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
It may be necessary to learn about the Kubernetes cluster itself, rather
|
||||||
|
than just the workloads running in it. This can be useful for debugging
|
||||||
|
unexpected behavior.
|
||||||
|
|
||||||
|
## Versions
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
The `kubectl version` prints the client and server versions. Note that
|
||||||
|
the client version may not be present for clients built locally from
|
||||||
|
source.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl version
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.5", GitCommit:"f01a2bf98249a4db383560443a59bed0c13575df", GitTreeState:"clean", BuildDate:"2018-03-19T19:38:17Z", GoVersion:"go1.9.4", Compiler:"gc", Platform:"darwin/amd64"}
|
||||||
|
Server Version: version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.6-gke.2", GitCommit:"04ad69a117f331df6272a343b5d8f9e2aee5ab0c", GitTreeState:"clean", BuildDate:"2019-01-04T16:19:46Z", GoVersion:"go1.10.3b4", Compiler:"gc", Platform:"linux/amd64"}
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="warning", title="Version Skew" %}
|
||||||
|
Kubectl supports +/-1 version skew with the Kubernetes cluster. Kubectl
|
||||||
|
versions that are more than 1 version ahead of or behind the cluster are
|
||||||
|
not guaranteed to be compatible.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Control Plane and Addons
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
The `kubectl cluster-info` prints information about the control plane and
|
||||||
|
add-ons.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl cluster-info
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Kubernetes master is running at https://1.1.1.1
|
||||||
|
GLBCDefaultBackend is running at https://1.1.1.1/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
|
||||||
|
Heapster is running at https://1.1.1.1/api/v1/namespaces/kube-system/services/heapster/proxy
|
||||||
|
KubeDNS is running at https://1.1.1.1/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
|
||||||
|
Metrics-server is running at https://1.1.1.1/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Kube Proxy" %}
|
||||||
|
The URLs printed by `cluster-info` can be access at `127.0.0.1:8001` by
|
||||||
|
running `kubectl proxy`.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
## Nodes
|
||||||
|
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
The `kubectl top node` and `kubectl top pod` print information about the
|
||||||
|
top nodes and pods.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl top node
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
|
||||||
|
gke-dev-default-pool-e1e7bf6a-cc8b 37m 1% 571Mi 10%
|
||||||
|
gke-dev-default-pool-e1e7bf6a-f0xh 103m 5% 1106Mi 19%
|
||||||
|
gke-dev-default-pool-e1e7bf6a-jfq5 139m 7% 1252Mi 22%
|
||||||
|
gke-dev-default-pool-e1e7bf6a-x37l 112m 5% 982Mi 17%
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
## APIs
|
||||||
|
|
||||||
|
The `kubectl api-versions` and `kubectl resource-types` print information
|
||||||
|
about the available Kubernetes APIs. This information is read from the
|
||||||
|
Discovery Service.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print the Resource Types available in the cluster.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl api-resources
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME SHORTNAMES APIGROUP NAMESPACED KIND
|
||||||
|
bindings true Binding
|
||||||
|
componentstatuses cs false ComponentStatus
|
||||||
|
configmaps cm true ConfigMap
|
||||||
|
endpoints ep true Endpoints
|
||||||
|
events ev true Event
|
||||||
|
limitranges limits true LimitRange
|
||||||
|
namespaces ns false Namespace
|
||||||
|
...
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print the API versions available in the cluster.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl api-versions
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
admissionregistration.k8s.io/v1beta1
|
||||||
|
apiextensions.k8s.io/v1beta1
|
||||||
|
apiregistration.k8s.io/v1
|
||||||
|
apiregistration.k8s.io/v1beta1
|
||||||
|
apps/v1
|
||||||
|
apps/v1beta1
|
||||||
|
apps/v1beta2
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Discovery" %}
|
||||||
|
The discovery information can be viewed at `127.0.0.1:8001/` by running
|
||||||
|
`kubectl proxy`. The Discovery for specific API can be found under either
|
||||||
|
`/api/v1` or `apis/<group>/<version>`, depending on the API group -
|
||||||
|
e.g. `127.0.0.1:8001/apis/apps/v1`
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
The `kubectl explain` command can be used to print metadata about specific
|
||||||
|
Resource types. This is useful for learning about the type.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl explain deployment --api-version apps/v1
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
KIND: Deployment
|
||||||
|
VERSION: apps/v1
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
Deployment enables declarative updates for Pods and ReplicaSets.
|
||||||
|
|
||||||
|
FIELDS:
|
||||||
|
apiVersion <string>
|
||||||
|
APIVersion defines the versioned schema of this representation of an
|
||||||
|
object. Servers should convert recognized schemas to the latest internal
|
||||||
|
value, and may reject unrecognized values. More info:
|
||||||
|
https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
|
||||||
|
|
||||||
|
kind <string>
|
||||||
|
Kind is a string value representing the REST resource this object
|
||||||
|
represents. Servers may infer this from the endpoint the client submits
|
||||||
|
requests to. Cannot be updated. In CamelCase. More info:
|
||||||
|
https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
|
||||||
|
|
||||||
|
metadata <Object>
|
||||||
|
Standard object metadata.
|
||||||
|
|
||||||
|
spec <Object>
|
||||||
|
Specification of the desired behavior of the Deployment.
|
||||||
|
|
||||||
|
status <Object>
|
||||||
|
Most recently observed status of the Deployment.
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Print verbose debug information about a Resource
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Describe Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
Describe is a **higher level printing operation that may aggregate data from other sources** in addition
|
||||||
|
to the Resource being queried (e.g. Events).
|
||||||
|
|
||||||
|
Describe pulls out the most important information about a Resource from the Resource itself and related
|
||||||
|
Resources, and formats and prints this information on multiple lines.
|
||||||
|
|
||||||
|
- Aggregates data from related Resources
|
||||||
|
- Formats Verbose Output for debugging
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl describe deployments
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Name: nginx
|
||||||
|
Namespace: default
|
||||||
|
CreationTimestamp: Thu, 15 Nov 2018 10:58:03 -0800
|
||||||
|
Labels: app=nginx
|
||||||
|
Annotations: deployment.kubernetes.io/revision=1
|
||||||
|
Selector: app=nginx
|
||||||
|
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
|
||||||
|
StrategyType: RollingUpdate
|
||||||
|
MinReadySeconds: 0
|
||||||
|
RollingUpdateStrategy: 25% max unavailable, 25% max surge
|
||||||
|
Pod Template:
|
||||||
|
Labels: app=nginx
|
||||||
|
Containers:
|
||||||
|
nginx:
|
||||||
|
Image: nginx
|
||||||
|
Port: <none>
|
||||||
|
Host Port: <none>
|
||||||
|
Environment: <none>
|
||||||
|
Mounts: <none>
|
||||||
|
Volumes: <none>
|
||||||
|
Conditions:
|
||||||
|
Type Status Reason
|
||||||
|
---- ------ ------
|
||||||
|
Progressing True NewReplicaSetAvailable
|
||||||
|
Available True MinimumReplicasAvailable
|
||||||
|
OldReplicaSets: <none>
|
||||||
|
NewReplicaSet: nginx-78f5d695bd (1/1 replicas created)
|
||||||
|
Events: <none>
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="info", title="Get vs Describe" %}
|
||||||
|
When Describing a Resource, it may aggregate information from several other Resources. For instance Describing
|
||||||
|
a Node will aggregate Pod Resources to print the Node utilization.
|
||||||
|
|
||||||
|
When Getting a Resource, it will only print information available from reading that Resource. While Get may aggregate
|
||||||
|
data from the the *fields* of that Resource, it won't look at fields from other Resources.
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,183 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Format and print specific fields from Resources
|
||||||
|
- Use when scripting with Get
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Print Resource Fields
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Kubectl Get is able to pull out fields from Resources it queries and format them as output.
|
||||||
|
|
||||||
|
This may be **useful for scripting or gathering data** about Resources from a Kubernetes cluster.
|
||||||
|
|
||||||
|
## Get
|
||||||
|
|
||||||
|
The `kubectl get` reads Resources from the cluster and formats them as output. The examples in
|
||||||
|
this chapter will query for Resources by providing Get the *Resource Type* with the
|
||||||
|
Version and Group as an argument.
|
||||||
|
For more query options see [Queries and Options](queries_and_options.md).
|
||||||
|
|
||||||
|
Kubectl can format and print specific fields from Resources using Json Path.
|
||||||
|
|
||||||
|
{% panel style="warning", title="Scripting Pitfalls" %}
|
||||||
|
By default, if no API group or version is specified, kubectl will use the group and version preferred by
|
||||||
|
the apiserver.
|
||||||
|
|
||||||
|
Because the **Resource structure may change between API groups and Versions**, users *should* specify the
|
||||||
|
API Group and Version when emitting fields from `kubectl get` to make sure the command does not break
|
||||||
|
in future releases.
|
||||||
|
|
||||||
|
Failure to do this may result in the different API group / version being used after a cluster upgrade, and
|
||||||
|
this group / version may have changed the representation of fields.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
### Json Path
|
||||||
|
|
||||||
|
Print the fields from the Json Path
|
||||||
|
|
||||||
|
**Note:** Json Path can also be read from a file using `-o custom-columns-file`.
|
||||||
|
|
||||||
|
- Json Path template is composed of JSONPath expressions enclosed by {}. In addition to the original JSONPath syntax, several capabilities are added:
|
||||||
|
- The `$` operator is optional (the expression starts from the root object by default).
|
||||||
|
- Use "" to quote text inside JSONPath expressions.
|
||||||
|
- Use range operator to iterate lists.
|
||||||
|
- Use negative slice indices to step backwards through a list. Negative indices do not “wrap around” a list. They are valid as long as -index + listLength >= 0.
|
||||||
|
|
||||||
|
### Json Path Symbols Table
|
||||||
|
|
||||||
|
| Function | Description | Example | Result |
|
||||||
|
|---|---|---|---|
|
||||||
|
| text | the plain text | kind is {.kind} | kind is List |
|
||||||
|
| @ | the current object | {@} | the same as input |
|
||||||
|
| . or [] | child operator | {.kind} or {[‘kind’]} | List |
|
||||||
|
| .. | recursive descent | {..name} | 127.0.0.1 127.0.0.2 myself e2e |
|
||||||
|
| * | wildcard. Get all objects | {.items[*].metadata.name} | [127.0.0.1 127.0.0.2] |
|
||||||
|
| [start:end :step] | subscript operator | {.users[0].name} | myself |
|
||||||
|
| [,] | union operator | {.items[*][‘metadata.name’, ‘status.capacity’]} |127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8] |
|
||||||
|
| ?() | filter | {.users[?(@.name==“e2e”)].user.password} | secret |
|
||||||
|
| range, end | iterate list | {range .items[*]}[{.metadata.name}, {.status.capacity}] {end} | [127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] |
|
||||||
|
| “ | quote interpreted string |{range .items[*]}{.metadata.name}{’\t’} | {end} 127.0.0.1 127.0.0.2|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print the Json representation of the first Deployment in the list on a single line.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{.items[0]}{"\n"}'
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
map[apiVersion:apps/v1 kind:Deployment...replicas:1 updatedReplicas:1]]
|
||||||
|
```
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print the `metadata.name` field for the first Deployment in the list.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{.items[0].metadata.name}{"\n"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
For each Deployment, print its `metadata.name` field and a newline afterward.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nginx
|
||||||
|
nginx2
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
For each Deployment, print its `metadata.name` and `.status.availableReplicas`.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.availableReplicas}{"\n"}{end}'
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
nginx 1
|
||||||
|
nginx2 1
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print the list of Deployments as single line.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{@}{"\n"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
map[kind:List apiVersion:v1 metadata:map[selfLink: resourceVersion:] items:[map[apiVersion:apps/v1 kind:Deployment...replicas:1 updatedReplicas:1]]]]
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
Print each Deployment on a new line.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment.v1.apps -o=jsonpath='{range .items[*]}{@}{"\n"}{end}'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
map[kind:Deployment...readyReplicas:1]]
|
||||||
|
map[kind:Deployment...readyReplicas:1]]
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% panel style="info", title="Literal Syntax" %}
|
||||||
|
On Windows, you must double quote any JSONPath template that contains spaces (not single quote as shown above for bash).
|
||||||
|
This in turn means that you must use a single quote or escaped double quote around any literals in the template.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
C:\> kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.status.startTime}{'\n'}{end}"
|
||||||
|
```
|
||||||
|
{% endpanel %}
|
||||||
|
|
@ -0,0 +1,176 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Queries for Getting or Describing Resources
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Matching Objects from Get and Describing
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Match Resources with Queries when Getting or Describing them.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Resource Config By `kustomization.yaml`
|
||||||
|
|
||||||
|
Get all Resources provided by the `kustomization.yaml` in project/.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get -k project/
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Resource Config By Dir
|
||||||
|
|
||||||
|
Get all Resources present in the Resource Config for a directory.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get -f configs/
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Resource Types
|
||||||
|
|
||||||
|
Get **all** Resources in a namespace for a given type.
|
||||||
|
|
||||||
|
The Group and Version for the Resource are determined by the apiserver discovery service.
|
||||||
|
|
||||||
|
The Singular, Plural, Short Name also apply to *Types with Name* and *Types with Selectors*.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Plural
|
||||||
|
$ kubectl get deployments
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Singular
|
||||||
|
$ kubectl get deployment
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Short name
|
||||||
|
$ kubectl get deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Resource Types with Group / Version
|
||||||
|
|
||||||
|
Get **all** Resources in a namespace for a given type.
|
||||||
|
|
||||||
|
The Group and Version for the Resource are explicit.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments.apps
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments.v1.apps
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Resource Types with Name
|
||||||
|
|
||||||
|
Get named Resources in a namespace for a given type.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Label Selector
|
||||||
|
|
||||||
|
Get **all** Resources in a namespace **matching a label select** for a given type.
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments -l app=nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Namespaces
|
||||||
|
|
||||||
|
By default Get and Describe will fetch resource in the default namespace or the namespace specified
|
||||||
|
with `--namespace`.
|
||||||
|
|
||||||
|
The `---all-namespaces` flag will **fetch Resources from all namespaces**.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments --all-namespaces
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## List multiple Resource types
|
||||||
|
|
||||||
|
Get and Describe can accept **multiple Resource types**, and it will print them both in separate sections.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments,services
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## List multiple Resource types by name
|
||||||
|
|
||||||
|
Get and Describe can accept **multiple Resource types and names**.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get kubectl get rc/web service/frontend pods/web-pod-13je7
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Uninitialized
|
||||||
|
|
||||||
|
Kubernetes **Resources may be hidden until they have gone through an initialization process**.
|
||||||
|
These Resources can be view with the `--include-uninitialized` flag.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments --include-uninitialized
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
## Not Found
|
||||||
|
|
||||||
|
By default, Get or Describe **will return an error if an object is requested and doesn't exist**.
|
||||||
|
The `--ignore-not-found` flag will cause kubectl to exit 0 if the Resource is not found
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment nginx --ignore-not-found
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,225 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Get or List Raw Resources in a cluster as Yaml or Json
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Print Raw Resource
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Inspecting or Debugging Resources.
|
||||||
|
|
||||||
|
The Kubernetes Resources stored in etcd by the apiserver have **many more fields than
|
||||||
|
are shown in the summarized views**. Users can learn much more about a Resource by
|
||||||
|
viewing the Raw Resource as Yaml or Json. The Raw Resource will contain:
|
||||||
|
|
||||||
|
- fields specified by the **user** in the Resource Config (e.g. `metdata.name`)
|
||||||
|
- metadata fields owned by the **apiserver** (e.g. `metadata.creationTimestamp`)
|
||||||
|
- fields defaulted by the **apiserver** (e.g. `spec..imagePullPolicy`)
|
||||||
|
- fields set by **Controllers** (e.g. `spec.clusterIp`, `status`)
|
||||||
|
|
||||||
|
## Get
|
||||||
|
|
||||||
|
The `kubectl get` reads Resources from the cluster and formats them as output. The examples in
|
||||||
|
this chapter will query for Resources by providing Get the *Resource Type* as an argument.
|
||||||
|
For more query options see [Queries and Options](queries_and_options.md).
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
### Yaml
|
||||||
|
|
||||||
|
Print the Raw Resource formatting it as Yaml.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments -o yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
items:
|
||||||
|
- apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
deployment.kubernetes.io/revision: "1"
|
||||||
|
creationTimestamp: 2018-11-15T18:58:03Z
|
||||||
|
generation: 1
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
name: nginx
|
||||||
|
namespace: default
|
||||||
|
resourceVersion: "1672574"
|
||||||
|
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx
|
||||||
|
uid: 6131547f-e908-11e8-9ff6-42010a8a00d1
|
||||||
|
spec:
|
||||||
|
progressDeadlineSeconds: 600
|
||||||
|
replicas: 1
|
||||||
|
revisionHistoryLimit: 10
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
strategy:
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 25%
|
||||||
|
maxUnavailable: 25%
|
||||||
|
type: RollingUpdate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
creationTimestamp: null
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: nginx
|
||||||
|
imagePullPolicy: Always
|
||||||
|
name: nginx
|
||||||
|
resources: {}
|
||||||
|
terminationMessagePath: /dev/termination-log
|
||||||
|
terminationMessagePolicy: File
|
||||||
|
dnsPolicy: ClusterFirst
|
||||||
|
restartPolicy: Always
|
||||||
|
schedulerName: default-scheduler
|
||||||
|
securityContext: {}
|
||||||
|
terminationGracePeriodSeconds: 30
|
||||||
|
status:
|
||||||
|
availableReplicas: 1
|
||||||
|
conditions:
|
||||||
|
- lastTransitionTime: 2018-11-15T18:58:10Z
|
||||||
|
lastUpdateTime: 2018-11-15T18:58:10Z
|
||||||
|
message: Deployment has minimum availability.
|
||||||
|
reason: MinimumReplicasAvailable
|
||||||
|
status: "True"
|
||||||
|
type: Available
|
||||||
|
- lastTransitionTime: 2018-11-15T18:58:03Z
|
||||||
|
lastUpdateTime: 2018-11-15T18:58:10Z
|
||||||
|
message: ReplicaSet "nginx-78f5d695bd" has successfully progressed.
|
||||||
|
reason: NewReplicaSetAvailable
|
||||||
|
status: "True"
|
||||||
|
type: Progressing
|
||||||
|
observedGeneration: 1
|
||||||
|
readyReplicas: 1
|
||||||
|
replicas: 1
|
||||||
|
updatedReplicas: 1
|
||||||
|
kind: List
|
||||||
|
metadata:
|
||||||
|
resourceVersion: ""
|
||||||
|
selfLink: ""
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
### Json
|
||||||
|
|
||||||
|
Print the Raw Resource formatting it as Json.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments -o json
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"apiVersion": "extensions/v1beta1",
|
||||||
|
"kind": "Deployment",
|
||||||
|
"metadata": {
|
||||||
|
"annotations": {
|
||||||
|
"deployment.kubernetes.io/revision": "1"
|
||||||
|
},
|
||||||
|
"creationTimestamp": "2018-11-15T18:58:03Z",
|
||||||
|
"generation": 1,
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx"
|
||||||
|
},
|
||||||
|
"name": "nginx",
|
||||||
|
"namespace": "default",
|
||||||
|
"resourceVersion": "1672574",
|
||||||
|
"selfLink": "/apis/extensions/v1beta1/namespaces/default/deployments/nginx",
|
||||||
|
"uid": "6131547f-e908-11e8-9ff6-42010a8a00d1"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"progressDeadlineSeconds": 600,
|
||||||
|
"replicas": 1,
|
||||||
|
"revisionHistoryLimit": 10,
|
||||||
|
"selector": {
|
||||||
|
"matchLabels": {
|
||||||
|
"app": "nginx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"strategy": {
|
||||||
|
"rollingUpdate": {
|
||||||
|
"maxSurge": "25%",
|
||||||
|
"maxUnavailable": "25%"
|
||||||
|
},
|
||||||
|
"type": "RollingUpdate"
|
||||||
|
},
|
||||||
|
"template": {
|
||||||
|
"metadata": {
|
||||||
|
"creationTimestamp": null,
|
||||||
|
"labels": {
|
||||||
|
"app": "nginx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"containers": [
|
||||||
|
{
|
||||||
|
"image": "nginx",
|
||||||
|
"imagePullPolicy": "Always",
|
||||||
|
"name": "nginx",
|
||||||
|
"resources": {},
|
||||||
|
"terminationMessagePath": "/dev/termination-log",
|
||||||
|
"terminationMessagePolicy": "File"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dnsPolicy": "ClusterFirst",
|
||||||
|
"restartPolicy": "Always",
|
||||||
|
"schedulerName": "default-scheduler",
|
||||||
|
"securityContext": {},
|
||||||
|
"terminationGracePeriodSeconds": 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"availableReplicas": 1,
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"lastTransitionTime": "2018-11-15T18:58:10Z",
|
||||||
|
"lastUpdateTime": "2018-11-15T18:58:10Z",
|
||||||
|
"message": "Deployment has minimum availability.",
|
||||||
|
"reason": "MinimumReplicasAvailable",
|
||||||
|
"status": "True",
|
||||||
|
"type": "Available"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"lastTransitionTime": "2018-11-15T18:58:03Z",
|
||||||
|
"lastUpdateTime": "2018-11-15T18:58:10Z",
|
||||||
|
"message": "ReplicaSet \"nginx-78f5d695bd\" has successfully progressed.",
|
||||||
|
"reason": "NewReplicaSetAvailable",
|
||||||
|
"status": "True",
|
||||||
|
"type": "Progressing"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"observedGeneration": 1,
|
||||||
|
"readyReplicas": 1,
|
||||||
|
"replicas": 1,
|
||||||
|
"updatedReplicas": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"kind": "List",
|
||||||
|
"metadata": {
|
||||||
|
"resourceVersion": "",
|
||||||
|
"selfLink": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Get a Summary of Resources Running in the Cluster
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Summarizing Resources
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Quickly summarizing a collection of Resources and their state.
|
||||||
|
|
||||||
|
Summarizing Resource State using a columnar format is the most common way to view cluster
|
||||||
|
state when developing applications or triaging issues. The **columnar view gives a compact
|
||||||
|
summary of the most relevant information** for a collection of Resources.
|
||||||
|
|
||||||
|
## Get
|
||||||
|
|
||||||
|
The `kubectl get` reads Resources from the cluster and formats them as output. The examples in
|
||||||
|
this chapter will query for Resources by providing Get the *Resource Type* as an argument.
|
||||||
|
For more query options see [Queries and Options](queries_and_options.md).
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Default
|
||||||
|
|
||||||
|
If no output format is specified, Get will print a default set of columns.
|
||||||
|
|
||||||
|
**Note:** Some columns *may* not directly map to fields on the Resource, but instead may
|
||||||
|
be a summary of fields.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||||||
|
nginx 1 1 1 0 5s
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Wide
|
||||||
|
|
||||||
|
Print the default columns plus some additional columns.
|
||||||
|
|
||||||
|
**Note:** Some columns *may* not directly map to fields on the Resource, but instead may
|
||||||
|
be a summary of fields.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get -o=wide deployments nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
|
||||||
|
nginx 1 1 1 1 26s nginx nginx app=nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Custom Columns
|
||||||
|
|
||||||
|
Print out specific fields as Columns.
|
||||||
|
|
||||||
|
**Note:** Custom Columns can also be read from a file using `-o custom-columns-file`.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments -o custom-columns="Name:metadata.name,Replicas:spec.replicas,Strategy:spec.strategy.type"
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Name Replicas Strategy
|
||||||
|
nginx 1 RollingUpdate
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
#### Labels
|
||||||
|
|
||||||
|
Print out specific labels each as their own columns
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get deployments -L=app
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE APP
|
||||||
|
nginx 1 1 1 1 8m nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Show Labels
|
||||||
|
|
||||||
|
Print out all labels on each Resource in a single column (last).
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment --show-labels
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE LABELS
|
||||||
|
nginx 1 1 1 1 7m app=nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
### Show Kind
|
||||||
|
|
||||||
|
Print out the Group.Kind as part of the Name column.
|
||||||
|
|
||||||
|
**Note:** This can be useful if the user did not specify the group in the command and
|
||||||
|
they want to know which API is being used.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployments --show-kind
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||||||
|
deployment.extensions/nginx 1 1 1 1 8m
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
{% panel style="info", title="TL;DR" %}
|
||||||
|
- Continuously Watch and print Resources as they change
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
# Watching Resources for changes
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Print Resources as they are updated.
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
It is possible to have `kubectl get` **continuously watch for changes to objects**, and print the objects
|
||||||
|
when they are changed or when the watch is reestablished.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get deployments --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||||||
|
nginx 1 1 1 1 6h
|
||||||
|
nginx2 1 1 1 1 21m
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
|
{% panel style="danger", title="Watch Timeouts" %}
|
||||||
|
Watch **timesout after 5 minutes**, after which kubectl will re-establish the watch and print the
|
||||||
|
resources.
|
||||||
|
{% endpanel %}
|
||||||
|
|
||||||
|
{% method %}
|
||||||
|
|
||||||
|
It is possible to have `kubectl get` continuously watch for changes to objects **without fetching them first**
|
||||||
|
using the `--watch-only` flag.
|
||||||
|
|
||||||
|
{% sample lang="yaml" %}
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl get deployments --watch-only
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endmethod %}
|
||||||
|
|
||||||
Loading…
Reference in New Issue