Adds the statefulset.kubernetes.io/pod-name label allowing users to

attach a Service to an individual Pod.
This commit is contained in:
Kenneth Owens 2017-11-20 09:13:07 -08:00
parent 98fb71e8ce
commit 1ce4ef8229
5 changed files with 21 additions and 3 deletions

View File

@ -112,7 +112,8 @@ func identityMatches(set *apps.StatefulSet, pod *v1.Pod) bool {
return ordinal >= 0 && return ordinal >= 0 &&
set.Name == parent && set.Name == parent &&
pod.Name == getPodName(set, ordinal) && pod.Name == getPodName(set, ordinal) &&
pod.Namespace == set.Namespace pod.Namespace == set.Namespace &&
pod.Labels[apps.StatefulSetPodNameLabel] == pod.Name
} }
// storageMatches returns true if pod's Volumes cover the set of PersistentVolumeClaims // storageMatches returns true if pod's Volumes cover the set of PersistentVolumeClaims
@ -187,11 +188,15 @@ func initIdentity(set *apps.StatefulSet, pod *v1.Pod) {
pod.Spec.Subdomain = set.Spec.ServiceName pod.Spec.Subdomain = set.Spec.ServiceName
} }
// updateIdentity updates pod's name, hostname, and subdomain to conform to set's name and headless service. // updateIdentity updates pod's name, hostname, and subdomain, and StatefulSetPodNameLabel to conform to set's name
// and headless service.
func updateIdentity(set *apps.StatefulSet, pod *v1.Pod) { func updateIdentity(set *apps.StatefulSet, pod *v1.Pod) {
pod.Name = getPodName(set, getOrdinal(pod)) pod.Name = getPodName(set, getOrdinal(pod))
pod.Namespace = set.Namespace pod.Namespace = set.Namespace
if pod.Labels == nil {
pod.Labels = make(map[string]string)
}
pod.Labels[apps.StatefulSetPodNameLabel] = pod.Name
} }
// isRunningAndReady returns true if pod is in the PodRunning Phase, if it has a condition of PodReady. // isRunningAndReady returns true if pod is in the PodRunning Phase, if it has a condition of PodReady.

View File

@ -78,6 +78,11 @@ func TestIdentityMatches(t *testing.T) {
if identityMatches(set, pod) { if identityMatches(set, pod) {
t.Error("identity matches for a Pod with the wrong namespace") t.Error("identity matches for a Pod with the wrong namespace")
} }
pod = newStatefulSetPod(set, 1)
delete(pod.Labels, apps.StatefulSetPodNameLabel)
if identityMatches(set, pod) {
t.Error("identity matches for a Pod with the wrong statefulSetPodNameLabel")
}
} }
func TestStorageMatches(t *testing.T) { func TestStorageMatches(t *testing.T) {
@ -127,6 +132,11 @@ func TestUpdateIdentity(t *testing.T) {
if !identityMatches(set, pod) { if !identityMatches(set, pod) {
t.Error("updateIdentity failed to update the Pods namespace") t.Error("updateIdentity failed to update the Pods namespace")
} }
delete(pod.Labels, apps.StatefulSetPodNameLabel)
updateIdentity(set, pod)
if !identityMatches(set, pod) {
t.Error("updateIdentity failed to restore the statefulSetPodName label")
}
} }
func TestUpdateStorage(t *testing.T) { func TestUpdateStorage(t *testing.T) {

View File

@ -28,6 +28,7 @@ const (
StatefulSetRevisionLabel = ControllerRevisionHashLabelKey StatefulSetRevisionLabel = ControllerRevisionHashLabelKey
DeprecatedRollbackTo = "deprecated.deployment.rollback.to" DeprecatedRollbackTo = "deprecated.deployment.rollback.to"
DeprecatedTemplateGeneration = "deprecated.daemonset.template.generation" DeprecatedTemplateGeneration = "deprecated.daemonset.template.generation"
StatefulSetPodNameLabel = "statefulset.kubernetes.io/pod-name"
) )
// +genclient // +genclient

View File

@ -26,6 +26,7 @@ import (
const ( const (
ControllerRevisionHashLabelKey = "controller-revision-hash" ControllerRevisionHashLabelKey = "controller-revision-hash"
StatefulSetRevisionLabel = ControllerRevisionHashLabelKey StatefulSetRevisionLabel = ControllerRevisionHashLabelKey
StatefulSetPodNameLabel = "statefulset.kubernetes.io/pod-name"
) )
// ScaleSpec describes the attributes of a scale subresource // ScaleSpec describes the attributes of a scale subresource

View File

@ -28,6 +28,7 @@ const (
StatefulSetRevisionLabel = ControllerRevisionHashLabelKey StatefulSetRevisionLabel = ControllerRevisionHashLabelKey
DeprecatedRollbackTo = "deprecated.deployment.rollback.to" DeprecatedRollbackTo = "deprecated.deployment.rollback.to"
DeprecatedTemplateGeneration = "deprecated.daemonset.template.generation" DeprecatedTemplateGeneration = "deprecated.daemonset.template.generation"
StatefulSetPodNameLabel = "statefulset.kubernetes.io/pod-name"
) )
// ScaleSpec describes the attributes of a scale subresource // ScaleSpec describes the attributes of a scale subresource