kubebuilder開發一:從controller創建deployment


1、直接在controller目錄下創建文件virtualmachine_controller.go文件

/*
Copyright 2020 fanux.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package controllers

import (
	"context"
	"fmt"

	infrav1 "VM/api/v1"
	"github.com/go-logr/logr"
	appv1 "k8s.io/api/apps/v1"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

// VirtulMachineReconciler reconciles a VirtulMachine object
type VirtulMachineReconciler struct {
	client.Client
	Log    logr.Logger
	Scheme *runtime.Scheme
}

// +kubebuilder:rbac:groups=infra.sealyun.com,resources=virtulmachines,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=infra.sealyun.com,resources=virtulmachines/status,verbs=get;update;patch

func (r *VirtulMachineReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
	ctx := context.Background()
	log := r.Log.WithValues("virtulmachine", req.NamespacedName)

	// your logic here
	vm := &infrav1.VirtulMachine{}
	if err := r.Get(ctx, req.NamespacedName, vm); err != nil {
		log.Error(err, "unable to fetch vm")
	} else {
		fmt.Println(vm.Spec.CPU, vm.Spec.Memory)
	}
	log.Info("get it ")
	podLabels := map[string]string{
		"app": req.Name,
	}
	// 拼湊deploy資源的定義
	deployment := appv1.Deployment{
		TypeMeta: metav1.TypeMeta{
			Kind:       "Deployment",
			APIVersion: "apps/v1",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name:      req.Name,
			Namespace: req.Namespace,
		},
		Spec: appv1.DeploymentSpec{
			Selector: &metav1.LabelSelector{
				MatchLabels: podLabels,
			},
			Template: corev1.PodTemplateSpec{
				ObjectMeta: metav1.ObjectMeta{
					Labels: podLabels,
				},
				Spec: corev1.PodSpec{
					Containers: []corev1.Container{
						{
							Name: req.Name,
							Image: "nginx:1.13.5-alpine",
							ImagePullPolicy: "Always",
							Ports: []corev1.ContainerPort{
								{
									ContainerPort: 8080,
								},
							},
						},
					},
				},
			},
		},
	}

	if err := r.Create(ctx, &deployment); err != nil {
		log.Error(err, "創建 Deployment resource 出錯")
		return ctrl.Result{}, err
	}

	return ctrl.Result{}, nil
}

func (r *VirtulMachineReconciler) SetupWithManager(mgr ctrl.Manager) error {
	return ctrl.NewControllerManagedBy(mgr).
		For(&infrav1.VirtulMachine{}).
		Complete(r)
}

二、運行main.go文件,

三、查看集群內的deployment

[root@k8s-master samples]# kubectl get deployments.apps 
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
centos-deployment      2/2     2            2           22d
nginx-deployment       3/3     3            3           21d
qperf-server           1/1     1            1           16d
virtulmachine-sample   1/1     1            1           17h

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM