mirror of https://github.com/linkerd/linkerd2.git
Introduce ExternalWorkload CRD (#11805)
To support mesh expansion, the control plane needs to read configuration associated with an external instance (i.e. a VM) for the purpose of service and inbound authorization policy discovery. This change introduces a new CRD that supports the required configuration options. The resource supports: * a list of workload IPs (with a generic format to support ipv4 now and ipv6 in the future) * a set of mesh TLS settings (SNI and identity) * a set of ports exposed by the workload * a set of status conditions --------- Signed-off-by: Matei David <matei@buoyant.io> Co-authored-by: Oliver Gould <ver@buoyant.io>
This commit is contained in:
parent
cf2999df42
commit
31e1334f9e
|
|
@ -0,0 +1,157 @@
|
|||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: externalworkloads.workload.linkerd.io
|
||||
annotations:
|
||||
{{ include "partials.annotations.created-by" . }}
|
||||
labels:
|
||||
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
|
||||
linkerd.io/control-plane-ns: {{.Release.Namespace}}
|
||||
spec:
|
||||
group: workload.linkerd.io
|
||||
names:
|
||||
categories:
|
||||
- external
|
||||
kind: ExternalWorkload
|
||||
listKind: ExternalWorkloadList
|
||||
plural: externalworkloads
|
||||
singular: externalworkload
|
||||
shortNames: []
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- jsonPath: .spec.meshTls.identity
|
||||
name: Identity
|
||||
type: string
|
||||
- jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
served: true
|
||||
storage: true
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: >-
|
||||
An ExternalWorkload describes a single workload (i.e. a deployable unit) external
|
||||
to the cluster that should be enrolled in the mesh.
|
||||
type: object
|
||||
required: [spec]
|
||||
properties:
|
||||
apiVerson:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
meshTls:
|
||||
description: meshTls describes TLS settings associated with an
|
||||
external workload.
|
||||
properties:
|
||||
identity:
|
||||
type: string
|
||||
description: identity of the workload. Corresponds to the
|
||||
identity used in the workload's certificate. It is used
|
||||
by peers to perform verification in the mTLS handshake.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
serverName:
|
||||
type: string
|
||||
description: serverName is the name of the workload in DNS
|
||||
format. It is used by the workload to terminate TLS using
|
||||
SNI.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
type: object
|
||||
ports:
|
||||
type: array
|
||||
description: ports describes a list of ports exposed by the
|
||||
workload
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: name must be an IANA_SVC_NAME and unique
|
||||
within the ports set. Each named port can be referred
|
||||
to by services.
|
||||
port:
|
||||
format: int32
|
||||
maximum: 65535
|
||||
minimum: 1
|
||||
type: integer
|
||||
protocol:
|
||||
description: protocol exposed by the port. Must be UDP or
|
||||
TCP. Defaults to TCP.
|
||||
type: string
|
||||
default: "TCP"
|
||||
workloadIPs:
|
||||
type: array
|
||||
description: workloadIPs contains a list of IP addresses that
|
||||
can be used to send traffic to the workload.
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
ip:
|
||||
type: string
|
||||
type: object
|
||||
required:
|
||||
- ports
|
||||
- workloadIPs
|
||||
status:
|
||||
type: object
|
||||
properties:
|
||||
conditions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
lastProbeTime:
|
||||
description: lastProbeTime is the last time the
|
||||
healthcheck endpoint was probed.
|
||||
format: date-time
|
||||
type: string
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the
|
||||
condition transitioned from one status to another.
|
||||
format: date-time
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition (one of True, False, Unknown)
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of the condition in CamelCase or in
|
||||
foo.example.com/CamelCase.
|
||||
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
|
||||
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
|
||||
message:
|
||||
description: message is a human readable message
|
||||
indicating details about the transition. This may be an
|
||||
empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- status
|
||||
- type
|
||||
- reason
|
||||
- message
|
||||
|
|
@ -55,6 +55,7 @@ var (
|
|||
"templates/policy/server.yaml",
|
||||
"templates/serviceprofile.yaml",
|
||||
"templates/gateway.networking.k8s.io_httproutes.yaml",
|
||||
"templates/workload/external-workload.yaml",
|
||||
}
|
||||
|
||||
templatesControlPlane = []string{
|
||||
|
|
|
|||
|
|
@ -10137,3 +10137,160 @@ status:
|
|||
plural: ""
|
||||
conditions: null
|
||||
storedVersions: null
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: externalworkloads.workload.linkerd.io
|
||||
annotations:
|
||||
linkerd.io/created-by: linkerd/cli dev-undefined
|
||||
labels:
|
||||
helm.sh/chart: linkerd-crds-1.9.1-edge
|
||||
linkerd.io/control-plane-ns: linkerd
|
||||
spec:
|
||||
group: workload.linkerd.io
|
||||
names:
|
||||
categories:
|
||||
- external
|
||||
kind: ExternalWorkload
|
||||
listKind: ExternalWorkloadList
|
||||
plural: externalworkloads
|
||||
singular: externalworkload
|
||||
shortNames: []
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- jsonPath: .spec.meshTls.identity
|
||||
name: Identity
|
||||
type: string
|
||||
- jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
served: true
|
||||
storage: true
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: >-
|
||||
An ExternalWorkload describes a single workload (i.e. a deployable unit) external
|
||||
to the cluster that should be enrolled in the mesh.
|
||||
type: object
|
||||
required: [spec]
|
||||
properties:
|
||||
apiVerson:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
meshTls:
|
||||
description: meshTls describes TLS settings associated with an
|
||||
external workload.
|
||||
properties:
|
||||
identity:
|
||||
type: string
|
||||
description: identity of the workload. Corresponds to the
|
||||
identity used in the workload's certificate. It is used
|
||||
by peers to perform verification in the mTLS handshake.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
serverName:
|
||||
type: string
|
||||
description: serverName is the name of the workload in DNS
|
||||
format. It is used by the workload to terminate TLS using
|
||||
SNI.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
type: object
|
||||
ports:
|
||||
type: array
|
||||
description: ports describes a list of ports exposed by the
|
||||
workload
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: name must be an IANA_SVC_NAME and unique
|
||||
within the ports set. Each named port can be referred
|
||||
to by services.
|
||||
port:
|
||||
format: int32
|
||||
maximum: 65535
|
||||
minimum: 1
|
||||
type: integer
|
||||
protocol:
|
||||
description: protocol exposed by the port. Must be UDP or
|
||||
TCP. Defaults to TCP.
|
||||
type: string
|
||||
default: "TCP"
|
||||
workloadIPs:
|
||||
type: array
|
||||
description: workloadIPs contains a list of IP addresses that
|
||||
can be used to send traffic to the workload.
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
ip:
|
||||
type: string
|
||||
type: object
|
||||
required:
|
||||
- ports
|
||||
- workloadIPs
|
||||
status:
|
||||
type: object
|
||||
properties:
|
||||
conditions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
lastProbeTime:
|
||||
description: lastProbeTime is the last time the
|
||||
healthcheck endpoint was probed.
|
||||
format: date-time
|
||||
type: string
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the
|
||||
condition transitioned from one status to another.
|
||||
format: date-time
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition (one of True, False, Unknown)
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of the condition in CamelCase or in
|
||||
foo.example.com/CamelCase.
|
||||
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
|
||||
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
|
||||
message:
|
||||
description: message is a human readable message
|
||||
indicating details about the transition. This may be an
|
||||
empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- status
|
||||
- type
|
||||
- reason
|
||||
- message
|
||||
|
|
|
|||
|
|
@ -10153,3 +10153,162 @@ status:
|
|||
plural: ""
|
||||
conditions: null
|
||||
storedVersions: null
|
||||
---
|
||||
# Source: linkerd-crds/templates/workload/external-workload.yaml
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: externalworkloads.workload.linkerd.io
|
||||
annotations:
|
||||
linkerd.io/created-by: linkerd/helm linkerd-version
|
||||
labels:
|
||||
helm.sh/chart: linkerd-crds-
|
||||
linkerd.io/control-plane-ns: linkerd-dev
|
||||
spec:
|
||||
group: workload.linkerd.io
|
||||
names:
|
||||
categories:
|
||||
- external
|
||||
kind: ExternalWorkload
|
||||
listKind: ExternalWorkloadList
|
||||
plural: externalworkloads
|
||||
singular: externalworkload
|
||||
shortNames: []
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- jsonPath: .spec.meshTls.identity
|
||||
name: Identity
|
||||
type: string
|
||||
- jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
served: true
|
||||
storage: true
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: >-
|
||||
An ExternalWorkload describes a single workload (i.e. a deployable unit) external
|
||||
to the cluster that should be enrolled in the mesh.
|
||||
type: object
|
||||
required: [spec]
|
||||
properties:
|
||||
apiVerson:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
meshTls:
|
||||
description: meshTls describes TLS settings associated with an
|
||||
external workload.
|
||||
properties:
|
||||
identity:
|
||||
type: string
|
||||
description: identity of the workload. Corresponds to the
|
||||
identity used in the workload's certificate. It is used
|
||||
by peers to perform verification in the mTLS handshake.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
serverName:
|
||||
type: string
|
||||
description: serverName is the name of the workload in DNS
|
||||
format. It is used by the workload to terminate TLS using
|
||||
SNI.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
type: object
|
||||
ports:
|
||||
type: array
|
||||
description: ports describes a list of ports exposed by the
|
||||
workload
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: name must be an IANA_SVC_NAME and unique
|
||||
within the ports set. Each named port can be referred
|
||||
to by services.
|
||||
port:
|
||||
format: int32
|
||||
maximum: 65535
|
||||
minimum: 1
|
||||
type: integer
|
||||
protocol:
|
||||
description: protocol exposed by the port. Must be UDP or
|
||||
TCP. Defaults to TCP.
|
||||
type: string
|
||||
default: "TCP"
|
||||
workloadIPs:
|
||||
type: array
|
||||
description: workloadIPs contains a list of IP addresses that
|
||||
can be used to send traffic to the workload.
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
ip:
|
||||
type: string
|
||||
type: object
|
||||
required:
|
||||
- ports
|
||||
- workloadIPs
|
||||
status:
|
||||
type: object
|
||||
properties:
|
||||
conditions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
lastProbeTime:
|
||||
description: lastProbeTime is the last time the
|
||||
healthcheck endpoint was probed.
|
||||
format: date-time
|
||||
type: string
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the
|
||||
condition transitioned from one status to another.
|
||||
format: date-time
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition (one of True, False, Unknown)
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of the condition in CamelCase or in
|
||||
foo.example.com/CamelCase.
|
||||
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
|
||||
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
|
||||
message:
|
||||
description: message is a human readable message
|
||||
indicating details about the transition. This may be an
|
||||
empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- status
|
||||
- type
|
||||
- reason
|
||||
- message
|
||||
|
|
|
|||
|
|
@ -10153,3 +10153,162 @@ status:
|
|||
plural: ""
|
||||
conditions: null
|
||||
storedVersions: null
|
||||
---
|
||||
# Source: linkerd-crds/templates/workload/external-workload.yaml
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: externalworkloads.workload.linkerd.io
|
||||
annotations:
|
||||
linkerd.io/created-by: linkerd/helm linkerd-version
|
||||
labels:
|
||||
helm.sh/chart: linkerd-crds-
|
||||
linkerd.io/control-plane-ns: linkerd-dev
|
||||
spec:
|
||||
group: workload.linkerd.io
|
||||
names:
|
||||
categories:
|
||||
- external
|
||||
kind: ExternalWorkload
|
||||
listKind: ExternalWorkloadList
|
||||
plural: externalworkloads
|
||||
singular: externalworkload
|
||||
shortNames: []
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- jsonPath: .spec.meshTls.identity
|
||||
name: Identity
|
||||
type: string
|
||||
- jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
served: true
|
||||
storage: true
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: >-
|
||||
An ExternalWorkload describes a single workload (i.e. a deployable unit) external
|
||||
to the cluster that should be enrolled in the mesh.
|
||||
type: object
|
||||
required: [spec]
|
||||
properties:
|
||||
apiVerson:
|
||||
type: string
|
||||
kind:
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
meshTls:
|
||||
description: meshTls describes TLS settings associated with an
|
||||
external workload.
|
||||
properties:
|
||||
identity:
|
||||
type: string
|
||||
description: identity of the workload. Corresponds to the
|
||||
identity used in the workload's certificate. It is used
|
||||
by peers to perform verification in the mTLS handshake.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
serverName:
|
||||
type: string
|
||||
description: serverName is the name of the workload in DNS
|
||||
format. It is used by the workload to terminate TLS using
|
||||
SNI.
|
||||
minLength: 1
|
||||
maxLength: 253
|
||||
type: object
|
||||
ports:
|
||||
type: array
|
||||
description: ports describes a list of ports exposed by the
|
||||
workload
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: name must be an IANA_SVC_NAME and unique
|
||||
within the ports set. Each named port can be referred
|
||||
to by services.
|
||||
port:
|
||||
format: int32
|
||||
maximum: 65535
|
||||
minimum: 1
|
||||
type: integer
|
||||
protocol:
|
||||
description: protocol exposed by the port. Must be UDP or
|
||||
TCP. Defaults to TCP.
|
||||
type: string
|
||||
default: "TCP"
|
||||
workloadIPs:
|
||||
type: array
|
||||
description: workloadIPs contains a list of IP addresses that
|
||||
can be used to send traffic to the workload.
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
ip:
|
||||
type: string
|
||||
type: object
|
||||
required:
|
||||
- ports
|
||||
- workloadIPs
|
||||
status:
|
||||
type: object
|
||||
properties:
|
||||
conditions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
lastProbeTime:
|
||||
description: lastProbeTime is the last time the
|
||||
healthcheck endpoint was probed.
|
||||
format: date-time
|
||||
type: string
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the
|
||||
condition transitioned from one status to another.
|
||||
format: date-time
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition (one of True, False, Unknown)
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of the condition in CamelCase or in
|
||||
foo.example.com/CamelCase.
|
||||
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
|
||||
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
|
||||
message:
|
||||
description: message is a human readable message
|
||||
indicating details about the transition. This may be an
|
||||
empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- status
|
||||
- type
|
||||
- reason
|
||||
- message
|
||||
|
|
|
|||
Loading…
Reference in New Issue