
This adds a field to the SIP CRD to reference a Secret containing SSH private keys to inject into the jump host container to be used to SSH into the cluster's nodes. These should correspond to whatever SSH authorized keys that will be included in the nodes. These keys are then added to the jumphost container, and an SSH config file is added to the ubuntu user's SSH config which includes these keys along with host entries for each VM, which allows them to be consumed by bash completion, which this also adds to the jumphost image. Signed-off-by: Sean Eagan <seaneagan1@gmail.com> Change-Id: If2e948f567a867d8ee11353d79f3224faeac9215
253 lines
11 KiB
YAML
253 lines
11 KiB
YAML
|
|
---
|
|
apiVersion: apiextensions.k8s.io/v1beta1
|
|
kind: CustomResourceDefinition
|
|
metadata:
|
|
annotations:
|
|
controller-gen.kubebuilder.io/version: v0.3.0
|
|
creationTimestamp: null
|
|
name: sipclusters.airship.airshipit.org
|
|
spec:
|
|
group: airship.airshipit.org
|
|
names:
|
|
kind: SIPCluster
|
|
listKind: SIPClusterList
|
|
plural: sipclusters
|
|
singular: sipcluster
|
|
scope: Namespaced
|
|
subresources:
|
|
status: {}
|
|
validation:
|
|
openAPIV3Schema:
|
|
description: SIPCluster is the Schema for the sipclusters API
|
|
properties:
|
|
apiVersion:
|
|
description: 'APIVersion defines the versioned schema of this representation
|
|
of an object. Servers should convert recognized schemas to the latest
|
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
|
type: string
|
|
kind:
|
|
description: 'Kind is a string value representing the REST resource this
|
|
object represents. Servers may infer this from the endpoint the client
|
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
|
type: string
|
|
metadata:
|
|
type: object
|
|
spec:
|
|
description: SIPClusterSpec defines the desired state of a SIPCluster
|
|
properties:
|
|
nodes:
|
|
additionalProperties:
|
|
description: 'NodeSet are the the list of Nodes objects workers, or
|
|
ControlPlane that define expectations for the Tenant Clusters Includes
|
|
artifacts to associate with each defined namespace Such as : - Roles
|
|
for the Nodes - Flavor for theh Nodes image - Scheduling expectations
|
|
- Scale of the group of Nodes'
|
|
properties:
|
|
count:
|
|
description: Count defines the scale expectations for the Nodes
|
|
properties:
|
|
active:
|
|
description: 'INSERT ADDITIONAL STATUS FIELD - define observed
|
|
state of cluster Important: Run "make" to regenerate code
|
|
after modifying this file'
|
|
type: integer
|
|
standby:
|
|
type: integer
|
|
type: object
|
|
spreadTopology:
|
|
description: PlaceHolder until we define the real expected Implementation
|
|
Scheduling define constraints that allow the SIP Scheduler to
|
|
identify the required BMH's to allow CAPI to build a cluster
|
|
enum:
|
|
- PerRack
|
|
- PerHost
|
|
type: string
|
|
vmFlavor:
|
|
description: VMFlavor is essentially a Flavor label identifying
|
|
the type of Node that meets the construction reqirements
|
|
type: string
|
|
type: object
|
|
description: Nodes defines the set of nodes to schedule for each vm
|
|
role.
|
|
type: object
|
|
services:
|
|
description: Services defines the services that are deployed when a
|
|
SIPCluster is provisioned.
|
|
properties:
|
|
auth:
|
|
description: Auth defines the sub-cluster authentication services.
|
|
items:
|
|
properties:
|
|
clusterIP:
|
|
type: string
|
|
image:
|
|
type: string
|
|
nodeInterfaceId:
|
|
type: string
|
|
nodeLabels:
|
|
additionalProperties:
|
|
type: string
|
|
type: object
|
|
nodePort:
|
|
type: integer
|
|
required:
|
|
- image
|
|
- nodePort
|
|
type: object
|
|
type: array
|
|
jumpHost:
|
|
description: JumpHost defines the sub-cluster jump host services.
|
|
items:
|
|
description: JumpHostService is an infrastructure service type
|
|
that represents the sub-cluster jump-host service.
|
|
properties:
|
|
bmc:
|
|
description: BMCOpts contains options for BMC communication.
|
|
properties:
|
|
proxy:
|
|
type: boolean
|
|
type: object
|
|
clusterIP:
|
|
type: string
|
|
image:
|
|
type: string
|
|
nodeInterfaceId:
|
|
type: string
|
|
nodeLabels:
|
|
additionalProperties:
|
|
type: string
|
|
type: object
|
|
nodePort:
|
|
type: integer
|
|
nodeSSHPrivateKeys:
|
|
description: NodeSSHPrivateKeys holds the name of a Secret
|
|
in the same namespace as the SIPCluster CR, whose key values
|
|
each represent an ssh private key that can be used to access
|
|
the cluster nodes. They are mounted into the jumphost with
|
|
the secret keys serving as file names relative to a common
|
|
directory, and then configured as identity files in the
|
|
SSH config file of the default user.
|
|
type: string
|
|
sshAuthorizedKeys:
|
|
items:
|
|
type: string
|
|
type: array
|
|
required:
|
|
- image
|
|
- nodePort
|
|
- nodeSSHPrivateKeys
|
|
type: object
|
|
type: array
|
|
loadBalancer:
|
|
description: LoadBalancer defines the sub-cluster load balancer
|
|
services.
|
|
items:
|
|
properties:
|
|
clusterIP:
|
|
type: string
|
|
image:
|
|
type: string
|
|
nodeInterfaceId:
|
|
type: string
|
|
nodeLabels:
|
|
additionalProperties:
|
|
type: string
|
|
type: object
|
|
nodePort:
|
|
type: integer
|
|
required:
|
|
- image
|
|
- nodePort
|
|
type: object
|
|
type: array
|
|
type: object
|
|
required:
|
|
- services
|
|
type: object
|
|
status:
|
|
description: SIPClusterStatus defines the observed state of SIPCluster
|
|
properties:
|
|
conditions:
|
|
items:
|
|
description: "Condition contains details for one aspect of the current
|
|
state of this API Resource. --- This struct is intended for direct
|
|
use as an array at the field path .status.conditions. For example,
|
|
type FooStatus struct{ // Represents the observations of a foo's
|
|
current state. // Known .status.conditions.type are: \"Available\",
|
|
\"Progressing\", and \"Degraded\" // +patchMergeKey=type //
|
|
+patchStrategy=merge // +listType=map // +listMapKey=type
|
|
\ Conditions []metav1.Condition `json:\"conditions,omitempty\"
|
|
patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
|
|
\n // other fields }"
|
|
properties:
|
|
lastTransitionTime:
|
|
description: lastTransitionTime is the last time the condition
|
|
transitioned from one status to another. This should be when
|
|
the underlying condition changed. If that is not known, then
|
|
using the time when the API field changed is acceptable.
|
|
format: date-time
|
|
type: string
|
|
message:
|
|
description: message is a human readable message indicating details
|
|
about the transition. This may be an empty string.
|
|
maxLength: 32768
|
|
type: string
|
|
observedGeneration:
|
|
description: observedGeneration represents the .metadata.generation
|
|
that the condition was set based upon. For instance, if .metadata.generation
|
|
is currently 12, but the .status.conditions[x].observedGeneration
|
|
is 9, the condition is out of date with respect to the current
|
|
state of the instance.
|
|
format: int64
|
|
minimum: 0
|
|
type: integer
|
|
reason:
|
|
description: reason contains a programmatic identifier indicating
|
|
the reason for the condition's last transition. Producers of
|
|
specific condition types may define expected values and meanings
|
|
for this field, and whether the values are considered a guaranteed
|
|
API. The value should be a CamelCase string. This field may
|
|
not be empty.
|
|
maxLength: 1024
|
|
minLength: 1
|
|
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
|
|
type: string
|
|
status:
|
|
description: status of the condition, one of True, False, Unknown.
|
|
enum:
|
|
- "True"
|
|
- "False"
|
|
- Unknown
|
|
type: string
|
|
type:
|
|
description: type of condition in CamelCase or in foo.example.com/CamelCase.
|
|
--- Many .condition.type values are consistent across resources
|
|
like Available, but because arbitrary conditions can be useful
|
|
(see .node.status.conditions), the ability to deconflict is
|
|
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
|
|
maxLength: 316
|
|
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
|
|
type: string
|
|
required:
|
|
- lastTransitionTime
|
|
- message
|
|
- reason
|
|
- status
|
|
- type
|
|
type: object
|
|
type: array
|
|
type: object
|
|
type: object
|
|
version: v1
|
|
versions:
|
|
- name: v1
|
|
served: true
|
|
storage: true
|
|
status:
|
|
acceptedNames:
|
|
kind: ""
|
|
plural: ""
|
|
conditions: []
|
|
storedVersions: []
|