Skip to content

Commit

Permalink
feat: support deploy resourceconsist indivisually (#40)
Browse files Browse the repository at this point in the history
* feat: support deploy resourceconsist indivisually as a controller&webhook

* feat: add Dockerfile
  • Loading branch information
WeichengWang1 authored Jun 27, 2024
1 parent 2b5eba5 commit face57f
Show file tree
Hide file tree
Showing 7 changed files with 453 additions and 2 deletions.
29 changes: 29 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Build the manager binary
FROM golang:1.19-alpine3.17 as builder
ARG TARGETOS
ARG TARGETARCH

WORKDIR /workspace
# Copy the Go Modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
RUN go mod download

# Copy the go source
COPY main.go main.go
COPY pkg/ pkg/

# Build
# the GOARCH has not a default value to allow the binary be built according to the host where the command
# was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO
# the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore,
# by leaving it empty we can ensure that the container and binary shipped on it will have the same platform.
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH:-amd64} go build -a -o manager main.go

FROM alpine:3.17
WORKDIR /
COPY --from=builder /workspace/manager .

ENTRYPOINT ["/manager"]
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ require (
github.com/go-logr/logr v1.2.4
github.com/onsi/ginkgo v1.16.5
github.com/onsi/gomega v1.27.6
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.8.2
k8s.io/api v0.28.4
k8s.io/apimachinery v0.28.4
k8s.io/apiserver v0.22.6
k8s.io/client-go v0.28.4
k8s.io/klog/v2 v2.100.1
kusionstack.io/kube-api v0.0.27
kusionstack.io/kube-utils v0.1.9
sigs.k8s.io/controller-runtime v0.15.1
Expand Down Expand Up @@ -55,7 +58,6 @@ require (
github.com/prometheus/client_model v0.4.0 // indirect
github.com/prometheus/common v0.44.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/tjfoc/gmsm v1.3.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
Expand All @@ -76,7 +78,6 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.28.3 // indirect
k8s.io/component-base v0.28.4 // indirect
k8s.io/klog/v2 v2.100.1 // indirect
k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,7 @@ k8s.io/apiextensions-apiserver v0.22.6 h1:TH+9+EGtoVzzbrlfSDnObzFTnyXKqw1NBfT5XF
k8s.io/apiextensions-apiserver v0.22.6/go.mod h1:wNsLwy8mfIkGThiv4Qq/Hy4qRazViKXqmH5pfYiRKyY=
k8s.io/apimachinery v0.22.6 h1:z7vxNRkFX0NToA+8D17kzLZ/T4t+DqwzUlqqbqRepRs=
k8s.io/apimachinery v0.22.6/go.mod h1:ZvVLP5iLhwVFg2Yx9Gh5W0um0DUauExbRhe+2Z8I1EU=
k8s.io/apiserver v0.22.6 h1:5MXAa5zBEd7dvCmaqrYV5GohA5jvNAmJX3Hy78JAGDY=
k8s.io/apiserver v0.22.6/go.mod h1:OlL1rGa2kKWGj2JEXnwBcul/BwC9Twe95gm4ohtiIIs=
k8s.io/client-go v0.22.6 h1:ugAXeC312xeGXsn7zTRz+btgtLBnW3qYhtUUpVQL7YE=
k8s.io/client-go v0.22.6/go.mod h1:TffU4AV2idZGeP+g3kdFZP+oHVHWPL1JYFySOALriw0=
Expand Down
118 changes: 118 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/*
Copyright 2023 The KusionStack 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 main

import (
"context"
"flag"
"os"
"path/filepath"

"github.com/spf13/pflag"
"k8s.io/apiserver/pkg/util/feature"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"

"kusionstack.io/resourceconsist/pkg/adapters"
"kusionstack.io/resourceconsist/pkg/frame/webhook"
)

var (
scheme = clientgoscheme.Scheme
setupLog = ctrl.Log.WithName("setup")
)

func main() {
var (
metricsAddr string
enableLeaderElection bool
probeAddr string
certDir string
dnsName string
)
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
flag.StringVar(&certDir, "cert-dir", webhookTempCertDir(), "The directory that contains the server key and certificate. If not set, webhook server would look up the server key and certificate in {TempDir}/k8s-webhook-server/serving-certs")
flag.StringVar(&dnsName, "dns-name", "reosurceconsist-manager.resourceconsist.svc", "The DNS name of the webhook server.")

klog.InitFlags(nil)
defer klog.Flush()

feature.DefaultMutableFeatureGate.AddFlag(pflag.CommandLine)
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
pflag.Parse()

ctrl.SetLogger(klogr.New())

config := ctrl.GetConfigOrDie()
mgr, err := ctrl.NewManager(config, ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
HealthProbeBindAddress: probeAddr,
LeaderElection: enableLeaderElection,
LeaderElectionID: "resourceconsist-manager",
CertDir: certDir,
Logger: ctrl.Log,
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}

if err = adapters.AddAllBuiltinControllerAdatersToMgr(mgr); err != nil {
setupLog.Error(err, "unable to add controller")
os.Exit(1)
}

if err = adapters.AddAllBuiltinWebhookAdaptersToMgr(mgr); err != nil {
setupLog.Error(err, "unable to add webhook")
os.Exit(1)
}

// +kubebuilder:scaffold:builder
setupLog.Info("initialize webhook")
if err := webhook.Initialize(context.Background(), config, dnsName, certDir); err != nil {
setupLog.Error(err, "unable to initialize webhook")
os.Exit(1)
}

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
setupLog.Error(err, "unable to set up health check")
os.Exit(1)
}
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
setupLog.Error(err, "unable to set up ready check")
os.Exit(1)
}

setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}

func webhookTempCertDir() string {
return filepath.Join(os.TempDir(), "k8s-webhook-server", "serving-certs")
}
24 changes: 24 additions & 0 deletions pkg/adapters/adapters.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,30 @@ var builtinWebhookAdapters = map[AdapterName]webhookframe.WebhookAdapter{
AdapterAlibabaCloudSlb: alibabacloudslb.NewWebhookAdapter(),
}

func AddAllBuiltinControllerAdatersToMgr(mgr manager.Manager) error {
for adapterName, newAdapterFunc := range builtinControllerAdapterNewFuncs {
adapter, err := newAdapterFunc(mgr.GetClient())
if err != nil {
return fmt.Errorf("get adapter %s failed, err: %s", adapterName, err.Error())
}
err = controllerframe.AddToMgr(mgr, adapter)
if err != nil {
return fmt.Errorf("add adapter %s to controller failed, err: %s", adapterName, err.Error())
}
}
return nil
}

func AddAllBuiltinWebhookAdaptersToMgr(mgr manager.Manager) error {
for adapterName, adapter := range builtinWebhookAdapters {
err := webhookframe.AddToMgr(mgr, adapter)
if err != nil {
return fmt.Errorf("add adapter %s to controller failed, err: %s", adapterName, err.Error())
}
}
return nil
}

// AddBuiltinControllerAdaptersToMgr adds controller adapters of given adapterNames to manager
func AddBuiltinControllerAdaptersToMgr(mgr manager.Manager, adapterNames []AdapterName) error {
for _, adapterName := range adapterNames {
Expand Down
Loading

0 comments on commit face57f

Please sign in to comment.