kubekey/controllers/cluster_controller.go
pixiake 7f8d6b3ceb update controller
Signed-off-by: pixiake <guofeng@yunify.com>
2020-10-07 22:01:03 +08:00

125 lines
4.2 KiB
Go

/*
Copyright 2020 The KubeSphere Authors.
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"
"github.com/kubesphere/kubekey/pkg/cluster/etcd"
"github.com/kubesphere/kubekey/pkg/cluster/kubernetes"
"github.com/kubesphere/kubekey/pkg/cluster/preinstall"
"github.com/kubesphere/kubekey/pkg/container-engine/docker"
"github.com/kubesphere/kubekey/pkg/plugins/network"
"github.com/kubesphere/kubekey/pkg/util"
"github.com/kubesphere/kubekey/pkg/util/executor"
"github.com/kubesphere/kubekey/pkg/util/manager"
"github.com/pkg/errors"
kubeErr "k8s.io/apimachinery/pkg/api/errors"
"github.com/go-logr/logr"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
kubekeyv1alpha1 "github.com/kubesphere/kubekey/api/v1alpha1"
)
// ClusterReconciler reconciles a Cluster object
type ClusterReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
}
// +kubebuilder:rbac:groups=kubekey.kubesphere.io,resources=clusters,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=kubekey.kubesphere.io,resources=clusters/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete
func (r *ClusterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.Log.WithValues("cluster", req.NamespacedName)
logger := util.InitLogger(true)
cluster := &kubekeyv1alpha1.Cluster{}
newExecutor := executor.NewExecutor(&cluster.Spec, logger, "", true, true, false, false)
err := r.Get(ctx, req.NamespacedName, cluster)
if err != nil {
if kubeErr.IsNotFound(err) {
log.Info("Cluster resource not found. Ignoring since object must be deleted")
return ctrl.Result{}, nil
}
log.Error(err, "Failed to get Cluster")
return ctrl.Result{}, err
}
if len(cluster.Status.Conditions) == 0 {
// install
if err := installTasks(r, ctx, cluster, newExecutor); err != nil {
return ctrl.Result{}, err
}
}
return ctrl.Result{}, nil
}
func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&kubekeyv1alpha1.Cluster{}).
Complete(r)
}
func runTasks(mgr *manager.Manager, tasks []manager.Task) error {
for _, step := range tasks {
if err := step.Run(mgr); err != nil {
return errors.Wrap(err, step.ErrMsg)
}
}
return nil
}
var (
initNodesTasks = []manager.Task{
{Task: preinstall.DownloadBinaries, ErrMsg: "Failed to download kube binaries"},
{Task: preinstall.InitOS, ErrMsg: "Failed to init OS"},
{Task: docker.InstallerDocker, ErrMsg: "Failed to install docker"},
}
pullImagesTaks = []manager.Task{
{Task: preinstall.PrePullImages, ErrMsg: "Failed to pre-pull images"},
}
initEtcdClusterTasks = []manager.Task{
{Task: etcd.GenerateEtcdCerts, ErrMsg: "Failed to generate etcd certs"},
{Task: etcd.SyncEtcdCertsToMaster, ErrMsg: "Failed to sync etcd certs"},
{Task: etcd.GenerateEtcdService, ErrMsg: "Failed to create etcd service"},
{Task: etcd.SetupEtcdCluster, ErrMsg: "Failed to start etcd cluster"},
{Task: etcd.RefreshEtcdConfig, ErrMsg: "Failed to refresh etcd configuration"},
{Task: etcd.BackupEtcd, ErrMsg: "Failed to backup etcd data"},
}
initControlPlaneTasks = []manager.Task{
{Task: kubernetes.GetClusterStatus, ErrMsg: "Failed to get cluster status"},
{Task: kubernetes.InstallKubeBinaries, ErrMsg: "Failed to install kube binaries"},
{Task: kubernetes.InitKubernetesCluster, ErrMsg: "Failed to init kubernetes cluster"},
{Task: network.DeployNetworkPlugin, ErrMsg: "Failed to deploy network plugin"},
}
joinNodesTasks = []manager.Task{
{Task: kubernetes.JoinNodesToCluster, ErrMsg: "Failed to join node"},
}
)