-
Notifications
You must be signed in to change notification settings - Fork 124
/
types.go
252 lines (218 loc) · 10.6 KB
/
types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/*
Copyright 2019 The Machine Controller Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package v1alpha1 contains types to represent Kubernetes cluster and
// machine configuration.
package v1alpha1
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
const MachineResourcePlural = "machines"
// +genclient
// +genclient:nonNamespaced
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// Machine represents a single Node that should exist (whether it does or
// not yet). In this model, there is no grouping of nodes to scale with a
// numeric field. Each Machine exists independently, and grouping can only
// be inferred via label selectors.
//
// In order for a new Node to be created, one can generically create a new
// Machine object, possibly copying the spec from an existing Machine
// or a template. To scale down the cluster, delete specific instances of
// Machines and the underlying Nodes will be unregistered/deprovisioned.
// Separate provider-specific controllers will watch Machine objects they can
// act on (like a GCE cloud controller watching for only Machines destined for
// GCE) and take the appropriate actions.
//
// Any updates to the MachineSpec will be actuated to change the Node in
// place or replace the Node with one conforming to the spec. In this model,
// the fact that a controller is able to upgrade a node via in-place upgrades
// or via a cloud replacement is an implementation detail without API controls.
//
// It is recommended, but not required, that provider-specific controllers add
// finalizers to Machine objects so that they can be triggered on deletion to
// release the necessary external resources, reporting any errors encountered.
type Machine struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata"`
Spec MachineSpec `json:"spec"`
Status MachineStatus `json:"status,omitempty"`
}
type MachineSpec struct {
// This ObjectMeta will autopopulate the Node created. Use this to
// indicate what labels, annotations, etc., should be used when
// creating the Node.
// +optional
metav1.ObjectMeta `json:"metadata,omitempty"`
// The full, authoritative list of taints to apply to the corresponding
// Node. This list will overwrite any modifications made to the Node on
// an ongoing basis.
// +optional
Taints []corev1.Taint `json:"taints,omitempty"`
// Provider-specific serialized configuration to use during node
// creation. It is recommended that providers maintain their own
// versioned API types that should be serialized/deserialized from this
// field, akin to component config.
// +optional
ProviderConfig runtime.RawExtension `json:"providerConfig"`
// A list of roles for this Machine to use.
Roles []MachineRole `json:"roles,omitempty"`
// Versions of key software to use. This field is optional at cluster
// creation time, and omitting the field indicates that the cluster
// installation tool should select defaults for the user. These
// defaults may differ based on the cluster installer, but the tool
// should populate the values it uses when persisting Machine objects.
// A Machine spec missing this field at runtime is invalid.
// +optional
Versions MachineVersionInfo `json:"versions,omitempty"`
// To populate in the associated Node for dynamic kubelet config. This
// field already exists in Node, so any updates to it in the Machine
// spec will be automatically copied to the linked NodeRef from the
// status. The rest of dynamic kubelet config support should then work
// as-is.
// +optional
ConfigSource *corev1.NodeConfigSource `json:"configSource,omitempty"`
}
// The MachineRole indicates the purpose of the Machine, and will determine
// what software and configuration will be used when provisioning and managing
// the Machine. A single Machine may have more than one role, and the list and
// definitions of supported roles is expected to evolve over time.
//
// Currently, only two roles are supported: Master and Node. In the future, we
// expect user needs to drive the evolution and granularity of these roles,
// with new additions accommodating common cluster patterns, like dedicated
// etcd Machines.
//
// +-----------------------+------------------------+
// | Master present | Master absent |
// +---------------+-----------------------+------------------------|
// | Node present: | Install control plane | Join the cluster as |
// | | and be schedulable | just a node |
// |---------------+-----------------------+------------------------|
// | Node absent: | Install control plane | Invalid configuration |
// | | and be unscheduleable | |
// +---------------+-----------------------+------------------------+
type MachineRole string
const (
MasterRole = "Master"
NodeRole = "Node"
)
type MachineStatus struct {
// If the corresponding Node exists, this will point to its object.
// +optional
NodeRef *corev1.ObjectReference `json:"nodeRef,omitempty"`
// When was this status last observed
// +optional
LastUpdated metav1.Time `json:"lastUpdated,omitempty"`
// The current versions of software on the corresponding Node (if it
// exists). This is provided for a few reasons:
//
// 1) It is more convenient than checking the NodeRef, traversing it to
// the Node, and finding the appropriate field in Node.Status.NodeInfo
// (which uses different field names and formatting).
// 2) It removes some of the dependency on the structure of the Node,
// so that if the structure of Node.Status.NodeInfo changes, only
// machine controllers need to be updated, rather than every client
// of the Machines API.
// 3) There is no other way simple way to check the ControlPlane
// version. A client would have to connect directly to the apiserver
// running on the target node in order to find out its version.
// +optional
Versions *MachineVersionInfo `json:"versions,omitempty"`
// In the event that there is a terminal problem reconciling the
// Machine, both ErrorReason and ErrorMessage will be set. ErrorReason
// will be populated with a succinct value suitable for machine
// interpretation, while ErrorMessage will contain a more verbose
// string suitable for logging and human consumption.
//
// These fields should not be set for transitive errors that a
// controller faces that are expected to be fixed automatically over
// time (like service outages), but instead indicate that something is
// fundamentally wrong with the Machine's spec or the configuration of
// the controller, and that manual intervention is required. Examples
// of terminal errors would be invalid combinations of settings in the
// spec, values that are unsupported by the controller, or the
// responsible controller itself being critically misconfigured.
//
// Any transient errors that occur during the reconciliation of Machines
// can be added as events to the Machine object and/or logged in the
// controller's output.
// +optional
ErrorReason *MachineStatusError `json:"errorReason,omitempty"`
// +optional
ErrorMessage *string `json:"errorMessage,omitempty"`
}
type MachineStatusError string
const (
// Represents that the combination of configuration in the MachineSpec
// is not supported by this cluster. This is not a transient error, but
// indicates a state that must be fixed before progress can be made.
//
// Example: the ProviderConfig specifies an instance type that doesn't exist,
InvalidConfigurationMachineError MachineStatusError = "InvalidConfiguration"
// This indicates that the MachineSpec has been updated in a way that
// is not supported for reconciliation on this cluster. The spec may be
// completely valid from a configuration standpoint, but the controller
// does not support changing the real world state to match the new
// spec.
//
// Example: the responsible controller is not capable of changing the
// container runtime from docker to rkt.
UnsupportedChangeMachineError MachineStatusError = "UnsupportedChange"
// This generally refers to exceeding one's quota in a cloud provider,
// or running out of physical machines in an on-premise environment.
InsufficientResourcesMachineError MachineStatusError = "InsufficientResources"
// There was an error while trying to create a Node to match this
// Machine. This may indicate a transient problem that will be fixed
// automatically with time, such as a service outage, or a terminal
// error during creation that doesn't match a more specific
// MachineStatusError value.
//
// Example: timeout trying to connect to GCE.
CreateMachineError MachineStatusError = "CreateError"
// An error was encountered while trying to delete the Node that this
// Machine represents. This could be a transient or terminal error, but
// will only be observable if the provider's Machine controller has
// added a finalizer to the object to more gracefully handle deletions.
//
// Example: cannot resolve EC2 IP address.
DeleteMachineError MachineStatusError = "DeleteError"
)
type MachineVersionInfo struct {
// Semantic version of kubelet to run
Kubelet string `json:"kubelet"`
// Semantic version of the Kubernetes control plane to
// run. This should only be populated when the machine is a
// master.
// +optional
ControlPlane string `json:"controlPlane,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type MachineList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []Machine `json:"items"`
}