From ea9cd59d93b007754a9c209f5b8a32b456148480 Mon Sep 17 00:00:00 2001 From: haorenfsa Date: Tue, 19 Nov 2024 17:57:39 +0800 Subject: [PATCH] chart: make webhook optional Signed-off-by: haorenfsa --- .github/workflows/chart-lint.yml | 3 + .github/workflows/release.yml | 5 +- .gitignore | 2 - Makefile | 25 +- apis/milvus.io/v1beta1/milvus_types.go | 4 +- charts/milvus-operator/Chart.lock | 6 + charts/milvus-operator/Chart.yaml | 8 + .../charts/cert-manager-v1.5.3.tgz | Bin 0 -> 156718 bytes charts/milvus-operator/ci/default-values.yaml | 11 - charts/milvus-operator/ci/job-values.yaml | 11 - charts/milvus-operator/templates/NOTES.txt | 1 - charts/milvus-operator/templates/_helpers.tpl | 10 - .../templates/certificate.yaml | 23 + .../templates/checker_role.yaml | 347 ------------ .../templates/checker_rolebinding.yaml | 14 - .../templates/checker_serviceaccount.yaml | 15 - .../milvus-operator/templates/deployment.yaml | 10 +- charts/milvus-operator/templates/job.yaml | 42 -- .../mutatingwebhookconfiguration.yaml | 2 + .../templates/servicemonitor.yaml | 2 +- .../validatingwebhookconfiguration.yaml | 2 + charts/milvus-operator/values.yaml | 24 +- codecov.yaml | 4 +- config/default/job_args_patch.yaml | 14 - config/default/kustomization.yaml | 2 - config/default/manager_webhook_patch.yaml | 9 - config/helm/deployment/kustomization.yaml | 38 -- .../deployment/patch_deployment_metadata.yaml | 15 - .../patch_deployment_resources.yaml | 6 - .../deployment/patch_deployment_security.yaml | 27 - .../deployment/patch_deployment_webhook.yaml | 12 - config/manager/checker.yaml | 25 - config/manager/kustomization.yaml | 2 - config/manager/manager.yaml | 47 -- config/samples/hpa.yaml | 4 +- deploy/manifests/deployment.yaml | 524 +----------------- .../manage-dependencies/message-storage.md | 2 +- pkg/provisioner/cert_manager.go | 214 ------- pkg/provisioner/cert_manager_test.go | 93 ---- pkg/util/util.go | 5 + test/mc-2.1.yaml | 41 -- test/mc-upgrade.yaml | 10 - test/mi-upgrade.yaml | 10 - test/{milvus-2.1.yaml => milvus-2.4.yaml} | 2 +- test/milvus-upgrade.sh | 31 +- test/min-milvus-feature.yaml | 80 --- test/patch-2.5.yaml | 3 + test/upgrade.yaml | 15 - tool/checker/main.go | 40 -- 49 files changed, 96 insertions(+), 1746 deletions(-) create mode 100644 charts/milvus-operator/Chart.lock create mode 100644 charts/milvus-operator/charts/cert-manager-v1.5.3.tgz delete mode 100644 charts/milvus-operator/ci/job-values.yaml create mode 100644 charts/milvus-operator/templates/certificate.yaml delete mode 100644 charts/milvus-operator/templates/checker_role.yaml delete mode 100644 charts/milvus-operator/templates/checker_rolebinding.yaml delete mode 100644 charts/milvus-operator/templates/checker_serviceaccount.yaml delete mode 100644 charts/milvus-operator/templates/job.yaml delete mode 100644 config/default/job_args_patch.yaml delete mode 100644 config/helm/deployment/kustomization.yaml delete mode 100644 config/helm/deployment/patch_deployment_metadata.yaml delete mode 100644 config/helm/deployment/patch_deployment_resources.yaml delete mode 100644 config/helm/deployment/patch_deployment_security.yaml delete mode 100644 config/helm/deployment/patch_deployment_webhook.yaml delete mode 100644 config/manager/checker.yaml delete mode 100644 config/manager/manager.yaml delete mode 100644 pkg/provisioner/cert_manager.go delete mode 100644 pkg/provisioner/cert_manager_test.go delete mode 100644 test/mc-2.1.yaml delete mode 100644 test/mc-upgrade.yaml delete mode 100644 test/mi-upgrade.yaml rename test/{milvus-2.1.yaml => milvus-2.4.yaml} (93%) create mode 100644 test/patch-2.5.yaml delete mode 100644 test/upgrade.yaml delete mode 100644 tool/checker/main.go diff --git a/.github/workflows/chart-lint.yml b/.github/workflows/chart-lint.yml index 11731040..3287c505 100644 --- a/.github/workflows/chart-lint.yml +++ b/.github/workflows/chart-lint.yml @@ -18,6 +18,9 @@ jobs: uses: azure/setup-helm@v1 with: version: v3.4.0 + - name: Add dependency chart repos + run: | + helm repo add cert-manager https://charts.jetstack.io - name: Set up chart-testing uses: helm/chart-testing-action@v2.1.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e6e44f0..c97b3cfe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,10 +24,13 @@ jobs: uses: azure/setup-helm@v1 with: version: v3.4.0 + - name: Add dependency chart repos + run: | + helm repo add cert-manager https://charts.jetstack.io - name: Set up chart-testing uses: helm/chart-testing-action@v2.1.0 - + - name: Run chart-testing (lint) run: ct lint --all --config ct.yaml diff --git a/.gitignore b/.gitignore index 60251927..a9733918 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ *.dll *.so *.dylib -*.tgz bin testbin/* tmp @@ -42,7 +41,6 @@ test/*_gen.yaml # Helm packages charts/index.yaml charts/*.tgz -charts/milvus-operator/charts/*.tgz # output out/ diff --git a/Makefile b/Makefile index 73fc5c90..15c94b23 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ KIND_CLUSTER ?= kind # Produce remove descriptions, it's too long CRD_OPTIONS ?= "crd:maxDescLen=0" -# cert-manager +# cert-manager CERT_MANAGER_MANIFEST ?= "https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml" # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) @@ -100,13 +100,12 @@ build-config-tool: build-release: build-config-tool mkdir -p out CGO_ENABLED=0 go build -ldflags="$(BUILD_LDFLAGS)" -o out/manager main.go - CGO_ENABLED=0 go build -ldflags="-s -w" -o out/checker ./tool/checker run: manifests generate fmt vet ## Run a controller from your host. go run ./main.go docker-build: ## Build docker image with the manager. - docker build -t ${IMG} . + docker build -t ${IMG} . docker-push: ## Push docker image with the manager. docker push ${IMG} @@ -148,7 +147,7 @@ docker-tool-push: docker manifest push ${TOOL_RELEASE_IMG} docker-local-build: - docker build -t ${IMG} -f local.Dockerfile . + docker build -t ${IMG} -f local.Dockerfile . docker-local: build-release docker-local-build @@ -274,12 +273,11 @@ sit-deploy: sit-load-and-cleanup-images $(HELM) -n milvus-operator install --set image.repository=milvus-operator,image.tag=sit,resources.requests.cpu=10m --create-namespace milvus-operator ./charts/milvus-operator kubectl -n milvus-operator describe pods @echo "Waiting for operator to be ready" - kubectl -n milvus-operator wait --for=condition=complete job/milvus-operator-checker --timeout=6m kubectl -n milvus-operator rollout restart deploy/milvus-operator kubectl -n milvus-operator wait --timeout=3m --for=condition=available deployments/milvus-operator sleep 5 #wait for the service to be ready -sit-test: +sit-test: ./test/sit.sh ${test_mode} cleanup-sit: @@ -340,8 +338,7 @@ $(CHARTS_DIRECTORY)/milvus-operator-$(VERSION).tgz: $(CHART_MILVUS_OPERATOR)/tem $(wildcard $(CHART_MILVUS_OPERATOR)/assets/*) \ $(CHART_TEMPLATE_PATH)/role.yaml $(CHART_TEMPLATE_PATH)/clusterrole.yaml \ $(CHART_TEMPLATE_PATH)/rolebinding.yaml $(CHART_TEMPLATE_PATH)/clusterrolebinding.yaml \ - $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml \ - $(CHART_TEMPLATE_PATH)/deployment.yaml + $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml $(HELM) package $(CHART_MILVUS_OPERATOR) \ --version $(VERSION) \ --app-version $(VERSION) \ @@ -354,13 +351,6 @@ $(CHART_MILVUS_OPERATOR)/templates/crds.yaml: kustomize config/crd/bases sed "s/'\({{[^}}]*}}\)'/\1/g">> '$@' echo '{{- end -}}' >> '$@' -$(CHART_TEMPLATE_PATH)/deployment.yaml: kustomize $(wildcard config/helm/deployment/*) $(wildcard config/manager/*) $(wildcard config/config/*) - echo '{{- /* $(DO_NOT_EDIT) */ -}}' > $(CHART_TEMPLATE_PATH)/deployment.yaml - $(KUSTOMIZE) build --reorder legacy config/helm/deployment | \ - $(KUSTOMIZE) cfg grep --annotate=false 'kind=Deployment' | \ - sed "s/'\({{[^}}]*}}\)'/\1/g" \ - >> $(CHART_TEMPLATE_PATH)/deployment.yaml - $(CHART_TEMPLATE_PATH)/role.yaml: kustomize $(wildcard config/helm/rbac/*) $(wildcard config/rbac/*) echo '{{- /* $(DO_NOT_EDIT) */ -}}' > $(CHART_TEMPLATE_PATH)/role.yaml echo '{{- if .Values.rbac.create }}' >> $(CHART_TEMPLATE_PATH)/role.yaml @@ -403,23 +393,26 @@ $(CHART_TEMPLATE_PATH)/clusterrolebinding.yaml: kustomize $(wildcard config/helm $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml: kustomize $(wildcard config/helm/webhook/*) $(wildcard config/webhook/*) echo '{{- /* $(DO_NOT_EDIT) */ -}}' > $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml + echo '{{- if .Values.enableWebhook }}' >> $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml $(KUSTOMIZE) build --reorder legacy config/helm/webhook | \ $(KUSTOMIZE) cfg grep --annotate=false 'kind=ValidatingWebhookConfiguration' | \ sed "s/'\({{[^}}]*}}\)'/\1/g" \ >> $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml + echo '{{- end -}}' >> $(CHART_TEMPLATE_PATH)/validatingwebhookconfiguration.yaml $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml: kustomize $(wildcard config/helm/webhook/*) $(wildcard config/webhook/*) echo '{{- /* $(DO_NOT_EDIT) */ -}}' > $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml + echo '{{- if .Values.enableWebhook }}' >> $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml $(KUSTOMIZE) build --reorder legacy config/helm/webhook | \ $(KUSTOMIZE) cfg grep --annotate=false 'kind=MutatingWebhookConfiguration' | \ sed "s/'\({{[^}}]*}}\)'/\1/g" \ >> $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml + echo '{{- end -}}' >> $(CHART_TEMPLATE_PATH)/mutatingwebhookconfiguration.yaml deploy-by-manifest: sit-prepare-operator-images sit-load-operator-images sit-generate-manifest @echo "Deploying Milvus Operator" kubectl apply -f ./test/test_gen.yaml @echo "Waiting for the operator to be ready..." - kubectl -n milvus-operator wait --for=condition=complete job/milvus-operator-checker --timeout=6m kubectl -n milvus-operator rollout restart deploy/milvus-operator kubectl -n milvus-operator wait --timeout=3m --for=condition=available deployments/milvus-operator sleep 5 #wait for the service to be ready diff --git a/apis/milvus.io/v1beta1/milvus_types.go b/apis/milvus.io/v1beta1/milvus_types.go index 553eec3b..7e62358c 100644 --- a/apis/milvus.io/v1beta1/milvus_types.go +++ b/apis/milvus.io/v1beta1/milvus_types.go @@ -21,7 +21,7 @@ import ( "time" "github.com/coreos/go-semver/semver" - "github.com/milvus-io/milvus-operator/pkg/provisioner" + "github.com/milvus-io/milvus-operator/pkg/util" "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -119,7 +119,7 @@ func (ms MilvusSpec) GetMilvusVersionByImage() (*semver.Version, error) { if len(splited) != 2 { return nil, errors.Errorf("unknown version of image[%s]", splited[0]) } - return provisioner.GetSemanticVersion(splited[1]) + return util.GetSemanticVersion(splited[1]) } func (ms *MilvusSpec) GetPersistenceConfig() *Persistence { diff --git a/charts/milvus-operator/Chart.lock b/charts/milvus-operator/Chart.lock new file mode 100644 index 00000000..400d35db --- /dev/null +++ b/charts/milvus-operator/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: cert-manager + repository: https://charts.jetstack.io + version: v1.5.3 +digest: sha256:ded312c59e9aee73e5dc268bad53029e6d7187d6ce17219b8b5d2b0ca3d0c577 +generated: "2024-11-19T17:22:07.833644+08:00" diff --git a/charts/milvus-operator/Chart.yaml b/charts/milvus-operator/Chart.yaml index 6e4d60d6..51cbf192 100644 --- a/charts/milvus-operator/Chart.yaml +++ b/charts/milvus-operator/Chart.yaml @@ -26,6 +26,14 @@ version: 1.1.3 # It is recommended to use it with quotes. appVersion: "1.1.3" +dependencies: + - name: cert-manager + version: 1.5.3 + repository: https://charts.jetstack.io + condition: cert-manager.enabled + tags: + - cert-manager + maintainers: - name: zilliztech email: devops@zilliz.com diff --git a/charts/milvus-operator/charts/cert-manager-v1.5.3.tgz b/charts/milvus-operator/charts/cert-manager-v1.5.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..984c2e0255faec7439ed32e469e329eaf15e12af GIT binary patch literal 156718 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 N)~@Lthz&N#{{qt{gcJY( literal 0 HcmV?d00001 diff --git a/charts/milvus-operator/ci/default-values.yaml b/charts/milvus-operator/ci/default-values.yaml index 15435f88..e69de29b 100644 --- a/charts/milvus-operator/ci/default-values.yaml +++ b/charts/milvus-operator/ci/default-values.yaml @@ -1,11 +0,0 @@ -# check and install the dependencies when enabled, this need an extra service account with privileged clusterroles -installDependencies: - enable: true - serviceAccount: - # serviceAccount.create -- Specifies whether a service account should be created - create: true - # serviceAccount.annotations -- Annotations to add to the service account - annotations: {} - # serviceAccount.name -- The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "milvus-dep-sa" diff --git a/charts/milvus-operator/ci/job-values.yaml b/charts/milvus-operator/ci/job-values.yaml deleted file mode 100644 index 15435f88..00000000 --- a/charts/milvus-operator/ci/job-values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# check and install the dependencies when enabled, this need an extra service account with privileged clusterroles -installDependencies: - enable: true - serviceAccount: - # serviceAccount.create -- Specifies whether a service account should be created - create: true - # serviceAccount.annotations -- Annotations to add to the service account - annotations: {} - # serviceAccount.name -- The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "milvus-dep-sa" diff --git a/charts/milvus-operator/templates/NOTES.txt b/charts/milvus-operator/templates/NOTES.txt index 923de632..e884fdb0 100644 --- a/charts/milvus-operator/templates/NOTES.txt +++ b/charts/milvus-operator/templates/NOTES.txt @@ -1,5 +1,4 @@ Milvus Operator Is Starting, use `kubectl get -n {{ .Release.Namespace }} deploy/{{ .Release.Name }}` to check if its successfully installed -If Operator not started successfully, check the checker's log with `kubectl -n {{ .Release.Namespace }} logs job/{{ .Release.Name }}-checker` Full Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md Quick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml` More samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples diff --git a/charts/milvus-operator/templates/_helpers.tpl b/charts/milvus-operator/templates/_helpers.tpl index 8c67df85..2668feb5 100644 --- a/charts/milvus-operator/templates/_helpers.tpl +++ b/charts/milvus-operator/templates/_helpers.tpl @@ -61,13 +61,3 @@ Create the name of the service account to use {{- default "default" .Values.serviceAccount.name }} {{- end }} {{- end }} - -{{- define "chart.checkerServiceAccountName" -}} -{{- if .Values.installDependencies.enable }} -{{- if .Values.installDependencies.serviceAccount.create }} -{{- default (printf "%s-checker" (include "chart.fullname" .)) .Values.installDependencies.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/milvus-operator/templates/certificate.yaml b/charts/milvus-operator/templates/certificate.yaml new file mode 100644 index 00000000..9a456398 --- /dev/null +++ b/charts/milvus-operator/templates/certificate.yaml @@ -0,0 +1,23 @@ +{{- if .Values.enableWebhook -}} +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: '{{ include "chart.fullname" . }}-serving-cert' + namespace: {{ .Release.Namespace }} +spec: + dnsNames: + - milvus-operator-webhook-service.{{ .Release.Namespace }}.svc + - milvus-operator-webhook-service.{{ .Release.Namespace }}.svc.cluster.local + issuerRef: + kind: Issuer + name: '{{ include "chart.fullname" . }}-selfsigned-issuer' + secretName: '{{ include "chart.fullname" . }}-webhook-cert' +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: '{{ include "chart.fullname" . }}-selfsigned-issuer' + namespace: {{ .Release.Namespace }} +spec: + selfSigned: {} +{{- end -}} diff --git a/charts/milvus-operator/templates/checker_role.yaml b/charts/milvus-operator/templates/checker_role.yaml deleted file mode 100644 index 0220f79a..00000000 --- a/charts/milvus-operator/templates/checker_role.yaml +++ /dev/null @@ -1,347 +0,0 @@ -{{- if .Values.installDependencies.enable -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: '{{ include "chart.fullname" . }}-checker-role' -rules: -- apiGroups: - - "" - resources: - - configmaps - - secrets - - services - - namespaces - - events - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - deployments - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - pods - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apps - resources: - - deployments - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apps - resources: - - pods - - secrets - - services - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - batch - resources: - - jobs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - extensions - resources: - - deployments - - pods - - secrets - - services - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - extensions - resources: - - ingresses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - milvus.io - resources: - - milvuses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - milvus.io - resources: - - milvus/finalizers - verbs: - - update -- apiGroups: - - milvus.io - resources: - - milvuses/status - verbs: - - get - - patch - - update -- apiGroups: - - monitoring.coreos.com - resources: - - podmonitors - - servicemonitors - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - - ingresses/finalizers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - policy - resources: - - podsecuritypolicies - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - - clusterroles - - clusterrolebindings - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices/status - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - auditregistration.k8s.io - resources: - - auditsinks - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - cert-manager.io - - acme.cert-manager.io - resources: - - certificates - - certificates/status - - certificates/finalizers - - issuers - - issuers/status - - issuers/finalizers - - clusterissuers - - clusterissuers/status - - clusterissuers/finalizers - - orders - - orders/status - - orders/finalizers - - certificaterequests - - certificaterequests/status - - certificaterequests/finalizers - - challenges - - challenges/status - - challenges/finalizers - - signers - verbs: - - create - - delete - - deletecollection - - get - - list - - patch - - update - - watch - - approve - - sign -- apiGroups: - - networking.x-k8s.io - - route.openshift.io - - authorization.k8s.io - - certificates.k8s.io - - coordination.k8s.io - resources: - - httproutes - - httproutes/finalizers - - gateways - - gateways/finalizers - - routes/custom-host - - subjectaccessreviews - - signers - - certificatesigningrequests - - certificatesigningrequests/status - - leases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - sign -{{- end -}} diff --git a/charts/milvus-operator/templates/checker_rolebinding.yaml b/charts/milvus-operator/templates/checker_rolebinding.yaml deleted file mode 100644 index 052cd689..00000000 --- a/charts/milvus-operator/templates/checker_rolebinding.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.installDependencies.enable -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: '{{ include "chart.fullname" . }}-checker-rolebinding' -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: '{{ include "chart.fullname" . }}-checker-role' -subjects: -- kind: ServiceAccount - name: {{ include "chart.checkerServiceAccountName" . | quote }} - namespace: {{ .Release.Namespace | quote }} -{{- end -}} diff --git a/charts/milvus-operator/templates/checker_serviceaccount.yaml b/charts/milvus-operator/templates/checker_serviceaccount.yaml deleted file mode 100644 index 12792db1..00000000 --- a/charts/milvus-operator/templates/checker_serviceaccount.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.installDependencies.enable -}} -{{- if .Values.installDependencies.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "chart.checkerServiceAccountName" . | quote }} - namespace: {{ .Release.Namespace | quote }} - labels: - {{- include "chart.labels" . | nindent 4 }} - {{- with .Values.installDependencies.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/milvus-operator/templates/deployment.yaml b/charts/milvus-operator/templates/deployment.yaml index 4e99f279..d4610e51 100644 --- a/charts/milvus-operator/templates/deployment.yaml +++ b/charts/milvus-operator/templates/deployment.yaml @@ -1,4 +1,3 @@ -{{- /* Code generated by make. DO NOT EDIT. */ -}} apiVersion: apps/v1 kind: Deployment metadata: @@ -23,6 +22,9 @@ spec: - --health-probe-bind-address=:8081 - --metrics-bind-address=:8080 - --leader-elect + {{- if not .Values.enableWebhook }} + - --webhook=false + {{- end }} command: - /manager image: '{{.Values.image.repository}}:{{.Values.image.tag|default .Chart.AppVersion}}' @@ -50,17 +52,21 @@ spec: resources: {{- toYaml .Values.resources | nindent 10 }} securityContext: allowPrivilegeEscalation: {{ .Values.allowPrivilegeEscalation }} + {{- if .Values.enableWebhook }} volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: cert readOnly: true + {{- end }} nodeSelector: {{- toYaml .Values.nodeSelector | nindent 8 }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} serviceAccountName: {{ include "chart.serviceAccountName" . | quote }} terminationGracePeriodSeconds: 10 tolerations: {{- toYaml .Values.tolerations | nindent 8 }} + {{- if .Values.enableWebhook }} volumes: - name: cert secret: defaultMode: 420 - secretName: '{{ include "chart.fullname" . }}-webhook-cert' + # secretName: {{ include "$.chart.fullname" . }}-webhook-cert + {{- end }} diff --git a/charts/milvus-operator/templates/job.yaml b/charts/milvus-operator/templates/job.yaml deleted file mode 100644 index 5b057eef..00000000 --- a/charts/milvus-operator/templates/job.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - annotations: {{- toYaml .Values.checker.annotations | nindent 4 }} - labels: {{- include "chart.labels" . | nindent 4 }} - name: "{{ .Release.Name }}-checker" - namespace: {{ .Release.Namespace | quote }} -spec: - ttlSecondsAfterFinished: 100 - template: - spec: - securityContext: - runAsNonRoot: true - serviceAccountName: {{ include "chart.checkerServiceAccountName" . | quote }} - restartPolicy: OnFailure - containers: - - name: checker - image: '{{.Values.image.repository}}:{{.Values.image.tag|default .Chart.AppVersion}}' - imagePullPolicy: {{ .Values.image.pullPolicy | quote }} - command: ["/checker"] - args: - - "-namespace={{ .Release.Namespace }}" - - "-name={{ .Release.Name }}" - {{- if .Values.checker.disableCertManagerCheck }} - - "-disable-cert-manager-check" - {{- end }} - {{- if .Values.checker.disableCertManagerInstall }} - - "-disable-cert-manager-install" - {{- end }} - resources: - limits: - cpu: 500m - memory: 1Gi - requests: - cpu: 50m - memory: 100Mi - securityContext: - allowPrivilegeEscalation: false - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/charts/milvus-operator/templates/mutatingwebhookconfiguration.yaml b/charts/milvus-operator/templates/mutatingwebhookconfiguration.yaml index 1966e743..44f3d478 100644 --- a/charts/milvus-operator/templates/mutatingwebhookconfiguration.yaml +++ b/charts/milvus-operator/templates/mutatingwebhookconfiguration.yaml @@ -1,4 +1,5 @@ {{- /* Code generated by make. DO NOT EDIT. */ -}} +{{- if .Values.enableWebhook }} apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: @@ -47,3 +48,4 @@ webhooks: resources: - milvusupgrades sideEffects: None +{{- end -}} diff --git a/charts/milvus-operator/templates/servicemonitor.yaml b/charts/milvus-operator/templates/servicemonitor.yaml index 410afb56..e3e4f486 100644 --- a/charts/milvus-operator/templates/servicemonitor.yaml +++ b/charts/milvus-operator/templates/servicemonitor.yaml @@ -18,4 +18,4 @@ spec: namespaceSelector: matchNames: - {{ .Release.Namespace | quote }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/charts/milvus-operator/templates/validatingwebhookconfiguration.yaml b/charts/milvus-operator/templates/validatingwebhookconfiguration.yaml index b913da00..8ba320ea 100644 --- a/charts/milvus-operator/templates/validatingwebhookconfiguration.yaml +++ b/charts/milvus-operator/templates/validatingwebhookconfiguration.yaml @@ -1,4 +1,5 @@ {{- /* Code generated by make. DO NOT EDIT. */ -}} +{{- if .Values.enableWebhook }} apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: @@ -47,3 +48,4 @@ webhooks: resources: - milvusupgrades sideEffects: None +{{- end -}} diff --git a/charts/milvus-operator/values.yaml b/charts/milvus-operator/values.yaml index ba7a9242..c9e89ad2 100644 --- a/charts/milvus-operator/values.yaml +++ b/charts/milvus-operator/values.yaml @@ -1,3 +1,9 @@ +cert-manager: + enabled: false + fullnameOverride: "cert-manager" + +enableWebhook: false + # Default values for milvus-operator. # This is a YAML-formatted file. # Declare variables to be passed into your templates. @@ -14,24 +20,6 @@ installCRDs: true monitoringEnabled: false -checker: - disableCertManagerCheck: false - disableCertManagerInstall: false - # checker.annotations -- Annotations to add to the checker job - annotations: {} - -# check and install the dependencies when enabled, this need an extra service account with privileged clusterroles -installDependencies: - enable: true - serviceAccount: - # serviceAccount.create -- Specifies whether a service account should be created - create: true - # serviceAccount.annotations -- Annotations to add to the service account - annotations: {} - # serviceAccount.name -- The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - nameOverride: "" fullnameOverride: "" diff --git a/codecov.yaml b/codecov.yaml index 30e06499..5debe279 100644 --- a/codecov.yaml +++ b/codecov.yaml @@ -4,8 +4,8 @@ ignore: coverage: status: project: - default: + default: target: 80% patch: - default: + default: target: 20% \ No newline at end of file diff --git a/config/default/job_args_patch.yaml b/config/default/job_args_patch.yaml deleted file mode 100644 index 753c552a..00000000 --- a/config/default/job_args_patch.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: checker -spec: - template: - spec: - containers: - - name: checker - args: - - -namespace - - $(DEPLOYMENT_NAMESPACE) - - -name - - $(DEPLOYMENT_NAME) \ No newline at end of file diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index 26f7c8fa..8f76dc5e 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -43,8 +43,6 @@ patchesStrategicMerge: # 'CERTMANAGER' needs to be enabled to use ca injection - webhookcainjection_patch.yaml -- job_args_patch.yaml - vars: - name: DEPLOYMENT_NAMESPACE # namespace of the deployment objref: diff --git a/config/default/manager_webhook_patch.yaml b/config/default/manager_webhook_patch.yaml index 08dc68ae..f48cc559 100644 --- a/config/default/manager_webhook_patch.yaml +++ b/config/default/manager_webhook_patch.yaml @@ -14,12 +14,3 @@ spec: - containerPort: 8080 name: metrics protocol: TCP - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: milvus-operator-webhook-cert diff --git a/config/helm/deployment/kustomization.yaml b/config/helm/deployment/kustomization.yaml deleted file mode 100644 index c9d08fca..00000000 --- a/config/helm/deployment/kustomization.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# namePrefix: '{{ include "chart.fullname" . }}-' - -namespace: '{{ .Release.Namespace | quote }}' - -generatorOptions: - disableNameSuffixHash: true - -images: -- name: milvusdb/milvus-operator - newName: '{{.Values.image.repository}}' - newTag: '{{.Values.image.tag|default .Chart.AppVersion}}' - -patches: -# - patch_deployment_config.yaml -- patch_deployment_webhook.yaml - -patchesJson6902: -- target: - version: v1 - group: apps - kind: Deployment - name: controller-manager - path: patch_deployment_metadata.yaml -- target: - version: v1 - group: apps - kind: Deployment - name: controller-manager - path: patch_deployment_resources.yaml -- target: - version: v1 - group: apps - kind: Deployment - name: controller-manager - path: patch_deployment_security.yaml - -bases: -- ../../default diff --git a/config/helm/deployment/patch_deployment_metadata.yaml b/config/helm/deployment/patch_deployment_metadata.yaml deleted file mode 100644 index 4bf89894..00000000 --- a/config/helm/deployment/patch_deployment_metadata.yaml +++ /dev/null @@ -1,15 +0,0 @@ - - op: replace - path: /metadata/name - value: '{{ include "chart.fullname" . | quote }}' - - op: replace - path: /metadata/labels - value: '{{- include "chart.labels" . | nindent 4 }}' - - op: replace - path: /spec/selector/matchLabels - value: '{{- include "chart.selectorLabels" . | nindent 6 }}' - - op: replace - path: /spec/template/metadata/labels - value: '{{- include "chart.selectorLabels" . | nindent 8 }}' - - op: replace - path: /spec/template/metadata/annotations - value: '{{- toYaml .Values.podAnnotations | nindent 8 }}' diff --git a/config/helm/deployment/patch_deployment_resources.yaml b/config/helm/deployment/patch_deployment_resources.yaml deleted file mode 100644 index 6d968be3..00000000 --- a/config/helm/deployment/patch_deployment_resources.yaml +++ /dev/null @@ -1,6 +0,0 @@ - - op: test - path: /spec/template/spec/containers/0/name - value: manager - - op: replace - path: /spec/template/spec/containers/0/resources - value: '{{- toYaml .Values.resources | nindent 10 }}' diff --git a/config/helm/deployment/patch_deployment_security.yaml b/config/helm/deployment/patch_deployment_security.yaml deleted file mode 100644 index 1697b12f..00000000 --- a/config/helm/deployment/patch_deployment_security.yaml +++ /dev/null @@ -1,27 +0,0 @@ - - op: replace - path: /spec/template/spec/securityContext - value: '{{- toYaml .Values.podSecurityContext | nindent 8 }}' - - op: replace - path: /spec/template/spec/serviceAccountName - value: '{{ include "chart.serviceAccountName" . | quote }}' - - op: replace - path: /spec/template/spec/tolerations - value: '{{- toYaml .Values.tolerations | nindent 8 }}' - - op: replace - path: /spec/template/spec/affinity - value: '{{- toYaml .Values.affinity | nindent 8 }}' - - op: replace - path: /spec/template/spec/nodeSelector - value: '{{- toYaml .Values.nodeSelector | nindent 8 }}' -# - op: replace -# path: /spec/template/spec/imagePullSecrets -# value: '{{- toYaml .Values.imagePullSecrets | nindent 8 }}' - - op: test - path: /spec/template/spec/containers/0/name - value: manager - - op: replace - path: /spec/template/spec/containers/0/imagePullPolicy - value: '{{ .Values.image.pullPolicy | quote }}' - - op: replace - path: /spec/template/spec/containers/0/securityContext/allowPrivilegeEscalation - value: '{{ .Values.allowPrivilegeEscalation }}' diff --git a/config/helm/deployment/patch_deployment_webhook.yaml b/config/helm/deployment/patch_deployment_webhook.yaml deleted file mode 100644 index 12c7329d..00000000 --- a/config/helm/deployment/patch_deployment_webhook.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: controller-manager -spec: - template: - spec: - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: '{{ include "chart.fullname" . }}-webhook-cert' diff --git a/config/manager/checker.yaml b/config/manager/checker.yaml deleted file mode 100644 index 8c5a8a12..00000000 --- a/config/manager/checker.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: checker -spec: - ttlSecondsAfterFinished: 100 - template: - spec: - securityContext: - runAsNonRoot: true - serviceAccountName: checker - restartPolicy: OnFailure - containers: - - name: checker - image: milvusdb/milvus-operator:main-latest - command: ["/checker"] - resources: - limits: - cpu: 500m - memory: 1Gi - requests: - cpu: 200m - memory: 200Mi - securityContext: - allowPrivilegeEscalation: false \ No newline at end of file diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 2ed0540f..fc19d4dc 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -7,8 +7,6 @@ images: resources: - namespace.yaml -- manager.yaml -- checker.yaml generatorOptions: disableNameSuffixHash: true diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml deleted file mode 100644 index 2a42c228..00000000 --- a/config/manager/manager.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: controller-manager - labels: - control-plane: controller-manager -spec: - selector: - matchLabels: - control-plane: controller-manager - template: - metadata: - labels: - control-plane: controller-manager - spec: - securityContext: - runAsNonRoot: true - containers: - - command: - - /manager - args: - - --leader-elect - image: milvusdb/milvus-operator:main-latest - name: manager - securityContext: - allowPrivilegeEscalation: false - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - limits: - cpu: 2 - memory: 4Gi - requests: - cpu: 200m - memory: 200Mi - serviceAccountName: controller-manager - terminationGracePeriodSeconds: 10 diff --git a/config/samples/hpa.yaml b/config/samples/hpa.yaml index 55eb442b..0ed1fa0b 100644 --- a/config/samples/hpa.yaml +++ b/config/samples/hpa.yaml @@ -5,11 +5,11 @@ metadata: name: my-release spec: mode: cluster - components: + components: proxy: # set replicas to -1 will stop operator from scaling the component # thus handover the scaling responsibility to HPA - replicas: -1 + replicas: -1 --- # for more info see: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ apiVersion: autoscaling/v2 diff --git a/deploy/manifests/deployment.yaml b/deploy/manifests/deployment.yaml index 416b5c94..42bb4921 100644 --- a/deploy/manifests/deployment.yaml +++ b/deploy/manifests/deployment.yaml @@ -4,19 +4,6 @@ kind: Namespace metadata: name: milvus-operator --- -# Source: milvus-operator/templates/checker_serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: "milvus-operator-checker" - namespace: "milvus-operator" - labels: - helm.sh/chart: milvus-operator-1.1.3 - app.kubernetes.io/name: milvus-operator - app.kubernetes.io/instance: milvus-operator - app.kubernetes.io/version: "1.1.3" - app.kubernetes.io/managed-by: Helm ---- # Source: milvus-operator/templates/serviceaccount.yaml apiVersion: v1 kind: ServiceAccount @@ -14464,353 +14451,6 @@ spec: subresources: status: {} --- -# Source: milvus-operator/templates/checker_role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: 'milvus-operator-checker-role' -rules: -- apiGroups: - - "" - resources: - - configmaps - - secrets - - services - - namespaces - - events - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - deployments - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - pods - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apps - resources: - - deployments - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apps - resources: - - pods - - secrets - - services - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - batch - resources: - - jobs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - extensions - resources: - - deployments - - pods - - secrets - - services - - statefulsets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - extensions - resources: - - ingresses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - milvus.io - resources: - - milvuses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - milvus.io - resources: - - milvus/finalizers - verbs: - - update -- apiGroups: - - milvus.io - resources: - - milvuses/status - verbs: - - get - - patch - - update -- apiGroups: - - monitoring.coreos.com - resources: - - podmonitors - - servicemonitors - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - - ingresses/finalizers - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - policy - resources: - - podsecuritypolicies - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - - clusterroles - - clusterrolebindings - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices/status - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - auditregistration.k8s.io - resources: - - auditsinks - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - cert-manager.io - - acme.cert-manager.io - resources: - - certificates - - certificates/status - - certificates/finalizers - - issuers - - issuers/status - - issuers/finalizers - - clusterissuers - - clusterissuers/status - - clusterissuers/finalizers - - orders - - orders/status - - orders/finalizers - - certificaterequests - - certificaterequests/status - - certificaterequests/finalizers - - challenges - - challenges/status - - challenges/finalizers - - signers - verbs: - - create - - delete - - deletecollection - - get - - list - - patch - - update - - watch - - approve - - sign -- apiGroups: - - networking.x-k8s.io - - route.openshift.io - - authorization.k8s.io - - certificates.k8s.io - - coordination.k8s.io - resources: - - httproutes - - httproutes/finalizers - - gateways - - gateways/finalizers - - routes/custom-host - - subjectaccessreviews - - signers - - certificatesigningrequests - - certificatesigningrequests/status - - leases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - sign ---- # Source: milvus-operator/templates/clusterrole.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole @@ -15066,20 +14706,6 @@ rules: - update - watch --- -# Source: milvus-operator/templates/checker_rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: 'milvus-operator-checker-rolebinding' -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: 'milvus-operator-checker-role' -subjects: -- kind: ServiceAccount - name: "milvus-operator-checker" - namespace: "milvus-operator" ---- # Source: milvus-operator/templates/clusterrolebinding.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding @@ -15228,6 +14854,7 @@ spec: - --health-probe-bind-address=:8081 - --metrics-bind-address=:8080 - --leader-elect + - --webhook=false command: - /manager image: 'milvusdb/milvus-operator:v1.1.3' @@ -15261,10 +14888,6 @@ spec: memory: 100Mi securityContext: allowPrivilegeEscalation: false - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true nodeSelector: {} securityContext: @@ -15274,148 +14897,3 @@ spec: terminationGracePeriodSeconds: 10 tolerations: [] - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: 'milvus-operator-webhook-cert' ---- -# Source: milvus-operator/templates/job.yaml -apiVersion: batch/v1 -kind: Job -metadata: - annotations: - {} - labels: - helm.sh/chart: milvus-operator-1.1.3 - app.kubernetes.io/name: milvus-operator - app.kubernetes.io/instance: milvus-operator - app.kubernetes.io/version: "1.1.3" - app.kubernetes.io/managed-by: Helm - name: "milvus-operator-checker" - namespace: "milvus-operator" -spec: - ttlSecondsAfterFinished: 100 - template: - spec: - securityContext: - runAsNonRoot: true - serviceAccountName: "milvus-operator-checker" - restartPolicy: OnFailure - containers: - - name: checker - image: 'milvusdb/milvus-operator:v1.1.3' - imagePullPolicy: "IfNotPresent" - command: ["/checker"] - args: - - "-namespace=milvus-operator" - - "-name=milvus-operator" - resources: - limits: - cpu: 500m - memory: 1Gi - requests: - cpu: 50m - memory: 100Mi - securityContext: - allowPrivilegeEscalation: false ---- -# Source: milvus-operator/templates/mutatingwebhookconfiguration.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: 'milvus-operator/milvus-operator-serving-cert' - name: 'milvus-operator-mutating-webhook-configuration' -webhooks: -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: 'milvus-operator-webhook-service' - namespace: "milvus-operator" - path: /mutate-milvus-io-v1beta1-milvus - port: 443 - failurePolicy: Fail - name: mmilvus.kb.io - rules: - - apiGroups: - - milvus.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - milvuses - sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: 'milvus-operator-webhook-service' - namespace: "milvus-operator" - path: /mutate-milvus-io-v1beta1-milvusupgrade - failurePolicy: Fail - name: mmilvusupgrade.kb.io - rules: - - apiGroups: - - milvus.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - milvusupgrades - sideEffects: None ---- -# Source: milvus-operator/templates/validatingwebhookconfiguration.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: 'milvus-operator/milvus-operator-serving-cert' - name: 'milvus-operator-validating-webhook-configuration' -webhooks: -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: 'milvus-operator-webhook-service' - namespace: "milvus-operator" - path: /validate-milvus-io-v1beta1-milvus - port: 443 - failurePolicy: Fail - name: vmilvus.kb.io - rules: - - apiGroups: - - milvus.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - milvuses - sideEffects: None -- admissionReviewVersions: - - v1 - clientConfig: - service: - name: 'milvus-operator-webhook-service' - namespace: "milvus-operator" - path: /validate-milvus-io-v1beta1-milvusupgrade - failurePolicy: Fail - name: vmilvusupgrade.kb.io - rules: - - apiGroups: - - milvus.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - milvusupgrades - sideEffects: None diff --git a/docs/administration/manage-dependencies/message-storage.md b/docs/administration/manage-dependencies/message-storage.md index 7fb56c75..754d2470 100644 --- a/docs/administration/manage-dependencies/message-storage.md +++ b/docs/administration/manage-dependencies/message-storage.md @@ -38,7 +38,7 @@ RocksMQ is the default message storage in Milvus standalone. The following example configures a RocksMQ service. ```YAML -apiVersion: milvus.io/v1alpha1 +apiVersion: milvus.io/v1beta1 kind: Milvus metadata: name: milvus diff --git a/pkg/provisioner/cert_manager.go b/pkg/provisioner/cert_manager.go deleted file mode 100644 index 14bb4bd7..00000000 --- a/pkg/provisioner/cert_manager.go +++ /dev/null @@ -1,214 +0,0 @@ -package provisioner - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/coreos/go-semver/semver" - "github.com/milvus-io/milvus-operator/pkg/config" - "github.com/milvus-io/milvus-operator/pkg/util" - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/rest" - ctrl "sigs.k8s.io/controller-runtime" -) - -const ( - // cert manager version info see: https://cert-manager.io/docs/installation/supported-releases/ - CertManagerLeastVersion = "1.0.0" - CertManagerDefaultVersion = "1.5.3" - CertManagerDefaultNamespace = "cert-manager" - - apiTimeout = 30 * time.Second - waitInstallTimeout = 5 * time.Minute -) - -func certManagerManifestURLByVersion(version string) string { - return fmt.Sprintf("https://github.com/jetstack/cert-manager/releases/download/v%s/cert-manager.yaml", version) -} - -// configs is set by flag in main.go -var ( - CertManagerLeastSemanticVersion = semver.New(strings.TrimPrefix(CertManagerLeastVersion, "v")) - DisableCertManagerCheck bool = false - DisableCertManagerCheckFlag string = "disable-cert-manager-check" - DisableCertManagerInstall bool = false - DisableCertManagerInstallFlag string = "disable-cert-manager-install" - logger = ctrl.Log.WithName("cert-manager") -) - -var certManagerCrdNames = []string{ - "certificates.cert-manager.io", - "issuers.cert-manager.io", -} - -// CertManager provisioner -type CertManager struct { - cli util.K8sClient -} - -// NewCertManager returns a new CertManager -func NewCertManager(config *rest.Config) (*CertManager, error) { - cli, err := util.NewK8sClientsForConfig(config) - if err != nil { - return nil, errors.Wrap(err, "failed to create k8s client") - } - return &CertManager{ - cli: cli, - }, nil -} - -func (c CertManager) InstallIfNotExist() error { - err := c.checkAndInstall() - if err != nil { - return errors.Wrap(err, "failed to check and install cert manager") - } - return errors.Wrap(c.checkAndWaitInstallReady(), "failed to check and wait cert manager ready") -} - -func (c CertManager) checkAndInstall() error { - ctx, cancel := context.WithTimeout(context.Background(), apiTimeout) - defer cancel() - - versionMap, err := c.cli.GetCRDVersionsByNames(ctx, certManagerCrdNames) - if err != nil { - return errors.Wrap(err, "failed to check cert manager crds exist") - } - if certManagerCRDsExist(versionMap) { - if certManagerVersionSatisfied(versionMap) { - return nil - } - return errors.Errorf("cert manager crds exist but version is too old, please update it manually") - } - if DisableCertManagerInstall { - return errors.Errorf("cert manager crds not exist, please install it manually, or enable -%s flag", DisableCertManagerInstallFlag) - } - return errors.Wrap(c.installCertManager(), "failed to install cert manager") -} - -func (c CertManager) checkAndWaitInstallReady() error { - ctx, cancel := context.WithTimeout(context.Background(), waitInstallTimeout) - defer cancel() - err := c.cli.WaitDeploymentsReadyByNamespace(ctx, CertManagerDefaultNamespace) - return errors.Wrap(err, "failed to wait cert manager deployment ready") -} - -func getCertManifest(namespace, name string) string { - return `--- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: milvus-operator-serving-cert - namespace: ` + namespace + ` -spec: - dnsNames: - - milvus-operator-webhook-service.` + namespace + `.svc - - milvus-operator-webhook-service.` + namespace + `.svc.cluster.local - issuerRef: - kind: Issuer - name: ` + name + `-selfsigned-issuer - secretName: ` + name + `-webhook-cert -` -} - -func getIssuerManifest(namespace, name string) string { - return `--- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: ` + name + `-selfsigned-issuer - namespace: ` + namespace + ` -spec: - selfSigned: {} -` -} - -func (c CertManager) IssueCertIfNotExist() error { - issueCertName := config.OperatorName - namespace := config.OperatorNamespace - gv := schema.GroupVersion{ - Group: "cert-manager.io", - Version: "v1", - } - schema.ParseGroupResource("cert-manager.io").WithVersion("v1") - ctx, cancel1 := context.WithTimeout(context.Background(), apiTimeout) - defer cancel1() - exist, err := c.cli.Exist(ctx, gv.WithResource("certificates"), namespace, issueCertName+"-serving-cert") - if err != nil { - return errors.Wrap(err, "failed to check cert exist") - } - if !exist { - manifest := getCertManifest(namespace, issueCertName) - ctx, cancel2 := context.WithTimeout(context.Background(), apiTimeout) - defer cancel2() - err = c.cli.Create(ctx, []byte(manifest)) - if err != nil { - return errors.Wrap(err, "failed to create certificate") - } - } - - ctx, cancel3 := context.WithTimeout(context.Background(), apiTimeout) - defer cancel3() - exist, err = c.cli.Exist(ctx, gv.WithResource("issuers"), namespace, issueCertName+"-selfsigned-issuer") - if err != nil { - return errors.Wrap(err, "failed to check issuer exist") - } - - if !exist { - ctx, cancel4 := context.WithTimeout(context.Background(), apiTimeout) - defer cancel4() - manifest := getIssuerManifest(namespace, issueCertName) - err = c.cli.Create(ctx, []byte(manifest)) - if err != nil { - return errors.Wrap(err, "failed to create cert manager") - } - } - return nil -} - -func certManagerCRDsExist(crdMap map[string]string) bool { - for _, crdName := range certManagerCrdNames { - if _, ok := crdMap[crdName]; !ok { - return false - } - } - return true -} - -func GetSemanticVersion(version string) (*semver.Version, error) { - return semver.NewVersion(strings.TrimPrefix(version, "v")) -} - -func certManagerVersionSatisfied(crdVersionMap map[string]string) bool { - for _, crdName := range certManagerCrdNames { - currentVersion, err := GetSemanticVersion(crdVersionMap[crdName]) - if err != nil { - err = errors.Wrapf(err, "failed to parse crd version") - logger.Error(err, "crdName", crdName, "version", crdVersionMap[crdName]) - // take unknown version as not satisfied - return false - } - if currentVersion.LessThan(*CertManagerLeastSemanticVersion) { - return false - } - } - return true -} - -func (c CertManager) installCertManager() error { - manifest, err := downloadCertManagerManifest() - if err != nil { - return errors.Wrap(err, "failed to download cert manager manifest") - } - ctx, cancel := context.WithTimeout(context.Background(), apiTimeout) - defer cancel() - err = c.cli.Create(ctx, manifest) - return errors.Wrap(err, "failed to create cert manager manifest") -} - -func downloadCertManagerManifest() ([]byte, error) { - ret, err := util.HTTPGetBytes(certManagerManifestURLByVersion(CertManagerDefaultVersion)) - return ret, errors.Wrap(err, "failed to download cert manager manifest") -} diff --git a/pkg/provisioner/cert_manager_test.go b/pkg/provisioner/cert_manager_test.go deleted file mode 100644 index 26a8c188..00000000 --- a/pkg/provisioner/cert_manager_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package provisioner - -import ( - "os" - "path/filepath" - "testing" - - "github.com/milvus-io/milvus-operator/pkg/config" - "github.com/milvus-io/milvus-operator/pkg/util" - "github.com/stretchr/testify/assert" - "go.uber.org/mock/gomock" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/tools/clientcmd" -) - -func TestNewCertManager(t *testing.T) { - kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") - config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) - assert.NoError(t, err) - ret, err := NewCertManager(config) - assert.NoError(t, err) - assert.NotNil(t, ret) -} - -// TODO: make re-runnable -func TestCertManager_InstallIfNotExist(t *testing.T) { - kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") - config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) - assert.NoError(t, err) - ret, err := NewCertManager(config) - assert.NoError(t, err) - - t.Run("install disabled, install failed", func(t *testing.T) { - DisableCertManagerInstall = true - err = ret.InstallIfNotExist() - assert.Error(t, err) - }) - - // install ok - DisableCertManagerInstall = false - err = ret.InstallIfNotExist() - assert.NoError(t, err) - - // existed new ok - err = ret.InstallIfNotExist() - assert.NoError(t, err) -} - -func TestCertManager_IssueCertIfNotExist(t *testing.T) { - kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config") - restConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfig) - assert.NoError(t, err) - provider, err := NewCertManager(restConfig) - assert.NoError(t, err) - - ctl := gomock.NewController(t) - defer ctl.Finish() - mockCli := util.NewMockK8sClient(ctl) - provider.cli = mockCli - - // exist ok - mockCli.EXPECT().Exist(gomock.Any(), schema.GroupVersionResource{ - Group: "cert-manager.io", - Version: "v1", - Resource: "certificates", - }, config.OperatorNamespace, config.OperatorName+"-serving-cert").Return(true, nil) - - mockCli.EXPECT().Exist(gomock.Any(), schema.GroupVersionResource{ - Group: "cert-manager.io", - Version: "v1", - Resource: "issuers", - }, config.OperatorNamespace, config.OperatorName+"-selfsigned-issuer").Return(true, nil) - - err = provider.IssueCertIfNotExist() - assert.NoError(t, err) - - // not exist, create ok - mockCli.EXPECT().Exist(gomock.Any(), schema.GroupVersionResource{ - Group: "cert-manager.io", - Version: "v1", - Resource: "certificates", - }, config.OperatorNamespace, config.OperatorName+"-serving-cert").Return(false, nil) - - mockCli.EXPECT().Exist(gomock.Any(), schema.GroupVersionResource{ - Group: "cert-manager.io", - Version: "v1", - Resource: "issuers", - }, config.OperatorNamespace, config.OperatorName+"-selfsigned-issuer").Return(false, nil) - - mockCli.EXPECT().Create(gomock.Any(), gomock.Any()).Times(2) - err = provider.IssueCertIfNotExist() - assert.NoError(t, err) -} diff --git a/pkg/util/util.go b/pkg/util/util.go index bace7079..2cb55ee7 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -15,12 +15,17 @@ import ( "time" "github.com/Masterminds/sprig" + "github.com/coreos/go-semver/semver" "github.com/pkg/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) const MqTypeConfigKey = "messageQueue" +func GetSemanticVersion(version string) (*semver.Version, error) { + return semver.NewVersion(strings.TrimPrefix(version, "v")) +} + // GetNumberValue supports int64 / float64 in values return as float64 // see https://datatracker.ietf.org/doc/html/rfc8259#section-6 func GetNumberValue(values map[string]interface{}, fields ...string) (float64, bool) { diff --git a/test/mc-2.1.yaml b/test/mc-2.1.yaml deleted file mode 100644 index eae99592..00000000 --- a/test/mc-2.1.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: milvus.io/v1beta1 -kind: Milvus -metadata: - name: my-release - labels: - app: milvus -spec: - mode: cluster - components: - image: "milvusdb/milvus:v2.1.4" - mixCoord: - replicas: 1 - dependencies: - etcd: - inCluster: - values: - replicaCount: 1 - deletionPolicy: Delete - pvcDeletion: true - storage: - inCluster: - values: - mode: standalone - resources: - requests: - memory: 100Mi - persistence: - size: 20Gi - deletionPolicy: Delete - pvcDeletion: true - msgStreamType: kafka - kafka: - inCluster: - deletionPolicy: Delete - pvcDeletion: true - values: - defaultReplicationFactor: 1 - offsetsTopicReplicationFactor: 1 - replicaCount: 1 - zookeeper: - replicaCount: 1 diff --git a/test/mc-upgrade.yaml b/test/mc-upgrade.yaml deleted file mode 100644 index 7b4cd547..00000000 --- a/test/mc-upgrade.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: milvus.io/v1beta1 -kind: MilvusUpgrade -metadata: - name: my-release-upgrade -spec: - milvus: - namespace: mc - name: my-release - sourceVersion: "v2.1.4" - targetVersion: "v2.2.0" diff --git a/test/mi-upgrade.yaml b/test/mi-upgrade.yaml deleted file mode 100644 index 5063ba94..00000000 --- a/test/mi-upgrade.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: milvus.io/v1beta1 -kind: MilvusUpgrade -metadata: - name: my-release-upgrade -spec: - milvus: - namespace: default - name: my-release - sourceVersion: "v2.1.4" - targetVersion: "v2.2.0" diff --git a/test/milvus-2.1.yaml b/test/milvus-2.4.yaml similarity index 93% rename from test/milvus-2.1.yaml rename to test/milvus-2.4.yaml index a7064f01..5a4cdcd1 100644 --- a/test/milvus-2.1.yaml +++ b/test/milvus-2.4.yaml @@ -6,7 +6,7 @@ metadata: app: milvus spec: components: - image: "milvusdb/milvus:v2.1.4" + image: "milvusdb/milvus:v2.4.17" dependencies: etcd: inCluster: diff --git a/test/milvus-upgrade.sh b/test/milvus-upgrade.sh index 30571cdc..d8e98dc7 100755 --- a/test/milvus-upgrade.sh +++ b/test/milvus-upgrade.sh @@ -1,29 +1,12 @@ #!/bin/bash set -ex echo "Deploying old milvus" -kubectl apply -f test/milvus-2.1.yaml -kubectl --timeout 10m wait --for=condition=MilvusReady mi my-release -echo "Deploying milvus upgrade" -kubectl apply -f test/mi-upgrade.yaml -kubectl --timeout 10m wait --for=condition=Upgraded milvusupgrade my-release-upgrade -kubectl --timeout 10m wait --for=condition=MilvusReady mi my-release -echo "Rollback" -kubectl patch milvusupgrade my-release-upgrade --patch '{"spec": {"operation": "rollback"}}' --type=merge -kubectl --timeout 10m wait --for=condition=Rollbacked milvusupgrade my-release-upgrade +kubectl apply -f test/milvus-2.4.yaml kubectl --timeout 10m wait --for=condition=MilvusReady mi my-release +echo "Upgrade" +kubectl patch -f test/milvus-2.4.yaml --patch-file=test/patch-2.5.yaml --type=merge +sleep 30 +kubectl --timeout 10m wait --for=condition=MilvusUpdated mi my-release +kubectl --timeout 5m wait --for=condition=MilvusReady mi my-release echo "Clean up" -kubectl delete -f test/milvus-2.1.yaml --wait=true --timeout=5m --cascade=foreground -kubectl delete -f test/mi-upgrade.yaml --wait=true --timeout=5m --cascade=foreground - -echo "Deploying old milvus cluster" -kubectl create ns mc -kubectl -n mc apply -f test/mc-2.1.yaml -kubectl -n mc --timeout 15m wait --for=condition=MilvusReady mi my-release -echo "Deploying milvus upgrade" -kubectl -n mc apply -f test/mc-upgrade.yaml -kubectl -n mc --timeout 10m wait --for=condition=Upgraded milvusupgrade my-release-upgrade -kubectl -n mc --timeout 10m wait --for=condition=MilvusReady mi my-release -echo "Rollback" -kubectl -n mc patch milvusupgrade my-release-upgrade --patch '{"spec": {"operation": "rollback"}}' --type=merge -kubectl -n mc --timeout 10m wait --for=condition=Rollbacked milvusupgrade my-release-upgrade -kubectl -n mc --timeout 10m wait --for=condition=MilvusReady mi my-release +kubectl delete -f test/milvus-2.4.yaml --wait=true --timeout=5m --cascade=foreground diff --git a/test/min-milvus-feature.yaml b/test/min-milvus-feature.yaml index 330af66c..cbedec64 100644 --- a/test/min-milvus-feature.yaml +++ b/test/min-milvus-feature.yaml @@ -4,36 +4,6 @@ kind: Namespace metadata: name: milvus-sit --- -apiVersion: v1 -kind: Secret -metadata: - namespace: milvus-sit - name: milvus-pulsar-token-symmetric-key -type: Opaque -stringData: - # the root SECRETKEY used for signing jwt token for users - SECRETKEY: my-pulsar-secret-key-example-change-it-to-your-own!! ---- -apiVersion: v1 -kind: Secret -metadata: - namespace: milvus-sit - name: milvus-pulsar-token-milvus -type: Opaque -stringData: - # signed to user: milvus with SECRETKEY - TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtaWx2dXMifQ.2ciEzP9-vuwO6oI-4WfnYA1UqI5oXz7uOLJpOBrrhYo ---- -apiVersion: v1 -kind: Secret -metadata: - namespace: milvus-sit - name: milvus-pulsar-token-pulsar-proxy -type: Opaque -stringData: - # signed to user: pulsar-proxy with SECRETKEY - TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJwdWxzYXItcHJveHkifQ.OgKpFomaZVIoMFl2GmgYED48RaDcFzhqe5Td_v8JNhU ---- apiVersion: milvus.io/v1beta1 kind: Milvus metadata: @@ -50,27 +20,11 @@ spec: standalone: ingress: hosts: ['mc-sit.milvus.io'] - volumes: - - name: pulsar-token - secret: - secretName: milvus-pulsar-token-milvus - items: - - key: TOKEN - path: token - volumeMounts: - - name: pulsar-token - mountPath: /milvus/pulsar dependencies: etcd: inCluster: deletionPolicy: Delete pvcDeletion: true - values: - replicaCount: 3 - auth: - rbac: - enabled: true - rootPassword: myrootpass storage: inCluster: deletionPolicy: Delete @@ -89,21 +43,6 @@ spec: deletionPolicy: Delete pvcDeletion: true values: - auth: - authentication: - enabled: true - provider: 'jwt' - jwt: - usingSecretKey: true - authorization: - enabled: true - superUsers: - # broker to broker communication - broker: 'milvus' - # proxy to broker communication - proxy: 'pulsar-proxy' - # pulsar-admin client to broker/proxy communication - client: '' volumes: persistence: false components: @@ -174,25 +113,6 @@ spec: -Xms64m -Xmx512m -XX:MaxDirectMemorySize=2048m # end pulsar values config: - rootCoord: - enableActiveStandby: true - dataCoord: - enableActiveStandby: true - queryCoord: - enableActiveStandby: true - indexCoord: - enableActiveStandby: true milvus: log: level: info - component: - proxy: - timeTickInterval: 150 - pulsar: - authPlugin: token - authParams: file:/milvus/pulsar/token - etcd: - auth: - enabled: true - userName: root - password: myrootpass diff --git a/test/patch-2.5.yaml b/test/patch-2.5.yaml new file mode 100644 index 00000000..a347805d --- /dev/null +++ b/test/patch-2.5.yaml @@ -0,0 +1,3 @@ +spec: + components: + image: "milvusdb/milvus:v2.5.0-beta" diff --git a/test/upgrade.yaml b/test/upgrade.yaml deleted file mode 100644 index dba77558..00000000 --- a/test/upgrade.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: milvus.io/v1beta1 -kind: MilvusUpgrade -metadata: - name: my-release-upgrade -spec: - milvus: - namespace: milvus - name: milvus-sit - sourceVersion: "2.1.4" - targetVersion: "2.2.0" - # operation: upgrade - # rollbackIfFailed: true - # bakupPVC: "" - # deleteUpBackupPVC: true - deleteBackupPVC: true \ No newline at end of file diff --git a/tool/checker/main.go b/tool/checker/main.go deleted file mode 100644 index 46cee39e..00000000 --- a/tool/checker/main.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - - _ "k8s.io/client-go/plugin/pkg/client/auth" - - ctrlConfig "sigs.k8s.io/controller-runtime/pkg/client/config" - - "github.com/milvus-io/milvus-operator/pkg/config" - "github.com/milvus-io/milvus-operator/pkg/provisioner" -) - -func main() { - flag.StringVar(&config.OperatorNamespace, "namespace", "milvus-operator", "The namespace of self") - flag.StringVar(&config.OperatorName, "name", "milvus-operator", "The namespace of self") - flag.BoolVar(&provisioner.DisableCertManagerInstall, provisioner.DisableCertManagerInstallFlag, provisioner.DisableCertManagerInstall, "Disable auto install cert-manager if not exist") - flag.BoolVar(&provisioner.DisableCertManagerCheck, provisioner.DisableCertManagerCheckFlag, provisioner.DisableCertManagerCheck, "Disable auto check & install cert-manager") - flag.Parse() - certMangerProvisioner, err := provisioner.NewCertManager(ctrlConfig.GetConfigOrDie()) - if err != nil { - log.Fatal("unable to create cert manager provisioner ", err) - } - if !provisioner.DisableCertManagerCheck { - err = certMangerProvisioner.InstallIfNotExist() - if err != nil { - log.Fatal("unable to install cert manager ", err) - } - } else { - fmt.Println("cert-manager check is skipped") - } - - err = certMangerProvisioner.IssueCertIfNotExist() - if err != nil { - log.Fatal("unable to install certification", err) - } - // TODO: rollout milvus-operator to minimize pending time -}