api changes to support readiness.

pull/6/head
Mike Danese 2015-02-02 18:24:25 -08:00
parent e27d534b87
commit 27dfebed98
6 changed files with 232 additions and 136 deletions

View File

@ -339,10 +339,11 @@ type Container struct {
Ports []Port `json:"ports,omitempty"` Ports []Port `json:"ports,omitempty"`
Env []EnvVar `json:"env,omitempty"` Env []EnvVar `json:"env,omitempty"`
// Compute resource requirements. // Compute resource requirements.
Resources ResourceRequirements `json:"resources,omitempty"` Resources ResourceRequirements `json:"resources,omitempty"`
VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"` VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"`
LivenessProbe *Probe `json:"livenessProbe,omitempty"` LivenessProbe *Probe `json:"livenessProbe,omitempty"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty"` ReadinessProbe *Probe `json:"readinessProbe,omitempty"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty"`
// Optional: Defaults to /dev/termination-log // Optional: Defaults to /dev/termination-log
TerminationMessagePath string `json:"terminationMessagePath,omitempty"` TerminationMessagePath string `json:"terminationMessagePath,omitempty"`
// Optional: Default to false. // Optional: Default to false.
@ -380,27 +381,16 @@ type Lifecycle struct {
// The below types are used by kube_client and api_server. // The below types are used by kube_client and api_server.
// PodPhase is a label for the condition of a pod at the current time. type ConditionStatus string
type PodPhase string
// These are the valid statuses of pods. // These are valid condition statuses. "ConditionFull" means a resource is in the condition;
// "ConditionNone" means a resource is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if a resource is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const ( const (
// PodPending means the pod has been accepted by the system, but one or more of the containers ConditionFull ConditionStatus = "Full"
// has not been started. This includes time before being bound to a node, as well as time spent ConditionNone ConditionStatus = "None"
// pulling images onto the host. ConditionUnknown ConditionStatus = "Unknown"
PodPending PodPhase = "Pending"
// PodRunning means the pod has been bound to a node and all of the containers have been started.
// At least one container is still running or is in the process of being restarted.
PodRunning PodPhase = "Running"
// PodSucceeded means that all containers in the pod have voluntarily terminated
// with a container exit code of 0, and the system is not going to restart any of these containers.
PodSucceeded PodPhase = "Succeeded"
// PodFailed means that all containers in the pod have terminated, and at least one container has
// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
PodFailed PodPhase = "Failed"
// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
// to an error in communicating with the host of the pod.
PodUnknown PodPhase = "Unknown"
) )
type ContainerStateWaiting struct { type ContainerStateWaiting struct {
@ -434,6 +424,8 @@ type ContainerStatus struct {
// TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states // TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states
// defined for container? // defined for container?
State ContainerState `json:"state,omitempty"` State ContainerState `json:"state,omitempty"`
// Ready specifies whether the conatiner has passed its readiness check.
Ready bool `json:"ready"`
// Note that this is calculated from dead containers. But those containers are subject to // Note that this is calculated from dead containers. But those containers are subject to
// garbage collection. This value will get capped at 5 by GC. // garbage collection. This value will get capped at 5 by GC.
RestartCount int `json:"restartCount"` RestartCount int `json:"restartCount"`
@ -446,6 +438,44 @@ type ContainerStatus struct {
ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"` ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"`
} }
// PodPhase is a label for the condition of a pod at the current time.
type PodPhase string
// These are the valid statuses of pods.
const (
// PodPending means the pod has been accepted by the system, but one or more of the containers
// has not been started. This includes time before being bound to a node, as well as time spent
// pulling images onto the host.
PodPending PodPhase = "Pending"
// PodRunning means the pod has been bound to a node and all of the containers have been started.
// At least one container is still running or is in the process of being restarted.
PodRunning PodPhase = "Running"
// PodSucceeded means that all containers in the pod have voluntarily terminated
// with a container exit code of 0, and the system is not going to restart any of these containers.
PodSucceeded PodPhase = "Succeeded"
// PodFailed means that all containers in the pod have terminated, and at least one container has
// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
PodFailed PodPhase = "Failed"
// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
// to an error in communicating with the host of the pod.
PodUnknown PodPhase = "Unknown"
)
type PodConditionKind string
// These are valid conditions of pod.
const (
// PodReady means the pod is able to service requests and should be added to the
// load balancing pools of all matching services.
PodReady PodConditionKind = "Ready"
)
// TODO: add LastTransitionTime, Reason, Message to match NodeCondition api.
type PodCondition struct {
Kind PodConditionKind `json:"kind"`
Status ConditionStatus `json:"status"`
}
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
type PodInfo map[string]ContainerStatus type PodInfo map[string]ContainerStatus
@ -516,8 +546,8 @@ type PodSpec struct {
// PodStatus represents information about the status of a pod. Status may trail the actual // PodStatus represents information about the status of a pod. Status may trail the actual
// state of a system. // state of a system.
type PodStatus struct { type PodStatus struct {
Phase PodPhase `json:"phase,omitempty"` Phase PodPhase `json:"phase,omitempty"`
Conditions []PodCondition `json:"Condition,omitempty"`
// A human readable message indicating details about why the pod is in this state. // A human readable message indicating details about why the pod is in this state.
Message string `json:"message,omitempty"` Message string `json:"message,omitempty"`
@ -759,25 +789,13 @@ const (
NodeReady NodeConditionKind = "Ready" NodeReady NodeConditionKind = "Ready"
) )
type NodeConditionStatus string
// These are valid condition status. "ConditionFull" means node is in the condition;
// "ConditionNone" means node is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if node is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull NodeConditionStatus = "Full"
ConditionNone NodeConditionStatus = "None"
ConditionUnknown NodeConditionStatus = "Unknown"
)
type NodeCondition struct { type NodeCondition struct {
Kind NodeConditionKind `json:"kind"` Kind NodeConditionKind `json:"kind"`
Status NodeConditionStatus `json:"status"` Status ConditionStatus `json:"status"`
LastProbeTime util.Time `json:"lastProbeTime,omitempty"` LastProbeTime util.Time `json:"lastProbeTime,omitempty"`
LastTransitionTime util.Time `json:"lastTransitionTime,omitempty"` LastTransitionTime util.Time `json:"lastTransitionTime,omitempty"`
Reason string `json:"reason,omitempty"` Reason string `json:"reason,omitempty"`
Message string `json:"message,omitempty"` Message string `json:"message,omitempty"`
} }
// NodeResources is an object for conveying resource information about a node. // NodeResources is an object for conveying resource information about a node.

View File

@ -181,6 +181,9 @@ func init() {
if err := s.Convert(&in.Phase, &out.Status, 0); err != nil { if err := s.Convert(&in.Phase, &out.Status, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.Conditions, &out.Conditions, 0); err != nil {
return err
}
if err := s.Convert(&in.Info, &out.Info, 0); err != nil { if err := s.Convert(&in.Info, &out.Info, 0); err != nil {
return err return err
} }
@ -194,6 +197,9 @@ func init() {
if err := s.Convert(&in.Status, &out.Phase, 0); err != nil { if err := s.Convert(&in.Status, &out.Phase, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.Conditions, &out.Conditions, 0); err != nil {
return err
}
if err := s.Convert(&in.Info, &out.Info, 0); err != nil { if err := s.Convert(&in.Info, &out.Info, 0); err != nil {
return err return err
} }
@ -489,6 +495,9 @@ func init() {
if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil { if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.ReadinessProbe, &out.ReadinessProbe, 0); err != nil {
return err
}
if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil { if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil {
return err return err
} }
@ -569,6 +578,9 @@ func init() {
if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil { if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.ReadinessProbe, &out.ReadinessProbe, 0); err != nil {
return err
}
if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil { if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil {
return err return err
} }

View File

@ -281,10 +281,11 @@ type Container struct {
// Optional: Defaults to unlimited. // Optional: Defaults to unlimited.
CPU int `json:"cpu,omitempty" description:"CPU share in thousandths of a core"` CPU int `json:"cpu,omitempty" description:"CPU share in thousandths of a core"`
// Optional: Defaults to unlimited. // Optional: Defaults to unlimited.
Memory int64 `json:"memory,omitempty" description:"memory limit in bytes; defaults to unlimited"` Memory int64 `json:"memory,omitempty" description:"memory limit in bytes; defaults to unlimited"`
VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" description:"pod volumes to mount into the container's filesystem"` VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" description:"pod volumes to mount into the container's filesystem"`
LivenessProbe *LivenessProbe `json:"livenessProbe,omitempty" description:"periodic probe of container liveness; container will be restarted if the probe fails"` LivenessProbe *LivenessProbe `json:"livenessProbe,omitempty" description:"periodic probe of container liveness; container will be restarted if the probe fails"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty" description:"actions that the management system should take in response to container lifecycle events"` ReadinessProbe *LivenessProbe `json:"readinessProbe,omitempty" description:"periodic probe of container service readiness; container will be removed from service endpoints if the probe fails"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty" description:"actions that the management system should take in response to container lifecycle events"`
// Optional: Defaults to /dev/termination-log // Optional: Defaults to /dev/termination-log
TerminationMessagePath string `json:"terminationMessagePath,omitempty" description:"path at which the file to which the container's termination message will be written is mounted into the container's filesystem; message written is intended to be brief final status, such as an assertion failure message; defaults to /dev/termination-log"` TerminationMessagePath string `json:"terminationMessagePath,omitempty" description:"path at which the file to which the container's termination message will be written is mounted into the container's filesystem; message written is intended to be brief final status, such as an assertion failure message; defaults to /dev/termination-log"`
// Optional: Default to false. // Optional: Default to false.
@ -352,6 +353,18 @@ type TypeMeta struct {
Annotations map[string]string `json:"annotations,omitempty" description:"map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about the object"` Annotations map[string]string `json:"annotations,omitempty" description:"map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about the object"`
} }
type ConditionStatus string
// These are valid condition statuses. "ConditionFull" means a resource is in the condition;
// "ConditionNone" means a resource is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if a resource is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull ConditionStatus = "Full"
ConditionNone ConditionStatus = "None"
ConditionUnknown ConditionStatus = "Unknown"
)
// PodStatus represents a status of a pod. // PodStatus represents a status of a pod.
type PodStatus string type PodStatus string
@ -400,6 +413,7 @@ type ContainerStatus struct {
// TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states // TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states
// defined for container? // defined for container?
State ContainerState `json:"state,omitempty" description:"details about the container's current condition"` State ContainerState `json:"state,omitempty" description:"details about the container's current condition"`
Ready bool `json:"ready" description:"specifies whether the container has passed its readiness probe"`
// Note that this is calculated from dead containers. But those containers are subject to // Note that this is calculated from dead containers. But those containers are subject to
// garbage collection. This value will get capped at 5 by GC. // garbage collection. This value will get capped at 5 by GC.
RestartCount int `json:"restartCount" description:"the number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed"` RestartCount int `json:"restartCount" description:"the number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed"`
@ -412,6 +426,21 @@ type ContainerStatus struct {
ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"` ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"`
} }
type PodConditionKind string
// These are valid conditions of pod.
const (
// PodReady means the pod is able to service requests and should be added to the
// load balancing pools of all matching services.
PodReady PodConditionKind = "Ready"
)
// TODO: add LastTransitionTime, Reason, Message to match NodeCondition api.
type PodCondition struct {
Kind PodConditionKind `json:"kind"`
Status ConditionStatus `json:"status"`
}
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
type PodInfo map[string]ContainerStatus type PodInfo map[string]ContainerStatus
@ -440,8 +469,9 @@ type RestartPolicy struct {
// PodState is the state of a pod, used as either input (desired state) or output (current state). // PodState is the state of a pod, used as either input (desired state) or output (current state).
type PodState struct { type PodState struct {
Manifest ContainerManifest `json:"manifest,omitempty" description:"manifest of containers and volumes comprising the pod"` Manifest ContainerManifest `json:"manifest,omitempty" description:"manifest of containers and volumes comprising the pod"`
Status PodStatus `json:"status,omitempty" description:"current condition of the pod, Waiting, Running, or Terminated"` Status PodStatus `json:"status,omitempty" description:"current condition of the pod, Waiting, Running, or Terminated"`
Conditions []PodCondition `json:"Condition,omitempty" description:"current service state of pod"`
// A human readable message indicating details about why the pod is in this state. // A human readable message indicating details about why the pod is in this state.
Message string `json:"message,omitempty" description:"human readable message indicating details about why the pod is in this condition"` Message string `json:"message,omitempty" description:"human readable message indicating details about why the pod is in this condition"`
Host string `json:"host,omitempty" description:"host to which the pod is assigned; empty if not yet scheduled"` Host string `json:"host,omitempty" description:"host to which the pod is assigned; empty if not yet scheduled"`
@ -604,25 +634,13 @@ const (
NodeReady NodeConditionKind = "Ready" NodeReady NodeConditionKind = "Ready"
) )
type NodeConditionStatus string
// These are valid condition status. "ConditionFull" means node is in the condition;
// "ConditionNone" means node is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if node is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull NodeConditionStatus = "Full"
ConditionNone NodeConditionStatus = "None"
ConditionUnknown NodeConditionStatus = "Unknown"
)
type NodeCondition struct { type NodeCondition struct {
Kind NodeConditionKind `json:"kind" description:"kind of the condition, one of reachable, ready"` Kind NodeConditionKind `json:"kind" description:"kind of the condition, one of reachable, ready"`
Status NodeConditionStatus `json:"status" description:"status of the condition, one of full, none, unknown"` Status ConditionStatus `json:"status" description:"status of the condition, one of full, none, unknown"`
LastProbeTime util.Time `json:"lastProbeTime,omitempty" description:"last time the condition was probed"` LastProbeTime util.Time `json:"lastProbeTime,omitempty" description:"last time the condition was probed"`
LastTransitionTime util.Time `json:"lastTransitionTime,omitempty" description:"last time the condition transit from one status to another"` LastTransitionTime util.Time `json:"lastTransitionTime,omitempty" description:"last time the condition transit from one status to another"`
Reason string `json:"reason,omitempty" description:"(brief) reason for the condition's last transition"` Reason string `json:"reason,omitempty" description:"(brief) reason for the condition's last transition"`
Message string `json:"message,omitempty" description:"human readable message indicating details about last transition"` Message string `json:"message,omitempty" description:"human readable message indicating details about last transition"`
} }
// NodeResources represents resources on a Kubernetes system node // NodeResources represents resources on a Kubernetes system node

View File

@ -341,6 +341,9 @@ func init() {
if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil { if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.ReadinessProbe, &out.ReadinessProbe, 0); err != nil {
return err
}
if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil { if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil {
return err return err
} }
@ -423,6 +426,9 @@ func init() {
if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil { if err := s.Convert(&in.LivenessProbe, &out.LivenessProbe, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.ReadinessProbe, &out.ReadinessProbe, 0); err != nil {
return err
}
if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil { if err := s.Convert(&in.Lifecycle, &out.Lifecycle, 0); err != nil {
return err return err
} }
@ -475,6 +481,9 @@ func init() {
if err := s.Convert(&in.Info, &out.Info, 0); err != nil { if err := s.Convert(&in.Info, &out.Info, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.Conditions, &out.Conditions, 0); err != nil {
return err
}
out.Message = in.Message out.Message = in.Message
out.Host = in.Host out.Host = in.Host
out.HostIP = in.HostIP out.HostIP = in.HostIP
@ -488,6 +497,9 @@ func init() {
if err := s.Convert(&in.Info, &out.Info, 0); err != nil { if err := s.Convert(&in.Info, &out.Info, 0); err != nil {
return err return err
} }
if err := s.Convert(&in.Conditions, &out.Conditions, 0); err != nil {
return err
}
out.Message = in.Message out.Message = in.Message
out.Host = in.Host out.Host = in.Host
out.HostIP = in.HostIP out.HostIP = in.HostIP

View File

@ -240,10 +240,11 @@ type Container struct {
// Optional: Defaults to unlimited. // Optional: Defaults to unlimited.
CPU int `json:"cpu,omitempty" description:"CPU share in thousandths of a core"` CPU int `json:"cpu,omitempty" description:"CPU share in thousandths of a core"`
// Optional: Defaults to unlimited. // Optional: Defaults to unlimited.
Memory int64 `json:"memory,omitempty" description:"memory limit in bytes; defaults to unlimited"` Memory int64 `json:"memory,omitempty" description:"memory limit in bytes; defaults to unlimited"`
VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" description:"pod volumes to mount into the container's filesystem"` VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" description:"pod volumes to mount into the container's filesystem"`
LivenessProbe *LivenessProbe `json:"livenessProbe,omitempty" description:"periodic probe of container liveness; container will be restarted if the probe fails"` LivenessProbe *LivenessProbe `json:"livenessProbe,omitempty" description:"periodic probe of container liveness; container will be restarted if the probe fails"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty" description:"actions that the management system should take in response to container lifecycle events"` ReadinessProbe *LivenessProbe `json:"readinessProbe,omitempty" description:"periodic probe of container service readiness; container will be removed from service endpoints if the probe fails"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty" description:"actions that the management system should take in response to container lifecycle events"`
// Optional: Defaults to /dev/termination-log // Optional: Defaults to /dev/termination-log
TerminationMessagePath string `json:"terminationMessagePath,omitempty" description:"path at which the file to which the container's termination message will be written is mounted into the container's filesystem; message written is intended to be brief final status, such as an assertion failure message; defaults to /dev/termination-log"` TerminationMessagePath string `json:"terminationMessagePath,omitempty" description:"path at which the file to which the container's termination message will be written is mounted into the container's filesystem; message written is intended to be brief final status, such as an assertion failure message; defaults to /dev/termination-log"`
// Optional: Default to false. // Optional: Default to false.
@ -316,6 +317,18 @@ type TypeMeta struct {
Annotations map[string]string `json:"annotations,omitempty" description:"map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about the object"` Annotations map[string]string `json:"annotations,omitempty" description:"map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about the object"`
} }
type ConditionStatus string
// These are valid condition statuses. "ConditionFull" means a resource is in the condition;
// "ConditionNone" means a resource is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if a resource is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull ConditionStatus = "Full"
ConditionNone ConditionStatus = "None"
ConditionUnknown ConditionStatus = "Unknown"
)
// PodStatus represents a status of a pod. // PodStatus represents a status of a pod.
type PodStatus string type PodStatus string
@ -364,6 +377,7 @@ type ContainerStatus struct {
// TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states // TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states
// defined for container? // defined for container?
State ContainerState `json:"state,omitempty" description:"details about the container's current condition"` State ContainerState `json:"state,omitempty" description:"details about the container's current condition"`
Ready bool `json:"ready" description:"specifies whether the container has passed its readiness probe"`
// Note that this is calculated from dead containers. But those containers are subject to // Note that this is calculated from dead containers. But those containers are subject to
// garbage collection. This value will get capped at 5 by GC. // garbage collection. This value will get capped at 5 by GC.
RestartCount int `json:"restartCount" description:"the number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed"` RestartCount int `json:"restartCount" description:"the number of times the container has been restarted, currently based on the number of dead containers that have not yet been removed"`
@ -376,6 +390,21 @@ type ContainerStatus struct {
ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"` ContainerID string `json:"containerID,omitempty" description:"container's ID in the format 'docker://<container_id>'"`
} }
type PodConditionKind string
// These are valid conditions of pod.
const (
// PodReady means the pod is able to service requests and should be added to the
// load balancing pools of all matching services.
PodReady PodConditionKind = "Ready"
)
// TODO: add LastTransitionTime, Reason, Message to match NodeCondition api.
type PodCondition struct {
Kind PodConditionKind `json:"kind"`
Status ConditionStatus `json:"status"`
}
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
type PodInfo map[string]ContainerStatus type PodInfo map[string]ContainerStatus
@ -404,8 +433,9 @@ type RestartPolicy struct {
// PodState is the state of a pod, used as either input (desired state) or output (current state). // PodState is the state of a pod, used as either input (desired state) or output (current state).
type PodState struct { type PodState struct {
Manifest ContainerManifest `json:"manifest,omitempty" description:"manifest of containers and volumes comprising the pod"` Manifest ContainerManifest `json:"manifest,omitempty" description:"manifest of containers and volumes comprising the pod"`
Status PodStatus `json:"status,omitempty" description:"current condition of the pod, Waiting, Running, or Terminated"` Status PodStatus `json:"status,omitempty" description:"current condition of the pod, Waiting, Running, or Terminated"`
Conditions []PodCondition `json:"Condition,omitempty" description:"current service state of pod"`
// A human readable message indicating details about why the pod is in this state. // A human readable message indicating details about why the pod is in this state.
Message string `json:"message,omitempty" description:"human readable message indicating details about why the pod is in this condition"` Message string `json:"message,omitempty" description:"human readable message indicating details about why the pod is in this condition"`
Host string `json:"host,omitempty" description:"host to which the pod is assigned; empty if not yet scheduled"` Host string `json:"host,omitempty" description:"host to which the pod is assigned; empty if not yet scheduled"`
@ -568,25 +598,13 @@ const (
NodeReady NodeConditionKind = "Ready" NodeReady NodeConditionKind = "Ready"
) )
type NodeConditionStatus string
// These are valid condition status. "ConditionFull" means node is in the condition;
// "ConditionNone" means node is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if node is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull NodeConditionStatus = "Full"
ConditionNone NodeConditionStatus = "None"
ConditionUnknown NodeConditionStatus = "Unknown"
)
type NodeCondition struct { type NodeCondition struct {
Kind NodeConditionKind `json:"kind" description:"kind of the condition, one of reachable, ready"` Kind NodeConditionKind `json:"kind" description:"kind of the condition, one of reachable, ready"`
Status NodeConditionStatus `json:"status" description:"status of the condition, one of full, none, unknown"` Status ConditionStatus `json:"status" description:"status of the condition, one of full, none, unknown"`
LastProbeTime util.Time `json:"lastProbeTime,omitempty" description:"last time the condition was probed"` LastProbeTime util.Time `json:"lastProbeTime,omitempty" description:"last time the condition was probed"`
LastTransitionTime util.Time `json:"lastTransitionTime,omitempty" description:"last time the condition transit from one status to another"` LastTransitionTime util.Time `json:"lastTransitionTime,omitempty" description:"last time the condition transit from one status to another"`
Reason string `json:"reason,omitempty" description:"(brief) reason for the condition's last transition"` Reason string `json:"reason,omitempty" description:"(brief) reason for the condition's last transition"`
Message string `json:"message,omitempty" description:"human readable message indicating details about last transition"` Message string `json:"message,omitempty" description:"human readable message indicating details about last transition"`
} }
// NodeResources represents resources on a Kubernetes system node // NodeResources represents resources on a Kubernetes system node

View File

@ -358,13 +358,14 @@ type Container struct {
// Optional: Defaults to whatever is defined in the image. // Optional: Defaults to whatever is defined in the image.
Command []string `json:"command,omitempty"` Command []string `json:"command,omitempty"`
// Optional: Defaults to Docker's default. // Optional: Defaults to Docker's default.
WorkingDir string `json:"workingDir,omitempty"` WorkingDir string `json:"workingDir,omitempty"`
Ports []Port `json:"ports,omitempty"` Ports []Port `json:"ports,omitempty"`
Env []EnvVar `json:"env,omitempty"` Env []EnvVar `json:"env,omitempty"`
Resources ResourceRequirements `json:"resources,omitempty" description:"Compute Resources required by this container"` Resources ResourceRequirements `json:"resources,omitempty" description:"Compute Resources required by this container"`
VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"` VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"`
LivenessProbe *Probe `json:"livenessProbe,omitempty"` LivenessProbe *Probe `json:"livenessProbe,omitempty"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty"` ReadinessProbe *Probe `json:"readinessProbe,omitempty"`
Lifecycle *Lifecycle `json:"lifecycle,omitempty"`
// Optional: Defaults to /dev/termination-log // Optional: Defaults to /dev/termination-log
TerminationMessagePath string `json:"terminationMessagePath,omitempty"` TerminationMessagePath string `json:"terminationMessagePath,omitempty"`
// Optional: Default to false. // Optional: Default to false.
@ -400,27 +401,16 @@ type Lifecycle struct {
PreStop *Handler `json:"preStop,omitempty"` PreStop *Handler `json:"preStop,omitempty"`
} }
// PodPhase is a label for the condition of a pod at the current time. type ConditionStatus string
type PodPhase string
// These are the valid states of pods. // These are valid condition statuses. "ConditionFull" means a resource is in the condition;
// "ConditionNone" means a resource is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if a resource is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const ( const (
// PodPending means the pod has been accepted by the system, but one or more of the containers ConditionFull ConditionStatus = "Full"
// has not been started. This includes time before being bound to a node, as well as time spent ConditionNone ConditionStatus = "None"
// pulling images onto the host. ConditionUnknown ConditionStatus = "Unknown"
PodPending PodPhase = "Pending"
// PodRunning means the pod has been bound to a node and all of the containers have been started.
// At least one container is still running or is in the process of being restarted.
PodRunning PodPhase = "Running"
// PodSucceeded means that all containers in the pod have voluntarily terminated
// with a container exit code of 0, and the system is not going to restart any of these containers.
PodSucceeded PodPhase = "Succeeded"
// PodFailed means that all containers in the pod have terminated, and at least one container has
// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
PodFailed PodPhase = "Failed"
// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
// to an error in communicating with the host of the pod.
PodUnknown PodPhase = "Unknown"
) )
type ContainerStateWaiting struct { type ContainerStateWaiting struct {
@ -454,6 +444,7 @@ type ContainerStatus struct {
// TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states // TODO(dchen1107): Should we rename PodStatus to a more generic name or have a separate states
// defined for container? // defined for container?
State ContainerState `json:"state,omitempty"` State ContainerState `json:"state,omitempty"`
Ready bool `json:"ready"`
// Note that this is calculated from dead containers. But those containers are subject to // Note that this is calculated from dead containers. But those containers are subject to
// garbage collection. This value will get capped at 5 by GC. // garbage collection. This value will get capped at 5 by GC.
RestartCount int `json:"restartCount"` RestartCount int `json:"restartCount"`
@ -468,6 +459,44 @@ type ContainerStatus struct {
ImageID string `json:"imageID" description:"ID of the container's image"` ImageID string `json:"imageID" description:"ID of the container's image"`
} }
// PodPhase is a label for the condition of a pod at the current time.
type PodPhase string
// These are the valid statuses of pods.
const (
// PodPending means the pod has been accepted by the system, but one or more of the containers
// has not been started. This includes time before being bound to a node, as well as time spent
// pulling images onto the host.
PodPending PodPhase = "Pending"
// PodRunning means the pod has been bound to a node and all of the containers have been started.
// At least one container is still running or is in the process of being restarted.
PodRunning PodPhase = "Running"
// PodSucceeded means that all containers in the pod have voluntarily terminated
// with a container exit code of 0, and the system is not going to restart any of these containers.
PodSucceeded PodPhase = "Succeeded"
// PodFailed means that all containers in the pod have terminated, and at least one container has
// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
PodFailed PodPhase = "Failed"
// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
// to an error in communicating with the host of the pod.
PodUnknown PodPhase = "Unknown"
)
type PodConditionKind string
// These are valid conditions of pod.
const (
// PodReady means the pod is able to service requests and should be added to the
// load balancing pools of all matching services.
PodReady PodConditionKind = "Ready"
)
// TODO: add LastTransitionTime, Reason, Message to match NodeCondition api.
type PodCondition struct {
Kind PodConditionKind `json:"kind"`
Status ConditionStatus `json:"status"`
}
// PodInfo contains one entry for every container with available info. // PodInfo contains one entry for every container with available info.
type PodInfo map[string]ContainerStatus type PodInfo map[string]ContainerStatus
@ -521,7 +550,8 @@ type PodSpec struct {
// PodStatus represents information about the status of a pod. Status may trail the actual // PodStatus represents information about the status of a pod. Status may trail the actual
// state of a system. // state of a system.
type PodStatus struct { type PodStatus struct {
Phase PodPhase `json:"phase,omitempty"` Phase PodPhase `json:"phase,omitempty"`
Conditions []PodCondition `json:"Condition,omitempty"`
// A human readable message indicating details about why the pod is in this state. // A human readable message indicating details about why the pod is in this state.
Message string `json:"message,omitempty"` Message string `json:"message,omitempty"`
@ -793,25 +823,13 @@ const (
NodeReady NodeConditionKind = "Ready" NodeReady NodeConditionKind = "Ready"
) )
type NodeConditionStatus string
// These are valid condition status. "ConditionFull" means node is in the condition;
// "ConditionNone" means node is not in the condition; "ConditionUnknown" means kubernetes
// can't decide if node is in the condition or not. In the future, we could add other
// intermediate conditions, e.g. ConditionDegraded.
const (
ConditionFull NodeConditionStatus = "Full"
ConditionNone NodeConditionStatus = "None"
ConditionUnknown NodeConditionStatus = "Unknown"
)
type NodeCondition struct { type NodeCondition struct {
Kind NodeConditionKind `json:"kind"` Kind NodeConditionKind `json:"kind"`
Status NodeConditionStatus `json:"status"` Status ConditionStatus `json:"status"`
LastProbeTime util.Time `json:"lastProbeTime,omitempty"` LastProbeTime util.Time `json:"lastProbeTime,omitempty"`
LastTransitionTime util.Time `json:"lastTransitionTime,omitempty"` LastTransitionTime util.Time `json:"lastTransitionTime,omitempty"`
Reason string `json:"reason,omitempty"` Reason string `json:"reason,omitempty"`
Message string `json:"message,omitempty"` Message string `json:"message,omitempty"`
} }
// ResourceName is the name identifying various resources in a ResourceList. // ResourceName is the name identifying various resources in a ResourceList.