When using Argo daemon containers, referencing the IP of a previous step is well-supported via the {{steps.<step-name>.ip}}
variable:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: sidecar-nginx-
spec:
entrypoint: sidecar-nginx-example
templates:
- name: sidecar-nginx-example
steps:
- - name: start-nginx
template: nginx-daemon
- - name: curl-nginx
template: curl-container
arguments:
parameters:
- name: nginx-ip
value: "{{steps.start-nginx.ip}}"
- name: nginx-daemon
daemon: true
retryStrategy:
limit: 3
container:
name: nginx
image: nginx:1.13
command: [nginx, -g, "daemon off;"]
nodeSelector:
kubernetes.io/os: linux
- name: curl-container
inputs:
parameters:
- name: nginx-ip
container:
image: appropriate/curl
command: [sh, -c]
args: ["until `curl -G 'http://{{inputs.parameters.nginx-ip}}/' >& /tmp/out`; do echo sleep && sleep 1; done && cat /tmp/out"]
nodeSelector:
kubernetes.io/os: linux
However, when using non-daemon containers, the convenient {{steps.<step-name>.ip}}
variable is not available. So I’m looking for a good way to access pod metadata (IP or name) in later workflow steps.
Here is one approach:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: pod-name-passing-example-
spec:
entrypoint: main
templates:
- name: main
steps:
- - name: get-pod-name
template: get-pod-name
- - name: use-pod-name
template: use-pod-name
arguments:
parameters:
- name: pod-name
value: "{{steps.get-pod-name.outputs.parameters.pod-name}}"
- name: get-pod-name
outputs:
parameters:
- name: pod-name
value: "{{pod.name}}"
container:
image: alpine:3.7
command: [sh, -c]
args: ["echo Capturing pod name"]
- name: use-pod-name
inputs:
parameters:
- name: pod-name
container:
image: alpine:3.7
command: [sh, -c]
args: ["echo Step 1 Pod Name is {{inputs.parameters.pod-name}}"]
Another approach could be extracting pod metadata from environment variables:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: pod-metadata-env-
spec:
entrypoint: main
templates:
- name: main
container:
image: alpine:3.7
command: [sh, -c]
args: ["echo Pod Name: $MY_POD_NAME && echo Namespace: $MY_POD_NAMESPACE && echo Pod IP: $MY_POD_IP"]
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
nodeSelector:
kubernetes.io/os: linux
What would be best practice in this case, either these or some other approach?
For reference, the question is motivated by Argo’s apparent lack of support for Windows daemon containers.
1