From e02fe9392dc50b8da69c708b2cad97ef127cd40b Mon Sep 17 00:00:00 2001 From: Jerome Haltom Date: Sun, 6 Sep 2026 12:22:30 -0500 Subject: [PATCH] Let a deployment state its own probes, and fix CRD generation The operator hardcodes timeoutSeconds: 1 on all three probes and the CRD exposed no probe fields at all, so an instance that answers /health slowly is killed by the kubelet 30 seconds later. Under CPU contention Seq's own log reports a /api response taking 12.7 seconds; seq-server-0 carries 346 restarts on one cluster and 282 on another, every one of them exit 143 rather than a fault in Seq. spec.deployment now carries livenessProbe, readinessProbe and startupProbe. A probe given there replaces the operator's outright rather than merging into it: merging would let a caller set one field, inherit the rest, and read back a probe that is neither what they wrote nor what was chosen for them, and it offers no way to clear a field the operator sets. Left unset, the emitted probes are exactly what they are today. None of that could reach the CRD, because the pinned kubeops.cli 9.1.6-alethic.5 resolves from no configured feed, and KubeOps.Operator.targets probes the CLI with IgnoreExitCode and invokes generation with ContinueOnError -- so generation was skipped and the build still reported success. The tool is pinned to the stock 9.11.8, matching the KubeOps.Operator and KubeOps.Generator references the project already carries. Regenerating on stock leaves four of the five CRDs byte-identical apart from nullable annotations, and every enum identical -- the fork's patch is JsonStringEnumMemberNameAttribute handling, which nothing here declares. What it does change is ResourceQuantity, which 9.1.x transpiled as an object of {format, value}. Kubernetes quantities are strings, so spec.deployment.resources could not be given an ordinary value like 250m, which is why Seq has run BestEffort; env[].valueFrom.resourceFieldRef.divisor carried the same fault. Namespaces are declared through EntityRbac. An Instance's permissions are evaluated against the namespace object itself, but nothing inferred that from the controller's entity types, so the rule was patched in by hand wherever the generated role was copied. The chart's ClusterRole is now a straight copy of the generated role with nothing added to it. --- .config/dotnet-tools.json | 4 +- .../seq-operator/templates/clusterrole.yaml | 41 +- .../Instance/InstanceDeploymentSpec.cs | 33 ++ .../Instance/V1alpha1InstanceController.cs | 15 +- src/Alethic.Seq.Operator/config/Dockerfile | 3 +- .../config/alerts_seq_k8s_datalust_co.yaml | 4 - .../config/apikeys_seq_k8s_datalust_co.yaml | 9 - .../config/instances_seq_k8s_datalust_co.yaml | 464 ++++++++---------- .../config/kustomization.yaml | 6 +- .../config/operator-role.yaml | 24 +- .../retentionpolicys_seq_k8s_datalust_co.yaml | 3 - .../config/signals_seq_k8s_datalust_co.yaml | 3 - 12 files changed, 314 insertions(+), 295 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 4218884..cd0b93b 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,11 +3,11 @@ "isRoot": true, "tools": { "kubeops.cli": { - "version": "9.1.6-alethic.5", + "version": "9.11.8", "commands": [ "kubeops" ], "rollForward": false } } -} \ No newline at end of file +} diff --git a/charts/seq-operator/templates/clusterrole.yaml b/charts/seq-operator/templates/clusterrole.yaml index 8836e93..0ee8346 100644 --- a/charts/seq-operator/templates/clusterrole.yaml +++ b/charts/seq-operator/templates/clusterrole.yaml @@ -20,7 +20,7 @@ rules: verbs: - '*' - apiGroups: - - "" + - '' resources: - secrets - services @@ -33,6 +33,14 @@ rules: - events verbs: - '*' +- apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - list + - watch - apiGroups: - apps resources: @@ -40,7 +48,7 @@ rules: verbs: - '*' - apiGroups: - - "" + - '' resources: - events verbs: @@ -53,7 +61,13 @@ rules: resources: - leases verbs: - - '*' + - get + - list + - watch + - create + - update + - patch + - delete - apiGroups: - seq.k8s.datalust.co resources: @@ -79,7 +93,15 @@ rules: - update - patch - apiGroups: - - "" + - '' + resources: + - namespaces/status + verbs: + - get + - update + - patch +- apiGroups: + - '' resources: - services/status verbs: @@ -110,15 +132,4 @@ rules: - get - update - patch - - -# Additional not generated -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch --- diff --git a/src/Alethic.Seq.Operator/Instance/InstanceDeploymentSpec.cs b/src/Alethic.Seq.Operator/Instance/InstanceDeploymentSpec.cs index de7a077..290ef72 100644 --- a/src/Alethic.Seq.Operator/Instance/InstanceDeploymentSpec.cs +++ b/src/Alethic.Seq.Operator/Instance/InstanceDeploymentSpec.cs @@ -93,6 +93,39 @@ public class InstanceDeploymentSpec [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ImagePullPolicy { get; set; } + /// + /// Liveness probe for the Seq container. Replaces the operator's own probe entirely when set; leave it unset + /// to keep the default. + /// + /// + /// Seq answers /health from the same thread pool that serves ingestion, so on a busy or CPU-starved + /// instance the response can take seconds. The default probe is deliberately conservative rather than + /// generous, and a deployment that knows its own load may need to say so. + /// + [JsonPropertyName("livenessProbe")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public V1Probe? LivenessProbe { get; set; } + + /// + /// Readiness probe for the Seq container. Replaces the operator's own probe entirely when set; leave it unset + /// to keep the default. + /// + [JsonPropertyName("readinessProbe")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public V1Probe? ReadinessProbe { get; set; } + + /// + /// Startup probe for the Seq container. Replaces the operator's own probe entirely when set; leave it unset + /// to keep the default. + /// + /// + /// While a startup probe is running the liveness and readiness probes are held off, so this is the one that + /// governs how long a cold instance is given — a large store replaying on first boot is the case to size for. + /// + [JsonPropertyName("startupProbe")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public V1Probe? StartupProbe { get; set; } + [JsonPropertyName("service")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public InstanceDeploymentServiceSpec? Service { get; set; } diff --git a/src/Alethic.Seq.Operator/Instance/V1alpha1InstanceController.cs b/src/Alethic.Seq.Operator/Instance/V1alpha1InstanceController.cs index c385992..5bc608b 100644 --- a/src/Alethic.Seq.Operator/Instance/V1alpha1InstanceController.cs +++ b/src/Alethic.Seq.Operator/Instance/V1alpha1InstanceController.cs @@ -28,6 +28,11 @@ namespace Alethic.Seq.Operator.Instance { + // Namespaces are read, never written: an Instance's permissions can admit entities from every namespace or from + // those matching a selector, and both are evaluated against the namespace object itself. Nothing infers this from + // the controller's entity types, so without it the generated role omits namespaces and has to be patched by hand + // wherever it is copied. + [EntityRbac(typeof(V1Namespace), Verbs = RbacVerb.Get | RbacVerb.List | RbacVerb.Watch)] [EntityRbac(typeof(V1alpha1Instance), Verbs = RbacVerb.All)] [EntityRbac(typeof(V1Secret), Verbs = RbacVerb.All)] [EntityRbac(typeof(V1Service), Verbs = RbacVerb.All)] @@ -593,7 +598,11 @@ V1StatefulSet ApplyDeploymentStatefulSet(V1alpha1Instance instance, InstanceDepl container.VolumeMounts.Clear(); container.VolumeMounts.Add(new V1VolumeMount("/data", "seq-data")); - container.LivenessProbe = new V1Probe( + // A probe given on the deployment replaces ours outright rather than merging into it. Merging would let a + // caller set one field and silently inherit the rest of ours, so the probe they read back would be neither + // what they wrote nor what we chose; and it offers no way to clear a field we set. This follows the same + // shape as Resources below, which is a straight pass-through of what the caller supplied. + container.LivenessProbe = deployment.LivenessProbe ?? new V1Probe( httpGet: new V1HTTPGetAction("ui", path: "/health"), failureThreshold: 3, initialDelaySeconds: 0, @@ -601,7 +610,7 @@ V1StatefulSet ApplyDeploymentStatefulSet(V1alpha1Instance instance, InstanceDepl successThreshold: 1, timeoutSeconds: 1); - container.ReadinessProbe = new V1Probe( + container.ReadinessProbe = deployment.ReadinessProbe ?? new V1Probe( httpGet: new V1HTTPGetAction("ui", path: "/health"), failureThreshold: 3, initialDelaySeconds: 0, @@ -609,7 +618,7 @@ V1StatefulSet ApplyDeploymentStatefulSet(V1alpha1Instance instance, InstanceDepl successThreshold: 1, timeoutSeconds: 1); - container.StartupProbe = new V1Probe( + container.StartupProbe = deployment.StartupProbe ?? new V1Probe( httpGet: new V1HTTPGetAction("ui", path: "/health"), failureThreshold: 30, periodSeconds: 10); diff --git a/src/Alethic.Seq.Operator/config/Dockerfile b/src/Alethic.Seq.Operator/config/Dockerfile index d256e7a..657bdc4 100644 --- a/src/Alethic.Seq.Operator/config/Dockerfile +++ b/src/Alethic.Seq.Operator/config/Dockerfile @@ -10,8 +10,7 @@ FROM mcr.microsoft.com/dotnet/runtime:latest as final RUN addgroup k8s-operator && useradd -G k8s-operator operator-user WORKDIR /operator -COPY --from=build /operator/out/ ./ -RUN chown operator-user:k8s-operator -R . +COPY --chown=operator-user:k8s-operator --from=build /operator/out/ ./ USER operator-user diff --git a/src/Alethic.Seq.Operator/config/alerts_seq_k8s_datalust_co.yaml b/src/Alethic.Seq.Operator/config/alerts_seq_k8s_datalust_co.yaml index c423952..5f61c1a 100644 --- a/src/Alethic.Seq.Operator/config/alerts_seq_k8s_datalust_co.yaml +++ b/src/Alethic.Seq.Operator/config/alerts_seq_k8s_datalust_co.yaml @@ -18,7 +18,6 @@ spec: openAPIV3Schema: properties: status: - nullable: false properties: id: nullable: true @@ -89,7 +88,6 @@ spec: type: string notificationProperties: additionalProperties: - nullable: false type: string nullable: true type: object @@ -113,11 +111,9 @@ spec: nullable: true type: string type: object - nullable: false type: array type: object spec: - nullable: false properties: instanceRef: nullable: true diff --git a/src/Alethic.Seq.Operator/config/apikeys_seq_k8s_datalust_co.yaml b/src/Alethic.Seq.Operator/config/apikeys_seq_k8s_datalust_co.yaml index 8dbaab5..4fbd61d 100644 --- a/src/Alethic.Seq.Operator/config/apikeys_seq_k8s_datalust_co.yaml +++ b/src/Alethic.Seq.Operator/config/apikeys_seq_k8s_datalust_co.yaml @@ -18,7 +18,6 @@ spec: openAPIV3Schema: properties: status: - nullable: false properties: id: nullable: true @@ -27,10 +26,8 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object info: @@ -68,7 +65,6 @@ spec: properties: appliedProperties: additionalProperties: - nullable: false type: string nullable: true type: object @@ -119,11 +115,9 @@ spec: nullable: true type: string type: object - nullable: false type: array type: object spec: - nullable: false properties: instanceRef: nullable: true @@ -141,10 +135,8 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object conf: @@ -173,7 +165,6 @@ spec: properties: appliedProperties: additionalProperties: - nullable: false type: string nullable: true type: object diff --git a/src/Alethic.Seq.Operator/config/instances_seq_k8s_datalust_co.yaml b/src/Alethic.Seq.Operator/config/instances_seq_k8s_datalust_co.yaml index dbf705c..65798dd 100644 --- a/src/Alethic.Seq.Operator/config/instances_seq_k8s_datalust_co.yaml +++ b/src/Alethic.Seq.Operator/config/instances_seq_k8s_datalust_co.yaml @@ -18,7 +18,6 @@ spec: openAPIV3Schema: properties: status: - nullable: false properties: deployment: nullable: true @@ -30,20 +29,16 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object tokenSecretRef: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object type: object @@ -94,7 +89,6 @@ spec: type: string scopes: items: - nullable: false type: string nullable: true type: array @@ -135,31 +129,26 @@ spec: type: integer newUserPreferences: additionalProperties: - nullable: false type: string nullable: true type: object newUserRoleIds: items: - nullable: false type: string nullable: true type: array newUserShowSignalIds: items: - nullable: false type: string nullable: true type: array newUserShowQueryIds: items: - nullable: false type: string nullable: true type: array newUserShowDashboardIds: items: - nullable: false type: string nullable: true type: array @@ -230,11 +219,9 @@ spec: nullable: true type: string type: object - nullable: false type: array type: object spec: - nullable: false properties: remote: nullable: true @@ -252,10 +239,8 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object required: @@ -268,10 +253,8 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object required: @@ -294,31 +277,25 @@ spec: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object tokenSecretRef: nullable: true properties: name: - nullable: false type: string namespace: - nullable: false type: string type: object annotations: additionalProperties: - nullable: false type: string nullable: true type: object labels: additionalProperties: - nullable: false type: string nullable: true type: object @@ -326,60 +303,45 @@ spec: nullable: true properties: nodeAffinity: - nullable: false properties: preferredDuringSchedulingIgnoredDuringExecution: items: properties: preference: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchFields: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array type: object weight: format: int32 - nullable: false type: integer type: object - nullable: false type: array requiredDuringSchedulingIgnoredDuringExecution: - nullable: false properties: nodeSelectorTerms: items: @@ -388,403 +350,289 @@ spec: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchFields: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array type: object - nullable: false type: array type: object type: object podAffinity: - nullable: false properties: preferredDuringSchedulingIgnoredDuringExecution: items: properties: podAffinityTerm: - nullable: false properties: labelSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object matchLabelKeys: items: - nullable: false type: string - nullable: false type: array mismatchLabelKeys: items: - nullable: false type: string - nullable: false type: array namespaceSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object namespaces: items: - nullable: false type: string - nullable: false type: array topologyKey: - nullable: false type: string type: object weight: format: int32 - nullable: false type: integer type: object - nullable: false type: array requiredDuringSchedulingIgnoredDuringExecution: items: properties: labelSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object matchLabelKeys: items: - nullable: false type: string - nullable: false type: array mismatchLabelKeys: items: - nullable: false type: string - nullable: false type: array namespaceSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object namespaces: items: - nullable: false type: string - nullable: false type: array topologyKey: - nullable: false type: string type: object - nullable: false type: array type: object podAntiAffinity: - nullable: false properties: preferredDuringSchedulingIgnoredDuringExecution: items: properties: podAffinityTerm: - nullable: false properties: labelSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object matchLabelKeys: items: - nullable: false type: string - nullable: false type: array mismatchLabelKeys: items: - nullable: false type: string - nullable: false type: array namespaceSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object namespaces: items: - nullable: false type: string - nullable: false type: array topologyKey: - nullable: false type: string type: object weight: format: int32 - nullable: false type: integer type: object - nullable: false type: array requiredDuringSchedulingIgnoredDuringExecution: items: properties: labelSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object matchLabelKeys: items: - nullable: false type: string - nullable: false type: array mismatchLabelKeys: items: - nullable: false type: string - nullable: false type: array namespaceSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object namespaces: items: - nullable: false type: string - nullable: false type: array topologyKey: - nullable: false type: string type: object - nullable: false type: array type: object type: object nodeSelector: additionalProperties: - nullable: false type: string nullable: true type: object @@ -795,45 +643,18 @@ spec: items: properties: name: - nullable: false type: string request: - nullable: false type: string type: object - nullable: false type: array limits: additionalProperties: - properties: - format: - enum: - - DecimalExponent - - BinarySI - - DecimalSI - nullable: false - type: string - value: - nullable: false - type: string - type: object - nullable: false + type: string type: object requests: additionalProperties: - properties: - format: - enum: - - DecimalExponent - - BinarySI - - DecimalSI - nullable: false - type: string - value: - nullable: false - type: string - type: object - nullable: false + type: string type: object type: object restartPolicy: @@ -850,20 +671,16 @@ spec: items: properties: effect: - nullable: false type: string key: - nullable: false type: string operator: - nullable: false type: string tolerationSeconds: format: int64 nullable: true type: integer value: - nullable: false type: string type: object nullable: true @@ -872,58 +689,43 @@ spec: items: properties: labelSelector: - nullable: false properties: matchExpressions: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object matchLabelKeys: items: - nullable: false type: string - nullable: false type: array maxSkew: format: int32 - nullable: false type: integer minDomains: format: int32 nullable: true type: integer nodeAffinityPolicy: - nullable: false type: string nodeTaintsPolicy: - nullable: false type: string topologyKey: - nullable: false type: string whenUnsatisfiable: - nullable: false type: string type: object nullable: true @@ -932,7 +734,6 @@ spec: items: properties: name: - nullable: false type: string type: object nullable: true @@ -941,69 +742,42 @@ spec: items: properties: name: - nullable: false type: string value: - nullable: false type: string valueFrom: - nullable: false properties: configMapKeyRef: - nullable: false properties: key: - nullable: false type: string name: - nullable: false type: string optional: nullable: true type: boolean type: object fieldRef: - nullable: false properties: apiVersion: - nullable: false type: string fieldPath: - nullable: false type: string type: object resourceFieldRef: - nullable: false properties: containerName: - nullable: false type: string divisor: - nullable: false - properties: - format: - enum: - - DecimalExponent - - BinarySI - - DecimalSI - nullable: false - type: string - value: - nullable: false - type: string - type: object + type: string resource: - nullable: false type: string type: object secretKeyRef: - nullable: false properties: key: - nullable: false type: string name: - nullable: false type: string optional: nullable: true @@ -1017,23 +791,18 @@ spec: items: properties: configMapRef: - nullable: false properties: name: - nullable: false type: string optional: nullable: true type: boolean type: object prefix: - nullable: false type: string secretRef: - nullable: false properties: name: - nullable: false type: string optional: nullable: true @@ -1048,6 +817,216 @@ spec: imagePullPolicy: nullable: true type: string + livenessProbe: + nullable: true + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + nullable: true + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + path: + type: string + port: + x-kubernetes-int-or-string: true + scheme: + type: string + type: object + initialDelaySeconds: + format: int32 + nullable: true + type: integer + periodSeconds: + format: int32 + nullable: true + type: integer + successThreshold: + format: int32 + nullable: true + type: integer + tcpSocket: + properties: + host: + type: string + port: + x-kubernetes-int-or-string: true + type: object + terminationGracePeriodSeconds: + format: int64 + nullable: true + type: integer + timeoutSeconds: + format: int32 + nullable: true + type: integer + type: object + readinessProbe: + nullable: true + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + nullable: true + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + path: + type: string + port: + x-kubernetes-int-or-string: true + scheme: + type: string + type: object + initialDelaySeconds: + format: int32 + nullable: true + type: integer + periodSeconds: + format: int32 + nullable: true + type: integer + successThreshold: + format: int32 + nullable: true + type: integer + tcpSocket: + properties: + host: + type: string + port: + x-kubernetes-int-or-string: true + type: object + terminationGracePeriodSeconds: + format: int64 + nullable: true + type: integer + timeoutSeconds: + format: int32 + nullable: true + type: integer + type: object + startupProbe: + nullable: true + properties: + exec: + properties: + command: + items: + type: string + type: array + type: object + failureThreshold: + format: int32 + nullable: true + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + type: string + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + path: + type: string + port: + x-kubernetes-int-or-string: true + scheme: + type: string + type: object + initialDelaySeconds: + format: int32 + nullable: true + type: integer + periodSeconds: + format: int32 + nullable: true + type: integer + successThreshold: + format: int32 + nullable: true + type: integer + tcpSocket: + properties: + host: + type: string + port: + x-kubernetes-int-or-string: true + type: object + terminationGracePeriodSeconds: + format: int64 + nullable: true + type: integer + timeoutSeconds: + format: int32 + nullable: true + type: integer + type: object service: nullable: true properties: @@ -1056,13 +1035,11 @@ spec: type: string annotations: additionalProperties: - nullable: false type: string nullable: true type: object labels: additionalProperties: - nullable: false type: string nullable: true type: object @@ -1074,13 +1051,11 @@ spec: type: string clusterIPs: items: - nullable: false type: string nullable: true type: array externalIPs: items: - nullable: false type: string nullable: true type: array @@ -1095,7 +1070,6 @@ spec: type: string ipFamilies: items: - nullable: false type: string nullable: true type: array @@ -1110,7 +1084,6 @@ spec: type: string loadBalancerSourceRanges: items: - nullable: false type: string nullable: true type: array @@ -1124,7 +1097,6 @@ spec: nullable: true properties: clientIP: - nullable: false properties: timeoutSeconds: format: int32 @@ -1176,25 +1148,18 @@ spec: items: properties: key: - nullable: false type: string operator: - nullable: false type: string values: items: - nullable: false type: string - nullable: false type: array type: object - nullable: false type: array matchLabels: additionalProperties: - nullable: false type: string - nullable: false type: object type: object type: object @@ -1312,7 +1277,6 @@ spec: type: string scopes: items: - nullable: false type: string nullable: true type: array @@ -1376,10 +1340,8 @@ spec: nullable: true properties: key: - nullable: false type: string name: - nullable: false type: string optional: nullable: true diff --git a/src/Alethic.Seq.Operator/config/kustomization.yaml b/src/Alethic.Seq.Operator/config/kustomization.yaml index b02fe05..5b963dd 100644 --- a/src/Alethic.Seq.Operator/config/kustomization.yaml +++ b/src/Alethic.Seq.Operator/config/kustomization.yaml @@ -1,7 +1,9 @@ namespace: alethic.seq.operator-system namePrefix: alethic.seq.operator- -commonLabels: - operator: alethic.seq.operator +labels: +- includeSelectors: true + pairs: + operator: alethic.seq.operator resources: - operator-role.yaml - operator-role-binding.yaml diff --git a/src/Alethic.Seq.Operator/config/operator-role.yaml b/src/Alethic.Seq.Operator/config/operator-role.yaml index b801d76..c165c9e 100644 --- a/src/Alethic.Seq.Operator/config/operator-role.yaml +++ b/src/Alethic.Seq.Operator/config/operator-role.yaml @@ -32,6 +32,14 @@ rules: - events verbs: - '*' +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get + - list + - watch - apiGroups: - apps resources: @@ -52,7 +60,13 @@ rules: resources: - leases verbs: - - '*' + - get + - list + - watch + - create + - update + - patch + - delete - apiGroups: - seq.k8s.datalust.co resources: @@ -77,6 +91,14 @@ rules: - get - update - patch +- apiGroups: + - "" + resources: + - namespaces/status + verbs: + - get + - update + - patch - apiGroups: - "" resources: diff --git a/src/Alethic.Seq.Operator/config/retentionpolicys_seq_k8s_datalust_co.yaml b/src/Alethic.Seq.Operator/config/retentionpolicys_seq_k8s_datalust_co.yaml index 9a376e1..05ac733 100644 --- a/src/Alethic.Seq.Operator/config/retentionpolicys_seq_k8s_datalust_co.yaml +++ b/src/Alethic.Seq.Operator/config/retentionpolicys_seq_k8s_datalust_co.yaml @@ -18,7 +18,6 @@ spec: openAPIV3Schema: properties: status: - nullable: false properties: id: nullable: true @@ -46,11 +45,9 @@ spec: nullable: true type: string type: object - nullable: false type: array type: object spec: - nullable: false properties: instanceRef: nullable: true diff --git a/src/Alethic.Seq.Operator/config/signals_seq_k8s_datalust_co.yaml b/src/Alethic.Seq.Operator/config/signals_seq_k8s_datalust_co.yaml index 2ee09f0..78504b9 100644 --- a/src/Alethic.Seq.Operator/config/signals_seq_k8s_datalust_co.yaml +++ b/src/Alethic.Seq.Operator/config/signals_seq_k8s_datalust_co.yaml @@ -18,7 +18,6 @@ spec: openAPIV3Schema: properties: status: - nullable: false properties: id: nullable: true @@ -92,11 +91,9 @@ spec: nullable: true type: string type: object - nullable: false type: array type: object spec: - nullable: false properties: instanceRef: nullable: true