mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-06 22:27:22 +00:00
add managed secret creation policy
This commit is contained in:
@@ -13,9 +13,9 @@ type: application
|
|||||||
# This is the chart version. This version number should be incremented each time you make changes
|
# This is the chart version. This version number should be incremented each time you make changes
|
||||||
# to the chart and its templates, including the app version.
|
# to the chart and its templates, including the app version.
|
||||||
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||||
version: 0.3.3
|
version: v0.4.0
|
||||||
# This is the version number of the application being deployed. This version number should be
|
# This is the version number of the application being deployed. This version number should be
|
||||||
# incremented each time you make changes to the application. Versions are not expected to
|
# incremented each time you make changes to the application. Versions are not expected to
|
||||||
# follow Semantic Versioning. They should reflect the version the application is using.
|
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||||
# It is recommended to use it with quotes.
|
# It is recommended to use it with quotes.
|
||||||
appVersion: "0.3.0"
|
appVersion: "v0.4.0"
|
||||||
|
|||||||
@@ -1,13 +1,3 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: {{ include "secrets-operator.fullname" . }}-controller-manager
|
|
||||||
labels:
|
|
||||||
app.kubernetes.io/component: rbac
|
|
||||||
app.kubernetes.io/created-by: k8-operator
|
|
||||||
app.kubernetes.io/part-of: k8-operator
|
|
||||||
{{- include "secrets-operator.labels" . | nindent 4 }}
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
@@ -49,36 +39,29 @@ spec:
|
|||||||
values:
|
values:
|
||||||
- linux
|
- linux
|
||||||
containers:
|
containers:
|
||||||
- args:
|
- args: {{- toYaml .Values.controllerManager.kubeRbacProxy.args | nindent 8 }}
|
||||||
- --secure-listen-address=0.0.0.0:8443
|
|
||||||
- --upstream=http://127.0.0.1:8080/
|
|
||||||
- --logtostderr=true
|
|
||||||
- --v=0
|
|
||||||
env:
|
env:
|
||||||
- name: KUBERNETES_CLUSTER_DOMAIN
|
- name: KUBERNETES_CLUSTER_DOMAIN
|
||||||
value: {{ .Values.kubernetesClusterDomain }}
|
value: {{ quote .Values.kubernetesClusterDomain }}
|
||||||
image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag | default .Chart.AppVersion }}
|
image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag
|
||||||
|
| default .Chart.AppVersion }}
|
||||||
name: kube-rbac-proxy
|
name: kube-rbac-proxy
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8443
|
- containerPort: 8443
|
||||||
name: https
|
name: https
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent 10 }}
|
resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent
|
||||||
securityContext:
|
10 }}
|
||||||
allowPrivilegeEscalation: false
|
securityContext: {{- toYaml .Values.controllerManager.kubeRbacProxy.containerSecurityContext
|
||||||
capabilities:
|
| nindent 10 }}
|
||||||
drop:
|
- args: {{- toYaml .Values.controllerManager.manager.args | nindent 8 }}
|
||||||
- ALL
|
|
||||||
- args:
|
|
||||||
- --health-probe-bind-address=:8081
|
|
||||||
- --metrics-bind-address=127.0.0.1:8080
|
|
||||||
- --leader-elect
|
|
||||||
command:
|
command:
|
||||||
- /manager
|
- /manager
|
||||||
env:
|
env:
|
||||||
- name: KUBERNETES_CLUSTER_DOMAIN
|
- name: KUBERNETES_CLUSTER_DOMAIN
|
||||||
value: {{ .Values.kubernetesClusterDomain }}
|
value: {{ quote .Values.kubernetesClusterDomain }}
|
||||||
image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag | default .Chart.AppVersion }}
|
image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag
|
||||||
|
| default .Chart.AppVersion }}
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /healthz
|
path: /healthz
|
||||||
@@ -92,12 +75,10 @@ spec:
|
|||||||
port: 8081
|
port: 8081
|
||||||
initialDelaySeconds: 5
|
initialDelaySeconds: 5
|
||||||
periodSeconds: 10
|
periodSeconds: 10
|
||||||
resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10 }}
|
resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10
|
||||||
securityContext:
|
}}
|
||||||
allowPrivilegeEscalation: false
|
securityContext: {{- toYaml .Values.controllerManager.manager.containerSecurityContext
|
||||||
capabilities:
|
| nindent 10 }}
|
||||||
drop:
|
|
||||||
- ALL
|
|
||||||
securityContext:
|
securityContext:
|
||||||
runAsNonRoot: true
|
runAsNonRoot: true
|
||||||
serviceAccountName: {{ include "secrets-operator.fullname" . }}-controller-manager
|
serviceAccountName: {{ include "secrets-operator.fullname" . }}-controller-manager
|
||||||
|
|||||||
@@ -96,6 +96,14 @@ spec:
|
|||||||
type: string
|
type: string
|
||||||
managedSecretReference:
|
managedSecretReference:
|
||||||
properties:
|
properties:
|
||||||
|
creationPolicy:
|
||||||
|
default: Orphan
|
||||||
|
description: 'The Kubernetes Secret creation policy. Enum with values:
|
||||||
|
''Owner'', ''Orphan''. Owner creates the secret and sets .metadata.ownerReferences
|
||||||
|
of the InfisicalSecret CRD that created it. Orphan will not set
|
||||||
|
the secret owner. This will result in the secret being orphaned
|
||||||
|
and not deleted when the resource is deleted.'
|
||||||
|
type: string
|
||||||
secretName:
|
secretName:
|
||||||
description: The name of the Kubernetes Secret
|
description: The name of the Kubernetes Secret
|
||||||
type: string
|
type: string
|
||||||
|
|||||||
@@ -14,4 +14,4 @@ spec:
|
|||||||
control-plane: controller-manager
|
control-plane: controller-manager
|
||||||
{{- include "secrets-operator.selectorLabels" . | nindent 4 }}
|
{{- include "secrets-operator.selectorLabels" . | nindent 4 }}
|
||||||
ports:
|
ports:
|
||||||
{{- .Values.metricsService.ports | toYaml | nindent 2 -}}
|
{{- .Values.metricsService.ports | toYaml | nindent 2 }}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ include "secrets-operator.fullname" . }}-controller-manager
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/component: rbac
|
||||||
|
app.kubernetes.io/created-by: k8-operator
|
||||||
|
app.kubernetes.io/part-of: k8-operator
|
||||||
|
{{- include "secrets-operator.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml .Values.controllerManager.serviceAccount.annotations | nindent 4 }}
|
||||||
@@ -1,5 +1,15 @@
|
|||||||
controllerManager:
|
controllerManager:
|
||||||
kubeRbacProxy:
|
kubeRbacProxy:
|
||||||
|
args:
|
||||||
|
- --secure-listen-address=0.0.0.0:8443
|
||||||
|
- --upstream=http://127.0.0.1:8080/
|
||||||
|
- --logtostderr=true
|
||||||
|
- --v=0
|
||||||
|
containerSecurityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
image:
|
image:
|
||||||
repository: gcr.io/kubebuilder/kube-rbac-proxy
|
repository: gcr.io/kubebuilder/kube-rbac-proxy
|
||||||
tag: v0.15.0
|
tag: v0.15.0
|
||||||
@@ -11,9 +21,18 @@ controllerManager:
|
|||||||
cpu: 5m
|
cpu: 5m
|
||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
manager:
|
manager:
|
||||||
|
args:
|
||||||
|
- --health-probe-bind-address=:8081
|
||||||
|
- --metrics-bind-address=127.0.0.1:8080
|
||||||
|
- --leader-elect
|
||||||
|
containerSecurityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
image:
|
image:
|
||||||
repository: infisical/kubernetes-operator
|
repository: infisical/kubernetes-operator
|
||||||
tag: latest
|
tag: v0.4.0 # fixed to prevent accidental upgrade
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
cpu: 500m
|
cpu: 500m
|
||||||
@@ -22,6 +41,8 @@ controllerManager:
|
|||||||
cpu: 10m
|
cpu: 10m
|
||||||
memory: 64Mi
|
memory: 64Mi
|
||||||
replicas: 1
|
replicas: 1
|
||||||
|
serviceAccount:
|
||||||
|
annotations: {}
|
||||||
kubernetesClusterDomain: cluster.local
|
kubernetesClusterDomain: cluster.local
|
||||||
metricsService:
|
metricsService:
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
+13
-3
@@ -37,9 +37,19 @@ help: ## Display this help.
|
|||||||
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
|
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
|
||||||
## Chart - NOTE: change helper file to have 15 length for full name method
|
# ## Chart - NOTE: change helper file to have 15 length for full name method
|
||||||
helm-chart:
|
# helm-chart:
|
||||||
$(KUSTOMIZE) build config/default | helmify ../helm-charts/secrets-operator
|
# $(KUSTOMIZE) build config/default | helmify ../helm-charts/secrets-operator
|
||||||
|
|
||||||
|
HELMIFY ?= $(LOCALBIN)/helmify
|
||||||
|
|
||||||
|
.PHONY: helmify
|
||||||
|
helmify: $(HELMIFY) ## Download helmify locally if necessary.
|
||||||
|
$(HELMIFY): $(LOCALBIN)
|
||||||
|
test -s $(LOCALBIN)/helmify || GOBIN=$(LOCALBIN) go install github.com/arttor/helmify/cmd/helmify@latest
|
||||||
|
|
||||||
|
helm: manifests kustomize helmify
|
||||||
|
$(KUSTOMIZE) build config/default | $(HELMIFY) ../helm-charts/secrets-operator
|
||||||
|
|
||||||
## Yaml for Kubectl
|
## Yaml for Kubectl
|
||||||
kubectl-install: manifests kustomize
|
kubectl-install: manifests kustomize
|
||||||
|
|||||||
@@ -56,6 +56,14 @@ type MangedKubeSecretConfig struct {
|
|||||||
// +kubebuilder:validation:Optional
|
// +kubebuilder:validation:Optional
|
||||||
// +kubebuilder:default:=Opaque
|
// +kubebuilder:default:=Opaque
|
||||||
SecretType string `json:"secretType"`
|
SecretType string `json:"secretType"`
|
||||||
|
|
||||||
|
// The Kubernetes Secret creation policy.
|
||||||
|
// Enum with values: 'Owner', 'Orphan'.
|
||||||
|
// Owner creates the secret and sets .metadata.ownerReferences of the InfisicalSecret CRD that created it.
|
||||||
|
// Orphan will not set the secret owner. This will result in the secret being orphaned and not deleted when the resource is deleted.
|
||||||
|
// +kubebuilder:validation:Optional
|
||||||
|
// +kubebuilder:default:=Orphan
|
||||||
|
CreationPolicy string `json:"creationPolicy"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// InfisicalSecretSpec defines the desired state of InfisicalSecret
|
// InfisicalSecretSpec defines the desired state of InfisicalSecret
|
||||||
|
|||||||
@@ -96,6 +96,15 @@ spec:
|
|||||||
type: string
|
type: string
|
||||||
managedSecretReference:
|
managedSecretReference:
|
||||||
properties:
|
properties:
|
||||||
|
creationPolicy:
|
||||||
|
default: Orphan
|
||||||
|
description: 'The Kubernetes Secret creation policy. Enum with
|
||||||
|
values: ''Owner'', ''Orphan''. Owner creates the secret and
|
||||||
|
sets .metadata.ownerReferences of the InfisicalSecret CRD that
|
||||||
|
created it. Orphan will not set the secret owner. This will
|
||||||
|
result in the secret being orphaned and not deleted when the
|
||||||
|
resource is deleted.'
|
||||||
|
type: string
|
||||||
secretName:
|
secretName:
|
||||||
description: The name of the Kubernetes Secret
|
description: The name of the Kubernetes Secret
|
||||||
type: string
|
type: string
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ metadata:
|
|||||||
labels:
|
labels:
|
||||||
label-to-be-passed-to-managed-secret: sample-value
|
label-to-be-passed-to-managed-secret: sample-value
|
||||||
annotations:
|
annotations:
|
||||||
example.com/annotation-to-be-passed-to-managed-secret: "sample-value"
|
reflector.v1.k8s.emberstack.com/reflection-allowed: 'true'
|
||||||
spec:
|
spec:
|
||||||
hostAPI: https://app.infisical.com/api
|
hostAPI: http://localhost:8888/api
|
||||||
resyncInterval: 10
|
resyncInterval: 10
|
||||||
authentication:
|
authentication:
|
||||||
serviceAccount:
|
serviceAccount:
|
||||||
@@ -26,6 +26,7 @@ spec:
|
|||||||
managedSecretReference:
|
managedSecretReference:
|
||||||
secretName: managed-secret
|
secretName: managed-secret
|
||||||
secretNamespace: default
|
secretNamespace: default
|
||||||
|
creationPolicy: "Orphan" ## Owner | Orphan
|
||||||
# secretType: kubernetes.io/dockerconfigjson
|
# secretType: kubernetes.io/dockerconfigjson
|
||||||
|
|
||||||
# # To be depreciated soon
|
# # To be depreciated soon
|
||||||
|
|||||||
@@ -142,8 +142,18 @@ func (r *InfisicalSecretReconciler) CreateInfisicalManagedKubeSecret(ctx context
|
|||||||
}
|
}
|
||||||
|
|
||||||
annotations := map[string]string{}
|
annotations := map[string]string{}
|
||||||
|
systemPrefixes := []string{"kubectl.kubernetes.io/", "kubernetes.io/", "k8s.io/", "helm.sh/"}
|
||||||
for k, v := range infisicalSecret.Annotations {
|
for k, v := range infisicalSecret.Annotations {
|
||||||
annotations[k] = v
|
isSystem := false
|
||||||
|
for _, prefix := range systemPrefixes {
|
||||||
|
if strings.HasPrefix(k, prefix) {
|
||||||
|
isSystem = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !isSystem {
|
||||||
|
annotations[k] = v
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
annotations[SECRET_VERSION_ANNOTATION] = encryptedSecretsResponse.ETag
|
annotations[SECRET_VERSION_ANNOTATION] = encryptedSecretsResponse.ETag
|
||||||
@@ -160,13 +170,15 @@ func (r *InfisicalSecretReconciler) CreateInfisicalManagedKubeSecret(ctx context
|
|||||||
Data: plainProcessedSecrets,
|
Data: plainProcessedSecrets,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set InfisicalSecret instance as the owner and controller
|
if infisicalSecret.Spec.ManagedSecretReference.CreationPolicy == "Owner" {
|
||||||
err := ctrl.SetControllerReference(&infisicalSecret, newKubeSecretInstance, r.Scheme)
|
// Set InfisicalSecret instance as the owner and controller of the managed secret
|
||||||
if err != nil {
|
err := ctrl.SetControllerReference(&infisicalSecret, newKubeSecretInstance, r.Scheme)
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = r.Client.Create(ctx, newKubeSecretInstance)
|
err := r.Client.Create(ctx, newKubeSecretInstance)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to create the managed Kubernetes secret : %w", err)
|
return fmt.Errorf("unable to create the managed Kubernetes secret : %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ func CallGetSecretsV3(httpClient *resty.Client, request GetEncryptedSecretsV3Req
|
|||||||
return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
return GetEncryptedSecretsV3Response{}, fmt.Errorf("CallGetSecretsV3: Unsuccessful response. Please make sure your secret path, workspace and environment name are all correct [response=%s]", response)
|
||||||
}
|
}
|
||||||
|
|
||||||
if response.StatusCode() == 304 {
|
if response.Header().Get("etag") == request.ETag {
|
||||||
secretsResponse.Modified = false
|
secretsResponse.Modified = false
|
||||||
} else {
|
} else {
|
||||||
secretsResponse.Modified = true
|
secretsResponse.Modified = true
|
||||||
|
|||||||
Reference in New Issue
Block a user