add filer and s3 ingress
This commit is contained in:
parent
31c843cae4
commit
46806156b6
|
@ -98,9 +98,6 @@ type SeaweedSpec struct {
|
||||||
StatefulSetUpdateStrategy appsv1.StatefulSetUpdateStrategyType `json:"statefulSetUpdateStrategy,omitempty"`
|
StatefulSetUpdateStrategy appsv1.StatefulSetUpdateStrategyType `json:"statefulSetUpdateStrategy,omitempty"`
|
||||||
|
|
||||||
VolumeServerDiskCount int32 `json:"volumeServerDiskCount,omitempty"`
|
VolumeServerDiskCount int32 `json:"volumeServerDiskCount,omitempty"`
|
||||||
|
|
||||||
// Ingresses
|
|
||||||
Hosts []string `json:"hosts,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeaweedStatus defines the observed state of Seaweed
|
// SeaweedStatus defines the observed state of Seaweed
|
||||||
|
@ -151,6 +148,9 @@ type VolumeSpec struct {
|
||||||
IdleTimeout *int32 `json:"idleTimeout,omitempty"`
|
IdleTimeout *int32 `json:"idleTimeout,omitempty"`
|
||||||
MaxVolumeCounts *int32 `json:"maxVolumeCounts,omitempty"`
|
MaxVolumeCounts *int32 `json:"maxVolumeCounts,omitempty"`
|
||||||
MinFreeSpacePercent *int32 `json:"minFreeSpacePercent,omitempty"`
|
MinFreeSpacePercent *int32 `json:"minFreeSpacePercent,omitempty"`
|
||||||
|
|
||||||
|
// Ingresses
|
||||||
|
HostSuffix *string `json:"hostSuffix,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// FilerSpec is the spec for filers
|
// FilerSpec is the spec for filers
|
||||||
|
@ -169,6 +169,9 @@ type FilerSpec struct {
|
||||||
// Filer-specific settings
|
// Filer-specific settings
|
||||||
|
|
||||||
MaxMB *int32 `json:"maxMB,omitempty"`
|
MaxMB *int32 `json:"maxMB,omitempty"`
|
||||||
|
|
||||||
|
// Ingresses
|
||||||
|
HostSuffix *string `json:"hostSuffix,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ComponentSpec is the base spec of each component, the fields should always accessed by the Basic<Component>Spec() method to respect the cluster-level properties
|
// ComponentSpec is the base spec of each component, the fields should always accessed by the Basic<Component>Spec() method to respect the cluster-level properties
|
||||||
|
|
|
@ -128,6 +128,11 @@ func (in *FilerSpec) DeepCopyInto(out *FilerSpec) {
|
||||||
*out = new(int32)
|
*out = new(int32)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.HostSuffix != nil {
|
||||||
|
in, out := &in.HostSuffix, &out.HostSuffix
|
||||||
|
*out = new(string)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FilerSpec.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FilerSpec.
|
||||||
|
@ -315,11 +320,6 @@ func (in *SeaweedSpec) DeepCopyInto(out *SeaweedSpec) {
|
||||||
(*in)[i].DeepCopyInto(&(*out)[i])
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if in.Hosts != nil {
|
|
||||||
in, out := &in.Hosts, &out.Hosts
|
|
||||||
*out = make([]string, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeaweedSpec.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeaweedSpec.
|
||||||
|
@ -424,6 +424,11 @@ func (in *VolumeSpec) DeepCopyInto(out *VolumeSpec) {
|
||||||
*out = new(int32)
|
*out = new(int32)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.HostSuffix != nil {
|
||||||
|
in, out := &in.HostSuffix, &out.HostSuffix
|
||||||
|
*out = new(string)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeSpec.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeSpec.
|
||||||
|
|
|
@ -1343,6 +1343,9 @@ spec:
|
||||||
description: Whether Hostnetwork of the component is enabled. Override
|
description: Whether Hostnetwork of the component is enabled. Override
|
||||||
the cluster-level setting if present
|
the cluster-level setting if present
|
||||||
type: boolean
|
type: boolean
|
||||||
|
hostSuffix:
|
||||||
|
description: Ingresses
|
||||||
|
type: string
|
||||||
imagePullPolicy:
|
imagePullPolicy:
|
||||||
description: ImagePullPolicy of the component. Override the cluster-level
|
description: ImagePullPolicy of the component. Override the cluster-level
|
||||||
imagePullPolicy if present
|
imagePullPolicy if present
|
||||||
|
@ -1492,11 +1495,6 @@ spec:
|
||||||
hostNetwork:
|
hostNetwork:
|
||||||
description: Whether Hostnetwork is enabled for pods
|
description: Whether Hostnetwork is enabled for pods
|
||||||
type: boolean
|
type: boolean
|
||||||
hosts:
|
|
||||||
description: Ingresses
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
type: array
|
|
||||||
image:
|
image:
|
||||||
description: Image
|
description: Image
|
||||||
type: string
|
type: string
|
||||||
|
@ -3190,6 +3188,9 @@ spec:
|
||||||
description: Whether Hostnetwork of the component is enabled. Override
|
description: Whether Hostnetwork of the component is enabled. Override
|
||||||
the cluster-level setting if present
|
the cluster-level setting if present
|
||||||
type: boolean
|
type: boolean
|
||||||
|
hostSuffix:
|
||||||
|
description: Ingresses
|
||||||
|
type: string
|
||||||
idleTimeout:
|
idleTimeout:
|
||||||
format: int32
|
format: int32
|
||||||
type: integer
|
type: integer
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
|
|
||||||
|
seaweedv1 "github.com/seaweedfs/seaweedfs-operator/api/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (r *SeaweedReconciler) createFilerIngress(m *seaweedv1.Seaweed) *extensionsv1beta1.Ingress {
|
||||||
|
labels := labelsForIngress(m.Name)
|
||||||
|
|
||||||
|
dep := &extensionsv1beta1.Ingress{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: m.Name + "-ingress",
|
||||||
|
Namespace: m.Namespace,
|
||||||
|
Labels: labels,
|
||||||
|
},
|
||||||
|
Spec: extensionsv1beta1.IngressSpec{
|
||||||
|
// TLS: ingressSpec.TLS,
|
||||||
|
Rules: []extensionsv1beta1.IngressRule{
|
||||||
|
{
|
||||||
|
Host: "filer." + *m.Spec.Filer.HostSuffix,
|
||||||
|
IngressRuleValue: extensionsv1beta1.IngressRuleValue{
|
||||||
|
HTTP: &extensionsv1beta1.HTTPIngressRuleValue{
|
||||||
|
Paths: []extensionsv1beta1.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Path: "/",
|
||||||
|
Backend: extensionsv1beta1.IngressBackend{
|
||||||
|
ServiceName: m.Name + "-filer",
|
||||||
|
ServicePort: intstr.FromInt(seaweedv1.FilerHTTPPort),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "s3." + *m.Spec.Filer.HostSuffix,
|
||||||
|
IngressRuleValue: extensionsv1beta1.IngressRuleValue{
|
||||||
|
HTTP: &extensionsv1beta1.HTTPIngressRuleValue{
|
||||||
|
Paths: []extensionsv1beta1.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Path: "/",
|
||||||
|
Backend: extensionsv1beta1.IngressBackend{
|
||||||
|
ServiceName: m.Name + "-s3",
|
||||||
|
ServicePort: intstr.FromInt(seaweedv1.FilerS3Port),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set master instance as the owner and controller
|
||||||
|
ctrl.SetControllerReference(m, dep, r.Scheme)
|
||||||
|
return dep
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/seaweedfs/seaweedfs-operator/controllers/label"
|
||||||
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||||
|
|
||||||
|
seaweedv1 "github.com/seaweedfs/seaweedfs-operator/api/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (r *SeaweedReconciler) ensureSeaweedIngress(seaweedCR *seaweedv1.Seaweed) (done bool, result ctrl.Result, err error) {
|
||||||
|
_ = context.Background()
|
||||||
|
_ = r.Log.WithValues("seaweed", seaweedCR.Name)
|
||||||
|
|
||||||
|
if seaweedCR.Spec.Filer.HostSuffix != nil && len(*seaweedCR.Spec.Filer.HostSuffix) != 0 {
|
||||||
|
if done, result, err = r.ensureFilerIngress(seaweedCR); done {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *SeaweedReconciler) ensureFilerIngress(seaweedCR *seaweedv1.Seaweed) (bool, ctrl.Result, error) {
|
||||||
|
log := r.Log.WithValues("sw-master-service", seaweedCR.Name)
|
||||||
|
|
||||||
|
ingressService := r.createFilerIngress(seaweedCR)
|
||||||
|
if err := controllerutil.SetControllerReference(seaweedCR, ingressService, r.Scheme); err != nil {
|
||||||
|
return ReconcileResult(err)
|
||||||
|
}
|
||||||
|
_, err := r.CreateOrUpdateIngress(ingressService)
|
||||||
|
|
||||||
|
log.Info("Get master service " + ingressService.Name)
|
||||||
|
return ReconcileResult(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func labelsForIngress(name string) map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
label.ManagedByLabelKey: "seaweedfs-operator",
|
||||||
|
label.NameLabelKey: "seaweedfs",
|
||||||
|
label.ComponentLabelKey: "ingress",
|
||||||
|
label.InstanceLabelKey: name,
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
seaweedv1 "github.com/seaweedfs/seaweedfs-operator/api/v1"
|
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||||
|
@ -14,49 +13,11 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
|
||||||
"k8s.io/client-go/kubernetes/scheme"
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
// svcName is the backend service name
|
|
||||||
func createIngress(seaweedCR *seaweedv1.Seaweed, svcName string, port int) *extensionsv1beta1.Ingress {
|
|
||||||
ingressLabel := map[string]string{"app": "seaweedfs", "role": "ingress", "name": svcName}
|
|
||||||
|
|
||||||
ingress := &extensionsv1beta1.Ingress{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: svcName + "-ingress",
|
|
||||||
Namespace: seaweedCR.Namespace,
|
|
||||||
Labels: ingressLabel,
|
|
||||||
},
|
|
||||||
Spec: extensionsv1beta1.IngressSpec{
|
|
||||||
Rules: []extensionsv1beta1.IngressRule{},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, host := range seaweedCR.Spec.Hosts {
|
|
||||||
rule := extensionsv1beta1.IngressRule{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: extensionsv1beta1.IngressRuleValue{
|
|
||||||
HTTP: &extensionsv1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []extensionsv1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: extensionsv1beta1.IngressBackend{
|
|
||||||
ServiceName: svcName,
|
|
||||||
ServicePort: intstr.FromInt(port),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
ingress.Spec.Rules = append(ingress.Spec.Rules, rule)
|
|
||||||
}
|
|
||||||
return ingress
|
|
||||||
}
|
|
||||||
|
|
||||||
// the following is adapted from tidb-operator/pkg/controller/generic_control.go
|
// the following is adapted from tidb-operator/pkg/controller/generic_control.go
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -68,6 +68,10 @@ func (r *SeaweedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if done, result, err = r.ensureSeaweedIngress(seaweedCR); done {
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
return ctrl.Result{}, nil
|
return ctrl.Result{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue