Skip to content

Commit

Permalink
Update placementapi to use service override
Browse files Browse the repository at this point in the history
Removes creation of routes. Those get done in the openstack-operator.
Via service overrides the openstack-operator customize the services
for the endpoints to the desired state specified in the ctlplane CR
using externalEndpoints or the service override in the service template.

Jira: OSP-26690

Depends-On: openstack-k8s-operators/lib-common#313
  • Loading branch information
stuggi committed Aug 14, 2023
1 parent 6e7a009 commit 33648c8
Show file tree
Hide file tree
Showing 15 changed files with 578 additions and 213 deletions.
222 changes: 180 additions & 42 deletions api/bases/placement.openstack.org_placementapis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,48 +92,6 @@ spec:
to add additional files. Those get added to the service config dir
in /etc/<service> . TODO: -> implement'
type: object
externalEndpoints:
description: ExternalEndpoints, expose a VIP using a pre-created IPAddressPool
items:
description: MetalLBConfig to configure the MetalLB loadbalancer
service
properties:
endpoint:
description: Endpoint, OpenStack endpoint this service maps
to
enum:
- internal
- public
type: string
ipAddressPool:
description: IPAddressPool expose VIP via MetalLB on the IPAddressPool
minLength: 1
type: string
loadBalancerIPs:
description: LoadBalancerIPs, request given IPs from the pool
if available. Using a list to allow dual stack (IPv4/IPv6)
support
items:
type: string
type: array
sharedIP:
default: true
description: SharedIP if true, VIP/VIPs get shared with multiple
services
type: boolean
sharedIPKey:
default: ""
description: SharedIPKey specifies the sharing key which gets
set as the annotation on the LoadBalancer service. Services
which share the same VIP must have the same SharedIPKey. Defaults
to the IPAddressPool if SharedIP is true, but no SharedIPKey
specified.
type: string
required:
- endpoint
- ipAddressPool
type: object
type: array
networkAttachments:
description: NetworkAttachments is a list of NetworkAttachment resource
names to expose the services to the given network
Expand All @@ -146,6 +104,186 @@ spec:
description: NodeSelector to target subset of worker nodes running
this service
type: object
override:
description: Override, provides the ability to override the generated
manifest of several child resources.
properties:
service:
description: Override configuration for the Service created to
serve traffic to the cluster.
items:
description: OverrideSpec - service override configuration for
the Service created to serve traffic to the cluster. Allows
for the manifest of the created Service to be overwritten
with custom configuration.
properties:
endpoint:
description: Endpoint, OpenStack endpoint this service maps
to
enum:
- internal
- public
type: string
endpointURL:
description: EndpointURL to be used to register the service
in keystone.
type: string
metadata:
description: EmbeddedLabelsAnnotations is an embedded subset
of the fields included in k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta.
Only labels and annotations are included.
properties:
annotations:
additionalProperties:
type: string
description: 'Annotations is an unstructured key value
map stored with a resource that may be set by external
tools to store and retrieve arbitrary metadata. They
are not queryable and should be preserved when modifying
objects. More info: http://kubernetes.io/docs/user-guide/annotations'
type: object
labels:
additionalProperties:
type: string
description: 'Map of string keys and values that can
be used to organize and categorize (scope and select)
objects. May match selectors of replication controllers
and services. More info: http://kubernetes.io/docs/user-guide/labels'
type: object
type: object
spec:
description: Spec defines the behavior of a Service. https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
properties:
externalName:
description: externalName is the external reference
that discovery mechanisms will return as an alias
for this service (e.g. a DNS CNAME record). No proxying
will be involved. Must be a lowercase RFC-1123 hostname
(https://tools.ietf.org/html/rfc1123) and requires
`type` to be "ExternalName".
type: string
externalTrafficPolicy:
description: externalTrafficPolicy describes how nodes
distribute service traffic they receive on one of
the Service's "externally-facing" addresses (NodePorts,
ExternalIPs, and LoadBalancer IPs). If set to "Local",
the proxy will configure the service in a way that
assumes that external load balancers will take care
of balancing the service traffic between nodes, and
so each node will deliver traffic only to the node-local
endpoints of the service, without masquerading the
client source IP. (Traffic mistakenly sent to a node
with no endpoints will be dropped.) The default value,
"Cluster", uses the standard behavior of routing to
all endpoints evenly (possibly modified by topology
and other features). Note that traffic sent to an
External IP or LoadBalancer IP from within the cluster
will always get "Cluster" semantics, but clients sending
to a NodePort from within the cluster may need to
take traffic policy into account when picking a node.
type: string
internalTrafficPolicy:
description: InternalTrafficPolicy describes how nodes
distribute service traffic they receive on the ClusterIP.
If set to "Local", the proxy will assume that pods
only want to talk to endpoints of the service on the
same node as the pod, dropping the traffic if there
are no local endpoints. The default value, "Cluster",
uses the standard behavior of routing to all endpoints
evenly (possibly modified by topology and other features).
type: string
ipFamilyPolicy:
description: IPFamilyPolicy represents the dual-stack-ness
requested or required by this Service. If there is
no value provided, then this field will be set to
SingleStack. Services can be "SingleStack" (a single
IP family), "PreferDualStack" (two IP families on
dual-stack configured clusters or a single IP family
on single-stack clusters), or "RequireDualStack" (two
IP families on dual-stack configured clusters, otherwise
fail). The ipFamilies and clusterIPs fields depend
on the value of this field. This field will be wiped
when updating a service to type ExternalName.
type: string
loadBalancerClass:
description: loadBalancerClass is the class of the load
balancer implementation this Service belongs to. If
specified, the value of this field must be a label-style
identifier, with an optional prefix, e.g. "internal-vip"
or "example.com/internal-vip". Unprefixed names are
reserved for end-users. This field can only be set
when the Service type is 'LoadBalancer'. If not set,
the default load balancer implementation is used,
today this is typically done through the cloud provider
integration, but should apply for any default implementation.
If set, it is assumed that a load balancer implementation
is watching for Services with a matching class. Any
default load balancer implementation (e.g. cloud providers)
should ignore Services that set this field. This field
can only be set when creating or updating a Service
to type 'LoadBalancer'. Once set, it can not be changed.
This field will be wiped when a service is updated
to a non 'LoadBalancer' type.
type: string
loadBalancerSourceRanges:
description: 'If specified and supported by the platform,
this will restrict traffic through the cloud-provider
load-balancer will be restricted to the specified
client IPs. This field will be ignored if the cloud-provider
does not support the feature." More info: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/'
items:
type: string
type: array
sessionAffinity:
description: 'Supports "ClientIP" and "None". Used to
maintain session affinity. Enable client IP based
session affinity. Must be ClientIP or None. Defaults
to None. More info: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies'
type: string
sessionAffinityConfig:
description: sessionAffinityConfig contains the configurations
of session affinity.
properties:
clientIP:
description: clientIP contains the configurations
of Client IP based session affinity.
properties:
timeoutSeconds:
description: timeoutSeconds specifies the seconds
of ClientIP type session sticky time. The
value must be >0 && <=86400(for 1 day) if
ServiceAffinity == "ClientIP". Default value
is 10800(for 3 hours).
format: int32
type: integer
type: object
type: object
type:
description: 'type determines how the Service is exposed.
Defaults to ClusterIP. Valid options are ExternalName,
ClusterIP, NodePort, and LoadBalancer. "ClusterIP"
allocates a cluster-internal IP address for load-balancing
to endpoints. Endpoints are determined by the selector
or if that is not specified, by manual construction
of an Endpoints object or EndpointSlice objects. If
clusterIP is "None", no virtual IP is allocated and
the endpoints are published as a set of endpoints
rather than a virtual IP. "NodePort" builds on ClusterIP
and allocates a port on every node which routes to
the same endpoints as the clusterIP. "LoadBalancer"
builds on NodePort and creates an external load-balancer
(if supported in the current cloud) which routes to
the same endpoints as the clusterIP. "ExternalName"
aliases this service to the specified externalName.
Several other fields do not apply to ExternalName
services. More info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types'
type: string
type: object
required:
- endpoint
type: object
type: array
type: object
passwordSelectors:
default:
database: PlacementDatabasePassword
Expand Down
12 changes: 9 additions & 3 deletions api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/emicklei/go-restful/v3 v3.10.1 // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
Expand Down Expand Up @@ -45,7 +45,7 @@ require (
github.com/spf13/pflag v1.0.5 // indirect
go.uber.org/zap v1.25.0 // indirect
golang.org/x/net v0.12.0 // indirect
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 // indirect
golang.org/x/oauth2 v0.4.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/term v0.10.0 // indirect
golang.org/x/text v0.11.0 // indirect
Expand All @@ -59,7 +59,7 @@ require (
k8s.io/apiextensions-apiserver v0.26.7 //indirect
k8s.io/client-go v0.26.7 //indirect
k8s.io/component-base v0.26.7 //indirect
k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/klog/v2 v2.100.1 // indirect
k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a //indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b //indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd //indirect
Expand All @@ -70,3 +70,9 @@ require (
// mschuppert: map to latest commit from release-4.13 tag
// must consistent within modules and service operators
replace github.com/openshift/api => github.com/openshift/api v0.0.0-20230414143018-3367bc7e6ac7 //allow-merging

replace github.com/openstack-k8s-operators/lib-common/modules/common => github.com/stuggi/lib-common/modules/common v0.0.0-20230809093007-fabc8af10167

replace github.com/openstack-k8s-operators/lib-common/modules/openstack => github.com/stuggi/lib-common/modules/openstack v0.0.0-20230809093007-fabc8af10167

replace github.com/openstack-k8s-operators/keystone-operator/api => github.com/stuggi/keystone-operator/api v0.0.0-20230809093350-20b643058213
Loading

0 comments on commit 33648c8

Please sign in to comment.