Author a Helm Chart for Your Application
Author a Helm chart to deploy your application on IronSled — scaffold a chart with helm create, configure Chart.yaml and values.yaml (image repository and tag, imagePullSecrets, securityContext, service, ingress, resources, autoscaling, liveness/readiness probes), point the chart at your uploaded image in the internal registry, install and upgrade with helm, verify the release, and roll back. External vendors must commit their own chart and README.
A Helm chart packages everything Kubernetes needs to run your application — the Deployment, Service, Ingress, resource limits, and probes — as a single versioned unit driven by a values.yaml file. On IronSled, your application is deployed from a Helm chart, and every project is provisioned with a Helm chart repository during onboarding.
External vendors must commit their own Helm chart and a README to the chart repository provisioned during onboarding — it is a hard prerequisite for deployment. The IronSled platform team cannot stand up your application until the chart is in place. (Internal teams get help building one.) The chart should deploy the images you uploaded by referencing them from the internal registry.
Scaffold the Chart
Generate a chart skeleton with helm create:
helm create my-appThis produces the standard chart structure:
my-app/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── hpa.yaml
│ ├── serviceaccount.yaml
│ ├── _helpers.tpl
│ ├── NOTES.txt
│ └── tests/
└── charts/You configure the chart mainly through Chart.yaml (metadata) and values.yaml (what actually gets deployed). Commit this chart, along with a README describing your application, to the Helm chart repository provisioned for your project.
Configure Chart.yaml
Chart.yaml holds the chart's metadata and version:
apiVersion: v2
name: my-app
description: My Application Helm Chart
type: application
version: 1.0.0
appVersion: "1.0.0"
maintainers:
- name: Your Name
email: your.email@example.comBump version whenever you change the chart, and set appVersion to the version of the application it deploys.
Configure values.yaml
values.yaml is where you set the image, security context, networking, resources, autoscaling, and health probes. A production-ready starting point:
replicaCount: 3
image:
repository: registry.example.com/my-app
pullPolicy: IfNotPresent
tag: "v1.0.0"
imagePullSecrets:
- name: regcred
serviceAccount:
create: true
name: ""
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: my-app.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: my-app-tls
hosts:
- my-app.example.com
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
livenessProbe:
httpGet:
path: /healthz
port: http
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: http
initialDelaySeconds: 5
periodSeconds: 5The securityContext block above (run as non-root, read-only root filesystem, drop all capabilities) reflects the hardened defaults expected on IronSled — keep them unless your application genuinely needs otherwise.
Point the Chart at Your Image
Set image.repository and image.tag to the image you published to the internal registry. IronSled images are pulled from registry.ironsled.com, so a published image reference looks like:
image:
repository: registry.ironsled.com/<project>/<image>
tag: "<tag>" # the tag you uploaded, e.g. 1.0.0Use the exact tag you gave the image when you uploaded or built it. Because the registry is private, the pod needs an image-pull secret (imagePullSecrets) that grants access — see Kubernetes Secrets for creating a docker-registry secret.
Install and Upgrade
Install the chart into your namespace, then use the same command to upgrade — helm upgrade --install is idempotent:
# Create the namespace (first time only)
kubectl create namespace my-app
# Install or upgrade the release
helm upgrade --install my-app ./my-app \
--namespace my-app \
--values values.yaml
# Override values at deploy time (e.g. a new image tag)
helm upgrade --install my-app ./my-app \
--namespace my-app \
--set image.tag=v2.0.0Verify the Release
Confirm the release and its workloads are healthy:
# Release status
helm list -n my-app
helm status my-app -n my-app
# Kubernetes objects
kubectl get pods -n my-app
kubectl get svc my-app -n my-app
kubectl get ingress -n my-appIf pods do not reach Running, see Debug Pods.
Roll Back
If an upgrade goes wrong, roll back to the previous revision:
# List revision history
helm history my-app -n my-app
# Roll back to the previous revision
helm rollback my-app -n my-app
# Or roll back to a specific revision number
helm rollback my-app 3 -n my-appFor a Deployment-level undo without Helm, use kubectl rollout undo deployment my-app -n my-app.
Kubernetes Secrets and the External Secrets Operator
Create and consume secrets in Kubernetes on IronSled — kubectl create secret from literals/files/YAML, Opaque data vs stringData, mounting secrets as environment variables or files, image-pull secrets, rotating secrets and restarting pods, and using the External Secrets Operator (ESO) to sync secrets from AWS Secrets Manager into your namespace.
Debug Pods and Common Failures
Troubleshoot Kubernetes pods on IronSled — read pod status and common states (Pending, ImagePullBackOff, CrashLoopBackOff), fix each failure mode, view and stream logs with kubectl logs (--previous, --tail, --since), exec into containers, use ephemeral kubectl debug containers, inspect events and describe output, check resource usage with kubectl top, verify ConfigMaps/Secrets/volumes, and follow a debug checklist.