working with images

This commit is contained in:
2025-04-03 23:46:25 +03:00
parent f464e8966d
commit b021c161ca
7 changed files with 184 additions and 15 deletions

View File

@@ -33,6 +33,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
servermanagerv1alpha1 "git.acooldomain.co/server-manager/kubernetes-operator/api/v1alpha1"
)
@@ -95,7 +96,7 @@ type ServerManagerReconciler struct {
// +kubebuilder:rbac:groups=,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=server-manager.acooldomain.co,resources=servermanagers/finalizers,verbs=update
// +kubebuilder:rbac:groups=,resources=services,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=,resources=pods,verbs=get;list;watch;create
// +kubebuilder:rbac:groups=,resources=pods,verbs=get;list;watch;create;delete
// Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state.
@@ -151,7 +152,13 @@ func (r *ServerManagerReconciler) Reconcile(ctx context.Context, req ctrl.Reques
}
logging.Info("verified browserPvc")
serverPod := r.ServerPod(s, pvc)
image, err := r.GetImage(ctx, s)
if err != nil {
logging.Error(err, "Failed to get image")
return reconcile.Result{}, err
}
serverPod := r.ServerPod(s, pvc, image)
found := &corev1.Pod{}
err = r.Get(ctx, client.ObjectKey{Namespace: pvc.Namespace, Name: pvc.Name}, found)
if err == nil && !s.Spec.Server.On {
@@ -602,8 +609,13 @@ func (r *ServerManagerReconciler) ServerPvc(s *servermanagerv1alpha1.ServerManag
return pvc
}
func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManager, pvc *corev1.PersistentVolumeClaim) *corev1.Pod {
ports := make([]corev1.ContainerPort, len(s.Spec.Server.Ports))
func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManager, pvc *corev1.PersistentVolumeClaim, image *servermanagerv1alpha1.Image) *corev1.Pod {
serverPorts := image.Spec.Ports
if len(s.Spec.Server.Ports) > 0 {
serverPorts = s.Spec.Server.Ports
}
ports := make([]corev1.ContainerPort, len(serverPorts))
for i, port := range s.Spec.Server.Ports {
ports[i] = corev1.ContainerPort{
@@ -612,6 +624,36 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
}
}
command := image.Spec.Command
if len(s.Spec.Server.Command) > 0 {
command = s.Spec.Server.Command
}
args := image.Spec.Args
if len(s.Spec.Server.Args) > 0 {
args = s.Spec.Server.Args
}
var initContainers []corev1.Container = nil
if image.Spec.InitScript != nil {
initContainers = []corev1.Container{
{
Name: "init",
Image: image.Spec.InitScript.Image,
ImagePullPolicy: corev1.PullIfNotPresent,
Command: image.Spec.Command,
Args: image.Spec.InitScript.Args,
VolumeMounts: []corev1.VolumeMount{
{
Name: "volume",
MountPath: "/data",
},
},
},
}
}
pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: s.Name,
@@ -629,18 +671,19 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
},
},
},
InitContainers: initContainers,
Containers: []corev1.Container{
{
Name: "server",
Image: s.Spec.Server.Image,
Image: image.Spec.Location,
ImagePullPolicy: corev1.PullAlways,
Command: s.Spec.Server.Command,
Args: s.Spec.Server.Args,
WorkingDir: s.Spec.Server.WorkingDir,
Command: command,
Args: args,
WorkingDir: image.Spec.WorkingDir,
Ports: ports,
VolumeMounts: []corev1.VolumeMount{{
Name: "volume",
MountPath: s.Spec.Server.WorkingDir,
MountPath: image.Spec.WorkingDir,
}},
Stdin: true,
TTY: true,
@@ -648,10 +691,21 @@ func (r *ServerManagerReconciler) ServerPod(s *servermanagerv1alpha1.ServerManag
},
},
}
controllerutil.SetControllerReference(s, pod, r.Scheme)
return pod
}
func (r *ServerManagerReconciler) GetImage(ctx context.Context, s *servermanagerv1alpha1.ServerManager) (*servermanagerv1alpha1.Image, error) {
image := &servermanagerv1alpha1.Image{}
err := r.Get(ctx, client.ObjectKey{Name: s.Spec.Server.Image, Namespace: s.Namespace}, image)
if err != nil {
return nil, err
}
return image, nil
}
// SetupWithManager sets up the controller with the Manager.
func (r *ServerManagerReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).