Helm pod deployment loop

45 views Asked by At

I have a list of 50 cities, trying to reuse the same deployment template to spin up 5 pods each containing 10 containers (representing 10 cities ) in it.

I managed to create a pod (50 pods) deployment per city. Couldn't figure out how to split 10 cities per pod.

sample code

{{ if .Values.enabled }}
{{- range $i, $value := .Values.cities }}
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-{{ . }}"
spec:
  nodeSelector:
    "kubernetes.io/os": linux
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-{{ $value }}"

---
{{- end }}
{{ end }}
1

There are 1 answers

3
larsks On BEST ANSWER

For starters, you're going to need a nested loop -- one to create multiple pods, and then within each pod you'll need a loop to create multiple containers.

For the outer loop, we can use untilStep to loop over the number of cities in steps of 10, like this:

{{- $cityCount := len .Values.cities }}
{{- range $beginningOfRange := untilStep 0 $cityCount 10 }}
beginningOfRange: {{ $beginningOfRange }}
{{end}}

Assuming there are 50 cities in our list, that gets us:

---
# Source: example/templates/pod.yaml
beginningOfRange: 0

beginningOfRange: 10

beginningOfRange: 20

beginningOfRange: 30

beginningOfRange: 40

For the inner loop, we need to go from $beginningOfRange to $beginningOfRange + 10, which we can do like this:

{{- $cityCount := len .Values.cities }}
{{- range $beginningOfRange := untilStep 0 $cityCount 10 }}
beginningOfRange: {{ $beginningOfRange }}
cities:
{{- $endOfRange := add $beginningOfRange 10 | int}}
{{- range $cityNumber := untilStep $beginningOfRange $endOfRange 1 }}
- cityNumber: {{ $cityNumber }}
{{- end }}
{{end}}

Which gets us:

---
# Source: example/templates/pod.yaml
beginningOfRange: 0
cities:
- cityNumber: 0
- cityNumber: 1
- cityNumber: 2
- cityNumber: 3
- cityNumber: 4
- cityNumber: 5
- cityNumber: 6
- cityNumber: 7
- cityNumber: 8
- cityNumber: 9

beginningOfRange: 10
cities:
- cityNumber: 10
- cityNumber: 11
- cityNumber: 12
- cityNumber: 13
- cityNumber: 14
- cityNumber: 15
- cityNumber: 16
- cityNumber: 17
- cityNumber: 18
- cityNumber: 19

beginningOfRange: 20
cities:
- cityNumber: 20
- cityNumber: 21
- cityNumber: 22
- cityNumber: 23
- cityNumber: 24
- cityNumber: 25
- cityNumber: 26
- cityNumber: 27
- cityNumber: 28
- cityNumber: 29

.
.
.

As you can see, we now have the basic structure for our template. If we modify your original template, we get something like this:

{{- $cityCount := len .Values.cities }}
{{- range $beginningOfRange := untilStep 0 $cityCount 10 }}
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-{{ $beginningOfRange }}"
spec:
  containers:
{{- $endOfRange := add $beginningOfRange 10 | int}}
{{- range $cityNumber := untilStep $beginningOfRange $endOfRange 1 }}
{{- if lt $cityNumber $cityCount }}
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-{{ $cityNumber }}"
      env:
        - name: CITY_NAME
          value: "{{ index $.Values.cities $cityNumber }}"
{{- end }}
{{- end }}
---
{{end}}

Assuming that .Values.cities has a list of US state capitals, this will generate output like:

---
# Source: example/templates/pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-0"
spec:
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-0"
      env:
        - name: CITY_NAME
          value: "Montgomery, Alabama"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-1"
      env:
        - name: CITY_NAME
          value: "Juneau, Alaska"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-2"
      env:
        - name: CITY_NAME
          value: "Phoenix, Arizona"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-3"
      env:
        - name: CITY_NAME
          value: "Little-Rock, Arkansas"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-4"
      env:
        - name: CITY_NAME
          value: "Sacramento, California"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-5"
      env:
        - name: CITY_NAME
          value: "Denver, Colorado"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-6"
      env:
        - name: CITY_NAME
          value: "Hartford, Connecticut"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-7"
      env:
        - name: CITY_NAME
          value: "Dover, Delaware"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-8"
      env:
        - name: CITY_NAME
          value: "Tallahassee, Florida"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-9"
      env:
        - name: CITY_NAME
          value: "Atlanta, Georgia"
