Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save x95castle1/f5d89ac3e6a2f29a2f450128c8e27f37 to your computer and use it in GitHub Desktop.
Save x95castle1/f5d89ac3e6a2f29a2f450128c8e27f37 to your computer and use it in GitHub Desktop.
Statefulset Workload Type for TAP
#@ load("@ytt:data", "data")
---
apiVersion: carto.run/v1alpha1
kind: ClusterConfigTemplate
metadata:
name: statefulset-template
annotations:
doc: |
This template consumes an input named config which contains a
PodTemplateSpec and returns a ConfigMap which contains a
"delivery.yml" which contains a manifests for a Kubernetes
Deployment which will run the templated pod, and a "service.yml"
Kubernetes Service to expose the pods on the network.
This template creates a deployment that allows you to control
the replicas!
spec:
configPath: .data
params:
- name: replicas
default: 1
- name: ports
default:
- containerPort: 8080
port: 8080
name: http
healthRule:
alwaysHealthy: {}
#@ label_exclusions = "[\"" + "\", \"".join(["kapp.k14s.io/app", "kapp.k14s.io/association"]) + "\"]"
#@yaml/text-templated-strings
ytt: |
#@ load("@ytt:data", "data")
#@ load("@ytt:yaml", "yaml")
#@ load("@ytt:struct", "struct")
#@ load("@ytt:assert", "assert")
#@ load("@ytt:overlay", "overlay")
#@ def merge_labels(fixed_values):
#@ labels = {}
#@ if hasattr(data.values.workload.metadata, "labels"):
#@ exclusions = (@= label_exclusions @)
#@ for k,v in dict(data.values.workload.metadata.labels).items():
#@ if k not in exclusions:
#@ labels[k] = v
#@ end
#@ end
#@ end
#@ labels.update(fixed_values)
#@ return labels
#@ end
#@ def intOrString(v):
#@ return v if type(v) == "int" else int(v.strip()) if v.strip().isdigit() else v
#@ end
#@ def merge_ports(ports_spec, containers):
#@ ports = {}
#@ for c in containers:
#@ for p in getattr(c, "ports", []):
#@ ports[p.containerPort] = {"targetPort": p.containerPort, "port": p.containerPort, "name": getattr(p, "name", str(p.containerPort))}
#@ end
#@ end
#@ for p in ports_spec:
#@ targetPort = getattr(p, "containerPort", p.port)
#@ type(targetPort) in ("string", "int") or fail("containerPort must be a string or int")
#@ targetPort = intOrString(targetPort)
#@
#@ port = p.port
#@ type(port) in ("string", "int") or fail("port must be a string or int")
#@ port = int(port)
#@ ports[p.port] = {"targetPort": targetPort, "port": port, "name": getattr(p, "name", str(p.port))}
#@ end
#@ return ports.values()
#@ end
#@ def param(key):
#@ if not key in data.values.params:
#@ return None
#@ end
#@ return data.values.params[key]
#@ end
#@ def overlayvolumes():
#@overlay/match by=overlay.subset({"kind":"StatefulSet"}), expects="0+"
---
spec:
template:
#@overlay/match missing_ok=True
volumeClaimTemplates: #@ param("volumeclaimtemplate")
spec:
#@overlay/match missing_ok=True
volumemounts: #@ param("volumemounts")
#@ end
#@ def delivery():
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: #@ data.values.workload.metadata.name
annotations:
kapp.k14s.io/update-strategy: "fallback-on-replace"
ootb.apps.tanzu.vmware.com/servicebinding-workload: "true"
kapp.k14s.io/change-rule: "upsert after upserting servicebinding.io/ServiceBindings"
labels: #@ merge_labels({ "app.kubernetes.io/component": "run", "carto.run/workload-name": data.values.workload.metadata.name })
spec:
serviceName: #@ data.values.workload.metadata.name
replicas: #@ data.values.params.replicas
selector:
matchLabels: #@ data.values.config.metadata.labels
template: #@ data.values.config
---
apiVersion: v1
kind: Service
metadata:
name: #@ data.values.workload.metadata.name
labels: #@ merge_labels({ "app.kubernetes.io/component": "run", "carto.run/workload-name": data.values.workload.metadata.name })
spec:
selector: #@ data.values.config.metadata.labels
ports:
#@ hasattr(data.values.params, "ports") and len(data.values.params.ports) or assert.fail("one or more ports param must be provided.")
#@ declared_ports = []
#@ if "ports" in data.values.params:
#@ declared_ports = data.values.params.ports
#@ else:
#@ declared_ports = struct.encode([{ "containerPort": 8080, "port": 8080, "name": "http"}])
#@ end
#@ for p in merge_ports(declared_ports, data.values.config.spec.containers):
- #@ p
#@ end
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: #@ data.values.workload.metadata.name
annotations:
projectcontour.io/tls-cert-namespace: kube-system
ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: contour
kapp.k14s.io/change-rule: "upsert after upserting Services"
labels: #@ merge_labels({ "app.kubernetes.io/component": "run", "carto.run/workload-name": data.values.workload.metadata.name })
spec:
tls:
- secretName: wildcard-cert
hosts:
- #@ data.values.workload.metadata.name
rules:
- host: #@ data.values.workload.metadata.name
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: #@ data.values.workload.metadata.name
port:
number: 8080
#@ end
---
apiVersion: v1
kind: ConfigMap
metadata:
name: #@ data.values.workload.metadata.name + "-server"
labels: #@ merge_labels({ "app.kubernetes.io/component": "config" })
data:
delivery.yml: #@ yaml.encode(overlay.apply(delivery(),overlayvolumes()))
apiVersion: carto.run/v1alpha1
kind: Workload
metadata:
name: ss-friday-java-web-app
labels:
apps.tanzu.vmware.com/workload-type: statefulset
apps.tanzu.vmware.com/auto-configure-actuators: "true"
app.kubernetes.io/part-of: ss-friday-java-web-app
spec:
build:
env:
- name: BP_JVM_VERSION
value: "11"
params:
- name: annotations
value:
autoscaling.knative.dev/minScale: "1"
- name: replicas
value: 3
- name: volumeclaimtemplate
value:
- metadata:
name: www
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: default
- name: volumemounts
value:
- name: www
mountPath: /usr/share/nginx/html
source:
git:
url: https://github.com/x95castle1/friday-java-web-app
ref:
branch: main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment