Skip to content

Commit dc735b0

Browse files
committed
Onboard etcd-shield to standard component structure
KFLUXINFRA-4238
1 parent 3041455 commit dc735b0

30 files changed

Lines changed: 489 additions & 3 deletions

argo-cd-apps/base/member/infra-deployments/etcd-shield/etcd-shield.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ spec:
4949
namespace: etcd-shield
5050
server: '{{server}}'
5151
syncPolicy:
52-
automated:
53-
prune: true
54-
selfHeal: true
5552
syncOptions:
5653
- CreateNamespace=true
5754
retry:
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
apiVersion: argoproj.io/v1alpha1
2+
kind: ApplicationSet
3+
metadata:
4+
name: etcd-shield
5+
labels:
6+
appstudio.redhat.com/environment: member # Helps cluster patches detect this appset
7+
spec:
8+
generators:
9+
- merge:
10+
mergeKeys:
11+
- nameNormalized
12+
generators:
13+
- clusters:
14+
selector:
15+
matchLabels:
16+
appstudio.redhat.com/is-tenant-cluster: "true"
17+
values:
18+
sourceRoot: components/etcd-shield-rd
19+
ring: "empty-base"
20+
clusterDir: "empty-base"
21+
- list:
22+
elements: [] # Populated via a patch(or manually if the cluster list is unusual)
23+
24+
template:
25+
metadata:
26+
name: etcd-shield-{{nameNormalized}}
27+
spec:
28+
project: default
29+
source:
30+
path: '{{values.sourceRoot}}/rings/{{values.ring}}/{{values.clusterDir}}'
31+
repoURL: https://github.com/redhat-appstudio/infra-deployments.git
32+
targetRevision: main
33+
destination:
34+
namespace: etcd-shield
35+
server: '{{server}}'
36+
syncPolicy:
37+
automated:
38+
prune: true
39+
selfHeal: true
40+
syncOptions:
41+
- CreateNamespace=true
42+
retry:
43+
limit: 50
44+
backoff:
45+
duration: 15s
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
4+
resources:
5+
- etcd-shield-appset.yaml

argo-cd-apps/overlays/rd-staging/kustomization.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace: argocd-infra-deployments
44

55
resources:
66
- authentication
7+
- etcd-shield
78

89
patches:
910
- path: patches/all-clusters-patch.yaml
@@ -21,3 +22,8 @@ patches:
2122
kind: ApplicationSet
2223
version: v1alpha1
2324
labelSelector: appstudio.redhat.com/environment=internal
25+
- path: patches/member-clusters-patch.yaml
26+
target:
27+
kind: ApplicationSet
28+
version: v1alpha1
29+
labelSelector: appstudio.redhat.com/environment=member
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
- op: add
2+
path: /spec/generators/0/merge/generators/1/list/elements
3+
value:
4+
- values.ring: ring-1
5+
nameNormalized: stone-stage-p01
6+
values.clusterDir: stone-stage-p01
7+
- values.ring: ring-1
8+
nameNormalized: stone-stg-rh01
9+
values.clusterDir: stone-stg-rh01

