Skip to content

Commit

Permalink
Merge pull request #119 from stuggi/handle_ingress_v3
Browse files Browse the repository at this point in the history
Update dnsmasq to use service override
  • Loading branch information
openshift-merge-robot authored Sep 20, 2023
2 parents 70498d9 + 4017ab5 commit 2c76cd2
Show file tree
Hide file tree
Showing 14 changed files with 457 additions and 181 deletions.
199 changes: 164 additions & 35 deletions apis/bases/network.openstack.org_dnsmasqs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,41 +62,6 @@ spec:
description: Value of the DNSDataLabelSelectorKey which was set on
the configmaps containing hosts information
type: string
externalEndpoints:
description: ExternalEndpoints, expose a VIP using a pre-created IPAddressPool
items:
description: MetalLBConfig to configure the MetalLB loadbalancer
service
properties:
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:
- ipAddressPool
- loadBalancerIPs
type: object
type: array
nodeSelector:
additionalProperties:
type: string
Expand Down Expand Up @@ -135,6 +100,170 @@ spec:
- values
type: object
type: array
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.
properties:
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: OverrideServiceSpec is a subset of the fields
included in https://pkg.go.dev/k8s.io/[email protected]/core/v1#ServiceSpec
Limited to Type, SessionAffinity, LoadBalancerSourceRanges,
ExternalName, ExternalTrafficPolicy, SessionAffinityConfig,
IPFamilyPolicy, LoadBalancerClass and InternalTrafficPolicy
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
type: object
type: object
replicas:
default: 1
description: Replicas - DNSMasq Replicas
Expand Down
2 changes: 1 addition & 1 deletion apis/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.19
require (
github.com/onsi/ginkgo/v2 v2.12.0
github.com/onsi/gomega v1.27.10
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230824094610-976b18ca2875
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230919113507-d74c2f31d216
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
k8s.io/api v0.26.9
k8s.io/apimachinery v0.26.9
Expand Down
4 changes: 2 additions & 2 deletions apis/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230824094610-976b18ca2875 h1:pj22n6PQy/XAmV5m6XaarMY6X1lvxAh16oVT5ZSVoNI=
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230824094610-976b18ca2875/go.mod h1:Mqg9hyHpWPda62750vqmk5TajxP3zbYPDP1rtSH7mg0=
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230919113507-d74c2f31d216 h1:arYbQA6bLyXJkHm+6M6gPc4YpWMFjs5qkG16Yii4UDo=
github.com/openstack-k8s-operators/lib-common/modules/common v0.1.1-0.20230919113507-d74c2f31d216/go.mod h1:Ge7Yf6AUmjEvJK9AIW2bT5udLzBIcK59b1QxqymncaQ=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
Expand Down
33 changes: 8 additions & 25 deletions apis/network/v1beta1/dnsmasq_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package v1beta1

import (
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
"github.com/openstack-k8s-operators/lib-common/modules/common/service"
"github.com/openstack-k8s-operators/lib-common/modules/common/util"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -69,38 +70,20 @@ type DNSMasqSpec struct {
// specific NodeSelector Settings.
NodeSelector map[string]string `json:"nodeSelector,omitempty"`

// +kubebuilder:validation:Optional
// ExternalEndpoints, expose a VIP using a pre-created IPAddressPool
ExternalEndpoints []MetalLBConfig `json:"externalEndpoints,omitempty"`

// +kubebuilder:validation:Optional
// +kubebuilder:default="dnsdata"
// Value of the DNSDataLabelSelectorKey which was set on the configmaps containing hosts information
DNSDataLabelSelectorValue string `json:"dnsDataLabelSelectorValue"`
}

// MetalLBConfig to configure the MetalLB loadbalancer service
type MetalLBConfig struct {
// +kubebuilder:validation:Required
// +kubebuilder:validation:MinLength=1
// IPAddressPool expose VIP via MetalLB on the IPAddressPool
IPAddressPool string `json:"ipAddressPool"`

// +kubebuilder:validation:Optional
// +kubebuilder:default=true
// SharedIP if true, VIP/VIPs get shared with multiple services
SharedIP bool `json:"sharedIP"`
// Override, provides the ability to override the generated manifest of several child resources.
Override DNSMasqOverrideSpec `json:"override,omitempty"`
}

// +kubebuilder:validation:Optional
// +kubebuilder:default=""
// 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.
SharedIPKey string `json:"sharedIPKey"`

// +kubebuilder:validation: Required
// LoadBalancerIPs, request given IPs from the pool if available. Using a list to allow dual stack (IPv4/IPv6) support
LoadBalancerIPs []string `json:"loadBalancerIPs"`
// DNSMasqOverrideSpec to override the generated manifest of several child resources.
type DNSMasqOverrideSpec struct {
// Override configuration for the Service created to serve traffic to the cluster.
Service *service.OverrideSpec `json:"service,omitempty"`
}

// DNSMasqDebug defines the observed state of DNSMasq
Expand Down
Loading

0 comments on commit 2c76cd2

Please sign in to comment.