Merge pull request #12595 from smarterclayton/add_pod_status_ip

Add status.podIP as a valid downward API target
pull/6/head
Brendan Burns 2015-08-14 20:29:50 -07:00
commit a9580a0ad0
8 changed files with 30 additions and 5 deletions

View File

@ -51,6 +51,7 @@ The following information is available to a `Pod` through the downward API:
* The pod's name
* The pod's namespace
* The pod's IP
More information will be exposed through this same API over time.
@ -101,6 +102,10 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
restartPolicy: Never
```

View File

@ -61,8 +61,9 @@ through the pod logs to see that the pod was injected with the correct values:
```console
$ kubectl logs dapi-test-pod | grep POD_
2015-04-30T20:22:18.568024817Z POD_NAME=dapi-test-pod
2015-04-30T20:22:18.568087688Z POD_NAMESPACE=default
2015-04-30T20:22:18.568024817Z MY_POD_NAME=dapi-test-pod
2015-04-30T20:22:18.568087688Z MY_POD_NAMESPACE=default
2015-04-30T20:22:18.568092435Z MY_POD_IP=10.0.1.6
```

View File

@ -16,4 +16,8 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
restartPolicy: Never

View File

@ -44,6 +44,7 @@ func addConversionFuncs() {
case "metadata.name",
"metadata.namespace",
"status.phase",
"status.podIP",
"spec.nodeName":
return label, value, nil
// This is for backwards compatibility with old v1 clients which send spec.host

View File

@ -680,7 +680,7 @@ func validateEnvVarValueFrom(ev api.EnvVar) errs.ValidationErrorList {
return allErrs
}
var validFieldPathExpressions = util.NewStringSet("metadata.name", "metadata.namespace")
var validFieldPathExpressions = util.NewStringSet("metadata.name", "metadata.namespace", "status.podIP")
func validateObjectFieldSelector(fs *api.ObjectFieldSelector) errs.ValidationErrorList {
allErrs := errs.ValidationErrorList{}

View File

@ -667,7 +667,7 @@ func TestValidateEnv(t *testing.T) {
},
},
}},
expectedError: "[0].valueFrom.fieldRef.fieldPath: unsupported value 'status.phase', Details: supported values: metadata.name, metadata.namespace",
expectedError: "[0].valueFrom.fieldRef.fieldPath: unsupported value 'status.phase', Details: supported values: metadata.name, metadata.namespace, status.podIP",
},
}
for _, tc := range errorCases {

View File

@ -1051,7 +1051,10 @@ func (kl *Kubelet) podFieldSelectorRuntimeValue(fs *api.ObjectFieldSelector, pod
if err != nil {
return "", err
}
switch internalFieldPath {
case "status.podIP":
return pod.Status.PodIP, nil
}
return fieldpath.ExtractFieldPathAsString(pod, internalFieldPath)
}

View File

@ -1187,6 +1187,15 @@ func TestMakeEnvironmentVariables(t *testing.T) {
},
},
},
{
Name: "POD_IP",
ValueFrom: &api.EnvVarSource{
FieldRef: &api.ObjectFieldSelector{
APIVersion: testapi.Version(),
FieldPath: "status.podIP",
},
},
},
},
},
masterServiceNs: "nothing",
@ -1194,6 +1203,7 @@ func TestMakeEnvironmentVariables(t *testing.T) {
expectedEnvs: []kubecontainer.EnvVar{
{Name: "POD_NAME", Value: "dapi-test-pod-name"},
{Name: "POD_NAMESPACE", Value: "downward-api"},
{Name: "POD_IP", Value: "1.2.3.4"},
},
},
{
@ -1345,6 +1355,7 @@ func TestMakeEnvironmentVariables(t *testing.T) {
Name: "dapi-test-pod-name",
},
}
testPod.Status.PodIP = "1.2.3.4"
result, err := kl.makeEnvironmentVariables(testPod, tc.container)
if err != nil {