---
# Source: example/templates/pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-10"
spec:
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-10"
      env:
        - name: CITY_NAME
          value: "Honolulu, Hawaii"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-11"
      env:
        - name: CITY_NAME
          value: "Boise, Idaho"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-12"
      env:
        - name: CITY_NAME
          value: "Springfield, Illinois"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-13"
      env:
        - name: CITY_NAME
          value: "Indianapolis, Indiana"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-14"
      env:
        - name: CITY_NAME
          value: "Des-Moines, Iowa"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-15"
      env:
        - name: CITY_NAME
          value: "Topeka, Kansas"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-16"
      env:
        - name: CITY_NAME
          value: "Frankfort, Kentucky"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-17"
      env:
        - name: CITY_NAME
          value: "Baton-Rouge, Louisiana"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-18"
      env:
        - name: CITY_NAME
          value: "Augusta, Maine"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-19"
      env:
        - name: CITY_NAME
          value: "Annapolis, Maryland"
---
# Source: example/templates/pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-20"
spec:
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-20"
      env:
        - name: CITY_NAME
          value: "Boston, Massachusetts"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-21"
      env:
        - name: CITY_NAME
          value: "Lansing, Michigan"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-22"
      env:
        - name: CITY_NAME
          value: "St.-Paul, Minnesota"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-23"
      env:
        - name: CITY_NAME
          value: "Jackson, Mississippi"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-24"
      env:
        - name: CITY_NAME
          value: "Jefferson-City, Missouri"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-25"
      env:
        - name: CITY_NAME
          value: "Helena, Montana"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-26"
      env:
        - name: CITY_NAME
          value: "Lincoln, Nebraska"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-27"
      env:
        - name: CITY_NAME
          value: "Carson-City, Nevada"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-28"
      env:
        - name: CITY_NAME
          value: "Concord, New-Hampshire"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-29"
      env:
        - name: CITY_NAME
          value: "Trenton, New-Jersey"
---
# Source: example/templates/pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-30"
spec:
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-30"
      env:
        - name: CITY_NAME
          value: "Santa-Fe, New-Mexico"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-31"
      env:
        - name: CITY_NAME
          value: "Albany, New-York"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-32"
      env:
        - name: CITY_NAME
          value: "Raleigh, North-Carolina"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-33"
      env:
        - name: CITY_NAME
          value: "Bismarck, North-Dakota"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-34"
      env:
        - name: CITY_NAME
          value: "Columbus, Ohio"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-35"
      env:
        - name: CITY_NAME
          value: "Oklahoma-City, Oklahoma"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-36"
      env:
        - name: CITY_NAME
          value: "Salem, Oregon"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-37"
      env:
        - name: CITY_NAME
          value: "Harrisburg, Pennsylvania"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-38"
      env:
        - name: CITY_NAME
          value: "Providence, Rhode-Island"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-39"
      env:
        - name: CITY_NAME
          value: "Columbia, South-Carolina"
---
# Source: example/templates/pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: "nginx-blob-40"
spec:
  containers:
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-40"
      env:
        - name: CITY_NAME
          value: "Pierre, South-Dakota"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-41"
      env:
        - name: CITY_NAME
          value: "Nashville, Tennessee"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-42"
      env:
        - name: CITY_NAME
          value: "Austin, Texas"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-43"
      env:
        - name: CITY_NAME
          value: "Salt-Lake-City, Utah"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-44"
      env:
        - name: CITY_NAME
          value: "Montpelier, Vermont"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-45"
      env:
        - name: CITY_NAME
          value: "Richmond, Virginia"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-46"
      env:
        - name: CITY_NAME
          value: "Olympia, Washington"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-47"
      env:
        - name: CITY_NAME
          value: "Charleston, West-Virginia"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-48"
      env:
        - name: CITY_NAME
          value: "Madison, Wisconsin"
    - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
      name: "nginx-blob-49"
      env:
        - name: CITY_NAME
          value: "Cheyenne, Wyoming"