feat: add ingress

This commit is contained in:
cdryzun 2023-09-05 20:14:59 +08:00
parent c20a316026
commit 4983f8b4b1
4 changed files with 95 additions and 1 deletions

View File

@ -35,6 +35,7 @@ type AppServiceSpec struct {
Resources *Resources `json:"resources,omitempty"` Resources *Resources `json:"resources,omitempty"`
Envs []corev1.EnvVar `json:"envs,omitempty"` Envs []corev1.EnvVar `json:"envs,omitempty"`
Ports []corev1.ServicePort `json:"ports,omitempty"` Ports []corev1.ServicePort `json:"ports,omitempty"`
Hostname string `json:"hostname,omitempty"`
} }
type Resources struct { type Resources struct {

View File

@ -143,6 +143,8 @@ spec:
- name - name
type: object type: object
type: array type: array
hostname:
type: string
image: image:
type: string type: string
ports: ports:

View File

@ -22,6 +22,8 @@ import (
"fmt" "fmt"
"reflect" "reflect"
v1 "k8s.io/api/networking/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"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
@ -96,6 +98,15 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
if err := r.Create(context.TODO(), service); err != nil { if err := r.Create(context.TODO(), service); err != nil {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
// 2.1 创建 Ingress
if instance.Spec.Hostname != "" {
ingress := NewIngress(instance)
if err := r.Client.Create(context.TODO(), ingress); err != nil {
return ctrl.Result{}, err
}
}
// 3. 关联 Annotations // 3. 关联 Annotations
data, _ := json.Marshal(instance.Spec) data, _ := json.Marshal(instance.Spec)
if instance.Annotations != nil { if instance.Annotations != nil {
@ -103,10 +114,10 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
} else { } else {
instance.Annotations = map[string]string{"spec": string(data)} instance.Annotations = map[string]string{"spec": string(data)}
} }
if err := r.Update(context.TODO(), instance); err != nil { if err := r.Update(context.TODO(), instance); err != nil {
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
@ -137,6 +148,31 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
return ctrl.Result{}, err return ctrl.Result{}, err
} }
if instance.Spec.Hostname != "" {
newIngress := NewIngress(instance)
r.Client.Create(context.TODO(), newIngress)
oldIngress := &v1.Ingress{}
if err := r.Get(context.TODO(), req.NamespacedName, oldIngress); err != nil {
return ctrl.Result{}, err
}
oldIngress.Spec = newIngress.Spec
if err := r.Update(context.TODO(), oldIngress); err != nil {
return ctrl.Result{}, err
}
} else {
// 删除 Ingress
oldIngress := &v1.Ingress{
ObjectMeta: ctrl.ObjectMeta{
Name: instance.Name,
Namespace: instance.Namespace,
},
}
if err := r.Delete(context.Background(), oldIngress); err != nil {
return ctrl.Result{}, err
}
}
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
@ -246,3 +282,57 @@ func newContainers(instance *apptreesirpubv1alpha1.AppService) []corev1.Containe
container, container,
} }
} }
// 实现 NewIngress
func NewIngress(instance *apptreesirpubv1alpha1.AppService) *v1.Ingress {
return &v1.Ingress{
ObjectMeta: ctrl.ObjectMeta{
Name: instance.Name,
Namespace: instance.Namespace,
Annotations: map[string]string{
"nginx.ingress.kubernetes.io/rewrite-target": "/",
},
Labels: map[string]string{
"app": instance.Name,
},
OwnerReferences: []metav1.OwnerReference{
*metav1.NewControllerRef(
instance,
schema.GroupVersionKind{
Group: apptreesirpubv1alpha1.SchemeBuilder.GroupVersion.Group,
Version: apptreesirpubv1alpha1.SchemeBuilder.GroupVersion.Version,
Kind: "AppService",
},
)},
},
Spec: v1.IngressSpec{
Rules: []v1.IngressRule{
{
Host: instance.Spec.Hostname,
IngressRuleValue: v1.IngressRuleValue{
HTTP: &v1.HTTPIngressRuleValue{
Paths: []v1.HTTPIngressPath{
{
Path: "/",
PathType: func() *v1.PathType {
pathType := v1.PathTypePrefix
return &pathType
}(),
Backend: v1.IngressBackend{
Service: &v1.IngressServiceBackend{
Name: instance.Name,
Port: v1.ServiceBackendPort{
Number: instance.Spec.Ports[0].TargetPort.IntVal,
},
},
},
},
},
},
},
},
},
},
}
}

View File

@ -11,6 +11,7 @@ metadata:
spec: spec:
size: 1 size: 1
image: nginx:1.7.9 image: nginx:1.7.9
hostname: "test.treesir.pub"
ports: ports:
- port: 80 - port: 80
targetPort: 80 targetPort: 80