components/etcd-shield-rd/OWNERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# See the OWNERS docs: https://go.k8s.io/owners
2+
3+
approvers:
4+
- konflux-infra-team
5+
6+
reviewers:
7+
- konflux-infra-team
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
destName: etcd-shield-state
2+
destNamespace: etcd-shield
3+
prometheus:
4+
address: https://prometheus-k8s.openshift-monitoring.svc:9091
5+
alertName: EtcdShieldDenyAdmission
6+
config:
7+
authorization:
8+
type: Bearer
9+
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
10+
tls_config:
11+
ca_file: /var/tls/tls.crt
12+
waitTime: 15s
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: etcd-shield
5+
labels:
6+
app: etcd-shield
7+
annotations:
8+
ignore-check.kube-linter.io/no-anti-affinity: "using topologySpreadConstraints"
9+
spec:
10+
selector:
11+
matchLabels:
12+
app: etcd-shield
13+
replicas: 3
14+
template:
15+
metadata:
16+
labels:
17+
app: etcd-shield
18+
spec:
19+
serviceAccountName: etcd-shield
20+
topologySpreadConstraints:
21+
- maxSkew: 1
22+
topologyKey: topology.kubernetes.io/zone
23+
whenUnsatisfiable: ScheduleAnyway
24+
labelSelector:
25+
matchLabels:
26+
app: etcd-shield
27+
containers:
28+
- args:
29+
- -leader-elect=false
30+
- -health-probe-bind-address=:8081
31+
- -config=/etc/etcd-shield/config.yaml
32+
- -port=8443
33+
- -metrics-addr=:9100
34+
env:
35+
- name: "NAMESPACE"
36+
valueFrom:
37+
fieldRef:
38+
fieldPath: metadata.namespace
39+
- name: "STATE_MANAGER"
40+
value: "in-memory"
41+
image: etcd-shield:latest
42+
name: etcd-shield
43+
imagePullPolicy: IfNotPresent
44+
livenessProbe:
45+
initialDelaySeconds: 1
46+
httpGet:
47+
path: /healthz
48+
port: 8081
49+
scheme: HTTP
50+
readinessProbe:
51+
initialDelaySeconds: 1
52+
httpGet:
53+
path: /readyz
54+
port: 8081
55+
scheme: HTTP
56+
resources:
57+
limits:
58+
memory: 128Mi
59+
requests:
60+
cpu: 500m
61+
memory: 128Mi
62+
ports:
63+
- containerPort: 8443
64+
name: http
65+
- containerPort: 8081
66+
name: healthz
67+
- containerPort: 9100
68+
name: metrics
69+
securityContext:
70+
allowPrivilegeEscalation: false
71+
readOnlyRootFilesystem: true
72+
runAsNonRoot: true
73+
capabilities:
74+
drop:
75+
- "ALL"
76+
volumeMounts:
77+
- name: tls
78+
mountPath: /var/tls
79+
readOnly: true
80+
- name: config
81+
mountPath: /etc/etcd-shield/
82+
readOnly: true
83+
terminationGracePeriodSeconds: 60
84+
volumes:
85+
- name: tls
86+
secret:
87+
secretName: etcd-shield-tls
88+
- name: config
89+
configMap:
90+
name: etcd-shield-config
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apiVersion: monitoring.coreos.com/v1
2+
kind: PrometheusRule
3+
metadata:
4+
name: etcd-shield-triggers
5+
spec:
6+
groups:
7+
- name: etcd_shield_triggers
8+
interval: 1m
9+
rules:
10+
- alert: EtcdShieldDenyAdmission
11+
expr: etcd_shield_trigger != bool 0
12+
for: 2m
13+
keep_firing_for: 5m
14+
labels:
15+
severity: critical
16+
annotations:
17+
summary: etcd-shield is denying admission
18+
description: Etcd is nearing capacity limits, so etcd-shield is denying admission
19+
- record: etcd_shield_trigger
20+
expr: |
21+
(((etcd_mvcc_db_total_size_in_use_in_bytes >= bool (etcd_server_quota_backend_bytes * 0.80)) == 1) or
22+
((((etcd_mvcc_db_total_size_in_use_in_bytes) >= bool (etcd_server_quota_backend_bytes * 0.70)) == 1) and
23+
(count without (alertname, alertstate, severity)
24+
(ALERTS{
25+
alertname="EtcdShieldDenyAdmission",
26+
alertstate="firing",
27+
severity="critical"
28+
}) == bool 1)))
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
apiVersion: kustomize.config.k8s.io/v1beta1
3+
kind: Kustomization
4+
configMapGenerator:
5+
- files:
6+
- ./config.yaml
7+
name: etcd-shield-config
8+
# generatorOptions:
9+
# # until https://github.com/kubernetes-sigs/kustomize/issues/4475 is fixed
10+
# disableNameSuffixHash: true
11+
images:
12+
- name: etcd-shield
13+
newName: quay.io/konflux-ci/etcd-shield
14+
newTag: 94885d051db284f214f43d76df2f9bd4c9fe993f
15+
namespace: etcd-shield
16+
resources:
17+
- deployment.yaml
18+
- ns.yaml
19+
- service.yaml
20+
- webhook.yaml
21+
- etcd_shield_alerts.yaml
22+
- metrics
23+
- rbac

0 commit comments

Comments
 (0)