mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Merge pull request #42717 from andrewsykim/support-host-ip-downward-api
Automatic merge from submit-queue Support status.hostIP in downward API **What this PR does / why we need it**: Exposes pod's hostIP (node IP) via downward API. **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes https://github.com/kubernetes/kubernetes/issues/24657 **Special notes for your reviewer**: Not sure if there's more documentation that's needed, please point me in the right direction and I will add some :)
This commit is contained in:
commit
e28cb42706
@ -38347,7 +38347,7 @@
|
|||||||
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapKeySelector"
|
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapKeySelector"
|
||||||
},
|
},
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.",
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.",
|
||||||
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ObjectFieldSelector"
|
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ObjectFieldSelector"
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
|
@ -3768,7 +3768,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -2551,7 +2551,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -3584,7 +3584,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -8015,7 +8015,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -1125,7 +1125,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -19380,7 +19380,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"$ref": "v1.ObjectFieldSelector",
|
"$ref": "v1.ObjectFieldSelector",
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP."
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP."
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
"$ref": "v1.ResourceFieldSelector",
|
"$ref": "v1.ResourceFieldSelector",
|
||||||
|
@ -2498,7 +2498,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -6270,7 +6270,7 @@ Examples:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-21 14:22:21 UTC
|
Last updated 2017-03-28 17:18:11 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -3741,7 +3741,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -5512,7 +5512,7 @@ Examples:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-21 14:22:57 UTC
|
Last updated 2017-03-28 17:18:59 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -3568,7 +3568,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -5608,7 +5608,7 @@ Examples:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-27 13:42:49 UTC
|
Last updated 2017-03-28 20:12:14 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -3090,7 +3090,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -7917,7 +7917,7 @@ Both these may change in the future. Incoming requests are matched against the h
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-21 14:23:11 UTC
|
Last updated 2017-03-28 17:19:22 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -2783,7 +2783,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -3806,7 +3806,7 @@ Examples:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-21 14:23:30 UTC
|
Last updated 2017-03-28 17:19:50 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -3554,7 +3554,7 @@ The resulting set of endpoints can be viewed as:<br>
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">fieldRef</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectfieldselector">v1.ObjectFieldSelector</a></p></td>
|
||||||
<td class="tableblock halign-left valign-top"></td>
|
<td class="tableblock halign-left valign-top"></td>
|
||||||
@ -9857,7 +9857,7 @@ Examples:<br>
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2017-03-21 14:22:15 UTC
|
Last updated 2017-03-28 17:18:02 UTC
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -9851,7 +9851,7 @@
|
|||||||
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapKeySelector"
|
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ConfigMapKeySelector"
|
||||||
},
|
},
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.",
|
"description": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.",
|
||||||
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ObjectFieldSelector"
|
"$ref": "#/definitions/io.k8s.kubernetes.pkg.api.v1.ObjectFieldSelector"
|
||||||
},
|
},
|
||||||
"resourceFieldRef": {
|
"resourceFieldRef": {
|
||||||
|
@ -1250,7 +1250,7 @@ type EnvVar struct {
|
|||||||
// Only one of its fields may be set.
|
// Only one of its fields may be set.
|
||||||
type EnvVarSource struct {
|
type EnvVarSource struct {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
FieldRef *ObjectFieldSelector
|
FieldRef *ObjectFieldSelector
|
||||||
// Selects a resource of the container: only resources limits and requests
|
// Selects a resource of the container: only resources limits and requests
|
||||||
|
@ -190,6 +190,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
"spec.restartPolicy",
|
"spec.restartPolicy",
|
||||||
"spec.serviceAccountName",
|
"spec.serviceAccountName",
|
||||||
"status.phase",
|
"status.phase",
|
||||||
|
"status.hostIP",
|
||||||
"status.podIP":
|
"status.podIP":
|
||||||
return label, value, nil
|
return label, value, nil
|
||||||
// This is for backwards compatibility with old v1 clients which send spec.host
|
// This is for backwards compatibility with old v1 clients which send spec.host
|
||||||
|
@ -899,7 +899,7 @@ message EnvVar {
|
|||||||
// EnvVarSource represents a source for the value of an EnvVar.
|
// EnvVarSource represents a source for the value of an EnvVar.
|
||||||
message EnvVarSource {
|
message EnvVarSource {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
optional ObjectFieldSelector fieldRef = 1;
|
optional ObjectFieldSelector fieldRef = 1;
|
||||||
|
|
||||||
|
@ -1349,7 +1349,7 @@ type EnvVar struct {
|
|||||||
// EnvVarSource represents a source for the value of an EnvVar.
|
// EnvVarSource represents a source for the value of an EnvVar.
|
||||||
type EnvVarSource struct {
|
type EnvVarSource struct {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
FieldRef *ObjectFieldSelector `json:"fieldRef,omitempty" protobuf:"bytes,1,opt,name=fieldRef"`
|
FieldRef *ObjectFieldSelector `json:"fieldRef,omitempty" protobuf:"bytes,1,opt,name=fieldRef"`
|
||||||
// Selects a resource of the container: only resources limits and requests
|
// Selects a resource of the container: only resources limits and requests
|
||||||
|
@ -481,7 +481,7 @@ func (EnvVar) SwaggerDoc() map[string]string {
|
|||||||
|
|
||||||
var map_EnvVarSource = map[string]string{
|
var map_EnvVarSource = map[string]string{
|
||||||
"": "EnvVarSource represents a source for the value of an EnvVar.",
|
"": "EnvVarSource represents a source for the value of an EnvVar.",
|
||||||
"fieldRef": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.",
|
"fieldRef": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.",
|
||||||
"resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.",
|
"resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.",
|
||||||
"configMapKeyRef": "Selects a key of a ConfigMap.",
|
"configMapKeyRef": "Selects a key of a ConfigMap.",
|
||||||
"secretKeyRef": "Selects a key of a secret in the pod's namespace",
|
"secretKeyRef": "Selects a key of a secret in the pod's namespace",
|
||||||
|
@ -1416,7 +1416,7 @@ func ValidateEnv(vars []api.EnvVar, fldPath *field.Path) field.ErrorList {
|
|||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
var validFieldPathExpressionsEnv = sets.NewString("metadata.name", "metadata.namespace", "spec.nodeName", "spec.serviceAccountName", "status.podIP")
|
var validFieldPathExpressionsEnv = sets.NewString("metadata.name", "metadata.namespace", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP")
|
||||||
var validContainerResourceFieldPathExpressions = sets.NewString("limits.cpu", "limits.memory", "requests.cpu", "requests.memory")
|
var validContainerResourceFieldPathExpressions = sets.NewString("limits.cpu", "limits.memory", "requests.cpu", "requests.memory")
|
||||||
|
|
||||||
func validateEnvVarValueFrom(ev api.EnvVar, fldPath *field.Path) field.ErrorList {
|
func validateEnvVarValueFrom(ev api.EnvVar, fldPath *field.Path) field.ErrorList {
|
||||||
|
@ -2153,6 +2153,24 @@ func TestValidateEnv(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "abc",
|
||||||
|
ValueFrom: &api.EnvVarSource{
|
||||||
|
FieldRef: &api.ObjectFieldSelector{
|
||||||
|
APIVersion: api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(),
|
||||||
|
FieldPath: "status.hostIP",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "abc",
|
||||||
|
ValueFrom: &api.EnvVarSource{
|
||||||
|
FieldRef: &api.ObjectFieldSelector{
|
||||||
|
APIVersion: api.Registry.GroupOrDie(api.GroupName).GroupVersion.String(),
|
||||||
|
FieldPath: "status.podIP",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "secret_value",
|
Name: "secret_value",
|
||||||
ValueFrom: &api.EnvVarSource{
|
ValueFrom: &api.EnvVarSource{
|
||||||
@ -2328,7 +2346,7 @@ func TestValidateEnv(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.podIP`,
|
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "invalid fieldPath annotations",
|
name: "invalid fieldPath annotations",
|
||||||
@ -2341,7 +2359,7 @@ func TestValidateEnv(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.annotations": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.podIP`,
|
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.annotations": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "unsupported fieldPath",
|
name: "unsupported fieldPath",
|
||||||
@ -2354,7 +2372,7 @@ func TestValidateEnv(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
expectedError: `valueFrom.fieldRef.fieldPath: Unsupported value: "status.phase": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.podIP`,
|
expectedError: `valueFrom.fieldRef.fieldPath: Unsupported value: "status.phase": supported values: metadata.name, metadata.namespace, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range errorCases {
|
for _, tc := range errorCases {
|
||||||
|
@ -41,11 +41,6 @@ func FormatMap(m map[string]string) (fmtStr string) {
|
|||||||
// ExtractFieldPathAsString extracts the field from the given object
|
// ExtractFieldPathAsString extracts the field from the given object
|
||||||
// and returns it as a string. The object must be a pointer to an
|
// and returns it as a string. The object must be a pointer to an
|
||||||
// API type.
|
// API type.
|
||||||
//
|
|
||||||
// Currently, this API is limited to supporting the fieldpaths:
|
|
||||||
//
|
|
||||||
// 1. metadata.name - The name of an API object
|
|
||||||
// 2. metadata.namespace - The namespace of an API object
|
|
||||||
func ExtractFieldPathAsString(obj interface{}, fieldPath string) (string, error) {
|
func ExtractFieldPathAsString(obj interface{}, fieldPath string) (string, error) {
|
||||||
accessor, err := meta.Accessor(obj)
|
accessor, err := meta.Accessor(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -3355,7 +3355,7 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope
|
|||||||
Properties: map[string]spec.Schema{
|
Properties: map[string]spec.Schema{
|
||||||
"fieldRef": {
|
"fieldRef": {
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
Description: "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.",
|
Description: "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.",
|
||||||
Ref: ref("k8s.io/kubernetes/pkg/api/v1.ObjectFieldSelector"),
|
Ref: ref("k8s.io/kubernetes/pkg/api/v1.ObjectFieldSelector"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -46,7 +46,7 @@ type HandlerRunner interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RuntimeHelper wraps kubelet to make container runtime
|
// RuntimeHelper wraps kubelet to make container runtime
|
||||||
// able to get necessary informations like the RunContainerOptions, DNS settings.
|
// able to get necessary informations like the RunContainerOptions, DNS settings, Host IP.
|
||||||
type RuntimeHelper interface {
|
type RuntimeHelper interface {
|
||||||
GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (contOpts *RunContainerOptions, useClusterFirstPolicy bool, err error)
|
GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (contOpts *RunContainerOptions, useClusterFirstPolicy bool, err error)
|
||||||
GetClusterDNS(pod *v1.Pod) (dnsServers []string, dnsSearches []string, useClusterFirstPolicy bool, err error)
|
GetClusterDNS(pod *v1.Pod) (dnsServers []string, dnsSearches []string, useClusterFirstPolicy bool, err error)
|
||||||
|
@ -638,6 +638,12 @@ func (kl *Kubelet) podFieldSelectorRuntimeValue(fs *v1.ObjectFieldSelector, pod
|
|||||||
return pod.Spec.NodeName, nil
|
return pod.Spec.NodeName, nil
|
||||||
case "spec.serviceAccountName":
|
case "spec.serviceAccountName":
|
||||||
return pod.Spec.ServiceAccountName, nil
|
return pod.Spec.ServiceAccountName, nil
|
||||||
|
case "status.hostIP":
|
||||||
|
hostIP, err := kl.getHostIPAnyWay()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return hostIP.String(), nil
|
||||||
case "status.podIP":
|
case "status.podIP":
|
||||||
return podIP, nil
|
return podIP, nil
|
||||||
}
|
}
|
||||||
|
@ -502,6 +502,15 @@ func TestMakeEnvironmentVariables(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "HOST_IP",
|
||||||
|
ValueFrom: &v1.EnvVarSource{
|
||||||
|
FieldRef: &v1.ObjectFieldSelector{
|
||||||
|
APIVersion: api.Registry.GroupOrDie(v1.GroupName).GroupVersion.String(),
|
||||||
|
FieldPath: "status.hostIP",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
masterServiceNs: "nothing",
|
masterServiceNs: "nothing",
|
||||||
@ -512,6 +521,7 @@ func TestMakeEnvironmentVariables(t *testing.T) {
|
|||||||
{Name: "POD_NODE_NAME", Value: "node-name"},
|
{Name: "POD_NODE_NAME", Value: "node-name"},
|
||||||
{Name: "POD_SERVICE_ACCOUNT_NAME", Value: "special"},
|
{Name: "POD_SERVICE_ACCOUNT_NAME", Value: "special"},
|
||||||
{Name: "POD_IP", Value: "1.2.3.4"},
|
{Name: "POD_IP", Value: "1.2.3.4"},
|
||||||
|
{Name: "HOST_IP", Value: testKubeletHostIP},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -79,6 +79,7 @@ func init() {
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
testKubeletHostname = "127.0.0.1"
|
testKubeletHostname = "127.0.0.1"
|
||||||
|
testKubeletHostIP = "127.0.0.1"
|
||||||
|
|
||||||
testReservationCPU = "200m"
|
testReservationCPU = "200m"
|
||||||
testReservationMemory = "100M"
|
testReservationMemory = "100M"
|
||||||
@ -166,7 +167,31 @@ func newTestKubeletWithImageList(
|
|||||||
kubelet.masterServiceNamespace = metav1.NamespaceDefault
|
kubelet.masterServiceNamespace = metav1.NamespaceDefault
|
||||||
kubelet.serviceLister = testServiceLister{}
|
kubelet.serviceLister = testServiceLister{}
|
||||||
kubelet.nodeLister = testNodeLister{}
|
kubelet.nodeLister = testNodeLister{}
|
||||||
kubelet.nodeInfo = testNodeInfo{}
|
kubelet.nodeInfo = testNodeInfo{
|
||||||
|
nodes: []*v1.Node{
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: string(kubelet.nodeName),
|
||||||
|
},
|
||||||
|
Status: v1.NodeStatus{
|
||||||
|
Conditions: []v1.NodeCondition{
|
||||||
|
{
|
||||||
|
Type: v1.NodeReady,
|
||||||
|
Status: v1.ConditionTrue,
|
||||||
|
Reason: "Ready",
|
||||||
|
Message: "Node ready",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Addresses: []v1.NodeAddress{
|
||||||
|
{
|
||||||
|
Type: v1.NodeInternalIP,
|
||||||
|
Address: testKubeletHostIP,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
kubelet.recorder = fakeRecorder
|
kubelet.recorder = fakeRecorder
|
||||||
if err := kubelet.setupDataDirs(); err != nil {
|
if err := kubelet.setupDataDirs(); err != nil {
|
||||||
t.Fatalf("can't initialize kubelet data dirs: %v", err)
|
t.Fatalf("can't initialize kubelet data dirs: %v", err)
|
||||||
|
@ -1250,7 +1250,7 @@ type EnvVar struct {
|
|||||||
// Only one of its fields may be set.
|
// Only one of its fields may be set.
|
||||||
type EnvVarSource struct {
|
type EnvVarSource struct {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
FieldRef *ObjectFieldSelector
|
FieldRef *ObjectFieldSelector
|
||||||
// Selects a resource of the container: only resources limits and requests
|
// Selects a resource of the container: only resources limits and requests
|
||||||
|
@ -190,6 +190,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error {
|
|||||||
"spec.restartPolicy",
|
"spec.restartPolicy",
|
||||||
"spec.serviceAccountName",
|
"spec.serviceAccountName",
|
||||||
"status.phase",
|
"status.phase",
|
||||||
|
"status.hostIP",
|
||||||
"status.podIP":
|
"status.podIP":
|
||||||
return label, value, nil
|
return label, value, nil
|
||||||
// This is for backwards compatibility with old v1 clients which send spec.host
|
// This is for backwards compatibility with old v1 clients which send spec.host
|
||||||
|
@ -899,7 +899,7 @@ message EnvVar {
|
|||||||
// EnvVarSource represents a source for the value of an EnvVar.
|
// EnvVarSource represents a source for the value of an EnvVar.
|
||||||
message EnvVarSource {
|
message EnvVarSource {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
optional ObjectFieldSelector fieldRef = 1;
|
optional ObjectFieldSelector fieldRef = 1;
|
||||||
|
|
||||||
|
@ -1349,7 +1349,7 @@ type EnvVar struct {
|
|||||||
// EnvVarSource represents a source for the value of an EnvVar.
|
// EnvVarSource represents a source for the value of an EnvVar.
|
||||||
type EnvVarSource struct {
|
type EnvVarSource struct {
|
||||||
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
// Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations,
|
||||||
// spec.nodeName, spec.serviceAccountName, status.podIP.
|
// spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.
|
||||||
// +optional
|
// +optional
|
||||||
FieldRef *ObjectFieldSelector `json:"fieldRef,omitempty" protobuf:"bytes,1,opt,name=fieldRef"`
|
FieldRef *ObjectFieldSelector `json:"fieldRef,omitempty" protobuf:"bytes,1,opt,name=fieldRef"`
|
||||||
// Selects a resource of the container: only resources limits and requests
|
// Selects a resource of the container: only resources limits and requests
|
||||||
|
@ -481,7 +481,7 @@ func (EnvVar) SwaggerDoc() map[string]string {
|
|||||||
|
|
||||||
var map_EnvVarSource = map[string]string{
|
var map_EnvVarSource = map[string]string{
|
||||||
"": "EnvVarSource represents a source for the value of an EnvVar.",
|
"": "EnvVarSource represents a source for the value of an EnvVar.",
|
||||||
"fieldRef": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.podIP.",
|
"fieldRef": "Selects a field of the pod: supports metadata.name, metadata.namespace, metadata.labels, metadata.annotations, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP.",
|
||||||
"resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.",
|
"resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.",
|
||||||
"configMapKeyRef": "Selects a key of a ConfigMap.",
|
"configMapKeyRef": "Selects a key of a ConfigMap.",
|
||||||
"secretKeyRef": "Selects a key of a secret in the pod's namespace",
|
"secretKeyRef": "Selects a key of a secret in the pod's namespace",
|
||||||
|
@ -62,7 +62,7 @@ var _ = framework.KubeDescribe("Downward API", func() {
|
|||||||
testDownwardAPI(f, podName, env, expectations)
|
testDownwardAPI(f, podName, env, expectations)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should provide pod IP as an env var [Conformance]", func() {
|
It("should provide pod and host IP as an env var [Conformance]", func() {
|
||||||
podName := "downward-api-" + string(uuid.NewUUID())
|
podName := "downward-api-" + string(uuid.NewUUID())
|
||||||
env := []v1.EnvVar{
|
env := []v1.EnvVar{
|
||||||
{
|
{
|
||||||
@ -74,10 +74,20 @@ var _ = framework.KubeDescribe("Downward API", func() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "HOST_IP",
|
||||||
|
ValueFrom: &v1.EnvVarSource{
|
||||||
|
FieldRef: &v1.ObjectFieldSelector{
|
||||||
|
APIVersion: "v1",
|
||||||
|
FieldPath: "status.hostIP",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
expectations := []string{
|
expectations := []string{
|
||||||
"POD_IP=(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)",
|
"POD_IP=(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)",
|
||||||
|
"HOST_IP=(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)\\.(?:\\d+)",
|
||||||
}
|
}
|
||||||
|
|
||||||
testDownwardAPI(f, podName, env, expectations)
|
testDownwardAPI(f, podName, env, expectations)
|
||||||
|
@ -20,4 +20,8 @@ spec:
|
|||||||
valueFrom:
|
valueFrom:
|
||||||
fieldRef:
|
fieldRef:
|
||||||
fieldPath: status.podIP
|
fieldPath: status.podIP
|
||||||
|
- name: MY_HOST_IP
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: status.hostIP
|
||||||
restartPolicy: Never
|
restartPolicy: Never
|
||||||
|
Loading…
Reference in New Issue
Block a user