diff --git a/eggops/Dockerfile b/eggops/Dockerfile index 4152680b7425b0dfaec3bfc33187a38d16f79b89..f2745c2c567ff3d9e7efd2e90511620adf0d8f02 100644 --- a/eggops/Dockerfile +++ b/eggops/Dockerfile @@ -1,21 +1,25 @@ # Build the manager binary FROM golang:1.16 as builder +ARG ARCH + 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 +RUN GOPROXY="https://goproxy.cn,direct" go mod download # Copy the go source -COPY main.go main.go -COPY api/ api/ -COPY controllers/ controllers/ +COPY eggops/main.go eggops/main.go +COPY eggops/api/ eggops/api/ +COPY eggops/controllers/ eggops/controllers/ +COPY cmd/ cmd/ +COPY pkg/ pkg/ # Build -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go +RUN CGO_ENABLED=0 GOOS=linux GOARCH=${ARCH} go build -a -o manager eggops/main.go # Use distroless as minimal base image to package the manager binary # Refer to https://github.com/GoogleContainerTools/distroless for more details diff --git a/eggops/Makefile b/eggops/Makefile index f36be0f6381aaf4edbd5802d6e69945be94084d6..bc85ff284b765996fe72c5bef987f325c06afa00 100644 --- a/eggops/Makefile +++ b/eggops/Makefile @@ -4,6 +4,12 @@ IMG ?= controller:latest # Produce CRDs that work back to Kubernetes 1.11 (no version conversion) CRD_OPTIONS ?= "crd:trivialVersions=true,preserveUnknownFields=false" +# Image Arch amd64/arm64 +ARCH ?= amd64 +ifeq ($(shell uname -p),aarch64) +ARCH ?= arm64 +endif + # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) GOBIN=$(shell go env GOPATH)/bin @@ -64,7 +70,7 @@ run: manifests generate fmt vet ## Run a controller from your host. go run ./main.go docker-build: test ## Build docker image with the manager. - docker build -t ${IMG} . + docker build --build-arg ARCH="${ARCH}" -t ${IMG} -f Dockerfile .. docker-push: ## Push docker image with the manager. docker push ${IMG} diff --git a/eggops/README.md b/eggops/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5a38a4e2ab13314eb5b59751ccf4a2a84901fb17 --- /dev/null +++ b/eggops/README.md @@ -0,0 +1,52 @@ +# eggops + +### 介绍 +eggops是以kubebuilder生成代码框架为基础而编写的,其主要功能是通过operator实现多k8s集群的自动化部署。通过eggops,用户可以以CRD定义machine、cluster资源,通过controller自动为cluster分配machine,并部署k8s集群,从而实现集群部署集群的能力。 + +### 编译安装 + +1. 直接运行 +```bash +# 指定元集群kubeconfig文件 +$ export KUBECONFIG=/etc/kubernetes/admin.conf +# 部署CRDs +$ make install +# 运行controller,会一直前台执行 +$ make run ENABLE_WEBHOOKS=false +# 停止运行controller +CTRL C +# 删除CRDs +$ make uninstall +``` + +2. 在集群中运行 +```bash +# 任一台机器 +# 登录镜像仓库 +$ docker login -u +# 构建镜像并推送 +$ make docker-build docker-push IMG=/: + +# 元集群master节点 +# 指定元集群kubeconfig文件 +$ export KUBECONFIG=/etc/kubernetes/admin.conf +# 将控制器部署到集群中 +$ make deploy IMG=/: +# 卸载控制器 +$ make undeploy +``` + +### 使用方法 + +详细的用法见 https://gitee.com/openeuler/eggo/blob/master/docs/eggops.md + +### 常见问题 + +1. 直接运行时,eggops会监听当前机器的8080端口。如果当前机器开启了coredns服务,则可能8080端口已被其占用,`make run ENABLE_WEBHOOKS=false`失败。 +解决办法:建议将coredns服务已pod方式部署;建议eggops部署在集群中运行而非直接运行;(不推荐)修改eggops/main.go。 + +2. 构建镜像时,由于网络导致`gcr.io/distroless/static:nonroot`镜像无法下载,需要开启代理。同时在Dockerfile文件中,go mod下载默认配置了`GOPROXY="https://goproxy.cn,direct"`,用户可以自行修改或去除。 + +3. make deploy部署控制器时,除了会下载用户指定的image,还会下载镜像`gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0`,该镜像由于网络原因同样可能pull失败,需要开启代理 + +4. 开发过程中,如果重新build并push镜像,但镜像name:tag未改变,则在部署控制器到集群时,需要去worker节点上将上次pull下来的镜像rmi,避免使用旧的镜像。 diff --git a/eggops/api/v1/cluster_types.go b/eggops/api/v1/cluster_types.go index 67bdc98bf997a7ff12297446042ea465c8cf1077..8e9412911e22fbc6803273fb5a34b346c88ad0f6 100644 --- a/eggops/api/v1/cluster_types.go +++ b/eggops/api/v1/cluster_types.go @@ -88,6 +88,9 @@ type ClusterSpec struct { Runtime RuntimeConfig `json:"runtime,omitempty"` + // +optional + EnableKubeletServing bool `json:"enableKubeletServing"` + // network config of cluster Network ClusterNetworkConfig `json:"network,omitempty"` diff --git a/eggops/controllers/cluster_controller.go b/eggops/controllers/cluster_controller.go index 29c433b831eccda294ab16808ecb526dfa79c265..310e1d926e32d469b2063bc668d4c9f3078c050b 100644 --- a/eggops/controllers/cluster_controller.go +++ b/eggops/controllers/cluster_controller.go @@ -55,10 +55,14 @@ type ClusterReconciler struct { // +kubebuilder:rbac:groups=eggo.isula.org,resources=clusters/finalizers,verbs=update // +kubebuilder:rbac:groups=eggo.isula.org,resources=machinebindings,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=eggo.isula.org,resources=machinebindings/status,verbs=get;update;patch -// +kubebuilder:rbac:groups=v1,resources=configmaps,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=v1,resources=configmaps/status,verbs=get;update;patch -// +kubebuilder:rbac:groups=v1,resources=persistentvolumeclaim,verbs=get;list;watch -// +kubebuilder:rbac:groups=v1,resources=secret,verbs=get;list;watch; +// +kubebuilder:rbac:groups=eggo.isula.org,resources=infrastructures,verbs=get;list;watch +// +kubebuilder:rbac:groups=batch,resources=jobs,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=batch,resources=jobs/status,verbs=get;list;watch +// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups="",resources=configmaps/status,verbs=get;update;patch +// +kubebuilder:rbac:groups="",resources=persistentvolumeclaims,verbs=get;list;watch +// +kubebuilder:rbac:groups="",resources=persistentvolumeclaims/status,verbs=get;list;watch +// +kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch // Reconcile is part of the main kubernetes reconciliation loop which aims to // move the current state of the cluster closer to the desired state. diff --git a/eggops/controllers/tools.go b/eggops/controllers/tools.go index fa6359d2d404f04b8932baa439b0646d261932bb..c6836c2a9c9a0053e85a198920f2d2755a274f3a 100644 --- a/eggops/controllers/tools.go +++ b/eggops/controllers/tools.go @@ -156,6 +156,11 @@ func ConvertClusterToEggoConfig(cluster *eggov1.Cluster, mb *eggov1.MachineBindi conf.OpenPorts = fillOpenPortsConfig(infrastructure.Spec.OpenPorts) + conf.EnableKubeletServing = false + if cluster.Spec.EnableKubeletServing { + conf.EnableKubeletServing = true + } + if cluster.Spec.ApiEndpoint.Advertise != "" { conf.ApiServerEndpoint = getEndpoint(cluster.Spec.ApiEndpoint) }