Replies: 19 comments 35 replies
Repositories vs Registries?V12 different types. repositories:
bitnami: https://charts.bitnami.com/bitnami
registries:
ghcr.io: {}V2Merge Repositories & Repositories into one spec. repositories:
bitnami: https://charts.bitnami.com/bitnami
ghcr.io: oci://ghcr.io |
Tags vs Labels?Labels! releases:
app@prod:
labels:
env: prod
db@prod:
labels:
env: prod
app@stage:
labels:
env: stage
db@stage:
labels:
env: stage
Label Logic!!! Looking for solutions glob:
RE
expressions, = , !=, >, <, ?
|
ValuesV1Non-map. values:
- s3://mybucket/config/file.json
- ../path/to/values.json
- src: git+https://github.com/hairyhenderson/gomplate//docs-src/content/functions/values.yml
alias: gitfileV2URL is a key. values:
"https://raw.githubusercontent.com/my.store.yml":
alias: my-store
render: sopsV3Alias is a key. values:
my:
src: https://raw.githubusercontent.com/my.yml
render: sopsThe third way looks good. |
StoreFilesreleases:
app:
storefiles:
my: # <--- this is an alias
src: https://raw.githubusercontent.com/my.store.yml
render: sops
values:
a: # <--- this is an alias
src: a.values.yml
render: copy
b: # <--- this is an alias
src: b.values.yml
render: copyHow to call the data from the store?
podLabels:
name: (ds "store/my").blaGet any stores by datasource by How to call the data from another value?!!! You can face a problem with cyclic dependencies.
podLabels:
name: (ds "values/a").blaGet any values by datasource by |
DefaultsDefaults can be passed by Any fields in this section can be passed by ENVIRONMENT VARIABLES. Example
defaults:
gomplate:
leftDelim: '[['
rightDelim: ']]'
It's equal to
defaults:
gomplate:
leftDelim: '[[' |
Gomplate vs Sprig?Gomplate! Sprig must die. |
Slice or Map?Map! releases:
- name: foo
- name: barreleases:
foo:
bar:It's prettier for yaml merge and finding the uniqname problems. |
Magic UniqnameUniqname is V1releases:
nginx@example@custom-context:
version: 0.3.0
nginx@hello: # = nginx@hello@my-shell-kube-context
version: 0.1.0
nginx: # = nginx@default@my-shell-kube-context
version: 0.2.0
Issues:
V2If you escalate to a new scope, you should also provide a new context for the uniqname. Uniqname is only a namereleases:
nginx: {} # ok
redis: {} # okUniqname escalates to namespaceIf one of the releases has a namespace, it means everyone should have a namespace. releases:
nginx@prod: {} # prod is a namespace
redis@stage: {} # stage is a namespace
my: {} # err invalid, namespace not defined.Uniqname escalates to kubecontextIf one of the releases has a kubecontext, it means everyone should have a kubecontext. releases:
nginx@default@stage: {} # stage is a kubecontext
nginx@default@prod : {} # prod is a kubecontext
my: {} # err invalid, namespace and kubecontext not defined.
my@default: {} # err invalid, namespace not defined. |
Deploy manifests step-by-stepOrder by weightapiVersion: v1
kind: ConfigMap
metadata:
name: order-by-weight
annotations:
"helmwave.app/weight": "1"flowchart LR
subgraph weight_0
configmap_A
configmap_B
end
weight_0 --> weight_1
subgraph weight_1
deployment_A
deployment_B
end
Issues
Order by NeedsapiVersion: v1
kind: Deployment
metadata:
name: order-by-needs
annotations:
"helmwave.app/needs": "configMap/order-by-weight,<$kind>/<$name>"flowchart LR
configmap_A --> deployment_A
configmap_B --> deployment_B
Issues
|
Levels of abstractionflowchart TD
configmap_A & deployment_A & service_A & ingress_A --> helm_chart_A
configmap_B & deployment_B & service_B & ingress_B --> helm_chart_B
helm_chart_A --> release_A1 & release_A2 --> helmwave
helm_chart_B --> release_B1 & release_B2 --> helmwave
|
Deploy releases step-by-stepStrict needsreleases:
app:
needs:
namespace:
prod: {}
name:
db: {}
labels:
app: dbIssues
Smart needsreleases:
app:
needs:
my-rule-name:
- namespace = "prod" and name = "db" and label.app = "db"Issues
|
Client-Side Apply (CSA) vs Server-Side Apply (SSA)Server-Side Apply! |
How to choose a render?V1Create an additional field where users can set a render. files:
my:
src:
url: https://raw.githubusercontent.com/my.yml
render: sopsV2KISS, it's the users' responsibility. Users can use Overriding MIME Types
files:
only-copy-file:
src: https://raw.githubusercontent.com/my.yml?type=text/plain
render-and-copy:
src: https://raw.githubusercontent.com/my.yml
sops-and-copy:
src: https://raw.githubusercontent.com/my.yml?type=text/sops # create custom MIME types for specific usage.V3Use Headers to pass options files:
only-copy-file:
src:
url: https://raw.githubusercontent.com/my.yml
header:
x-bla-type: text/plain # create custom header
render-and-copy:
src:
url: https://raw.githubusercontent.com/my.yml
sops-and-copy:
src:
url: https://raw.githubusercontent.com/my.yml
header:
x-bla-type: text/sops # create custom header with custom valuesV4Define options by extensions? If a file extension is If a file extension is The default behavior is just to copy. files:
only-copy-file:
src: https://raw.githubusercontent.com/my.yml
render-and-copy:
src: https://raw.githubusercontent.com/my.yml.tpl
sops-and-copy:
src: https://raw.githubusercontent.com/my.sops.ymlV5like V4, but extensions defined in aliases. files:
my.yml: # <-- just copy
src: https://raw.githubusercontent.com/my.txt
my.yml.tpl: # <-- render and copy
src: https://raw.githubusercontent.com/my.txt
my.yml.sops: # <-- sops and copy
src: https://raw.githubusercontent.com/my.txtThe easiest way to understand is V1 or V4. |
Version pinning ?Nice suggestions, but I think we miss a very important feature: version pinning. Its a bad practice to always take the latest version of a chart, its safer to update charts manually. Or have a system where only patch versions are update automatically. Helm and Helmfile tool are supporting this https://helm.sh/docs/chart_best_practices/dependencies/#versions . charts.lock.yaml always get version like this in helmwave.yml.tml if I want to programatilly check for available updates, I need to run a set of commands (I put it in a Gitlab CI job). Providing an empty chart.lock.yaml makes helmwave create a planfile with latest version of charts. as you can see its very home-made, it would be amazing to integrate such feature into helmwave |
PlandirV1.helmwave/
Deploy with kubectlRun the pull modelV2.helmwave/
|
helmwave.yml.tplSelf-render configuration. V1Left 2 steps for render. It's current behavior. helmwave.yml.tpl -- helmwave yml --> helmwave.yml V2Only 1 file! helmwave.yml can contain templating. For example werf.yml, (Pulumi.yaml)[https://www.pulumi.com/blog/pulumi-yaml/] You will get a template error in |
Plan behaviorV1The current concept is that a plan is a subject on which you can perform actions. Such as deploy a plan, delete a plan, and rollback a plan. It means that if you delete the release from the plan. It won't delete the release. For example, you need to uninstall the release FooBar flowchart LR
subgraph Plan
release_A
release_B
end
generate((generate)) --> Plan --> up((up)) & down((down)) & rollback((rollback))
V2Plan it's what we want to see in a k8s cluster. It means a plan is a list of actions for a deployer. releases:
a:
plan: uninstall
b:
plan: install
c:
plan: rollbackThus, inconsistency of the plan may occur. When the command flowchart LR
up((up))
down((down))
rollback((rollback))
subgraph Plan
release_A --> down
release_B --> up
release_C --> rollback
end
generate((generate)) --> Plan --> apply((apply))
V3It's like V1. Set the option behavior for helmwave cli.
Issues
V4is coming... |


Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
helmwave.yml
It's not a final! Just the current developed version.
All reactions