From 1cd87824f85c769e29167399e89238b2f8062e0d Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Fri, 11 Oct 2024 18:45:01 -0500 Subject: [PATCH 01/11] Experiment with k8 structure pattern Signed-off-by: Tanner Lewis --- deployment/k8/elasticsearch-helm/Chart.lock | 6 ++ deployment/k8/elasticsearch-helm/Chart.yaml | 8 +++ .../charts/elasticsearch-8.5.1.tgz | Bin 0 -> 28898 bytes deployment/k8/elasticsearch-helm/values.yaml | 38 ++++++++++++ deployment/k8/elasticsearch/Chart.yaml | 6 ++ .../k8/elasticsearch/templates/deployment.yml | 22 +++++++ .../k8/elasticsearch/templates/service.yml | 14 +++++ deployment/k8/elasticsearch/values.yaml | 23 +++++++ .../environments/full-environment/Chart.lock | 6 ++ .../environments/full-environment/Chart.yaml | 12 ++++ .../charts/elasticsearch-8.5.1.tgz | Bin 0 -> 28898 bytes .../environments/full-environment/values.yaml | 43 +++++++++++++ deployment/k8/kafka/.helmignore | 23 +++++++ deployment/k8/kafka/Chart.yaml | 6 ++ deployment/k8/kafka/templates/deployment.yml | 28 +++++++++ deployment/k8/kafka/templates/service.yml | 13 ++++ deployment/k8/kafka/values.yaml | 58 ++++++++++++++++++ deployment/k8/migration-console/.helmignore | 23 +++++++ deployment/k8/migration-console/Chart.yaml | 6 ++ .../templates/deployment.yml | 36 +++++++++++ .../migration-console/templates/service.yml | 13 ++++ deployment/k8/migration-console/values.yaml | 50 +++++++++++++++ deployment/k8/opensearch-helm/Chart.lock | 6 ++ deployment/k8/opensearch-helm/Chart.yaml | 8 +++ .../charts/opensearch-2.23.1.tgz | Bin 0 -> 24952 bytes deployment/k8/opensearch-helm/values.yaml | 21 +++++++ deployment/k8/replayer/.helmignore | 23 +++++++ deployment/k8/replayer/Chart.yaml | 6 ++ .../k8/replayer/templates/deployment.yml | 32 ++++++++++ deployment/k8/replayer/templates/service.yml | 13 ++++ deployment/k8/replayer/values.yaml | 48 +++++++++++++++ 31 files changed, 591 insertions(+) create mode 100644 deployment/k8/elasticsearch-helm/Chart.lock create mode 100644 deployment/k8/elasticsearch-helm/Chart.yaml create mode 100644 deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz create mode 100644 deployment/k8/elasticsearch-helm/values.yaml create mode 100644 deployment/k8/elasticsearch/Chart.yaml create mode 100644 deployment/k8/elasticsearch/templates/deployment.yml create mode 100644 deployment/k8/elasticsearch/templates/service.yml create mode 100644 deployment/k8/elasticsearch/values.yaml create mode 100644 deployment/k8/environments/full-environment/Chart.lock create mode 100644 deployment/k8/environments/full-environment/Chart.yaml create mode 100644 deployment/k8/environments/full-environment/charts/elasticsearch-8.5.1.tgz create mode 100644 deployment/k8/environments/full-environment/values.yaml create mode 100644 deployment/k8/kafka/.helmignore create mode 100644 deployment/k8/kafka/Chart.yaml create mode 100644 deployment/k8/kafka/templates/deployment.yml create mode 100644 deployment/k8/kafka/templates/service.yml create mode 100644 deployment/k8/kafka/values.yaml create mode 100644 deployment/k8/migration-console/.helmignore create mode 100644 deployment/k8/migration-console/Chart.yaml create mode 100644 deployment/k8/migration-console/templates/deployment.yml create mode 100644 deployment/k8/migration-console/templates/service.yml create mode 100644 deployment/k8/migration-console/values.yaml create mode 100644 deployment/k8/opensearch-helm/Chart.lock create mode 100644 deployment/k8/opensearch-helm/Chart.yaml create mode 100644 deployment/k8/opensearch-helm/charts/opensearch-2.23.1.tgz create mode 100644 deployment/k8/opensearch-helm/values.yaml create mode 100644 deployment/k8/replayer/.helmignore create mode 100644 deployment/k8/replayer/Chart.yaml create mode 100644 deployment/k8/replayer/templates/deployment.yml create mode 100644 deployment/k8/replayer/templates/service.yml create mode 100644 deployment/k8/replayer/values.yaml diff --git a/deployment/k8/elasticsearch-helm/Chart.lock b/deployment/k8/elasticsearch-helm/Chart.lock new file mode 100644 index 000000000..37b48254f --- /dev/null +++ b/deployment/k8/elasticsearch-helm/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: elasticsearch + repository: https://helm.elastic.co + version: 8.5.1 +digest: sha256:bcbc86197a071d486789f6ef578f12539354b1cd79d3d87c41e6e9faac0d9de8 +generated: "2024-10-11T18:10:17.461227-05:00" diff --git a/deployment/k8/elasticsearch-helm/Chart.yaml b/deployment/k8/elasticsearch-helm/Chart.yaml new file mode 100644 index 000000000..c9a550895 --- /dev/null +++ b/deployment/k8/elasticsearch-helm/Chart.yaml @@ -0,0 +1,8 @@ +apiVersion: v2 +name: elasticsearch-helm +version: 0.1.0 +dependencies: + - name: elasticsearch + version: "8.5.1" + repository: https://helm.elastic.co + alias: elasticsearch-local diff --git a/deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz b/deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1a88b2269f497501cc537cf7c41fdc644c54cf13 GIT binary patch literal 28898 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

lN{E1*E=~3!yWGC5l|KH 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 HV4(gN`AjP8 literal 0 HcmV?d00001 diff --git a/deployment/k8/opensearch-helm/values.yaml b/deployment/k8/opensearch-helm/values.yaml new file mode 100644 index 000000000..ce5d7d384 --- /dev/null +++ b/deployment/k8/opensearch-helm/values.yaml @@ -0,0 +1,21 @@ +opensearch-local: + fullnameOverride: "target-cluster" + image: + tag: "2.17.0" + replicas: 1 + singleNode: true + config: + discovery.type: single-node +# httpPort: 29200 + extraEnvs: + - name: OPENSEARCH_INITIAL_ADMIN_PASSWORD + value: myStrongPassword123! +# - name: http.port +# value: "29200" + service: + type: LoadBalancer + ports: + - name: http + port: 9200 + protocol: TCP + targetPort: 9200 diff --git a/deployment/k8/replayer/.helmignore b/deployment/k8/replayer/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/replayer/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/replayer/Chart.yaml b/deployment/k8/replayer/Chart.yaml new file mode 100644 index 000000000..4bd8707e5 --- /dev/null +++ b/deployment/k8/replayer/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: replayer +description: A Helm chart to install the Traffic Replayer +type: application +version: 0.1.0 +appVersion: "1.16.0" diff --git a/deployment/k8/replayer/templates/deployment.yml b/deployment/k8/replayer/templates/deployment.yml new file mode 100644 index 000000000..239af5d70 --- /dev/null +++ b/deployment/k8/replayer/templates/deployment.yml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: {{ .Values.service.port }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.container.command }}" + # Load all env variables + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key }} + value: {{ $value | quote }} + {{- end }} diff --git a/deployment/k8/replayer/templates/service.yml b/deployment/k8/replayer/templates/service.yml new file mode 100644 index 000000000..fe7bb8c7b --- /dev/null +++ b/deployment/k8/replayer/templates/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.service.port }} + selector: + app: {{ .Chart.Name }} diff --git a/deployment/k8/replayer/values.yaml b/deployment/k8/replayer/values.yaml new file mode 100644 index 000000000..e362692e6 --- /dev/null +++ b/deployment/k8/replayer/values.yaml @@ -0,0 +1,48 @@ +# Default values for traffic replayer. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: migrations/traffic_replayer + pullPolicy: IfNotPresent + tag: "latest" + +service: + # This makes the service available only within the cluster + type: ClusterIP + port: 80 + +container: + command: "/runJavaWithClasspath.sh org.opensearch.migrations.replay.TrafficReplayer --speedup-factor 2 https://opensearchtarget:9200 --auth-header-value Basic\\\\ YWRtaW46bXlTdHJvbmdQYXNzd29yZDEyMyE= --insecure --kafka-traffic-brokers kafka:9092 --kafka-traffic-topic logging-traffic-topic --kafka-traffic-group-id logging-group-default --otelCollectorEndpoint http://otel-collector:4317" + +resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + +env: + SHARED_LOGS_DIR_PATH: /shared-logs-output/traffic-replayer-default + +# Additional volumes on the output Deployment definition. +volumes: [] +# - name: foo +# secret: +# secretName: mysecret +# optional: false + +# Additional volumeMounts on the output Deployment definition. +volumeMounts: [] +# - name: foo +# mountPath: "/etc/foo" +# readOnly: true + +nodeSelector: {} + +tolerations: [] + +affinity: {} From 4abd50ea7a1dab19efa178ea296a12569c6c5cf7 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Fri, 11 Oct 2024 21:58:27 -0500 Subject: [PATCH 02/11] Partial working state for test environment Signed-off-by: Tanner Lewis --- .../lib/console_link/services.yaml | 4 +- deployment/k8/.gitignore | 1 + deployment/k8/elasticsearch-helm/Chart.lock | 2 +- deployment/k8/elasticsearch-helm/values.yaml | 52 +++++++++--------- .../environments/full-environment/Chart.lock | 20 +++++-- .../environments/full-environment/Chart.yaml | 21 ++++--- .../charts/elasticsearch-8.5.1.tgz | Bin 28898 -> 0 bytes .../environments/full-environment/values.yaml | 43 --------------- deployment/k8/kafka-helm/Chart.lock | 6 ++ deployment/k8/kafka-helm/Chart.yaml | 8 +++ deployment/k8/kafka-helm/values.yaml | 5 ++ deployment/k8/replayer/values.yaml | 2 +- 12 files changed, 81 insertions(+), 83 deletions(-) create mode 100644 deployment/k8/.gitignore delete mode 100644 deployment/k8/environments/full-environment/charts/elasticsearch-8.5.1.tgz create mode 100644 deployment/k8/kafka-helm/Chart.lock create mode 100644 deployment/k8/kafka-helm/Chart.yaml create mode 100644 deployment/k8/kafka-helm/values.yaml diff --git a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml index fbe53cc98..4e062e317 100644 --- a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml +++ b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml @@ -1,11 +1,11 @@ source_cluster: - endpoint: "https://capture-proxy:9200" + endpoint: "https://elasticsearch:19200" allow_insecure: true basic_auth: username: "admin" password: "admin" target_cluster: - endpoint: "https://opensearchtarget:9200" + endpoint: "https://opensearch-cluster-master:9200" allow_insecure: true basic_auth: username: "admin" diff --git a/deployment/k8/.gitignore b/deployment/k8/.gitignore new file mode 100644 index 000000000..aa1ec1ea0 --- /dev/null +++ b/deployment/k8/.gitignore @@ -0,0 +1 @@ +*.tgz diff --git a/deployment/k8/elasticsearch-helm/Chart.lock b/deployment/k8/elasticsearch-helm/Chart.lock index 37b48254f..b774b28e1 100644 --- a/deployment/k8/elasticsearch-helm/Chart.lock +++ b/deployment/k8/elasticsearch-helm/Chart.lock @@ -3,4 +3,4 @@ dependencies: repository: https://helm.elastic.co version: 8.5.1 digest: sha256:bcbc86197a071d486789f6ef578f12539354b1cd79d3d87c41e6e9faac0d9de8 -generated: "2024-10-11T18:10:17.461227-05:00" +generated: "2024-10-11T21:04:55.725841-05:00" diff --git a/deployment/k8/elasticsearch-helm/values.yaml b/deployment/k8/elasticsearch-helm/values.yaml index 54f8f68a1..71b3d4f24 100644 --- a/deployment/k8/elasticsearch-helm/values.yaml +++ b/deployment/k8/elasticsearch-helm/values.yaml @@ -1,7 +1,18 @@ elasticsearch-local: fullnameOverride: "source-cluster" + image: docker.elastic.co/elasticsearch/elasticsearch-oss imageTag: "7.10.2" + replicas: 1 + + resources: + requests: + cpu: "1" + memory: "2Gi" + limits: + cpu: "2" + memory: "4Gi" + service: type: LoadBalancer ports: @@ -9,30 +20,21 @@ elasticsearch-local: port: 9200 protocol: TCP targetPort: 9200 -# esConfig: -# elasticsearch.yml: | -# xpack.security.enabled: false - -# secret: -# password: admin123! - # Permit co-located instances for solitary minikube virtual machines. - antiAffinity: "soft" - # Shrink default JVM heap. - esJavaOpts: "-Xmx128m -Xms128m" - # Allocate smaller chunks of memory per pod. - resources: - requests: - cpu: "100m" - memory: "512M" - limits: - cpu: "1000m" - memory: "512M" + esConfig: + elasticsearch.yml: | + xpack: + security: + enabled: false + transport: + ssl: + key: "" + cluster.name: "docker-cluster" + network.host: "0.0.0.0" + discovery.type: "single-node" - # Request smaller persistent volumes. - volumeClaimTemplate: - accessModes: [ "ReadWriteOnce" ] - storageClassName: "standard" - resources: - requests: - storage: 100M + roles: + - master + - data + - ingest + - remote_cluster_client diff --git a/deployment/k8/environments/full-environment/Chart.lock b/deployment/k8/environments/full-environment/Chart.lock index 1519dbdc8..f0c8c7c77 100644 --- a/deployment/k8/environments/full-environment/Chart.lock +++ b/deployment/k8/environments/full-environment/Chart.lock @@ -1,6 +1,18 @@ dependencies: - name: elasticsearch - repository: https://helm.elastic.co - version: 8.5.1 -digest: sha256:f7a682bf9bfda4c29805019d307797674832e5fcbabd07d98df47497dbc9bdff -generated: "2024-10-10T23:53:32.505149-05:00" + repository: file://../../elasticsearch + version: 0.1.0 +- name: opensearch-helm + repository: file://../../opensearch-helm + version: 0.1.0 +- name: kafka-helm + repository: file://../../kafka-helm + version: 0.1.0 +- name: migration-console + repository: file://../../migration-console + version: 0.1.0 +- name: replayer + repository: file://../../replayer + version: 0.1.0 +digest: sha256:43ce1396b019dcf63e55b87d0d0580fc4483a56d6a2eece10f356456c2d7a635 +generated: "2024-10-11T21:40:26.248116-05:00" diff --git a/deployment/k8/environments/full-environment/Chart.yaml b/deployment/k8/environments/full-environment/Chart.yaml index 08558e9d1..b5fa2923c 100644 --- a/deployment/k8/environments/full-environment/Chart.yaml +++ b/deployment/k8/environments/full-environment/Chart.yaml @@ -3,10 +3,17 @@ name: full-environment version: 0.1.0 dependencies: - name: elasticsearch - version: "8.5.1" - repository: https://helm.elastic.co - alias: source -# - name: opensearch -# version: "2.23.1" -# repository: "https://opensearch-project.github.io/helm-charts/" -# alias: target + version: "0.1.0" + repository: "file://../../elasticsearch" + - name: opensearch-helm + version: "0.1.0" + repository: "file://../../opensearch-helm" + - name: kafka-helm + version: "0.1.0" + repository: "file://../../kafka-helm" + - name: migration-console + version: "0.1.0" + repository: "file://../../migration-console" + - name: replayer + version: "0.1.0" + repository: "file://../../replayer" diff --git a/deployment/k8/environments/full-environment/charts/elasticsearch-8.5.1.tgz b/deployment/k8/environments/full-environment/charts/elasticsearch-8.5.1.tgz deleted file mode 100644 index 1a88b2269f497501cc537cf7c41fdc644c54cf13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28898 zcmV*3Kz6?$iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMZ{SKG$6IDUTp>aW-}IS1&CYy)}p`d->g32it{2p=GA&*Eg^ zu{5@)NE%f$0(=7h`*+Qr8EGWT#ymor7Ok!ZOEY`k`!)MPBO)XV1SMH8?re`qCfgGd zM}ND=r`zpzUp#w;|8~3G`oG=h>l=Std$zIheC_4SwHMvLb=RJC*Vg|A-TUmstS1+e zWPj`4xvl!(zL1Bc>}Q$@#*-eLt$8F(i=W@LpSRb%kcuE!G62Xq%HZZ19 z41wA;Fyxtit#^|*<}vNTSjtrNI-L=d<9yH#c-%3YuA^%ESX+23Pz~6^>Py=cYX`ie zzKTv|v$oS@|n(g6nXjOJZ z%S(7jf6REE_MjCLRj%cEOK>!%AZT{R0t#|WBqTfm{T)WCxPWsOMIf^YNDcu{5*kSL z=lPf>@Ed0dOGY5a6io97lnD@Ho<|`J6nw1UbPxUuT7C=u3yNML+L`b?t2FNEABVbw zJ!oN{E7%D#9#NtDjy)YvAZZ#g8mdO6>Ppdy9myfM@`2U^<;G4O?KSLr(@yAKP6G;&RFP4m`(8b~i|H){~ zB|R}Ka}q?%0+ks_#E@sP=VdgFSU^M%HoTZ6EY9P%*snbvQqhBT&!gfk`Hg1<$d3!5EjRLN_LH1SAO| z;-hE3t+&&Rr!OueDvpJ(wqB)7tLBh7d~h2WWJbNj_W^MC!dw-rcsM)z%@ZJsA` za|1X0h0I9vCdHXeQ<}`$?M%4Gf+nFo7Zl8Hgk_qX^_JC$+VC%)LqHP91;y3kLo9ll z4``N9N%5?xC7C3WT)>!S)T63+v4 zoFII+sJDb5fA#lCa0(F%XdX`~59g;kf zZ+S?2(0%#*x#x|!kXsQWf|~C6z!Y^{TYuT^w!7`Mma3{ssXmLI?tg2@c{}0(iCX5x zfMoWC$6_*4bSmV*Da~BkQ0-uiIAgUVGU`DKc~A3ZKaZk)9Z`s>eQToYI->#wbU^OmW%W$zj))QfuwmFGM= zea(gJL92`Vq1*DjGaltJ-Hr&0k7%4mL{c>Z5-6PgR@1}d)&V8qFBy~cT@ujN2b>#c zqUuuxASBOl<7{+)WS*A|NT5DxveJVgiG;!qhEdxJ0(GeB%U}O)_&_zGB$pfy>k&Vt ziKS5~4-d_eHoL5$&7_1PQX1$Urx`nA5gj?03t%WTe`&^)P>c@LQ zvpHo1eZ!LcVqS?nO(Uvk0g13hF{iLzu%d*;|HaP&(HC!0#l#53UHx1xcJYK;lW6<$6x9WL6ii$iK#K$GI1&6q98 zGbmSm(%8@rVyaFBSvOR~J+wcCd&>eDCE>dyniOo1`n1gp*}e)n$E1AjMR@)NdEQc1NY`x)cv#B4`ID3(Ji0w@%B zYDhA$#E}q6_N2{tC**-p#3`Vu6oyLW87^Qa<)NP%;C`A>wMgpyl6@Jd7QNJMzc}LF z5_~@?c9<-1%y0VmY^8MJO!TMpoEgi6yNAA!S7f%1 zDWPXHn>810IMl0K%!J@WBV>k#*KQ4{kU)n+p2=2a$USI{Nfx&1`$s_rVhY{o{vkrJ zQR1s@q}u3ckv#ngBc3dblA?BR)|Jt|wp6jFBjswAEe{ zwYf=2MxuyDWpT9@LXu3euS6Oi5ocGjm}>pOfO9EiM$)vdMM!!0mLz0^h`wNg_Dw5= z?xI;TV99SZQ0)#Tg?1xi$*Jy?;-7Ot!>2IFB}zMy+Qe#s)z+@67gP_i!vcG(hhcVF ztRy4@A7xorszRnQB>`=FORzh{6GJajnlVK(bWzz&S}!q(I$? znc_a8{eIiibiimu-l%aEBt7Gj2Rt$wSWo?bpDVHSzt_8652gB)XVSde=ypBN3}6ls z)7*vr@tTq_qQbtEla%&gTQAz~zNd)YHb*fd)2B`C2bzQ_XNlDFADHhngqA`dlNQi3 znwV1z`)c#3Gb?CxMvEmw&~uJOsbwiY`Xpr?Gd{oI!HPF$Yn>%Ci-#!C(sA|}Rr zTq+)JvK59I6(}GS{16YRo;}T3O)+71$~A6Qztl9j6R*D%uhi6X5`Ir2k_2iJ4QTh} zA@=-$BqKxDL6K#eB_uk^)EN(oBhvD`JPnDYhf;}-qe%}AcoeZ@^d4W=5mHPpAWz5{ zVG)Y5_F!B7MD5X#i7ZEQ1cN*rp^)t23zXs&*RnQ6cGMPdWb|{SKAMKaTo*`S&0A8n zQFcb$A-O{EZnwfbQ@z5A0-C5v@nUlEzAVv$wF*nCI0AZsQnuwxK}i^%%ZKVWo|vu^ zkdzEq#8Byj+*g?KwB#eV-n_vbX*r$)&gBm*qGBQ>jf)e6P3`eSeXhQA+h2m${2U^# za3F_s!t^yvMM^|$AbAR-j0B1+j3%C>S_MwmbaRwZn*76bd~;1Gdb0%YQ7Hx_!jmUU4kT-<&lw%|=3yvF z#Hr|zFlGtEzMBpegq-?u9!Zu))Gr{5j<>Yr6+cUkuh0-^t&&Cy3OgOrhz62t?q2eU zW)?pkBR9LFkbFV9@w_713!;f4P~0l9s&tSgLaI}zsF~XDhE`}GOp~`UIisbP$Pg37 zS0Ox0*;z7DNVP(5W(hRvgjHwK)NUg;+ylj`UNjVwk?=`?bEOWQ!l!}5F=Mrsrxi(> zhV8~ys#MJ@dccNE(FDby8WiB;kDk6M^^IOcD}M}PK!uyd5-3h;X-OS}$fEA0QV`Ys zslfAPBy=IC?WICsZD<;AK;NCwEMuYG9SS{6z0^l#um0ML*pLR3K%r37tfUz|lnU3O ztazb>e%*X2C$%~QmUP6p^%Poup#D#TF^AVQin!LxYSJO(p<-`fOp-978GP%?jWHF1 zjA%=VYemu7ty(=j_%I-1?ELft=f`F7H^9=*thM`q9qY{Wn`jJ12WvZ+AB1$%%#Il-b>Twe#!A{?^ga&cWVhE8-&|i5UA| zx12(UueT0foov5*zjw6xjr0CsXaCLa_Lljw=6u;XJb8ccW>evqUZ;bLj~f!1yRz8% zm_-zhkD>KsCCIY~d;va(PDsx>NghSupTqLsKPoUM0T1cbzmsKnqJgir;Hyn&t#`XE z`0(L>l%yjfN>f-6$Tlq(L;_#X-(9+9q zf+x%1hsz&ZED7nwNlK)`vZB>HUjBEh^`tVRt$(+cKRj(&>8aKG*wQO^!iOh%8D zSg93kYm~aHahqZd6-%c$v>{W(hH8C#!q3|p^lkz?Q!KW6O%%(Fn;5BY6>&cWCLy6z zGgXM8)zKVs#eyj+fNZ_#@yCzlp=jkOl|vh@u6%tn=pa)yJdJ~}3ziYAh@?)JULPIp zgJO0~Llx@o>uXM5?Z-Q}RIt_8HdmCaw`rL8UbD^(0kWYYl@SXVVsMo6geAOymv9ng zH@r4MN$%s-Q?0qst!Xi5K-Cf$$+5DBmPIK++Ez&tLQG^ZR+W@o6=X~*p&W(Sj1t8q zjw!tQzHO^~pG!b(mXctf!Z|gPWg%xFqpjzTAwB1&gXVsXD{;5%ig>Df%LD{OP=sjj z3)NfOF0x=$Dj`q_u@M>#;MIEx%9J%K(%JKAm8gihgMg+|cddj3=S+@qM&wxWFCiNu zzbH{9EMNsE9xI)XnWT~8ze1dW)dD!q?3;?(7M03)gEGtzb%oW^I~S=su*j}BRebn} z*T|~sQ{buMz!X2Wn>^K`l41lb#1B`VowTjuVy1>DEMjP>A+*e(w058kdtA~|)YjjW z%>3@ar(wG~$>r70K^{@3(>|c+RG)B|Juh?S<~m?ArcF;>F>|#qP?^Z7k7iz{-Ybwr z2VF_LXJ@@Se^ss*&xqRJl0>KG-rVXXa)C^A1>Y2k41+e>GjYg5`~CB6$;a)Ywu`iv zbXD5_xsAOVo~pQPiMZ(Oy*t`DY|9II4{cm$|NHWJ-TwFa^YusjzXy5N+VG1yE1E6P zk~YLtalArFP!#f1A)_ZKCkHZu5jA%zzF!d1&5s|UeLy2h1Z@|H39hcdj}*JUSz!>X zW>pTm2>!XZ-i8AzGe*y-Wxo`YkS&YC$Yr`e)_`T9E-ls<$NokMK}yb0BKhX>$9700 zY1__REyJafE9r}8;D_GFkG?|V?Vq(JEh2)p)o5H@c^hpwqCyr^tz~ON6JFCO2319m z5RI!B8j`95^{=Wq)g79I;9p%eW1m^)|71*~lxCtW(>t32UvvInbh~S{^Z(*m_tF0U zL7tBvJ72>Yi+d<;3|U0wB&D0NnwDTpd+>D!w^8S7Z|5R424cuTTVn%MEVVsT&NtVQ z^^>I!mS2`ZVXUnkPH?x{Bjc){;8GFJB!Cwi_$P}G^Wl(PpcSxR+uypE+h~UZq-X;* z-tc=)A~s|+ROkr%-}Zi?8akGjstq+3C0qqW$t6nufuG7d2psj0(a2m@b})~y`V6Kt!ux%f=knrX%oIfT~Vh5vWas$m2T_J)%>tJit8 z%Zho8Q#mQRSJx%ZF4<73_~u%FUtRgmm(m8@_Bj$$)hnQ{t8d0U3)a+tn(9?H?sn2S~&9&DJ8Vb=N6cv$a>E%dP*l)G$8YU z>aVSawfEr(iL`ixbHap#6__!)ilcxYr8_z8zt5SOdfnBgsh)z@7H7eoVU|lz)EGxJ z+1{#w@&nR>jTg_W+r*SUWTS+J+v>$lrY2#LGr0=5>Og%9U_)&LehHEvO1y!+gu#nv zGzsdvK$rfBPG%K$_Q8{Y%!NDWG|oCtwNcK*QI&EJjP#5<$D%mSEq)&;t)X6ZHf}fb zg>i?2$*hK5ZBv#=SSgly#Wrn=tghO2pX8QWUWdc53V^DVkz_>S3401puxg%279C2O zLf7fWnjN@lLsO6^46d%88bCK3HG1ikBR1VA28T{bcCxXR+stgmt){Z6Z9~-}_2sR7 zZN#z0>#92_lV{e525CtKC|Ku0~&a_Sg`$(<_0#F%dU4frmfbt`tq zfCTMnV{N!B*u?7(Kz%@;TL5`{KI=0}{@2%JF-h;i8TcCcf9?6kv%38Ma_#w}{QnTo z6j{(7kP1WkzVFq-1DvuX?7?>7`w&w}6g%E496lCRt|5q;yTh1fOrnv!tID!W#wGlo zb4fMs2FUd1-n81QRuJ_QJ!q+Nju3ryr9Fm7n(B`Wbi3v0!8(LHC35@}o*2i$-e%)W z0`jh^C|q6j;1X$(sd99L^F0QM}2iwLw$&arZChs zh|Uz4k2cLf(K4kzI>*da19RTt&QDrmWF9HTVrc!jB1TKq_VuW zytEV%kEBy#K!Q`6gr)s*;Zy9sntig$r?jwfYM}w9u2-Osst7+dZuQr-V|ON62Rv{# zNii$!^p86oRvCaZQfdKevoy8O-5)dl{@irw@p+hM7XN2RW{P%%cjN-EL`8roNXWg%?VdoD#(>D3q^4mB!skL_*3U03J zrg;8>91Sxbmvn6je#m$XB$s2JvHutgYgieRv%yJq8FatZjd9A_h^zqVdu^%v=D%~H3{e=NbfOxwQ)xsa-} zrKvgctIb{crlBY1&-uG<3YAp1UTHKvd;c}=z=|LB7q$&&`kP#{zRp~J85^?f@SI(F zPdjoNoOW0-X8ebx8UGy@`DVDgeo#I+H$IF1OLucTT z-ADfKA)XpGu7*Z%RX5vCT!Z%3{;uKUMEf-n(9&{3=WMMtrF<(s6&jOS1qM`-HFw)< z7IL45uZpesy$&NW%_lB+#QZcIl+0H>5=6zqr9Km2{L$`>QTro^+jGvpb;!T740x^o z$FrLM$9nhqvq$~^gFLnKKNZ@qt>gOL{vu$`NiU9fwaI27u+VK49hlwcWJ-AZjKZN` zzA5dgT9r$La!d|TjiaVD%hSVEB}-0ceIdUO`^-B38IS0F#eu)h{$qWkuK#)d@-hFz z!#uU~j}~V4dE^nG6)5ncYU&E^fJgMY`?oLsFc)__K9H1EqmTL+k}DC$z+x)stC2h^ zE4Ajvzh8$UTdmr)*o+CcK+CI^qQ*^-FihXKozZOI3^Nz>(KzuzpLzIy zz><(9qdSv<>+t{DvwHrIm+Q}-J>vg|c>W;x|9idF{_JExF|7*h+^bP#f_`m!7 zW!?Y#<=V?f{{KOq8vZX6(m)N77wB5Mm3lh(;Z*R%JD7xH(v4;-yTxvRuf3tY*6?mV zb-21J%!y}vO*;O$ZCITlmj7{Z;{5Y}KN^5*<^SjFb^G7-jYt0PL7v+AH_JX{{%fP1 zU@`Qx%t#V$Md_IA{0*wFwfM9*URn_0N?k$ zil|yg>m??i);yL$R&4fAea5fF_*2m*Y9{wLv=6N49ltP|F=LHNA~AhQR4Y?@Ak?Q~ zmIFx*j_Y_*b!V_w>C#%n*Q=Js@zv||&qaS{r|M|v{H(%;l3BYmzub&<2yR*r$3(xS z-WTfkGX2WY_P%~I&xUfwhOj9{EYvdPNJGEe!j&B{XDn0MNZbJxA8#_MDZ9K`d%cqA z#GK+<@{@)RPgk2~jn-7lO`tN}Y$d(QV*XdN5N=ae7Tw^Cge?ujoe89wqx!=jc7JS= z1Kk0`*I@h^QN2x}v3Ltq$H4SPEm@0;v8Rq}LWvT|>y}jgwQE)@ zU*Ns-?914h=f5P+pZNaoS@-$Nm-X|%vHtS${6EA~4;)0&RFtL}ZX)Twj%(&a=;#}8 zS2gIO?(YnATMzJ9btyIIZtqso)4h8+s8!U_G%L(z5n|J5QW~=MR?Q3R-*v@W%2Mp% zlq#xPsPU@9$;w`JJ#0v`ZrFVHKmgqMP|WRu-duGj$m&VD(E(ZDklgN|+~%+>d|(yd40^BZ)P+$%Ot-k6@LNj#nh!16tioNSmQ>z;VL}tj0TjtSQkXZ>xz2S`C2PJhCBCj0UKT z!fo>uQaps1@@{sAERfk-YkE((QrmU0f}QEAf4i;8Y12u}C686Ps@QkLPiazR1B?Nw zE{)%-Bds8JCo6GT%1u?=jL%=p^gn25!%c-;7ONykzJ_YdU9%NOhfWg7wuVENFgbzN zm}FsVbxr}nhf*C#r=!KkdP~Iy%NWPqRgLQgcs*15ROPs4SDapL(~I6U!=FEN_jDmj zE=#yh^%?y=XBiD&VPf|~jU8Ar+8rglc)fE$gIsM1x2CU&WU~wZtekOfbxc`6(zN!W zA!VHVxGCeR@D?GbE;ZG=J>?M}O@5+P4%wa1qp}Q4JMhd~2;5=|E<}pS)o-~H=ah}c zvIlFG!Kv2l7-$yP=j_&Fx6j=5zkUbI-2>O`g4z3E(VZ|4-!@{gY2={sSh<+ZVLQ5W zj=H2-%o4=5KV~GL`_*jz?rlP2$r6%gnj0Cls#V!rMHworje7@@OhwJpwW{-cU0lcV zvG~(moV?}XR1xQshBl{cBV*Y3YDN_9`k1LGVrSbYurZ!zL>IhKK<>r+*vxj8{rv4L zF2hFOXJ4xUsTb{V)wF%8yVcY=#uk0fma6Tjn^?F{^|;nkn<2cZpZ1&66-+Dhie;FE z--TX1Op8GE=ba5R2~b5ENhR1%Rbw1=7C~3%Ky;kCl&Lt-~Z%?r}E#0q{5wnKS`ukCAWSv)GGUV6djs0n?=F;mnNBOs`f&C(wZ+LJ-lJbX_dH4f1cURkFudaCOzIzdItM ziWaHZLRK?81*QC0sTlA$CP~nXJSbM^nTxE+&=lbEC@D4K4%DhDk4bNrTE zyd~+j`h0cO`rzo+3J3kB$j?k3*aFvbRUbdj$NV$#{sP(#F-z6q_T@9Lj6;eBM2wxE ze&GDLtk59|KFv9#ETu!jBF`m;6*^wbrzZYxL50&9umn0XPCK@s!BL&BJ750~guKF| zoYKkWla&Dx6nV}kY_;;424fDbtuRE2!6H>c5sab_r*wka#Hu_uqr)T&eFW0ND$shu z+%jtN*&Vf)D?rT1loSXxU5u##1<#EH_O16sQ(l&Y4>9FB$;5yMwv28>HY9=;R{nh%w1%EhCvmpVgP; zQLgN-P63rBXHAp`iN;QH=F*+&aiz)G4;haeE9*})tCo1Hp>iE>HG|Mnn-ES0Uu~r9;l`tIH`> zm?rJs)cYmaxnOv2HbpX60(l~+oT`H)%Ks0vrYY1_tC2vNfg(YfYUhk(3?o4@0WlMT zC8MW6FPK#4qX~@a@Y>XeDq*ps+tn9>2@erI(pz;}^AyerlXzUo5PEi&9IWu z-*YM?q$DG;sIIlC@S2iHjKb(n`oTL(ucKkUBQ*+dlFrs4!4pD6yOX*OOlfis;50RaidRE?LM zaTY4RDpC^@BFAFBVm|GF=r2K@MGY{m1-iXG&{(y~1--(|qmZk$#m4^^HrmhEr=Zab z3_-njczAO7>id)ThdU?RTidU9HWNNQoUxQCtgOPvhCLGTfJB&2WV7|;kYPug9c?=cuDEII6Xk)p$p_l*?=~J5JNrEUNqEZxxsXX#yJfV~22FS0Ej`mNs z-@V$|e6oVOsnuyIDHi_zQT;p#cu22W(}x-0V0-h)cQZD_F+BNruzdx7LZJ&E=4}Rz z5$7z7-FV=i!?N3}W%&1#kKb<{?rxuKy+3+=1-D+j4k$^_p4)?M-TS7)U{Ei9Z{D@j zFP981Wka3aKy@D0yWOYoyt|>6N8d3c`X9p1A=pI1Ou&ow#hfWF7Vio+H=(uO?Y6F& zY}NU0(*}!XzJjhya{ixAsBRVVk&numicZ`ur1$L^Votp8$|Lv7()e3-seVI-ZqnE zvS?4J{4}#Qf9V@uO*8gY=6M!hKb5RP3mR&vT$O{BNTwWkr<19aKnf48g&@sHigAs8 zGn=p5)S8V3iCs}T6qzcMiI?I(RMK$R8KzNag3~p8(K5ZYoUFq&60Blk3-8pT|9mRX zNudYVy9QMuj6^58>WS*PnC|s_;jnN|tV@WEca=q#M-o;dn#@e(j=gU|dvz7M&4a*s z#$q?^vW0zv?&_5Dv-8eR5uVjmc-h?Vkcohw(QMNG4^7%BOGfQHVF3|Rr#-ysXy*AD zPYtgU*tWS>g3|Eh)Ayu4(e=IAe1aOW-;@onvq^N~6`a}Ypqa9-bwF4j}Xy)0L0W(_XMljxigxvAq&tf=_KZ1 z^H~aLCUvo!w{S`)jWDmfK0xb`j*L+AedAW09^bL`Ad`1#{lr9rm23t9TC67lS+FC; zR(Ys-FB*L4DQ{}{lg;*Q>!k9AYPOc%Twqn$!#NPmwN=9Rcv-6ECBO3-n8)riS*OmRI!)dlyz1C*+M#K8;EN&YR?eIPaIoob>dOzOc&iQ_Bo$qw- zd@CbLJ@{)ZDa{PcFmk_vMWq2W56nzs@7e-JY)FGi5LHk`@v@2Xl{K!TeNB7iFKC;v zfL+3U*d*M+9^rF`f0!BnLsB8}e}0vd&>G~Mg#@`K{?EqRT0Q^Y`pf4p9^-#J#8bl* zYQ@D=^w-9KKKneJ4iH!?$!`)${oP9n!iS^-)xQFy=eQUHGQ`=x4M<7Rn2tDhn5(( z${&7E{wR&4mcByXbHI`gP0rBD3j9*a(KoL8ZWXWX!1n{9gtx^cJgbSg)@lQXSUga#U7t8;;C-^wxV|o-M8aP5dB!Pt2@4uhfS8JB{U7kgowhS>f$N4~& z8IW*9I~h&6V3KDO+pg2aT8)$hr(}d-)730~r|NFnTAqi_Cpfd%Y4i(#h>gZlhe3jK zGBIj(?S~H}2_ef9;CTjoIAj4Mk$2qau7dL8hvN@z&-)g>{`wb^B`g_z{k8Wk{4%Bq zFbM&VwNJ0{LU28RfhX`&k?8?gGR%mOSsutdqfg78;(crF$?MZ2D2Xx6MxKr`5>oLLGHx7^3``x@Q9RYd&x5h| zE&c;B&!`^sFHDYY_6iIU$cNMO<7^;31NN)+Mfj%uyuJ3+`xeeAkc`5ZphFh$GpfDE zcrxPZg*q~lCIr30hd7BdTT&~i?p+O9S)Af#!;C$zS|K#nt>kH)p`VOv6~{|_h( zbJe8C)0Cs{TAqY7gPnJ8AYw5yT3kI97TlD+73njj4_n_h+~igxT8Ox0O{UDaJ@1MCbvhj>a}N z427SzntCdztq_m|CxPdQ+NU=n+!Kp!?AM{kXjp_~-*MftxlO}VEg0?gB ze0kr(n4i-#n&EJ167W1DBU;--k^@af>ixOh{Pcne^q8owul0SbPORO7IE!Yv%_Op{ zX{VbtrxgCzBJmMJ{2lPvV)%|jSvpLJoQlrc%Z)YN3w2;2q>`{mv_0>Czw&+U-3TEM zBoAOj6U>nl!qK~J8}9Rz(iAlQlrUCUMVdQLjFM?0ScC6>t0BI6x3_!*JFj++;OO=4 zAsp^(AML)|dkVXIhetbGui#+EKX|`q+dO&)@AqGA9qk|l&-3BIkV2E~V!rOf%c zs=n_gLTYcx4=YQo__2z20QM_}tHlw71%}a{k!mq;iJUD}!10N1tNEsykJWrRran$@ zS#7Gtke<H-`)HMd18gH56cH@72BH|M$3r=yPhn9lhJ`l?6i0_bZOt_npW+rW3xO z#o#ju{uw-3NzcR8p1$hJ0{D$*BTAAmBO&RS@`cO~zON}F_W)HUB7EH%Ke|`&NN>a~L zoWpU+S5~k;iare-f||FI*s7n!?;DX`~=yzdoRaskdr+JK~AnAR{LA2%xY24DiE<$^R?)vt9## z)*dl=qd~MQ++FpX?+YryUhZ$AD23yLf?e>ueSM%wbWSGLhyQr{_14~xJ8$0o*p5TB z4HVKl{{CQR>!;nlA5ZkxL-TDwhdiTR!F3=efP|i#<6tJu>>P(3QNt``EPJ{H2*qZT z2#yW1#(l_#wauyJStA< zfZJ+g&MyM$k3yQjP$H-c7!kEf@Z(QAu<|44qlkLWA>K(wETOAy9JisTh7nMGck&Y9 zgbyag2}kiIAPXI{D>s*S5Qg zi-$b%dCC&T6Fh`upr(FYW7oWjQWFP9FH$Zj&Y>_H6=-tCGM;GKVnQ)#4iim!j0KDE zSRzdfp|V z;gXttnE717D=LDFq1V9dVvmpWs5#RJfAK2brN6+lP@%`C^4wz1F1<_W&q&_#~V7 z6FryEujcNy`L+AAtJGJcx#%Sv8d7H^R3%RVO-za_*|=6&9wFHpYGRA{9J!03RBz6W z>ONF_e+w^-=y1q0*=oZ(Ii{J(oKY0i25R9aoWc8iE}^d`Y4+SVR8gxj%LcaZK*qDN z(->UHu&M&DZcU6FJUDo{Wo8mt{lTOR`v}L1lc1`gu~GgcbMpC~OXw@+{$$9r6FoPZ z$ix3bvY7H*Zmx;?O1Z1CH~SP_Y6-0}wdNwUx3sqJ~i@5KoST@E+~kIpF_$+ z8-yHhjD?Q*DN&tDGOBF_3?yOCi%~n2=cawn6ZT1;+ph-3N0?LZ5=`Ppt#C&-N+Y+W zL%x{y;UL@$N6^io-bN79rgVOiOBq}Nxx8HUv2NvTn>lG%Ms)dM`2&_Dig zleMs`VSMQ4uwJmGBzA#HAgvt$wVRCt`;bL?NB6IDSm_t0Emfr2p2U$>`t&0{diL9T zJI#2i&>j{2HeQJzYYq$DI;}37B!yQ6ZtwyN@n+5q;6#?VI zZzrRsq_EM1&k+Hk_72Ina|xx6&u?dOsfJUa{+!Px^jodltws@$VV1nH$Z8a>jqXj) zKYxB}t0@kb=(H3191xot^-Lu!`LvNKlDbw_C1wV+pMd(^JaU=LpOS8snds(}R>AT&~OKE$1F z3?}=51E7h(_hlOOVVEbuUqkhHr`6a=&SsJgxP%=HopIc#s9ua)`g3qfi$AyKsiqTw z^y`qXKO3wD;IDo@?sPWX=r~g_7Fmt63V^@*THMQO%;c#SU5&?uu+ME*W0*%#;soEA z260(%uUb`DRWzc|mhh1NnDIRAYpsWCpOKK*EMMlDgfn3kifC|Q)sd#UW|q`H5p}^o zb#lZNybxaWVnjQ|e?=^ipIuFM+trv3hBB?EDp#XFGx|{<^-(w{kI(H_qs*~7Q=`7^ znES!8Q{&GoOyBXjEl*_wv&_>|9gV5ZD1l}Xc#-7Xk|MTHvY=&L^>Q0r)YM2N;O;o&M_k%~^xL!@Ih~WC%7=u4N zF9ee&6G3kmQf5y!&j=CG@q?^9`yLt1-9I zwX5;?Og)#-*Ipj32YmI?r+#m)S0fo^RLrA^b)L%9&?Z&J^0L8Zp&;7}D9ZnI&n1Y4 zQO~cUSHsDu+_)z7yFaaPrf^(Hb9R1FHmssnVJ)DbEvCb2!WMkMonzFikd zmgvQQNd56`^;9vrc%P6n!Xkx-n(xKY4!2scl)o+cPI(9+6IrhPJO+6F_t)W_t za_Wz(i3JUSN^VDuxC#qgv*r6MrVNePhz%mD3quFiSK+^4t>1=SV~Ng^W|IN|-)_Ro z`<%B=^ISrI{WhyH|84`Wz28{mKI48y_$58J#Z*qB#+e%RpDQTo*v$huCGsI{{&TRY zcX%$L-^FCpi>q4}jt8qvp8c05)YF!q0YcySJ zNRo}HEKN6!ucf`!X!cn9lRdXR8%{dPnN)lyG5+sPhys%XV%k6&Fhe?Q>i{6y@x~k; zC*CE>hG^_@jCsIIlf{rH%hJa8aT`={?`N(){c~F#Zpy>0GF?!!^jAF_PIjS3Wz~%5 z)@Or{;rj6@NQ3KS>D zbb>g}ij|rIX|2eY`CLMO-wbonHLeX>WmjW{ z%+X|}V7y_8cCoZU6?KZUYMhglW-$|5tKmj+bK+WKdE=a`6D9TAuoVgJMxWC0bxiCj zEptekC8~v4UFe&{WVYmfeW*8-mLFm@GRAR(M?{E5ukp*0Ej0@9<9)Xh;-o!ZATz}& z=7yLUzw%0Xh;t#;BD931X2=>kME6vvgf?tDR&0`M zYdX<4nsv=p^=D;sH}Yy9k>eNj7_-3}TeoEc63nkO6H{r^WyPRkpmhoZrajA);AL)1 zwt@gdLJx2AZpJTNw$>B}yZH{jE zDZ^aVG_qyZ*G^C=4`B#VfHhU zgglNWGdUV(HD)*`8^{h7r$n%5V&cjYWBG~Ui7{RXm=LoydX6D1hIwR+obm)^l}dCm zOizV+LSs$(MVnLK*78%#R~gg&6! ztlr@9X?ku?#m#CMCC*VshC>!O+Vx8~z z(|NMW#WbU;Vz{{@_~+jF?O%hpqQTI`tCsF&W#N+2|5A&-Z}d2Xx2 zwX31MGF}@*)UQB(gWpUH5fYkcM~_Hr_H$RdG25$V)@nSGk=f6kSHnT6yZhC%aYMS{ zf>K-Hcb`Y-N&3OlZ3=395N9)her{S!M01LArEqClfSqf z*ST}BHIp&}-Fqm}IdXN-cN4Vz_91xhN;llW93s6uz{DMWLpOH!l{h)F_E0(o3;Vo;|yv|AtQOhbq}0GZN5!nlT<$r^X`*pYhyQ`m4wpb9`cJ0a-An&oaj1 zcT6{nDp_l$l3?Hq3N(2M{r}#$MU=^EcHudZEvC{CHyO0GXL#P=+@BLBr?M$)Riv9j zxy+1>PBkeH+fx|_o&3mVSskTWkx@CsA_W)-^Q@B4_R~F=&_B@Wrr+bVEy`1A_r2|i zu=uDz@-@iQR?)~{HB`lquCEi`EB(u!g>#cQnuNdQ!q^_0+`}t&4f`A2A6Xw(i`cDw zQ^fIUn9{%y2-y&Arey&!K=*{t^W5rQ95ea;u=W3Rg8SDxewX$Pb8`gq1W0LM_|rFs zO6HIm8{}$vzVp1JN*44oTe9|^;R&P}4|5$xT?8bm1avj0L}wfJiX^7!viTGuE(P!* z#5!@eS|Z0Y)69Gue&9w^kWnId0?g{qJOTqIL1rvCos|AOG%hl;M?4^r+aV{jg|Mln zyyLelVW+wFgQ$;q%tqsAf((k{DV6+m{NqnMAC5mfMP0JsF`b$>#M7Q}Hx)C|zlgTy z{X(q<+S@6n2ySFXrM=A+n>?U8c?u1!F4&k0TYy`Y0A$TB=(^^* zGYYqL?ed^!>#2uRrRFT)JPT2*N=Bw{Mn^s5d4i#Bj_n5R*sS$!+$l@2JyqHBb})N7 zhM&-h{v#GJ8BKspw`DH;V@eWxaiMGC-(w47?pHvL}D1DHyR*Mmz>A^Z{?R_gcrp7)k#YC}oFBJ9fX z(%RZLFJL9$u|j~W_N*_#+^A<2j5s6#ihQb zg0PDvs(uPQp`{HxYVZ3`+?W?nO51l&wPw{?s%SW~Y;jZEZ+q|5n)gvb-PcG9Z_FH* zt2u4j(P6sJ2rt?^gt1b9#OMTawFY&Oo_V__pj{Ca#2`3*Hpj+!vS4!xAU&|*GZ3Q~ z^yeXmM8XgfdahxLGSrAx3OWeG^(ruo(*)0$S4~4(xQ}b=#Vn(NH0@i&p4B^kM%|`7 zwyT%$!c->2i|T7ehdfgx!sO7bM}<-E6%AlQ zo961OPp$6Po1P=HPlUo)P@X&YHq0t*id4 zDKG_$=En4HE1`N7`)7yyz?eLO7GZVE^w-vVndcJCtSdZ*##ML~U(os48P`-{lgVg` zHMI)=qc?||h?m}_PM;O>HF)BwwSK_4KwX06KJlpX^8{-OO+poyX}kcS%6Uxlry34Q zy~XBq=WRAOVRui#P}sc|vk~qJ9W;_gaR)~(KC+ zXqYV?m&Z)i#+l6x5-Z)zrJu zUc@!GTCm$O@U3uQY`#l)2q*~tBV=kt^_Xk74gc zK>aMy$XuI}a;DV)+Nj6Lo~ftDB-cjwQqA})AyUA(vp#q_+n%@9hNFpX%|t;}+|Fd0 z+qQ_6pC@RUYV8KfHTH@%)^p|MgobfpvE31Vf#i|@`&%(WuS zi1DUDykz`okeut^5tB3{k;zKe)(1~X-hnJ&7zjxCRPU1@n_xs;UvK> z7~*Yul4sH8vW@qMA+$}EfX79Q#|{yp{;&AU{IRSL{E_B&WQCyCqSPB4R{jL=O<5hO zpgN6HpUYwEHgWsBwF&_RR_im=Ur?9>;mj2oPeUi&X&F8LsKC{DznIZ8#`AImu>{!_ z1FOumjRZL4y+yW&ZOpfmbLUO+hgtjii&`JJvv$VDPMunfN%R^{B~`BODup3662!1( zdZ+?c22>Ogek-`X=-jHNNgDZT?uiS*&_JVV>snwH)i>;#78S6ADBKjfYlZBUn4w8Q z8AmZsLK~OMN&CPgjf>r=Q(Ag*obh~Akfd4~QbB`)Nh@6XtS6dgd1s?Mtx^fC>Rheu ziCX7AqDzDD%uY4NT!N!?iZhHe*M@hw^%g|dL?B0k4KB3x^|`I>d%J6OpMo(-5*lqT zFKJmKT5c|<`hE{P_7|#W##zPY8LD9lMRC=R@cOqqZ2fCdU}dgQF{E~k=;5Ef>WC?W zo%Hl&f$CBZZr3F}A^&nk3Q0~Cl|(L-$XRJc^ntLVcO}jZwQ2^1YpE6{QkK$)B{il% z%atG!l8P}$Y3Ms-<8}>`iA>?K{cboEeJ!fi4H_70N6oIfVpE^gIrmZ!SZ~9YlGT$* zp&BfZjgI+KIHK!T>w(toa(b1P=O$gj*4y4jySPp>`CE#imTWbOk@^l5FT1gI^}*l2`SqxvG2cqJRG#AYp&w>|GQve2TI&ckgA zd86hIJ388;Kk9fDwe?w}7c}UZ^QE|Yl7#lBI*0=z#?DVaaDH5RF z=?zzO%DDwi@_0ZqH6Af0StvR-7>`r^Xy@(zo2{drlfA9CJDc(3#KLjP?C!nV`SoOf z>*#3bU~jV(@sW^3jQy`$PNBosTL-UBw%@(qJKFrld4I68|7Lf4%Y0dLzU&;Hygzue zsW5P_)4}UGC5rU^d%fFrifN7N@iDZXtOR)$fiJ-4&4Scl)Uu{Bbz1wZUhY$Y)AqNprn!=j;J8=i8LI1k{{s>y8cBhz(&XdYKwZMN3 z%jmV8NdE|J^Bo4F^PAwwGWg;0#}-RMdU28xDQT97R_}QE->ue@%8a)D-CF+ev}G0l zt=`9$Ubz!KJkcxH>McKUCV2U&Q^GE)DpQ&4<*O@0qddHrNz9dGGV;8AyZ{1BW(vpK z@Ai%kcE5jrw7d6XJ4OS#0V*F6kp)Ffo~Yxk{rM;Gd#>;?PlQJXJeR1t2fJoLcQ;1QGKe1PQFXbU=H8pXa=&UDf|iaM(DQpiM*W9Y_{?8U~~ z+KU&@o~?V00a;4u4e{qC5vQUBfqbR2jc1zj@V260~yenmsq(GF6ovltA# zvt*(9BnkZreDC=CgPpCPcK3cf*?zsX_v6l?+8qlo*dXGAPE1(RX#nFL>%ZT;`|*}Q z-TL0K)toEI-hp<0e(vh9kXCkRO&!%K!s2y|=CI>}Yma3d6)o6{vFaVyZ3a;7!@!-e)$19tN$cvGn1HtSRc;T0^wO;<@fhj&c%VyP^r zVwXv?aiOapz59MJ>QL3h(n)Zl8)5&U;R&|j74evbu~8D0c+86(RCWF%PC|SoGaezj zaUgb<)Uk~VhO0=9;VqIC=pJUlHsV`qrDvq6Iqx_u%}`bt)tEJ*Kobn0$wJe=(j=c9-s^l}k> znv7VYBzqdgP8IdDEyiBc?O>VpXXDebvT(`OArbr@T=u^dIJv)O|0L!i{4I^L8H?Zz9mq^1QZ zyi-Hqvtq2>e!rM^oh2b6--PB+JQq0^wf34LQ7xhiKwBJ_fR{P}eI_huUp464AXJ?t z6UIu-w!%AFR`Ipxo6pi}2k&DN6g=C!S5MZuz)-V1sW2)Iq6i0tjst~Ig$Bw@uR77I zcO0`ID)#P zvYU}e@LrTrsO%^-QUfZ9ZvyXlW&D(TI6VrM!XIA6r{MlL1GK>|r>jUVcW;v<3`Fmk zr!*1huW^4{tbpkqS2Dlcs{g9v7K)!{l*Wih6wcHy(V@yS*%t0aOpMqWO%x_Ck~#PY zT~VeolKpK4qm?gyz~eMWp2+}ny5X7F?4M*enVb6CbX`}qvZlQlo{BI+f%}~>r}gEzGnu3{eLgg|MXq=LZO*hhcoMG(N=O}Vz9;zo?UFJ}u@-`h-;Ow3 zbGE)OO}JO_fxR<(Sh@6=<$vtz_U})nuT@08@p1M3_W0c4nSZtQmYmWdi|F0j=yto^ z7tfyIzuj)P{_on$=g#n_cvEKa~bnk1B^PXHtlKriF=eFvD z`$8V$-O@wL1J7eg5al6-cDtkh8`CINC(!PUc6{o22RmK>OSQaK<07o6vv zaLjf1e`D=s9sfVuSbN0(5AiG+BUs}fSq6tdUsVE1^fggOYL>U(w4b-vjQ{hL>#Aq0 zN(|Gfty#ULC3r6s&*ps%j5n4A_~2YprimF`eOXo1o-(Ry_2HZ2r$JP?XC zk4^Zwaa1Lm;UDtsoMh;p@_SCRdP7_LyFJeX==b{`fJGgsPq#J2Szu0$Z=98lU8Xja z%q>dk6$ri2kh60V5ZPf#s1Sx}5hw0QTL#wb#j`wtV|DO>C6ZbdFovM}aQwkW!oYdJ zFmaye%_@F>$}odG6xfbx%t{G*E8KfKt|;=kkJA_T+++!F+s1YH|Jhod|9|=N#mh(h z{}2x%ArFc(IfaePZJxH4(q{PDBC7}1?%c5O_(H$Im~4uRM##Cikx(8B0(t>X8xW9W@q z|5k5px$$dAByoz&oPtG%+&r?G6LI??FSpE^oT%nn(1Vsft*vsPEkz`LO8EIx9S06i zcgyn}Z;Dpc!Mt#@ikOfs>xaRlZ%5uW^AM_G7Y!ADoPyG@cst-+3Yn3#$beXUx}~So z!qw4t&i z=5ajHfdnxAr;;1AM<0>iQq_gj1X4j)UK&~lOAJD%5W2Ty!k=l`Wh!3SV$sAjhOsw$ z?Mi%ggZkyTt;kOgI=RR?7!I$-Rup8_w z>}(WxIIniTFlobI5hXw9GavsqE6;A)#x?j~NdQ&+zrOb3+4D#I{}7MJQ<@p{@wxl* z_&oeG%VS8Z((dO1@VfKA@oc@W|9$!5#pC&Zi08iU{|ub_z5r~v>(iGXce?a=e2V9q z^M5ZFK-bBCYcJQP?*F@w=l?;TC3s~{?u-kd4HG@J>GG!%HrqR{-oG^5`Fs(VI90t^ z!(Gmw@508O_WF%YZ9(tc;NwlrAMUwkM`Sva$%&!bZ85$@8`trFFP?4G<-hK;jYs_d z5YN(AsDr|Yv&k98Rs#RRE5gd98NZlV^CtL*=OJqPhqr(5Zu?~S)#j70Jd@htltmHv zU1&Wq-&*i(8FXm<+kapTA$_qBj5)Mav7N(1*gb@U_j`N0dq3*y4mLD*=Khed2$rYr z$-n7#*E%F+owKzL_OFwWn2MAH&dx22Zkq79!QA@YGW-t)CoGg%x_f0rZxe}NqPs^U zL1z?AxU^-zDq}s-3noDaavCyyi=tyHc^FcuIvGbh2XA-xwvKjQwLGlY{j`|!Mik+e zZCuCyJ>RI^|E_n}oJ54f4i4+#o;LrMVph-W?++-&&q`y`e?{wOTEeWk zj;8NX4S4fsvGad7HQ;sp-+F`n-}Cjy^ZyXf5>%5P-bD?_lcrRPCQFYos&I9Kdt914 zbvnaOB{5E!5eS1^V;)C!-gQ{@Bm^dsW$EUL@k}lqlTq`pt9-1@^{0v>SoHy&8N4v$ zfoPkUcdF$YkkT2n^N6D#{<-l=-=dA{_`jDMFY5f?ix-df9}n{QzV9u;KFwk#A>h8k zFOr5D=Ouy3+9r6!B*`XVgY>`|%VbU>b=Jo$p`z`PM6xXth^7ZE!H2Ttc}s9O&RB9< zpw@r>{1zjNwLL2SNzTZ-REbh8|JV3pZT*`V{9j|C{=m9hk?s$Om_!lHAQTA{Mi$!ZS*HOK_l}7oBnv zFBj?N8eHNPd>t?AtsY8e-KG` z!SjD70q~mhzy6}`|GVB@fAJ{)J;<{JKke?lx~tUp6HCI+EbEmGsLsIuLbv_0-PQRk zheMsSZt z+HmX~7r{oNqncP+TYLUeP0Em6VBWJt_YC`G(vP0=?384f*HsOu(sP~1)FP6YBsqzq ziFbUUaT&Z(s08+j9K(Kz%WU3TOaN43o4#cX0At6g*1YPX8qNh)1f_6n>Ag<(q|-_= zo`}`DRQ-eP_P3k5-@W?~v>mwrKYQQ$+_tSO{yF?BFmmT4`AtacVM{rlUq9rgX`5-& zcH*?>&iHn0nuILY6u}FCR&;v$zu&>)LGU3_PdZ77FSbY!i`Oo87yJ1Cn>M?8w58@P zBK*aR^o`Ly%Y?ol)0d+3il3g?-`@R82;Jn^xK!JxI>b1I`t0=OsPC-7oXy))iEhp( z&Xqdo<($e4g4RJ_-{yMez{zppc(blSw66i#YFm`qmknVw^8aQ3zu{=u@9uwEDV_ZP z8OZ-R+8ta2u>G;H{T|yM{|AF{XaCbm>F~e9|22W-58?pUg#V+m{qJBh=y&peE2UZg zXL1a5mLFeWX~O?QIDj?a|6p`BuK0fryZgUZ$_aWWmimX6m;34fbvvJc&BuEgP;ibD z&ZMF(&knA;iLU%GBnfz3B^ZO2=N6mr6OM~+!i3$3zk;a1Kk8_``TJUys5#3uA(~K_ zNZzu>@oZ2GWh!W@%;u}@S$71iEL+U-&M+G3|Da6&C*xt~|JzED^4~WRgS(BCMh{Vp z??3>II3z)bOeHc*GEi8VY2s}Xar3q&ZV!k_jMFHPL6$Oxh14egl>(JJ_tR7m%+*B4J)*r!SBj-E>DvJm08R4$ z`S7e7|F7f!TPeT1fAj6z|1Qe=YUv$E`bO;~+>0i(XfI(shn&wwyjQ-0`$3V7l;J2Q zS3{C1CijFS8!1DQPc@{+Uej&L=1CuShp`_22cyxr!v77%XC3~xQH1=j!-{;DMIn}E zFIIYP5TGdrOB%i)=mD~<>+HkQ;9oY8+{upxlP4tf4DwwTrPc3oJa?pQZ0g!c!-Y6b zaY{VL8F;`#LM&ie`BJBF;{^F=N->*h6@)YN(2vmrMtLIC+a>ygM2Yy?M+sgSZ3QO) z7Th?+TlL&ix`SGfN;?uUm9fBRAV4pXLdq|SLp3cP`XFR}vVctV@++UCh@(Xm$4-j+jVR+%M~QEW!*e9tyn^VO#zutMO&heMp2YfB6w$*$Y~bGOD9W0Oof;dq6O?ChGu@6VzIM5 zwJ-HoVteUjD(!xTIS3SRD87J$8Gxv>OQm%sj-OO8L+;+0&(JN#iBb*XP(>@MLt%sd z64yQS6EqLqgGs*?NR-BYAaEuDt2*&VOdv9u-$FF?*$g5c5hnzkix`97GmJ0$OXwv|j;87f7pJBNKs-mJ|$kJ6IRj-JaGQEc&3ri*NIwjaJeo-HK zsdbNXD;47xOZ-)z`4l@Qk7%f8YM%NWHn~9NTRbHcBXOefD)o?>(Au5iBZ^(NOad6Q zk5t$nz%fCp$rK4Lh)iXVAUZK@7$9_1f{kEn7VtyK?}*KO8bW}BJVlJ4eN#dKbC*eg zLuVRiY=+|KUZO}ssE|CDXaQPbMG;|M`3zIjNgbOAU1Gp!NGEH*VTPE<(+WD92-tdJ z{-31RYMmgP%aDFud1X1kbz>g&>;S?q|UjPriVl10SY74>y*k_S1&CbcxUbJV! z=gtBHD7|MTq=*AB@nBGM;Ug>A8CTJK>8c~jE#CeBIM>w?{=XjN^YSkt3=7g%WE}^Y^j}ogB5GNcxm0`PB!?t~zL;E=iaA7lObkZ}PPjUt3AqL*B8MxgYc_(O% z*%O`q!9)L&DO2!9{MlL7oua>4`zsQoB}#J`gB;V98h^7Ur0U>FhZc1bF&_cZt|mnVO%&` z@+~d9tht15v^Zn)s)|qZXjf6Fd+*pH^j)Sm)tXgF>$Ue9hK%ppuuVrU zb94~guLg4fl29GLMHJqI5ijgRaU`h!&49$FRN|kUt1Skj*?DU~{eusvUo)V(QK&W4 z->EUp$%A6G!iWV#$b#O#apI*y3d<5vlY0VN*bTx7r%Q>fHzsq+jb!}w?AW-kEt?a)4Eg8bJT*eDrjRC;C*D)`Xa32p>T|zTkSiW>fBb& zIlMl_Ww4<8#7Tfp$KK1+ISI2EGgpgg%$xCfd~$7oUvqNpUmM_>Ib12V@7EpGsH+== z-h5U!G{-HCJIK25+7(9A{qNa$SoZ(!pLO})S}CsUTAAL4PAM5&G4vw=xU)E77S zAmXPFf#j>^eyA_B{Md1fp-X_j_>5$mpMAT-X!QRWRQx~Ay8J)wlnVaWU~_Hq$0os` z5I1_YLPodJ+k*0lE!opV2D${|z++G4XIZx4Aa{k)g#VLa+5fZO@8W;9Q>6Xx2it@I zgVK3q>Aj`InWd)%Wlh1T!Z`u8ypWwCv^iSLqL^{5+`GpZjD2%`hSFt}(#(GP#7FkO zNPd(8<*|94v+tsj{=dn2 z7yq%9a)RDz{NCIDQ?|3-|MTq>2n!P`JD$~zW9Cr0YNC0@xaIolInK>Z zwU&H~>VU1PTLaxO=@I{q-m}N^iB;6P;1jE#7JOpmqe2unaNF%p$-igWVn^)^qf!1Z z$A2G8#*^;+Z>4ncpFRV}*qtsu_KN>L&te`OCi{Q0|9^j2$^U;g>F)npDLdu=uW=d` z`=wTUAYLej>1Y~+P24|^>cx6=m(rpZ1lJscHkBtZ6~gJiCp8d8gK6$!B>xbqWmmd2znX zB($%wuxGlUsc@}ubKazFdku2c_s;Ypw)-uVpksth2 zLpa4^Kov-oh&Echj-mT|m(2v5{a`fdf6lA%-^XVi|JO>{i2qXt_Z|1waev3>{&s<9 zGcdcrRvgSGi+sG;GT&tAK`GXm;ek^=Cx9i4X{%cCfzi|S; zqvQ^*Dmy0Y5M@)v-###!?0*LR^8L@G%m3I?+35UVXP-L+a&AGxX&|of#jtk(gytSKt6%&8*Y>U!+|f5V1nUA#xN}$ zz3M2Hy!{30{rM;I-XsrRS*$>R{Uy!uZb`V*5`>F-5XP)$en0K04qpo>y$eOno>~=> zY<`RBHJM(6-l=!-&-%B(cc?0(r(Y_eTY>)x<_kjaQxZqPa$h^ZCj1{w&ddJ4!!G}8 zJ7p*PzZyHg!iM=ITm@Gf$#tHAdD#g6_jCei(*N}b761Q9XaCzyQ49SGEVO0>pUn0hLtHAH_W3|q!xG>b7q&t!bx zS;TQ1F^)s@3klhC)#}{m!R$x>7RM}C9tv6HLcmElPC{4o+phlRV@fex=UCsk=uc24 zif>;al49zM&ZD=<3*%dMRcP|}za&EwhLH>p^gfF*%NdZAgylI{+2i%SUf)*jaO7uZ zM1|+5Fuc+$HP+Ho(O9`>M&-6@PXMd;<|7w;UA)y^*<@7>_yaGkY4^zMTkiiSw#a$+ z9-9tz<#Ec2^Pi+RVY6t;+sOYmI;-Y?JL}~CR?5Eoe=(kE$L4=-r4j#+p8u^s81>Jq z`QJMJzm;-=eok?6DVBQQ03fEJ^$|e+ma!iW>o#$uFcLY^7ve}9-KQakTlQ-(Z%R?1 z&2s?S5%}H9mP@h|j3)kXGMbe2Kj*_P{zEI}IQKutzvijj;*2)B#aTJh#~PXLYY$zZ z9-OI#%c{a{7OF(1%&Ydqsq#ZY7B9e;@lr*uY+V0sj)GnHSQGva`{PRd*KsHRwNhNy z1yd@p3wuoxjz5B`k7mg$_AA5m0wq}-I}YfrD%GY;*@!@;n$Osh1w4M6MEtePgNW%D zA5;BvDl70`?}#?yzmA5Js{PlX%m3X$mS-eFycnN}YP~ z)w9bFuU`Lf{o9-Omv4Xm>G|VcC`)5dwnF2i<;D=lm}679&a|}dp_}4)?el>0|NKYZ zr_^e-oHUE$QbcP=>3ZQjk+Y3N4fNHsnk9Lz?PpnDo6eCtHC?eJIBE2XOmB)6?E!k} zU|9FUTQNv4pxiuX+z;;Ez=uW*Fx|NoBjhg7DW9k4f1D>z>PHT*PH&^+ zl+BPEpdLJUQp%i#DbIKmqrgY5OEM0vp4N8Nbp`u}o<2qY_{aLTFy(p>8ej4}bz#D4 zo(BF#kVQr7N2SB%Me3=(s@Vu}?r?%>6x5@> z>rN?|yW%YUdgYjQY#nGw0|0AUwr@Xxjk~`6e0Ex(4;{yNpwh(uwG;ol9RF|9A9nm- zE9C@fscskbzqIPf_zWjJ%2WG0e#QyV6Nn{Rpo3FF(T5)|(KCiIx-u67&-V$_?SVJB zZ^h(xtn`?Wr&xZi`-Cnpe=K(^j>$r1xWwp+Os7#0`LWNANW_ljTiwesK zxK|%(LVnX*S*g4}cO4a}0oFerh0IIT+TbepTMC%4Vt9~8fv!5x@@)d8$0u4`+y*{j1&_R#y6y zBgL$s|LQvRFd1N)=>M=n|HqT@c}M@-C_CN%zyAK!`wvy`j~cT8wU3-{-~aqhJfC=j zi8pw1V(#m~@AEoVoe__d#=U#lt831~WBolm?p(Eo#E zfN8S-9FNNRzsKW2XaCtsIYGZF5?#FhTSReOz5^^@VCgh4Kx5@yjh`SAhw_o5$U3B{ zO$;%OxL2P6)=xrHX|JoY!`(M|tz0;1WGme_wX*(Ob!kT!P5fVfFe>Z+2c7?KJLM4m zAN#9%S89=~3g=J5G2{`4ysgKGLgfSaige}6D-HDj5bEDX{_nhM|8?H+f9;ft{#Q%v z$B=@LC Date: Mon, 14 Oct 2024 16:56:14 -0500 Subject: [PATCH 03/11] Checkpoint - Basic replayer functionality Signed-off-by: Tanner Lewis --- deployment/k8/capture-proxy/.helmignore | 23 +++++++ deployment/k8/capture-proxy/Chart.yaml | 6 ++ .../k8/capture-proxy/templates/deployment.yml | 49 +++++++++++++++ .../templates/service.yml | 3 +- deployment/k8/capture-proxy/values.yaml | 50 ++++++++++++++++ .../k8/elasticsearch/templates/deployment.yml | 2 +- deployment/k8/elasticsearch/values.yaml | 2 +- .../environments/full-environment/Chart.lock | 7 ++- .../environments/full-environment/Chart.yaml | 3 + .../environments/full-environment/values.yaml | 4 ++ .../templates/deployment.yml | 28 ++++++++- .../k8/migration-console/templates/pvc.yml | 15 +++++ deployment/k8/migration-console/values.yaml | 56 ++++++++++------- .../k8/replayer/templates/deployment.yml | 28 ++++++++- deployment/k8/replayer/templates/pvc.yml | 15 +++++ deployment/k8/replayer/templates/service.yml | 13 ---- deployment/k8/replayer/values.yaml | 60 +++++++++++-------- 17 files changed, 293 insertions(+), 71 deletions(-) create mode 100644 deployment/k8/capture-proxy/.helmignore create mode 100644 deployment/k8/capture-proxy/Chart.yaml create mode 100644 deployment/k8/capture-proxy/templates/deployment.yml rename deployment/k8/{migration-console => capture-proxy}/templates/service.yml (76%) create mode 100644 deployment/k8/capture-proxy/values.yaml create mode 100644 deployment/k8/migration-console/templates/pvc.yml create mode 100644 deployment/k8/replayer/templates/pvc.yml delete mode 100644 deployment/k8/replayer/templates/service.yml diff --git a/deployment/k8/capture-proxy/.helmignore b/deployment/k8/capture-proxy/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/capture-proxy/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/capture-proxy/Chart.yaml b/deployment/k8/capture-proxy/Chart.yaml new file mode 100644 index 000000000..6f0fe47cd --- /dev/null +++ b/deployment/k8/capture-proxy/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: capture-proxy +description: A Helm chart to install the Capture Proxy +type: application +version: 0.1.0 +appVersion: "1.16.0" diff --git a/deployment/k8/capture-proxy/templates/deployment.yml b/deployment/k8/capture-proxy/templates/deployment.yml new file mode 100644 index 000000000..ea666c8f7 --- /dev/null +++ b/deployment/k8/capture-proxy/templates/deployment.yml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.container.command }}" + # Load all env variables + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key }} + value: {{ $value | quote }} + {{- end }} + {{- if .Values.otelCollectorSidecar.enabled }} + initContainers: + - name: {{ .Values.otelCollectorSidecar.name}} + image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" + imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} + ports: + {{- range .Values.otelCollectorSidecar.ports }} + - name: {{ .name }} + containerPort: {{ .containerPort }} + protocol: {{ .protocol | default "TCP" }} + {{- end }} + restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} + {{- if .Values.otelCollectorSidecar.command }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.otelCollectorSidecar.command }}" + {{- end }} + {{- end }} diff --git a/deployment/k8/migration-console/templates/service.yml b/deployment/k8/capture-proxy/templates/service.yml similarity index 76% rename from deployment/k8/migration-console/templates/service.yml rename to deployment/k8/capture-proxy/templates/service.yml index fe7bb8c7b..717b34a20 100644 --- a/deployment/k8/migration-console/templates/service.yml +++ b/deployment/k8/capture-proxy/templates/service.yml @@ -8,6 +8,7 @@ spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.port }} + protocol: TCP + targetPort: {{ .Values.service.targetPort }} selector: app: {{ .Chart.Name }} diff --git a/deployment/k8/capture-proxy/values.yaml b/deployment/k8/capture-proxy/values.yaml new file mode 100644 index 000000000..1e729ae6b --- /dev/null +++ b/deployment/k8/capture-proxy/values.yaml @@ -0,0 +1,50 @@ +# Default values for capture proxy. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: migrations/capture_proxy + pullPolicy: IfNotPresent + tag: "latest" + +service: + type: LoadBalancer + port: 9200 # Port exposed to external + targetPort: 9200 # Container port + +container: + command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka:9092 --destinationUri https://elasticsearch:9200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://otel-collector:4317" + +resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + +otelCollectorSidecar: + name: otel-collector + enabled: true + restartPolicy: "Always" + #command: "--config=/etc/otel-config-debug-only.yaml" + #command: "--config=/etc/otel-config-aws.yaml" + image: + repository: migrations/otel_collector + pullPolicy: IfNotPresent + tag: "latest" + ports: + - name: pprof + containerPort: 1888 + protocol: TCP + - name: health-check + containerPort: 13133 + protocol: TCP + - name: zpages + containerPort: 55679 + protocol: TCP + - name: otlp-receiver + containerPort: 4317 + protocol: TCP diff --git a/deployment/k8/elasticsearch/templates/deployment.yml b/deployment/k8/elasticsearch/templates/deployment.yml index 607578679..546b1fcf2 100644 --- a/deployment/k8/elasticsearch/templates/deployment.yml +++ b/deployment/k8/elasticsearch/templates/deployment.yml @@ -19,4 +19,4 @@ spec: image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - - containerPort: {{ .Values.service.port }} + - containerPort: {{ .Values.service.targetPort }} diff --git a/deployment/k8/elasticsearch/values.yaml b/deployment/k8/elasticsearch/values.yaml index 44ac2d183..445334281 100644 --- a/deployment/k8/elasticsearch/values.yaml +++ b/deployment/k8/elasticsearch/values.yaml @@ -11,7 +11,7 @@ image: service: type: LoadBalancer - port: 19200 # Port exposed to external + port: 9200 # Port exposed to external targetPort: 9200 # Container port resources: diff --git a/deployment/k8/environments/full-environment/Chart.lock b/deployment/k8/environments/full-environment/Chart.lock index f0c8c7c77..781059d74 100644 --- a/deployment/k8/environments/full-environment/Chart.lock +++ b/deployment/k8/environments/full-environment/Chart.lock @@ -14,5 +14,8 @@ dependencies: - name: replayer repository: file://../../replayer version: 0.1.0 -digest: sha256:43ce1396b019dcf63e55b87d0d0580fc4483a56d6a2eece10f356456c2d7a635 -generated: "2024-10-11T21:40:26.248116-05:00" +- name: capture-proxy + repository: file://../../capture-proxy + version: 0.1.0 +digest: sha256:ba4897cb6b540a897d96e6af4dd497f9448940f16c29dcbefffb00b2db965682 +generated: "2024-10-14T14:41:22.84168-05:00" diff --git a/deployment/k8/environments/full-environment/Chart.yaml b/deployment/k8/environments/full-environment/Chart.yaml index b5fa2923c..dfc099ad8 100644 --- a/deployment/k8/environments/full-environment/Chart.yaml +++ b/deployment/k8/environments/full-environment/Chart.yaml @@ -17,3 +17,6 @@ dependencies: - name: replayer version: "0.1.0" repository: "file://../../replayer" + - name: capture-proxy + version: "0.1.0" + repository: "file://../../capture-proxy" diff --git a/deployment/k8/environments/full-environment/values.yaml b/deployment/k8/environments/full-environment/values.yaml index e69de29bb..4a859e1ab 100644 --- a/deployment/k8/environments/full-environment/values.yaml +++ b/deployment/k8/environments/full-environment/values.yaml @@ -0,0 +1,4 @@ +replayer: + sharedLogVolume: + createPvc: false # Only want one service to create volume + diff --git a/deployment/k8/migration-console/templates/deployment.yml b/deployment/k8/migration-console/templates/deployment.yml index e49e47429..9b2da1b2d 100644 --- a/deployment/k8/migration-console/templates/deployment.yml +++ b/deployment/k8/migration-console/templates/deployment.yml @@ -18,8 +18,6 @@ spec: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.service.port }} # Load all env variables env: {{- range $key, $value := .Values.env }} @@ -27,10 +25,34 @@ spec: value: {{ $value | quote }} {{- end }} volumeMounts: + - name: {{ .Values.sharedLogVolume.volumeName }} + mountPath: {{ .Values.sharedLogVolume.mountPath }} - name: services-yaml-file mountPath: {{ .Values.servicesYamlVolume.mountPath }} + {{- if .Values.otelCollectorSidecar.enabled }} + initContainers: + - name: {{ .Values.otelCollectorSidecar.name}} + image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" + imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} + ports: + {{- range .Values.otelCollectorSidecar.ports }} + - name: {{ .name }} + containerPort: {{ .containerPort }} + protocol: {{ .protocol | default "TCP" }} + {{- end }} + restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} + {{- if .Values.otelCollectorSidecar.command }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.otelCollectorSidecar.command }}" + {{- end }} + {{- end }} volumes: + - name: {{ .Values.sharedLogVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.sharedLogVolume.pvcClaimName }} - name: services-yaml-file hostPath: path: {{ .Values.servicesYamlVolume.path }} - type: File # or Directory if you want to mount a directory + type: File diff --git a/deployment/k8/migration-console/templates/pvc.yml b/deployment/k8/migration-console/templates/pvc.yml new file mode 100644 index 000000000..31c5d69f2 --- /dev/null +++ b/deployment/k8/migration-console/templates/pvc.yml @@ -0,0 +1,15 @@ +{{- if .Values.sharedLogVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.sharedLogVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.sharedLogVolume.accessMode }} + resources: + requests: + storage: {{ .Values.sharedLogVolume.size }} + {{- if .Values.sharedLogVolume.storageClass }} + storageClassName: {{ .Values.sharedLogVolume.storageClass }} + {{- end }} +{{- end }} diff --git a/deployment/k8/migration-console/values.yaml b/deployment/k8/migration-console/values.yaml index 8700e34f9..a8ecf105f 100644 --- a/deployment/k8/migration-console/values.yaml +++ b/deployment/k8/migration-console/values.yaml @@ -9,11 +9,6 @@ image: pullPolicy: IfNotPresent tag: "latest" -service: - # This makes the service available only within the cluster - type: ClusterIP - port: 80 - resources: limits: cpu: 100m @@ -30,21 +25,36 @@ servicesYamlVolume: path: /opensearch-migrations/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml # Local file path on the host mountPath: /etc/migration_services.yaml # Path inside the container -# Additional volumes on the output Deployment definition. -volumes: [] -# - name: foo -# secret: -# secretName: mysecret -# optional: false - -# Additional volumeMounts on the output Deployment definition. -volumeMounts: [] -# - name: foo -# mountPath: "/etc/foo" -# readOnly: true - -nodeSelector: {} - -tolerations: [] - -affinity: {} +sharedLogVolume: + volumeName: shared-logs + mountPath: /shared-logs-output # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true # This should only be created once and shared between services + pvcClaimName: shared-logs-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 10Gi + +otelCollectorSidecar: + name: otel-collector + enabled: false + restartPolicy: "Always" + #command: "--config=/etc/otel-config-debug-only.yaml" + #command: "--config=/etc/otel-config-aws.yaml" + image: + repository: migrations/otel_collector + pullPolicy: IfNotPresent + tag: "latest" + ports: + - name: pprof + containerPort: 1888 + protocol: TCP + - name: health-check + containerPort: 13133 + protocol: TCP + - name: zpages + containerPort: 55679 + protocol: TCP + - name: otlp-receiver + containerPort: 4317 + protocol: TCP diff --git a/deployment/k8/replayer/templates/deployment.yml b/deployment/k8/replayer/templates/deployment.yml index 239af5d70..a6567d6f8 100644 --- a/deployment/k8/replayer/templates/deployment.yml +++ b/deployment/k8/replayer/templates/deployment.yml @@ -18,8 +18,6 @@ spec: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.service.port }} command: - "/bin/sh" - "-c" @@ -30,3 +28,29 @@ spec: - name: {{ $key }} value: {{ $value | quote }} {{- end }} + volumeMounts: + - name: {{ .Values.sharedLogVolume.volumeName }} + mountPath: {{ .Values.sharedLogVolume.mountPath }} + {{- if .Values.otelCollectorSidecar.enabled }} + initContainers: + - name: {{ .Values.otelCollectorSidecar.name}} + image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" + imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} + ports: + {{- range .Values.otelCollectorSidecar.ports }} + - name: {{ .name }} + containerPort: {{ .containerPort }} + protocol: {{ .protocol | default "TCP" }} + {{- end }} + restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} + {{- if .Values.otelCollectorSidecar.command }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.otelCollectorSidecar.command }}" + {{- end }} + {{- end }} + volumes: + - name: {{ .Values.sharedLogVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.sharedLogVolume.pvcClaimName }} diff --git a/deployment/k8/replayer/templates/pvc.yml b/deployment/k8/replayer/templates/pvc.yml new file mode 100644 index 000000000..31c5d69f2 --- /dev/null +++ b/deployment/k8/replayer/templates/pvc.yml @@ -0,0 +1,15 @@ +{{- if .Values.sharedLogVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.sharedLogVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.sharedLogVolume.accessMode }} + resources: + requests: + storage: {{ .Values.sharedLogVolume.size }} + {{- if .Values.sharedLogVolume.storageClass }} + storageClassName: {{ .Values.sharedLogVolume.storageClass }} + {{- end }} +{{- end }} diff --git a/deployment/k8/replayer/templates/service.yml b/deployment/k8/replayer/templates/service.yml deleted file mode 100644 index fe7bb8c7b..000000000 --- a/deployment/k8/replayer/templates/service.yml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.port }} - selector: - app: {{ .Chart.Name }} diff --git a/deployment/k8/replayer/values.yaml b/deployment/k8/replayer/values.yaml index f1a4d1312..e1185880b 100644 --- a/deployment/k8/replayer/values.yaml +++ b/deployment/k8/replayer/values.yaml @@ -2,20 +2,15 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 0 +replicaCount: 1 image: repository: migrations/traffic_replayer pullPolicy: IfNotPresent tag: "latest" -service: - # This makes the service available only within the cluster - type: ClusterIP - port: 80 - container: - command: "/runJavaWithClasspath.sh org.opensearch.migrations.replay.TrafficReplayer --speedup-factor 2 https://opensearchtarget:9200 --auth-header-value Basic\\\\ YWRtaW46bXlTdHJvbmdQYXNzd29yZDEyMyE= --insecure --kafka-traffic-brokers kafka:9092 --kafka-traffic-topic logging-traffic-topic --kafka-traffic-group-id logging-group-default --otelCollectorEndpoint http://otel-collector:4317" + command: "/runJavaWithClasspath.sh org.opensearch.migrations.replay.TrafficReplayer --speedup-factor 2 https://opensearch-cluster-master:9200 --auth-header-value Basic\\\\ YWRtaW46bXlTdHJvbmdQYXNzd29yZDEyMyE= --insecure --kafka-traffic-brokers kafka:9092 --kafka-traffic-topic logging-traffic-topic --kafka-traffic-group-id logging-group-default --otelCollectorEndpoint http://localhost:4317" resources: limits: @@ -28,21 +23,36 @@ resources: env: SHARED_LOGS_DIR_PATH: /shared-logs-output/traffic-replayer-default -# Additional volumes on the output Deployment definition. -volumes: [] -# - name: foo -# secret: -# secretName: mysecret -# optional: false - -# Additional volumeMounts on the output Deployment definition. -volumeMounts: [] -# - name: foo -# mountPath: "/etc/foo" -# readOnly: true - -nodeSelector: {} - -tolerations: [] - -affinity: {} +otelCollectorSidecar: + name: otel-collector + enabled: true + restartPolicy: "Always" + #command: "--config=/etc/otel-config-debug-only.yaml" + #command: "--config=/etc/otel-config-aws.yaml" + image: + repository: migrations/otel_collector + pullPolicy: IfNotPresent + tag: "latest" + ports: + - name: pprof + containerPort: 1888 + protocol: TCP + - name: health-check + containerPort: 13133 + protocol: TCP + - name: zpages + containerPort: 55679 + protocol: TCP + - name: otlp-receiver + containerPort: 4317 + protocol: TCP + +sharedLogVolume: + volumeName: shared-logs + mountPath: /shared-logs-output # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true # This should only be created once and shared between services + pvcClaimName: shared-logs-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 10Gi From 03e3431f68234e94abcaf153ac31708cacb9431c Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Mon, 14 Oct 2024 16:56:42 -0500 Subject: [PATCH 04/11] Update services.yaml endpoint Signed-off-by: Tanner Lewis --- .../main/docker/migrationConsole/lib/console_link/services.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml index 4e062e317..54edbf567 100644 --- a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml +++ b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml @@ -1,5 +1,5 @@ source_cluster: - endpoint: "https://elasticsearch:19200" + endpoint: "https://capture-proxy:9200" allow_insecure: true basic_auth: username: "admin" From 032227b9509530aa2c78fe95cd82e4d0d348a598 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Wed, 16 Oct 2024 15:27:13 -0500 Subject: [PATCH 05/11] Basic working Replayer and RFS in local k8 Signed-off-by: Tanner Lewis --- .../lib/console_link/services.yaml | 10 +-- deployment/k8/buildDockerImagesMini.sh | 11 +++ deployment/k8/capture-proxy/values.yaml | 4 +- .../k8/elasticsearch/templates/deployment.yml | 22 ------ deployment/k8/elasticsearch/templates/pvc.yml | 15 ++++ .../elasticsearch/templates/statefulset.yml | 36 +++++++++ deployment/k8/elasticsearch/values.yaml | 15 +++- .../environments/full-environment/Chart.lock | 7 +- .../environments/full-environment/Chart.yaml | 3 + .../environments/full-environment/values.yaml | 11 ++- deployment/k8/localSetupMini.sh | 13 ++++ .../templates/deployment.yml | 5 ++ .../k8/migration-console/templates/pvc.yml | 17 ++++ deployment/k8/migration-console/values.yaml | 13 +++- deployment/k8/opensearch-helm/values.yaml | 8 +- .../k8/reindex-from-snapshot/.helmignore | 23 ++++++ .../k8/reindex-from-snapshot/Chart.yaml | 6 ++ .../templates/deployment.yml | 61 +++++++++++++++ .../reindex-from-snapshot/templates/pvc.yml | 32 ++++++++ .../k8/reindex-from-snapshot/values.yaml | 78 +++++++++++++++++++ deployment/k8/replayer/values.yaml | 13 +++- 21 files changed, 361 insertions(+), 42 deletions(-) create mode 100755 deployment/k8/buildDockerImagesMini.sh delete mode 100644 deployment/k8/elasticsearch/templates/deployment.yml create mode 100644 deployment/k8/elasticsearch/templates/pvc.yml create mode 100644 deployment/k8/elasticsearch/templates/statefulset.yml create mode 100755 deployment/k8/localSetupMini.sh create mode 100644 deployment/k8/reindex-from-snapshot/.helmignore create mode 100644 deployment/k8/reindex-from-snapshot/Chart.yaml create mode 100644 deployment/k8/reindex-from-snapshot/templates/deployment.yml create mode 100644 deployment/k8/reindex-from-snapshot/templates/pvc.yml create mode 100644 deployment/k8/reindex-from-snapshot/values.yaml diff --git a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml index 54edbf567..e1be04aee 100644 --- a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml +++ b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml @@ -1,5 +1,5 @@ source_cluster: - endpoint: "https://capture-proxy:9200" + endpoint: "https://capture-proxy:9201" allow_insecure: true basic_auth: username: "admin" @@ -19,14 +19,14 @@ backfill: replay: docker: snapshot: - snapshot_name: "snapshot_2023_01_01" + snapshot_name: "rfs-snapshot" fs: - repo_path: "/snapshot/test-console" - otel_endpoint: "http://otel-collector:4317" + repo_path: "/storage/snapshot" + otel_endpoint: "http://localhost:4317" metadata_migration: from_snapshot: min_replicas: 0 - otel_endpoint: "http://otel-collector:4317" + otel_endpoint: "http://localhost:4317" kafka: broker_endpoints: "kafka:9092" standard: "" diff --git a/deployment/k8/buildDockerImagesMini.sh b/deployment/k8/buildDockerImagesMini.sh new file mode 100755 index 000000000..b520a03b4 --- /dev/null +++ b/deployment/k8/buildDockerImagesMini.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Allow executing this script from any dir +script_abs_path=$(readlink -f "$0") +script_dir_abs_path=$(dirname "$script_abs_path") +cd "$script_dir_abs_path" || exit + +cd ../.. || exit + +eval $(minikube docker-env) +./gradlew :buildDockerImages -x test diff --git a/deployment/k8/capture-proxy/values.yaml b/deployment/k8/capture-proxy/values.yaml index 1e729ae6b..62ac40a94 100644 --- a/deployment/k8/capture-proxy/values.yaml +++ b/deployment/k8/capture-proxy/values.yaml @@ -11,11 +11,11 @@ image: service: type: LoadBalancer - port: 9200 # Port exposed to external + port: 9201 # Port exposed to external targetPort: 9200 # Container port container: - command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka:9092 --destinationUri https://elasticsearch:9200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://otel-collector:4317" + command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka:9092 --destinationUri https://elasticsearch:19200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://localhost:4317" resources: limits: diff --git a/deployment/k8/elasticsearch/templates/deployment.yml b/deployment/k8/elasticsearch/templates/deployment.yml deleted file mode 100644 index 546b1fcf2..000000000 --- a/deployment/k8/elasticsearch/templates/deployment.yml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app: {{ .Chart.Name }} - template: - metadata: - labels: - app: {{ .Chart.Name }} - spec: - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.service.targetPort }} diff --git a/deployment/k8/elasticsearch/templates/pvc.yml b/deployment/k8/elasticsearch/templates/pvc.yml new file mode 100644 index 000000000..0c4371864 --- /dev/null +++ b/deployment/k8/elasticsearch/templates/pvc.yml @@ -0,0 +1,15 @@ +{{- if .Values.snapshotVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.snapshotVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.snapshotVolume.accessMode }} + resources: + requests: + storage: {{ .Values.snapshotVolume.size }} + {{- if .Values.snapshotVolume.storageClass }} + storageClassName: {{ .Values.snapshotVolume.storageClass }} + {{- end }} +{{- end }} diff --git a/deployment/k8/elasticsearch/templates/statefulset.yml b/deployment/k8/elasticsearch/templates/statefulset.yml new file mode 100644 index 000000000..f5c84d74d --- /dev/null +++ b/deployment/k8/elasticsearch/templates/statefulset.yml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: {{ .Values.service.targetPort }} + # Load all env variables + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key }} + value: {{ $value | quote }} + {{- end }} + volumeMounts: + - name: {{ .Values.snapshotVolume.volumeName }} + mountPath: {{ .Values.snapshotVolume.mountPath }} + volumes: + - name: {{ .Values.snapshotVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.snapshotVolume.pvcClaimName }} +# TODO Add PVC diff --git a/deployment/k8/elasticsearch/values.yaml b/deployment/k8/elasticsearch/values.yaml index 445334281..eebe4dde4 100644 --- a/deployment/k8/elasticsearch/values.yaml +++ b/deployment/k8/elasticsearch/values.yaml @@ -11,7 +11,7 @@ image: service: type: LoadBalancer - port: 9200 # Port exposed to external + port: 19200 # Port exposed to external targetPort: 9200 # Container port resources: @@ -21,3 +21,16 @@ resources: requests: cpu: 100m memory: 128Mi + +env: + path.repo: "/storage/snapshot" + +snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true + pvcClaimName: snapshot-vol-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi diff --git a/deployment/k8/environments/full-environment/Chart.lock b/deployment/k8/environments/full-environment/Chart.lock index 781059d74..17a71feb1 100644 --- a/deployment/k8/environments/full-environment/Chart.lock +++ b/deployment/k8/environments/full-environment/Chart.lock @@ -17,5 +17,8 @@ dependencies: - name: capture-proxy repository: file://../../capture-proxy version: 0.1.0 -digest: sha256:ba4897cb6b540a897d96e6af4dd497f9448940f16c29dcbefffb00b2db965682 -generated: "2024-10-14T14:41:22.84168-05:00" +- name: reindex-from-snapshot + repository: file://../../reindex-from-snapshot + version: 0.1.0 +digest: sha256:22e6f3906cac197c24acb27654f38c6e4e2abef6ae70077058093166c9f29264 +generated: "2024-10-15T13:08:09.729613-05:00" diff --git a/deployment/k8/environments/full-environment/Chart.yaml b/deployment/k8/environments/full-environment/Chart.yaml index dfc099ad8..f6e100fab 100644 --- a/deployment/k8/environments/full-environment/Chart.yaml +++ b/deployment/k8/environments/full-environment/Chart.yaml @@ -20,3 +20,6 @@ dependencies: - name: capture-proxy version: "0.1.0" repository: "file://../../capture-proxy" + - name: reindex-from-snapshot + version: "0.1.0" + repository: "file://../../reindex-from-snapshot" diff --git a/deployment/k8/environments/full-environment/values.yaml b/deployment/k8/environments/full-environment/values.yaml index 4a859e1ab..650e6b7aa 100644 --- a/deployment/k8/environments/full-environment/values.yaml +++ b/deployment/k8/environments/full-environment/values.yaml @@ -1,4 +1,13 @@ replayer: sharedLogVolume: - createPvc: false # Only want one service to create volume + createPvc: false # Only want one service to create volume, allowing Migration Console to do this +reindex-from-snapshot: + sharedLogVolume: + createPvc: false # Only want one service to create volume, allowing Migration Console to do this + snapshotVolume: + createPvc: false # Only want one service to create volume, allowing Migration Console to do this + +elasticsearch: + snapshotVolume: + createPvc: false # Only want one service to create volume, allowing Migration Console to do this diff --git a/deployment/k8/localSetupMini.sh b/deployment/k8/localSetupMini.sh new file mode 100755 index 000000000..3ba01a049 --- /dev/null +++ b/deployment/k8/localSetupMini.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# To have running during local development + +# Allow executing this script from any dir +script_abs_path=$(readlink -f "$0") +script_dir_abs_path=$(dirname "$script_abs_path") +cd "$script_dir_abs_path" || exit + +cd ../.. || exit + +minikube mount .:/opensearch-migrations > /dev/null 2>&1 & +minikube tunnel > /dev/null 2>&1 & diff --git a/deployment/k8/migration-console/templates/deployment.yml b/deployment/k8/migration-console/templates/deployment.yml index 9b2da1b2d..ae756fbb5 100644 --- a/deployment/k8/migration-console/templates/deployment.yml +++ b/deployment/k8/migration-console/templates/deployment.yml @@ -29,6 +29,8 @@ spec: mountPath: {{ .Values.sharedLogVolume.mountPath }} - name: services-yaml-file mountPath: {{ .Values.servicesYamlVolume.mountPath }} + - name: {{ .Values.snapshotVolume.volumeName }} + mountPath: {{ .Values.snapshotVolume.mountPath }} {{- if .Values.otelCollectorSidecar.enabled }} initContainers: - name: {{ .Values.otelCollectorSidecar.name}} @@ -56,3 +58,6 @@ spec: hostPath: path: {{ .Values.servicesYamlVolume.path }} type: File + - name: {{ .Values.snapshotVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.snapshotVolume.pvcClaimName }} diff --git a/deployment/k8/migration-console/templates/pvc.yml b/deployment/k8/migration-console/templates/pvc.yml index 31c5d69f2..b6caf6ef6 100644 --- a/deployment/k8/migration-console/templates/pvc.yml +++ b/deployment/k8/migration-console/templates/pvc.yml @@ -13,3 +13,20 @@ spec: storageClassName: {{ .Values.sharedLogVolume.storageClass }} {{- end }} {{- end }} + +--- +{{- if .Values.snapshotVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.snapshotVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.snapshotVolume.accessMode }} + resources: + requests: + storage: {{ .Values.snapshotVolume.size }} + {{- if .Values.snapshotVolume.storageClass }} + storageClassName: {{ .Values.snapshotVolume.storageClass }} + {{- end }} +{{- end }} diff --git a/deployment/k8/migration-console/values.yaml b/deployment/k8/migration-console/values.yaml index a8ecf105f..46e9d731b 100644 --- a/deployment/k8/migration-console/values.yaml +++ b/deployment/k8/migration-console/values.yaml @@ -35,9 +35,20 @@ sharedLogVolume: accessMode: ReadWriteOnce size: 10Gi +snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true + pvcClaimName: snapshot-vol-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi + + otelCollectorSidecar: name: otel-collector - enabled: false + enabled: true restartPolicy: "Always" #command: "--config=/etc/otel-config-debug-only.yaml" #command: "--config=/etc/otel-config-aws.yaml" diff --git a/deployment/k8/opensearch-helm/values.yaml b/deployment/k8/opensearch-helm/values.yaml index ce5d7d384..e79669d6f 100644 --- a/deployment/k8/opensearch-helm/values.yaml +++ b/deployment/k8/opensearch-helm/values.yaml @@ -6,7 +6,6 @@ opensearch-local: singleNode: true config: discovery.type: single-node -# httpPort: 29200 extraEnvs: - name: OPENSEARCH_INITIAL_ADMIN_PASSWORD value: myStrongPassword123! @@ -14,8 +13,5 @@ opensearch-local: # value: "29200" service: type: LoadBalancer - ports: - - name: http - port: 9200 - protocol: TCP - targetPort: 9200 +# httpPort: 29200 +# httpHostPort: 29200 diff --git a/deployment/k8/reindex-from-snapshot/.helmignore b/deployment/k8/reindex-from-snapshot/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/reindex-from-snapshot/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/reindex-from-snapshot/Chart.yaml b/deployment/k8/reindex-from-snapshot/Chart.yaml new file mode 100644 index 000000000..77280ac1a --- /dev/null +++ b/deployment/k8/reindex-from-snapshot/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: reindex-from-snapshot +description: A Helm chart to install Reindex-from-Snapshot (RFS) +type: application +version: 0.1.0 +appVersion: "1.16.0" diff --git a/deployment/k8/reindex-from-snapshot/templates/deployment.yml b/deployment/k8/reindex-from-snapshot/templates/deployment.yml new file mode 100644 index 000000000..1fe59eafa --- /dev/null +++ b/deployment/k8/reindex-from-snapshot/templates/deployment.yml @@ -0,0 +1,61 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + parallelism: 0 + completions: 1000 # Temporary until direction decided here + ttlSecondsAfterFinished: 30 # Clean up finished Jobs (either Complete or Failed) automatically after this time + template: + metadata: + labels: + app: {{ .Chart.Name }} + spec: + restartPolicy: Never + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.container.command }}" + # Load all env variables + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key }} + value: {{ $value | quote }} + {{- end }} + volumeMounts: + - name: {{ .Values.sharedLogVolume.volumeName }} + mountPath: {{ .Values.sharedLogVolume.mountPath }} + - name: {{ .Values.snapshotVolume.volumeName }} + mountPath: {{ .Values.snapshotVolume.mountPath }} + {{- if .Values.otelCollectorSidecar.enabled }} + initContainers: + - name: {{ .Values.otelCollectorSidecar.name}} + image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" + imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} + ports: + {{- range .Values.otelCollectorSidecar.ports }} + - name: {{ .name }} + containerPort: {{ .containerPort }} + protocol: {{ .protocol | default "TCP" }} + {{- end }} + restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} + {{- if .Values.otelCollectorSidecar.command }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.otelCollectorSidecar.command }}" + {{- end }} + {{- end }} + volumes: + - name: {{ .Values.sharedLogVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.sharedLogVolume.pvcClaimName }} + - name: {{ .Values.snapshotVolume.volumeName }} + persistentVolumeClaim: + claimName: {{ .Values.snapshotVolume.pvcClaimName }} diff --git a/deployment/k8/reindex-from-snapshot/templates/pvc.yml b/deployment/k8/reindex-from-snapshot/templates/pvc.yml new file mode 100644 index 000000000..b6caf6ef6 --- /dev/null +++ b/deployment/k8/reindex-from-snapshot/templates/pvc.yml @@ -0,0 +1,32 @@ +{{- if .Values.sharedLogVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.sharedLogVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.sharedLogVolume.accessMode }} + resources: + requests: + storage: {{ .Values.sharedLogVolume.size }} + {{- if .Values.sharedLogVolume.storageClass }} + storageClassName: {{ .Values.sharedLogVolume.storageClass }} + {{- end }} +{{- end }} + +--- +{{- if .Values.snapshotVolume.createPvc }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.snapshotVolume.pvcClaimName }} +spec: + accessModes: + - {{ .Values.snapshotVolume.accessMode }} + resources: + requests: + storage: {{ .Values.snapshotVolume.size }} + {{- if .Values.snapshotVolume.storageClass }} + storageClassName: {{ .Values.snapshotVolume.storageClass }} + {{- end }} +{{- end }} diff --git a/deployment/k8/reindex-from-snapshot/values.yaml b/deployment/k8/reindex-from-snapshot/values.yaml new file mode 100644 index 000000000..acef18f22 --- /dev/null +++ b/deployment/k8/reindex-from-snapshot/values.yaml @@ -0,0 +1,78 @@ +# Default values for reindex-from-snapshot. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 0 + +image: + repository: migrations/reindex_from_snapshot + pullPolicy: IfNotPresent + tag: "latest" + +container: + command: > + /rfs-app/runJavaWithClasspath.sh org.opensearch.migrations.RfsMigrateDocuments + --snapshot-local-dir /storage/snapshot + --snapshot-name rfs-snapshot + --lucene-dir /storage/lucene + --target-host https://opensearch-cluster-master:9200 + --target-username admin + --target-password myStrongPassword123! + --target-insecure + --max-shard-size-bytes 85899345920 + --otel-collector-endpoint http://localhost:4317 + +resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + +env: + SHARED_LOGS_DIR_PATH: /shared-logs-output/reindex-from-snapshot-default + +otelCollectorSidecar: + name: otel-collector + enabled: true + restartPolicy: "Always" + #command: "--config=/etc/otel-config-debug-only.yaml" + #command: "--config=/etc/otel-config-aws.yaml" + image: + repository: migrations/otel_collector + pullPolicy: IfNotPresent + tag: "latest" + ports: + - name: pprof + containerPort: 1888 + protocol: TCP + - name: health-check + containerPort: 13133 + protocol: TCP + - name: zpages + containerPort: 55679 + protocol: TCP + - name: otlp-receiver + containerPort: 4317 + protocol: TCP + +sharedLogVolume: + volumeName: shared-logs + mountPath: /shared-logs-output # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true # This should only be created once and shared between services + pvcClaimName: shared-logs-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 10Gi + +snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + # Persistent volume claim settings + createPvc: true + pvcClaimName: snapshot-vol-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi diff --git a/deployment/k8/replayer/values.yaml b/deployment/k8/replayer/values.yaml index e1185880b..a5816507e 100644 --- a/deployment/k8/replayer/values.yaml +++ b/deployment/k8/replayer/values.yaml @@ -2,7 +2,7 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 1 +replicaCount: 0 image: repository: migrations/traffic_replayer @@ -10,7 +10,16 @@ image: tag: "latest" container: - command: "/runJavaWithClasspath.sh org.opensearch.migrations.replay.TrafficReplayer --speedup-factor 2 https://opensearch-cluster-master:9200 --auth-header-value Basic\\\\ YWRtaW46bXlTdHJvbmdQYXNzd29yZDEyMyE= --insecure --kafka-traffic-brokers kafka:9092 --kafka-traffic-topic logging-traffic-topic --kafka-traffic-group-id logging-group-default --otelCollectorEndpoint http://localhost:4317" + command: > + /runJavaWithClasspath.sh org.opensearch.migrations.replay.TrafficReplayer + --speedup-factor 2 + https://opensearch-cluster-master:9200 + --auth-header-value Basic\\\\ YWRtaW46bXlTdHJvbmdQYXNzd29yZDEyMyE= + --insecure + --kafka-traffic-brokers kafka:9092 + --kafka-traffic-topic logging-traffic-topic + --kafka-traffic-group-id logging-group-default + --otelCollectorEndpoint http://localhost:4317 resources: limits: From 8054cdc5635b11468ef0d091976560c428fbd13b Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Wed, 16 Oct 2024 17:30:58 -0500 Subject: [PATCH 06/11] Swap out to use Kafka operator Signed-off-by: Tanner Lewis --- .../lib/console_link/services.yaml | 2 +- deployment/k8/capture-proxy/values.yaml | 2 +- .../environments/full-environment/Chart.lock | 8 +-- .../environments/full-environment/Chart.yaml | 4 +- deployment/k8/kafka-helm/Chart.lock | 6 -- deployment/k8/kafka-helm/Chart.yaml | 8 --- deployment/k8/kafka-helm/values.yaml | 5 -- deployment/k8/{kafka => kafka-op}/.helmignore | 0 deployment/k8/kafka-op/Chart.lock | 6 ++ deployment/k8/kafka-op/Chart.yaml | 9 +++ .../kafka-op/templates/kafka-single-node.yaml | 51 ++++++++++++++++ deployment/k8/kafka-op/values.yaml | 38 ++++++++++++ deployment/k8/kafka/Chart.yaml | 6 -- deployment/k8/kafka/templates/deployment.yml | 28 --------- deployment/k8/kafka/templates/service.yml | 13 ----- deployment/k8/kafka/values.yaml | 58 ------------------- 16 files changed, 112 insertions(+), 132 deletions(-) delete mode 100644 deployment/k8/kafka-helm/Chart.lock delete mode 100644 deployment/k8/kafka-helm/Chart.yaml delete mode 100644 deployment/k8/kafka-helm/values.yaml rename deployment/k8/{kafka => kafka-op}/.helmignore (100%) create mode 100644 deployment/k8/kafka-op/Chart.lock create mode 100644 deployment/k8/kafka-op/Chart.yaml create mode 100644 deployment/k8/kafka-op/templates/kafka-single-node.yaml create mode 100644 deployment/k8/kafka-op/values.yaml delete mode 100644 deployment/k8/kafka/Chart.yaml delete mode 100644 deployment/k8/kafka/templates/deployment.yml delete mode 100644 deployment/k8/kafka/templates/service.yml delete mode 100644 deployment/k8/kafka/values.yaml diff --git a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml index e1be04aee..73ac242a0 100644 --- a/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml +++ b/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml @@ -28,5 +28,5 @@ metadata_migration: min_replicas: 0 otel_endpoint: "http://localhost:4317" kafka: - broker_endpoints: "kafka:9092" + broker_endpoints: "kafka-cluster-kafka-bootstrap:9092" standard: "" diff --git a/deployment/k8/capture-proxy/values.yaml b/deployment/k8/capture-proxy/values.yaml index 62ac40a94..b346a5794 100644 --- a/deployment/k8/capture-proxy/values.yaml +++ b/deployment/k8/capture-proxy/values.yaml @@ -15,7 +15,7 @@ service: targetPort: 9200 # Container port container: - command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka:9092 --destinationUri https://elasticsearch:19200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://localhost:4317" + command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka-cluster-kafka-bootstrap:9092 --destinationUri https://elasticsearch:19200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://localhost:4317" resources: limits: diff --git a/deployment/k8/environments/full-environment/Chart.lock b/deployment/k8/environments/full-environment/Chart.lock index 17a71feb1..52d3af6d5 100644 --- a/deployment/k8/environments/full-environment/Chart.lock +++ b/deployment/k8/environments/full-environment/Chart.lock @@ -5,8 +5,8 @@ dependencies: - name: opensearch-helm repository: file://../../opensearch-helm version: 0.1.0 -- name: kafka-helm - repository: file://../../kafka-helm +- name: kafka-op + repository: file://../../kafka-op version: 0.1.0 - name: migration-console repository: file://../../migration-console @@ -20,5 +20,5 @@ dependencies: - name: reindex-from-snapshot repository: file://../../reindex-from-snapshot version: 0.1.0 -digest: sha256:22e6f3906cac197c24acb27654f38c6e4e2abef6ae70077058093166c9f29264 -generated: "2024-10-15T13:08:09.729613-05:00" +digest: sha256:f150a39fb9de82b31d6dcf1c56c6469e206dd24412de5a12d8183c365f7c2738 +generated: "2024-10-16T17:08:42.54601-05:00" diff --git a/deployment/k8/environments/full-environment/Chart.yaml b/deployment/k8/environments/full-environment/Chart.yaml index f6e100fab..2abb0b141 100644 --- a/deployment/k8/environments/full-environment/Chart.yaml +++ b/deployment/k8/environments/full-environment/Chart.yaml @@ -8,9 +8,9 @@ dependencies: - name: opensearch-helm version: "0.1.0" repository: "file://../../opensearch-helm" - - name: kafka-helm + - name: kafka-op version: "0.1.0" - repository: "file://../../kafka-helm" + repository: "file://../../kafka-op" - name: migration-console version: "0.1.0" repository: "file://../../migration-console" diff --git a/deployment/k8/kafka-helm/Chart.lock b/deployment/k8/kafka-helm/Chart.lock deleted file mode 100644 index f4f841f02..000000000 --- a/deployment/k8/kafka-helm/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: kafka - repository: https://charts.bitnami.com/bitnami - version: 22.0.3 -digest: sha256:473bf27a08dcb9580852b80a49ea1a76b3ae2c9c6a29328527d9f4d6afb4b319 -generated: "2024-10-11T20:17:36.485988-05:00" diff --git a/deployment/k8/kafka-helm/Chart.yaml b/deployment/k8/kafka-helm/Chart.yaml deleted file mode 100644 index 559a84947..000000000 --- a/deployment/k8/kafka-helm/Chart.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v2 -name: kafka-helm -version: 0.1.0 -dependencies: - - name: kafka - version: "22.0.3" - repository: https://charts.bitnami.com/bitnami - alias: kafka-local diff --git a/deployment/k8/kafka-helm/values.yaml b/deployment/k8/kafka-helm/values.yaml deleted file mode 100644 index 96800b3d1..000000000 --- a/deployment/k8/kafka-helm/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kafka-local: - fullnameOverride: "kafka" - image: - tag: "3.7.0" - replicaCount: 1 diff --git a/deployment/k8/kafka/.helmignore b/deployment/k8/kafka-op/.helmignore similarity index 100% rename from deployment/k8/kafka/.helmignore rename to deployment/k8/kafka-op/.helmignore diff --git a/deployment/k8/kafka-op/Chart.lock b/deployment/k8/kafka-op/Chart.lock new file mode 100644 index 000000000..9f5fd2841 --- /dev/null +++ b/deployment/k8/kafka-op/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: strimzi-kafka-operator + repository: https://strimzi.io/charts/ + version: 0.43.0 +digest: sha256:611b2dcc843c4a467cc02b65cffc0dff21c0bc60a21ead527ed4205c8efff75c +generated: "2024-10-16T15:55:13.511653-05:00" diff --git a/deployment/k8/kafka-op/Chart.yaml b/deployment/k8/kafka-op/Chart.yaml new file mode 100644 index 000000000..5377e52a3 --- /dev/null +++ b/deployment/k8/kafka-op/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: kafka-op +description: A Helm chart for deploying Strimzi Kafka Operator and Kafka Cluster +version: 0.1.0 +appVersion: "3.5.0" +dependencies: + - name: strimzi-kafka-operator + version: 0.43.0 + repository: https://strimzi.io/charts/ diff --git a/deployment/k8/kafka-op/templates/kafka-single-node.yaml b/deployment/k8/kafka-op/templates/kafka-single-node.yaml new file mode 100644 index 000000000..018ba3090 --- /dev/null +++ b/deployment/k8/kafka-op/templates/kafka-single-node.yaml @@ -0,0 +1,51 @@ +#https://github.com/strimzi/strimzi-kafka-operator/blob/release-0.43.x/examples/kafka/kraft/kafka-single-node.yaml +apiVersion: kafka.strimzi.io/v1beta2 +kind: KafkaNodePool +metadata: + name: dual-role + labels: + strimzi.io/cluster: kafka-cluster +spec: + replicas: 1 + roles: + - controller + - broker + storage: + type: jbod + volumes: + - id: 0 + type: persistent-claim + size: 10Gi + deleteClaim: true + kraftMetadata: shared +--- + +apiVersion: kafka.strimzi.io/v1beta2 +kind: Kafka +metadata: + name: kafka-cluster + annotations: + strimzi.io/node-pools: enabled + strimzi.io/kraft: enabled +spec: + kafka: + version: 3.8.0 + metadataVersion: 3.8-IV0 + listeners: + - name: plain + port: 9092 + type: internal + tls: false + - name: tls + port: 9093 + type: internal + tls: true + config: + offsets.topic.replication.factor: 1 + transaction.state.log.replication.factor: 1 + transaction.state.log.min.isr: 1 + default.replication.factor: 1 + min.insync.replicas: 1 + entityOperator: + topicOperator: {} + userOperator: {} diff --git a/deployment/k8/kafka-op/values.yaml b/deployment/k8/kafka-op/values.yaml new file mode 100644 index 000000000..01cce5cc2 --- /dev/null +++ b/deployment/k8/kafka-op/values.yaml @@ -0,0 +1,38 @@ +# Configuration for Strimzi Kafka Operator +#strimzi-kafka-operator: +# You can add operator-specific configurations here if needed +# For example, enabling metrics, RBAC settings, etc. + +## Configuration for the Kafka Cluster +#kafka: +# name: kafka-cluster +# version: "3.6.0" # Kafka version supporting KRaft +# replicas: 1 +# config: +# processRoles: "broker,controller" +# nodeId: 1 +# controllerQuorumVoters: "1@kafka-cluster-0.kafka-cluster-bootstrap:9093" +# interBrokerProtocolVersion: "3.5" +# logMessageFormatVersion: "3.5" +# autoCreateTopicsEnable: "true" +# storage: +# type: "ephemeral" # Use "persistent-claim" for persistent storage +# size: "20Gi" +# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class +# deleteClaim: false +# +## Configuration for the Controller +#controller: +# replicas: 1 +# resources: +# limits: +# memory: "2Gi" +# cpu: "1000m" +# requests: +# memory: "1Gi" +# cpu: "500m" +# storage: +# type: "ephemeral" # Use "persistent-claim" for persistent storage +# size: "10Gi" +# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class +# deleteClaim: false diff --git a/deployment/k8/kafka/Chart.yaml b/deployment/k8/kafka/Chart.yaml deleted file mode 100644 index ab9550ebf..000000000 --- a/deployment/k8/kafka/Chart.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: v2 -name: kafka -description: A Helm chart to install Kafka -type: application -version: 0.1.0 -appVersion: "1.16.0" diff --git a/deployment/k8/kafka/templates/deployment.yml b/deployment/k8/kafka/templates/deployment.yml deleted file mode 100644 index 381d07ffa..000000000 --- a/deployment/k8/kafka/templates/deployment.yml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app: {{ .Chart.Name }} - template: - metadata: - labels: - app: {{ .Chart.Name }} - spec: - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - containerPort: {{ .Values.service.port }} - # Load all env variables - env: - {{- range $key, $value := .Values.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} diff --git a/deployment/k8/kafka/templates/service.yml b/deployment/k8/kafka/templates/service.yml deleted file mode 100644 index fe7bb8c7b..000000000 --- a/deployment/k8/kafka/templates/service.yml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: {{ .Values.service.port }} - selector: - app: {{ .Chart.Name }} diff --git a/deployment/k8/kafka/values.yaml b/deployment/k8/kafka/values.yaml deleted file mode 100644 index f31cf945a..000000000 --- a/deployment/k8/kafka/values.yaml +++ /dev/null @@ -1,58 +0,0 @@ -# Default values for kafka. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: docker.io/apache/kafka - pullPolicy: IfNotPresent - tag: "3.7.0" - -service: - # This makes the service available only within the cluster - type: ClusterIP - port: 9092 - -resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - -env: - KAFKA_NODE_ID: 1 - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - KAFKA_ADVERTISED_LISTENERS: PLAINTEXT_HOST://kafka:9092,PLAINTEXT://kafka:19092 - KAFKA_PROCESS_ROLES: broker,controller - KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:29093 - KAFKA_LISTENERS: CONTROLLER://:29093,PLAINTEXT_HOST://:9092,PLAINTEXT://:19092 - KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT - KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER - CLUSTER_ID: 4L6g3nShT-eMCtK--X86sw - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 - KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 - KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 - KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 - KAFKA_LOG_DIRS: /tmp/kraft-combined-logs - -# Additional volumes on the output Deployment definition. -volumes: [] -# - name: foo -# secret: -# secretName: mysecret -# optional: false - -# Additional volumeMounts on the output Deployment definition. -volumeMounts: [] -# - name: foo -# mountPath: "/etc/foo" -# readOnly: true - -nodeSelector: {} - -tolerations: [] - -affinity: {} From 53057aeb4185d2f5ffad3ea7d40d4be2c55a1740 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Thu, 17 Oct 2024 14:13:21 -0500 Subject: [PATCH 07/11] Add opensearch operator (not working) Signed-off-by: Tanner Lewis --- deployment/k8/localSetupMini.sh | 3 ++ deployment/k8/opensearch-op/Chart.lock | 6 ++++ deployment/k8/opensearch-op/Chart.yaml | 9 +++++ .../k8/opensearch-op/templates/cluster.yaml | 35 +++++++++++++++++++ deployment/k8/opensearch-op/values.yaml | 17 +++++++++ 5 files changed, 70 insertions(+) create mode 100644 deployment/k8/opensearch-op/Chart.lock create mode 100644 deployment/k8/opensearch-op/Chart.yaml create mode 100644 deployment/k8/opensearch-op/templates/cluster.yaml create mode 100644 deployment/k8/opensearch-op/values.yaml diff --git a/deployment/k8/localSetupMini.sh b/deployment/k8/localSetupMini.sh index 3ba01a049..f41191ab6 100755 --- a/deployment/k8/localSetupMini.sh +++ b/deployment/k8/localSetupMini.sh @@ -9,5 +9,8 @@ cd "$script_dir_abs_path" || exit cd ../.. || exit +helm repo add opensearch-operator https://opensearch-project.github.io/opensearch-k8s-operator/ +helm repo add strimzi https://strimzi.io/charts/ + minikube mount .:/opensearch-migrations > /dev/null 2>&1 & minikube tunnel > /dev/null 2>&1 & diff --git a/deployment/k8/opensearch-op/Chart.lock b/deployment/k8/opensearch-op/Chart.lock new file mode 100644 index 000000000..b4e6436f1 --- /dev/null +++ b/deployment/k8/opensearch-op/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: opensearch-operator + repository: https://opensearch-project.github.io/opensearch-k8s-operator/ + version: 2.6.1 +digest: sha256:62728764536868eee48c3429d94cd97836826a4291490e88a4e69db1671f4cc0 +generated: "2024-10-16T17:47:25.36192-05:00" diff --git a/deployment/k8/opensearch-op/Chart.yaml b/deployment/k8/opensearch-op/Chart.yaml new file mode 100644 index 000000000..ed65c4d13 --- /dev/null +++ b/deployment/k8/opensearch-op/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: opensearch-op +description: A Helm chart for deploying OpenSearch Operator and OpenSearch cluster +appVersion: "3.5.0" +version: 0.1.0 +dependencies: + - name: opensearch-operator + version: 2.6.1 + repository: "https://opensearch-project.github.io/opensearch-k8s-operator/" diff --git a/deployment/k8/opensearch-op/templates/cluster.yaml b/deployment/k8/opensearch-op/templates/cluster.yaml new file mode 100644 index 000000000..99ba2009d --- /dev/null +++ b/deployment/k8/opensearch-op/templates/cluster.yaml @@ -0,0 +1,35 @@ +apiVersion: opensearch.opster.io/v1 +kind: OpenSearchCluster +metadata: + name: my-first-cluster + namespace: default +spec: + general: + serviceName: my-first-cluster + version: 2.3.0 + dashboards: + enable: false + version: 2.3.0 + replicas: 1 + resources: + requests: + memory: "512Mi" + cpu: "200m" + limits: + memory: "512Mi" + cpu: "200m" + nodePools: + - component: nodes + replicas: 3 + diskSize: "5Gi" + nodeSelector: + resources: + requests: + memory: "2Gi" + cpu: "500m" + limits: + memory: "2Gi" + cpu: "500m" + roles: + - "cluster_manager" + - "data" diff --git a/deployment/k8/opensearch-op/values.yaml b/deployment/k8/opensearch-op/values.yaml new file mode 100644 index 000000000..81567468f --- /dev/null +++ b/deployment/k8/opensearch-op/values.yaml @@ -0,0 +1,17 @@ +#opensearch-local: +# fullnameOverride: "target-cluster" +# image: +# tag: "2.17.0" +# replicas: 1 +# singleNode: true +# config: +# discovery.type: single-node +# extraEnvs: +# - name: OPENSEARCH_INITIAL_ADMIN_PASSWORD +# value: myStrongPassword123! +## - name: http.port +## value: "29200" +# service: +# type: LoadBalancer +## httpPort: 29200 +## httpHostPort: 29200 From 861401418aa3cd913863599d19f187ffcc8138ed Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Sat, 19 Oct 2024 21:10:07 -0500 Subject: [PATCH 08/11] Checkpoint after moving to shared volume charts, otel collector in shared library WIP Signed-off-by: Tanner Lewis --- .../k8/aws/ack-resource-setup/.helmignore | 23 +++ .../k8/aws/ack-resource-setup/Chart.yaml | 9 ++ .../templates/kafka-single-node.yaml | 51 +++++++ .../k8/aws/ack-resource-setup/values.yaml | 38 +++++ .../k8/capture-proxy/templates/deployment.yml | 7 +- deployment/k8/capture-proxy/values.yaml | 10 +- deployment/k8/elasticsearch/values.yaml | 5 - .../environments/full-environment/Chart.lock | 10 +- .../environments/full-environment/Chart.yaml | 15 ++ deployment/k8/grafana/Chart.lock | 6 + deployment/k8/grafana/Chart.yaml | 9 ++ .../k8/grafana/templates/configmap.yaml | 136 ++++++++++++++++++ deployment/k8/grafana/values.yaml | 40 ++++++ deployment/k8/jaeger/Chart.lock | 6 + deployment/k8/jaeger/Chart.yaml | 9 ++ deployment/k8/jaeger/values.yaml | 13 ++ deployment/k8/localSetupMini.sh | 16 --- deployment/k8/migration-console/Chart.lock | 6 + deployment/k8/migration-console/Chart.yaml | 6 + .../templates/deployment.yml | 20 +-- .../k8/migration-console/templates/pvc.yml | 32 ----- deployment/k8/migration-console/values.yaml | 35 +---- deployment/k8/migrations-lib/.helmignore | 23 +++ deployment/k8/migrations-lib/Chart.yaml | 5 + .../templates/_otel-collector.yml | 15 ++ deployment/k8/migrations-lib/values.yaml | 28 ++++ deployment/k8/minikubeTool.sh | 68 +++++++++ deployment/k8/prometheus/Chart.lock | 6 + deployment/k8/prometheus/Chart.yaml | 9 ++ deployment/k8/prometheus/values.yaml | 1 + .../templates/{deployment.yml => job.yml} | 9 +- .../reindex-from-snapshot/templates/pvc.yml | 32 ----- .../k8/reindex-from-snapshot/values.yaml | 22 ++- .../k8/replayer/templates/deployment.yml | 7 +- deployment/k8/replayer/values.yaml | 15 +- .../k8/shared/shared-logs-vol/.helmignore | 23 +++ .../k8/shared/shared-logs-vol/Chart.yaml | 6 + .../shared-logs-vol}/templates/pvc.yml | 2 - .../k8/shared/shared-logs-vol/values.yaml | 8 ++ deployment/k8/shared/snapshot-vol/.helmignore | 23 +++ deployment/k8/shared/snapshot-vol/Chart.yaml | 6 + .../snapshot-vol}/templates/pvc.yml | 2 - deployment/k8/shared/snapshot-vol/values.yaml | 8 ++ 43 files changed, 638 insertions(+), 182 deletions(-) create mode 100644 deployment/k8/aws/ack-resource-setup/.helmignore create mode 100644 deployment/k8/aws/ack-resource-setup/Chart.yaml create mode 100644 deployment/k8/aws/ack-resource-setup/templates/kafka-single-node.yaml create mode 100644 deployment/k8/aws/ack-resource-setup/values.yaml create mode 100644 deployment/k8/grafana/Chart.lock create mode 100644 deployment/k8/grafana/Chart.yaml create mode 100644 deployment/k8/grafana/templates/configmap.yaml create mode 100644 deployment/k8/grafana/values.yaml create mode 100644 deployment/k8/jaeger/Chart.lock create mode 100644 deployment/k8/jaeger/Chart.yaml create mode 100644 deployment/k8/jaeger/values.yaml delete mode 100755 deployment/k8/localSetupMini.sh create mode 100644 deployment/k8/migration-console/Chart.lock delete mode 100644 deployment/k8/migration-console/templates/pvc.yml create mode 100644 deployment/k8/migrations-lib/.helmignore create mode 100644 deployment/k8/migrations-lib/Chart.yaml create mode 100644 deployment/k8/migrations-lib/templates/_otel-collector.yml create mode 100644 deployment/k8/migrations-lib/values.yaml create mode 100755 deployment/k8/minikubeTool.sh create mode 100644 deployment/k8/prometheus/Chart.lock create mode 100644 deployment/k8/prometheus/Chart.yaml create mode 100644 deployment/k8/prometheus/values.yaml rename deployment/k8/reindex-from-snapshot/templates/{deployment.yml => job.yml} (91%) delete mode 100644 deployment/k8/reindex-from-snapshot/templates/pvc.yml create mode 100644 deployment/k8/shared/shared-logs-vol/.helmignore create mode 100644 deployment/k8/shared/shared-logs-vol/Chart.yaml rename deployment/k8/{replayer => shared/shared-logs-vol}/templates/pvc.yml (87%) create mode 100644 deployment/k8/shared/shared-logs-vol/values.yaml create mode 100644 deployment/k8/shared/snapshot-vol/.helmignore create mode 100644 deployment/k8/shared/snapshot-vol/Chart.yaml rename deployment/k8/{elasticsearch => shared/snapshot-vol}/templates/pvc.yml (87%) create mode 100644 deployment/k8/shared/snapshot-vol/values.yaml diff --git a/deployment/k8/aws/ack-resource-setup/.helmignore b/deployment/k8/aws/ack-resource-setup/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/aws/ack-resource-setup/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/aws/ack-resource-setup/Chart.yaml b/deployment/k8/aws/ack-resource-setup/Chart.yaml new file mode 100644 index 000000000..0a8045d46 --- /dev/null +++ b/deployment/k8/aws/ack-resource-setup/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: ack-resource-setup +description: A Helm chart for deploying required AWS resources for running the Migration Assistant +version: 0.1.0 +appVersion: "3.5.0" +dependencies: + - name: strimzi-kafka-operator + version: 0.43.0 + repository: https://strimzi.io/charts/ diff --git a/deployment/k8/aws/ack-resource-setup/templates/kafka-single-node.yaml b/deployment/k8/aws/ack-resource-setup/templates/kafka-single-node.yaml new file mode 100644 index 000000000..018ba3090 --- /dev/null +++ b/deployment/k8/aws/ack-resource-setup/templates/kafka-single-node.yaml @@ -0,0 +1,51 @@ +#https://github.com/strimzi/strimzi-kafka-operator/blob/release-0.43.x/examples/kafka/kraft/kafka-single-node.yaml +apiVersion: kafka.strimzi.io/v1beta2 +kind: KafkaNodePool +metadata: + name: dual-role + labels: + strimzi.io/cluster: kafka-cluster +spec: + replicas: 1 + roles: + - controller + - broker + storage: + type: jbod + volumes: + - id: 0 + type: persistent-claim + size: 10Gi + deleteClaim: true + kraftMetadata: shared +--- + +apiVersion: kafka.strimzi.io/v1beta2 +kind: Kafka +metadata: + name: kafka-cluster + annotations: + strimzi.io/node-pools: enabled + strimzi.io/kraft: enabled +spec: + kafka: + version: 3.8.0 + metadataVersion: 3.8-IV0 + listeners: + - name: plain + port: 9092 + type: internal + tls: false + - name: tls + port: 9093 + type: internal + tls: true + config: + offsets.topic.replication.factor: 1 + transaction.state.log.replication.factor: 1 + transaction.state.log.min.isr: 1 + default.replication.factor: 1 + min.insync.replicas: 1 + entityOperator: + topicOperator: {} + userOperator: {} diff --git a/deployment/k8/aws/ack-resource-setup/values.yaml b/deployment/k8/aws/ack-resource-setup/values.yaml new file mode 100644 index 000000000..01cce5cc2 --- /dev/null +++ b/deployment/k8/aws/ack-resource-setup/values.yaml @@ -0,0 +1,38 @@ +# Configuration for Strimzi Kafka Operator +#strimzi-kafka-operator: +# You can add operator-specific configurations here if needed +# For example, enabling metrics, RBAC settings, etc. + +## Configuration for the Kafka Cluster +#kafka: +# name: kafka-cluster +# version: "3.6.0" # Kafka version supporting KRaft +# replicas: 1 +# config: +# processRoles: "broker,controller" +# nodeId: 1 +# controllerQuorumVoters: "1@kafka-cluster-0.kafka-cluster-bootstrap:9093" +# interBrokerProtocolVersion: "3.5" +# logMessageFormatVersion: "3.5" +# autoCreateTopicsEnable: "true" +# storage: +# type: "ephemeral" # Use "persistent-claim" for persistent storage +# size: "20Gi" +# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class +# deleteClaim: false +# +## Configuration for the Controller +#controller: +# replicas: 1 +# resources: +# limits: +# memory: "2Gi" +# cpu: "1000m" +# requests: +# memory: "1Gi" +# cpu: "500m" +# storage: +# type: "ephemeral" # Use "persistent-claim" for persistent storage +# size: "10Gi" +# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class +# deleteClaim: false diff --git a/deployment/k8/capture-proxy/templates/deployment.yml b/deployment/k8/capture-proxy/templates/deployment.yml index ea666c8f7..ec5190224 100644 --- a/deployment/k8/capture-proxy/templates/deployment.yml +++ b/deployment/k8/capture-proxy/templates/deployment.yml @@ -40,10 +40,7 @@ spec: protocol: {{ .protocol | default "TCP" }} {{- end }} restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} - {{- if .Values.otelCollectorSidecar.command }} - command: - - "/bin/sh" - - "-c" - - "{{ .Values.otelCollectorSidecar.command }}" + {{- if .Values.otelCollectorSidecar.args }} + args: {{ .Values.otelCollectorSidecar.args }} {{- end }} {{- end }} diff --git a/deployment/k8/capture-proxy/values.yaml b/deployment/k8/capture-proxy/values.yaml index b346a5794..bf1986918 100644 --- a/deployment/k8/capture-proxy/values.yaml +++ b/deployment/k8/capture-proxy/values.yaml @@ -29,8 +29,8 @@ otelCollectorSidecar: name: otel-collector enabled: true restartPolicy: "Always" - #command: "--config=/etc/otel-config-debug-only.yaml" - #command: "--config=/etc/otel-config-aws.yaml" + #args: "--config=/etc/otel-config-debug-only.yaml" + #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] image: repository: migrations/otel_collector pullPolicy: IfNotPresent @@ -48,3 +48,9 @@ otelCollectorSidecar: - name: otlp-receiver containerPort: 4317 protocol: TCP +# - name: prom-metrics +# containerPort: 8888 +# protocol: TCP +# - name: prom-exporter +# containerPort: 8889 +# protocol: TCP diff --git a/deployment/k8/elasticsearch/values.yaml b/deployment/k8/elasticsearch/values.yaml index eebe4dde4..6b46a3ad3 100644 --- a/deployment/k8/elasticsearch/values.yaml +++ b/deployment/k8/elasticsearch/values.yaml @@ -28,9 +28,4 @@ env: snapshotVolume: volumeName: snapshot-vol mountPath: /storage # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true pvcClaimName: snapshot-vol-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi diff --git a/deployment/k8/environments/full-environment/Chart.lock b/deployment/k8/environments/full-environment/Chart.lock index 52d3af6d5..a3b4b73ee 100644 --- a/deployment/k8/environments/full-environment/Chart.lock +++ b/deployment/k8/environments/full-environment/Chart.lock @@ -20,5 +20,11 @@ dependencies: - name: reindex-from-snapshot repository: file://../../reindex-from-snapshot version: 0.1.0 -digest: sha256:f150a39fb9de82b31d6dcf1c56c6469e206dd24412de5a12d8183c365f7c2738 -generated: "2024-10-16T17:08:42.54601-05:00" +- name: shared-logs-vol + repository: file://../../shared/shared-logs-vol + version: 0.1.0 +- name: snapshot-vol + repository: file://../../shared/snapshot-vol + version: 0.1.0 +digest: sha256:3e79f502ad2dd012fbd9b3428374a310f2106026e0ab7feb7fd1ab1e6fd0e3f5 +generated: "2024-10-18T22:56:42.045426-05:00" diff --git a/deployment/k8/environments/full-environment/Chart.yaml b/deployment/k8/environments/full-environment/Chart.yaml index 2abb0b141..1b06104b5 100644 --- a/deployment/k8/environments/full-environment/Chart.yaml +++ b/deployment/k8/environments/full-environment/Chart.yaml @@ -23,3 +23,18 @@ dependencies: - name: reindex-from-snapshot version: "0.1.0" repository: "file://../../reindex-from-snapshot" + - name: shared-logs-vol + version: "0.1.0" + repository: "file://../../shared/shared-logs-vol" + - name: snapshot-vol + version: "0.1.0" + repository: "file://../../shared/snapshot-vol" +# - name: jaeger +# version: "0.1.0" +# repository: "file://../../jaeger" +# - name: prometheus +# version: "0.1.0" +# repository: "file://../../prometheus" +# - name: grafana +# version: "0.1.0" +# repository: "file://../../grafana" diff --git a/deployment/k8/grafana/Chart.lock b/deployment/k8/grafana/Chart.lock new file mode 100644 index 000000000..23e9f4fec --- /dev/null +++ b/deployment/k8/grafana/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: grafana + repository: https://grafana.github.io/helm-charts + version: 8.5.0 +digest: sha256:9a11b7ae0a252d66e7bb0db397b666f2a205f644aa0d0b2a79db35358e38015c +generated: "2024-10-17T23:02:18.615764-05:00" diff --git a/deployment/k8/grafana/Chart.yaml b/deployment/k8/grafana/Chart.yaml new file mode 100644 index 000000000..8ad83f9fe --- /dev/null +++ b/deployment/k8/grafana/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: grafana +description: A Helm chart for deploying Grafana +appVersion: "3.5.0" +version: 0.1.0 +dependencies: + - name: grafana + version: "8.5.0" + repository: "https://grafana.github.io/helm-charts" diff --git a/deployment/k8/grafana/templates/configmap.yaml b/deployment/k8/grafana/templates/configmap.yaml new file mode 100644 index 000000000..3de2b1bfa --- /dev/null +++ b/deployment/k8/grafana/templates/configmap.yaml @@ -0,0 +1,136 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: prometheus-metrics-dashboard + labels: + grafana_dashboard: "1" +data: + prometheus-metrics-dashboard.json: | + { + "id": null, + "title": "Prometheus Metrics Dashboard", + "tags": [], + "timezone": "browser", + "schemaVersion": 30, + "version": 1, + "refresh": "5s", + "panels": [ + { + "type": "graph", + "title": "CPU Usage", + "datasource": "Prometheus", + "targets": [ + { + "expr": "sum(rate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (instance)", + "legendFormat": "thing", + "refId": "A" + } + ], + "xaxis": { + "mode": "time" + }, + "yaxes": [ + { + "format": "percent", + "label": "CPU Usage" + } + ], + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + } + }, + { + "type": "graph", + "title": "Memory Usage", + "datasource": "Prometheus", + "targets": [ + { + "expr": "node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes", + "legendFormat": "Memory Usage", + "refId": "A" + } + ], + "xaxis": { + "mode": "time" + }, + "yaxes": [ + { + "format": "percent", + "label": "Memory Usage" + } + ], + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + } + }, + { + "type": "graph", + "title": "Disk I/O", + "datasource": "Prometheus", + "targets": [ + { + "expr": "rate(node_disk_io_time_seconds_total[5m])", + "legendFormat": "thing - thing2", + "refId": "A" + } + ], + "xaxis": { + "mode": "time" + }, + "yaxes": [ + { + "format": "s", + "label": "I/O Time" + } + ], + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 8 + } + }, + { + "type": "singlestat", + "title": "Total Requests", + "datasource": "Prometheus", + "targets": [ + { + "expr": "sum(rate(http_requests_total[5m]))", + "refId": "A" + } + ], + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 16 + }, + "format": "none" + }, + { + "type": "singlestat", + "title": "Up Time", + "datasource": "Prometheus", + "targets": [ + { + "expr": "time() - node_boot_time_seconds", + "refId": "A" + } + ], + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 16 + }, + "format": "s" + } + ] + } \ No newline at end of file diff --git a/deployment/k8/grafana/values.yaml b/deployment/k8/grafana/values.yaml new file mode 100644 index 000000000..4bc84f74b --- /dev/null +++ b/deployment/k8/grafana/values.yaml @@ -0,0 +1,40 @@ +grafana: + service: + type: LoadBalancer + port: 3000 + targetPort: 3000 + grafana.ini: + auth: + # Disable login form so anonymous users won't be prompted to log in + disable_login_form: true + auth.anonymous: + # Enable anonymous access + enabled: true + # Set the role for anonymous users (e.g., Viewer, Editor) + org_role: Editor + ## Grafana data sources configuration + datasources: + datasources.yaml: + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus-server + isDefault: true + editable: true + - name: Jaeger + type: jaeger + access: proxy + url: http://jaeger-query:16686 + isDefault: false + editable: true + + ## Set up the sidecar to import data sources (usually enabled by default) + sidecar: + datasources: + enabled: true + dashboards: + enabled: true + label: grafana_dashboard + diff --git a/deployment/k8/jaeger/Chart.lock b/deployment/k8/jaeger/Chart.lock new file mode 100644 index 000000000..1e746c04d --- /dev/null +++ b/deployment/k8/jaeger/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: jaeger + repository: https://jaegertracing.github.io/helm-charts + version: 3.2.0 +digest: sha256:41ac5fc4455e3fbdd08464f77e94d308ccab23dfde20a1c8f44b168bcbc38194 +generated: "2024-10-18T11:21:05.929732-05:00" diff --git a/deployment/k8/jaeger/Chart.yaml b/deployment/k8/jaeger/Chart.yaml new file mode 100644 index 000000000..ebfcc5be9 --- /dev/null +++ b/deployment/k8/jaeger/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: jaeger +description: A Helm chart for deploying Jaeger +appVersion: "3.5.0" +version: 0.1.0 +dependencies: + - name: jaeger + version: "3.2.0" + repository: "https://jaegertracing.github.io/helm-charts" diff --git a/deployment/k8/jaeger/values.yaml b/deployment/k8/jaeger/values.yaml new file mode 100644 index 000000000..f1658bb75 --- /dev/null +++ b/deployment/k8/jaeger/values.yaml @@ -0,0 +1,13 @@ +jaeger: + allInOne: + enabled: true + provisionDataStore: + cassandra: false + storage: + type: memory + agent: + enabled: false + collector: + enabled: false + query: + enabled: false diff --git a/deployment/k8/localSetupMini.sh b/deployment/k8/localSetupMini.sh deleted file mode 100755 index f41191ab6..000000000 --- a/deployment/k8/localSetupMini.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# To have running during local development - -# Allow executing this script from any dir -script_abs_path=$(readlink -f "$0") -script_dir_abs_path=$(dirname "$script_abs_path") -cd "$script_dir_abs_path" || exit - -cd ../.. || exit - -helm repo add opensearch-operator https://opensearch-project.github.io/opensearch-k8s-operator/ -helm repo add strimzi https://strimzi.io/charts/ - -minikube mount .:/opensearch-migrations > /dev/null 2>&1 & -minikube tunnel > /dev/null 2>&1 & diff --git a/deployment/k8/migration-console/Chart.lock b/deployment/k8/migration-console/Chart.lock new file mode 100644 index 000000000..1157df320 --- /dev/null +++ b/deployment/k8/migration-console/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: migrations-lib + repository: file://../migrations-lib + version: 0.1.0 +digest: sha256:16ba79c267bb045bbee80921a6d838f88f8bd9d4d7d2549b82ac700691a91236 +generated: "2024-10-19T00:23:01.6744-05:00" diff --git a/deployment/k8/migration-console/Chart.yaml b/deployment/k8/migration-console/Chart.yaml index 8acc01ea8..d97fe9a2e 100644 --- a/deployment/k8/migration-console/Chart.yaml +++ b/deployment/k8/migration-console/Chart.yaml @@ -4,3 +4,9 @@ description: A Helm chart to install the Migration Console type: application version: 0.1.0 appVersion: "1.16.0" +dependencies: + - name: migrations-lib + version: "0.1.0" + repository: "file://../migrations-lib" + import-values: + - "otelCollector" diff --git a/deployment/k8/migration-console/templates/deployment.yml b/deployment/k8/migration-console/templates/deployment.yml index ae756fbb5..69f03feb3 100644 --- a/deployment/k8/migration-console/templates/deployment.yml +++ b/deployment/k8/migration-console/templates/deployment.yml @@ -31,25 +31,7 @@ spec: mountPath: {{ .Values.servicesYamlVolume.mountPath }} - name: {{ .Values.snapshotVolume.volumeName }} mountPath: {{ .Values.snapshotVolume.mountPath }} - {{- if .Values.otelCollectorSidecar.enabled }} - initContainers: - - name: {{ .Values.otelCollectorSidecar.name}} - image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" - imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} - ports: - {{- range .Values.otelCollectorSidecar.ports }} - - name: {{ .name }} - containerPort: {{ .containerPort }} - protocol: {{ .protocol | default "TCP" }} - {{- end }} - restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} - {{- if .Values.otelCollectorSidecar.command }} - command: - - "/bin/sh" - - "-c" - - "{{ .Values.otelCollectorSidecar.command }}" - {{- end }} - {{- end }} + {{- include "migrations-lib.otel-sidecar" . | indent 8 }} volumes: - name: {{ .Values.sharedLogVolume.volumeName }} persistentVolumeClaim: diff --git a/deployment/k8/migration-console/templates/pvc.yml b/deployment/k8/migration-console/templates/pvc.yml deleted file mode 100644 index b6caf6ef6..000000000 --- a/deployment/k8/migration-console/templates/pvc.yml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.sharedLogVolume.createPvc }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.sharedLogVolume.pvcClaimName }} -spec: - accessModes: - - {{ .Values.sharedLogVolume.accessMode }} - resources: - requests: - storage: {{ .Values.sharedLogVolume.size }} - {{- if .Values.sharedLogVolume.storageClass }} - storageClassName: {{ .Values.sharedLogVolume.storageClass }} - {{- end }} -{{- end }} - ---- -{{- if .Values.snapshotVolume.createPvc }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.snapshotVolume.pvcClaimName }} -spec: - accessModes: - - {{ .Values.snapshotVolume.accessMode }} - resources: - requests: - storage: {{ .Values.snapshotVolume.size }} - {{- if .Values.snapshotVolume.storageClass }} - storageClassName: {{ .Values.snapshotVolume.storageClass }} - {{- end }} -{{- end }} diff --git a/deployment/k8/migration-console/values.yaml b/deployment/k8/migration-console/values.yaml index 46e9d731b..678cb366e 100644 --- a/deployment/k8/migration-console/values.yaml +++ b/deployment/k8/migration-console/values.yaml @@ -28,44 +28,11 @@ servicesYamlVolume: sharedLogVolume: volumeName: shared-logs mountPath: /shared-logs-output # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true # This should only be created once and shared between services pvcClaimName: shared-logs-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 10Gi snapshotVolume: volumeName: snapshot-vol mountPath: /storage # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true pvcClaimName: snapshot-vol-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi - -otelCollectorSidecar: - name: otel-collector - enabled: true - restartPolicy: "Always" - #command: "--config=/etc/otel-config-debug-only.yaml" - #command: "--config=/etc/otel-config-aws.yaml" - image: - repository: migrations/otel_collector - pullPolicy: IfNotPresent - tag: "latest" - ports: - - name: pprof - containerPort: 1888 - protocol: TCP - - name: health-check - containerPort: 13133 - protocol: TCP - - name: zpages - containerPort: 55679 - protocol: TCP - - name: otlp-receiver - containerPort: 4317 - protocol: TCP +test: true diff --git a/deployment/k8/migrations-lib/.helmignore b/deployment/k8/migrations-lib/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/migrations-lib/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/migrations-lib/Chart.yaml b/deployment/k8/migrations-lib/Chart.yaml new file mode 100644 index 000000000..ca274fc0d --- /dev/null +++ b/deployment/k8/migrations-lib/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: migrations-lib +version: 0.1.0 +description: A migrations shared library chart +type: library diff --git a/deployment/k8/migrations-lib/templates/_otel-collector.yml b/deployment/k8/migrations-lib/templates/_otel-collector.yml new file mode 100644 index 000000000..acd2e5eb1 --- /dev/null +++ b/deployment/k8/migrations-lib/templates/_otel-collector.yml @@ -0,0 +1,15 @@ +{{- define "migrations-lib.otel-sidecar" -}} +- name: {{ .Values.otelCollector.name}} + image: "{{ .Values.otelCollector.image.repository }}:{{ .Values.otelCollector.image.tag }}" + imagePullPolicy: {{ .Values.otelCollector.image.pullPolicy }} + ports: + {{- range .Values.otelCollector.ports }} + - name: {{ .name }} + containerPort: {{ .containerPort }} + protocol: {{ .protocol | default "TCP" }} + {{- end }} + restartPolicy: {{ .Values.otelCollector.restartPolicy }} + {{- if .Values.otelCollector.args }} + args: {{ .Values.otelCollector.args }} + {{- end }} +{{- end }} diff --git a/deployment/k8/migrations-lib/values.yaml b/deployment/k8/migrations-lib/values.yaml new file mode 100644 index 000000000..8a81608a2 --- /dev/null +++ b/deployment/k8/migrations-lib/values.yaml @@ -0,0 +1,28 @@ +otelCollector: + name: otel-collector + restartPolicy: "Always" + #args: "--config=/etc/otel-config-debug-only.yaml" + #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] + image: + repository: migrations/otel_collector + pullPolicy: IfNotPresent + tag: "latest" + ports: + - name: pprof + containerPort: 1888 + protocol: TCP + - name: health-check + containerPort: 13133 + protocol: TCP + - name: zpages + containerPort: 55679 + protocol: TCP + - name: otlp-receiver + containerPort: 4317 + protocol: TCP +# - name: prom-metrics +# containerPort: 8888 +# protocol: TCP +# - name: prom-exporter +# containerPort: 8889 +# protocol: TCP diff --git a/deployment/k8/minikubeTool.sh b/deployment/k8/minikubeTool.sh new file mode 100755 index 000000000..7dd1d2eeb --- /dev/null +++ b/deployment/k8/minikubeTool.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# To have running during local development + +usage() { + echo "Usage: $0 [--start | --pause | --delete]" + exit 1 +} + +kill_minikube_processes() { + mount_process_id=$(pgrep -f "minikube mount") + if [ -n "$mount_process_id" ]; then + kill "$mount_process_id" + fi + tunnel_process_id=$(pgrep -f "minikube tunnel") + if [ -n "$tunnel_process_id" ]; then + kill "$tunnel_process_id" + fi +} + +start() { + helm repo add opensearch-operator https://opensearch-project.github.io/opensearch-k8s-operator/ + helm repo add strimzi https://strimzi.io/charts/ + + minikube start + minikube mount .:/opensearch-migrations > /dev/null 2>&1 & + minikube tunnel > /dev/null 2>&1 & +} + +pause() { + kill_minikube_processes + minikube pause +} + +delete() { + kill_minikube_processes + minikube delete +} + +# Check if the script was called with no arguments +if [ $# -eq 0 ]; then + usage +fi + +# Allow executing this script from any dir +script_abs_path=$(readlink -f "$0") +script_dir_abs_path=$(dirname "$script_abs_path") +cd "$script_dir_abs_path" || exit + +cd ../.. || exit + +# Parse the argument and call the appropriate function +case "$1" in + --start) + start + ;; + --pause) + pause + ;; + --delete) + delete + ;; + *) + echo "Invalid option: $1" + usage + ;; +esac + diff --git a/deployment/k8/prometheus/Chart.lock b/deployment/k8/prometheus/Chart.lock new file mode 100644 index 000000000..3dae47c0c --- /dev/null +++ b/deployment/k8/prometheus/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: prometheus + repository: https://prometheus-community.github.io/helm-charts + version: 25.27.0 +digest: sha256:30e4a566c45c3dd4ce80a501e9c4d0903d1364a2810aaba965e8796a703a2093 +generated: "2024-10-17T23:31:30.225286-05:00" diff --git a/deployment/k8/prometheus/Chart.yaml b/deployment/k8/prometheus/Chart.yaml new file mode 100644 index 000000000..7a4fa048e --- /dev/null +++ b/deployment/k8/prometheus/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: prometheus +description: A Helm chart for deploying Prometheus +appVersion: "3.5.0" +version: 0.1.0 +dependencies: + - name: prometheus + version: "25.27.0" + repository: "https://prometheus-community.github.io/helm-charts" diff --git a/deployment/k8/prometheus/values.yaml b/deployment/k8/prometheus/values.yaml new file mode 100644 index 000000000..208967dd3 --- /dev/null +++ b/deployment/k8/prometheus/values.yaml @@ -0,0 +1 @@ +#prometheus: diff --git a/deployment/k8/reindex-from-snapshot/templates/deployment.yml b/deployment/k8/reindex-from-snapshot/templates/job.yml similarity index 91% rename from deployment/k8/reindex-from-snapshot/templates/deployment.yml rename to deployment/k8/reindex-from-snapshot/templates/job.yml index 1fe59eafa..bd3fd75d2 100644 --- a/deployment/k8/reindex-from-snapshot/templates/deployment.yml +++ b/deployment/k8/reindex-from-snapshot/templates/job.yml @@ -5,7 +5,7 @@ metadata: labels: app: {{ .Chart.Name }} spec: - parallelism: 0 + parallelism: {{ .Values.parallelCount }} completions: 1000 # Temporary until direction decided here ttlSecondsAfterFinished: 30 # Clean up finished Jobs (either Complete or Failed) automatically after this time template: @@ -45,11 +45,8 @@ spec: protocol: {{ .protocol | default "TCP" }} {{- end }} restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} - {{- if .Values.otelCollectorSidecar.command }} - command: - - "/bin/sh" - - "-c" - - "{{ .Values.otelCollectorSidecar.command }}" + {{- if .Values.otelCollectorSidecar.args }} + args: {{ .Values.otelCollectorSidecar.args }} {{- end }} {{- end }} volumes: diff --git a/deployment/k8/reindex-from-snapshot/templates/pvc.yml b/deployment/k8/reindex-from-snapshot/templates/pvc.yml deleted file mode 100644 index b6caf6ef6..000000000 --- a/deployment/k8/reindex-from-snapshot/templates/pvc.yml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.sharedLogVolume.createPvc }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.sharedLogVolume.pvcClaimName }} -spec: - accessModes: - - {{ .Values.sharedLogVolume.accessMode }} - resources: - requests: - storage: {{ .Values.sharedLogVolume.size }} - {{- if .Values.sharedLogVolume.storageClass }} - storageClassName: {{ .Values.sharedLogVolume.storageClass }} - {{- end }} -{{- end }} - ---- -{{- if .Values.snapshotVolume.createPvc }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.snapshotVolume.pvcClaimName }} -spec: - accessModes: - - {{ .Values.snapshotVolume.accessMode }} - resources: - requests: - storage: {{ .Values.snapshotVolume.size }} - {{- if .Values.snapshotVolume.storageClass }} - storageClassName: {{ .Values.snapshotVolume.storageClass }} - {{- end }} -{{- end }} diff --git a/deployment/k8/reindex-from-snapshot/values.yaml b/deployment/k8/reindex-from-snapshot/values.yaml index acef18f22..09bce96db 100644 --- a/deployment/k8/reindex-from-snapshot/values.yaml +++ b/deployment/k8/reindex-from-snapshot/values.yaml @@ -2,7 +2,7 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicaCount: 0 +parallelCount: 0 image: repository: migrations/reindex_from_snapshot @@ -37,8 +37,8 @@ otelCollectorSidecar: name: otel-collector enabled: true restartPolicy: "Always" - #command: "--config=/etc/otel-config-debug-only.yaml" - #command: "--config=/etc/otel-config-aws.yaml" + #args: "--config=/etc/otel-config-debug-only.yaml" + #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] image: repository: migrations/otel_collector pullPolicy: IfNotPresent @@ -56,23 +56,19 @@ otelCollectorSidecar: - name: otlp-receiver containerPort: 4317 protocol: TCP +# - name: prom-metrics +# containerPort: 8888 +# protocol: TCP +# - name: prom-exporter +# containerPort: 8889 +# protocol: TCP sharedLogVolume: volumeName: shared-logs mountPath: /shared-logs-output # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true # This should only be created once and shared between services pvcClaimName: shared-logs-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 10Gi snapshotVolume: volumeName: snapshot-vol mountPath: /storage # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true pvcClaimName: snapshot-vol-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 5Gi diff --git a/deployment/k8/replayer/templates/deployment.yml b/deployment/k8/replayer/templates/deployment.yml index a6567d6f8..7d90f8a2a 100644 --- a/deployment/k8/replayer/templates/deployment.yml +++ b/deployment/k8/replayer/templates/deployment.yml @@ -43,11 +43,8 @@ spec: protocol: {{ .protocol | default "TCP" }} {{- end }} restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} - {{- if .Values.otelCollectorSidecar.command }} - command: - - "/bin/sh" - - "-c" - - "{{ .Values.otelCollectorSidecar.command }}" + {{- if .Values.otelCollectorSidecar.args }} + args: {{ .Values.otelCollectorSidecar.args }} {{- end }} {{- end }} volumes: diff --git a/deployment/k8/replayer/values.yaml b/deployment/k8/replayer/values.yaml index a5816507e..99beaca5b 100644 --- a/deployment/k8/replayer/values.yaml +++ b/deployment/k8/replayer/values.yaml @@ -36,8 +36,8 @@ otelCollectorSidecar: name: otel-collector enabled: true restartPolicy: "Always" - #command: "--config=/etc/otel-config-debug-only.yaml" - #command: "--config=/etc/otel-config-aws.yaml" + #args: "--config=/etc/otel-config-debug-only.yaml" + #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] image: repository: migrations/otel_collector pullPolicy: IfNotPresent @@ -55,13 +55,14 @@ otelCollectorSidecar: - name: otlp-receiver containerPort: 4317 protocol: TCP +# - name: prom-metrics +# containerPort: 8888 +# protocol: TCP +# - name: prom-exporter +# containerPort: 8889 +# protocol: TCP sharedLogVolume: volumeName: shared-logs mountPath: /shared-logs-output # Path inside the container where the volume should be mounted - # Persistent volume claim settings - createPvc: true # This should only be created once and shared between services pvcClaimName: shared-logs-pvc - storageClass: "" - accessMode: ReadWriteOnce - size: 10Gi diff --git a/deployment/k8/shared/shared-logs-vol/.helmignore b/deployment/k8/shared/shared-logs-vol/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/shared/shared-logs-vol/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/shared/shared-logs-vol/Chart.yaml b/deployment/k8/shared/shared-logs-vol/Chart.yaml new file mode 100644 index 000000000..f3cc08c3f --- /dev/null +++ b/deployment/k8/shared/shared-logs-vol/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: shared-logs-vol +description: A utility Helm chart to create a shared logs volume +type: application +version: 0.1.0 +appVersion: "1.16.0" diff --git a/deployment/k8/replayer/templates/pvc.yml b/deployment/k8/shared/shared-logs-vol/templates/pvc.yml similarity index 87% rename from deployment/k8/replayer/templates/pvc.yml rename to deployment/k8/shared/shared-logs-vol/templates/pvc.yml index 31c5d69f2..d11e04912 100644 --- a/deployment/k8/replayer/templates/pvc.yml +++ b/deployment/k8/shared/shared-logs-vol/templates/pvc.yml @@ -1,4 +1,3 @@ -{{- if .Values.sharedLogVolume.createPvc }} apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -12,4 +11,3 @@ spec: {{- if .Values.sharedLogVolume.storageClass }} storageClassName: {{ .Values.sharedLogVolume.storageClass }} {{- end }} -{{- end }} diff --git a/deployment/k8/shared/shared-logs-vol/values.yaml b/deployment/k8/shared/shared-logs-vol/values.yaml new file mode 100644 index 000000000..d9a3fc7c4 --- /dev/null +++ b/deployment/k8/shared/shared-logs-vol/values.yaml @@ -0,0 +1,8 @@ +sharedLogVolume: + volumeName: shared-logs + mountPath: /shared-logs-output # Path inside the container where the volume should be mounted + # Persistent volume claim settings + pvcClaimName: shared-logs-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 10Gi diff --git a/deployment/k8/shared/snapshot-vol/.helmignore b/deployment/k8/shared/snapshot-vol/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/deployment/k8/shared/snapshot-vol/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/k8/shared/snapshot-vol/Chart.yaml b/deployment/k8/shared/snapshot-vol/Chart.yaml new file mode 100644 index 000000000..c00dad454 --- /dev/null +++ b/deployment/k8/shared/snapshot-vol/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: snapshot-vol +description: A utility Helm chart to create a storage volume for snapshots +type: application +version: 0.1.0 +appVersion: "1.16.0" diff --git a/deployment/k8/elasticsearch/templates/pvc.yml b/deployment/k8/shared/snapshot-vol/templates/pvc.yml similarity index 87% rename from deployment/k8/elasticsearch/templates/pvc.yml rename to deployment/k8/shared/snapshot-vol/templates/pvc.yml index 0c4371864..636c9021f 100644 --- a/deployment/k8/elasticsearch/templates/pvc.yml +++ b/deployment/k8/shared/snapshot-vol/templates/pvc.yml @@ -1,4 +1,3 @@ -{{- if .Values.snapshotVolume.createPvc }} apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -12,4 +11,3 @@ spec: {{- if .Values.snapshotVolume.storageClass }} storageClassName: {{ .Values.snapshotVolume.storageClass }} {{- end }} -{{- end }} diff --git a/deployment/k8/shared/snapshot-vol/values.yaml b/deployment/k8/shared/snapshot-vol/values.yaml new file mode 100644 index 000000000..b0a2a5b7d --- /dev/null +++ b/deployment/k8/shared/snapshot-vol/values.yaml @@ -0,0 +1,8 @@ +snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + # Persistent volume claim settings + pvcClaimName: snapshot-vol-pvc + storageClass: "" + accessMode: ReadWriteOnce + size: 5Gi From e1744440b4854c93dc5ffa952fd3dc1794177dd4 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Mon, 21 Oct 2024 22:02:26 -0500 Subject: [PATCH 09/11] Add documentation for getting started with K8 and minor changes Signed-off-by: Tanner Lewis --- deployment/k8/README.md | 85 +++++++++++++++++++ deployment/k8/migration-console/Chart.lock | 4 +- deployment/k8/migration-console/Chart.yaml | 4 +- .../templates/deployment.yml | 3 +- .../templates/_otel-collector.yml | 36 ++++---- deployment/k8/migrations-lib/values.yaml | 52 ++++++------ .../k8/{minikubeTool.sh => minikubeLocal.sh} | 0 7 files changed, 138 insertions(+), 46 deletions(-) create mode 100644 deployment/k8/README.md rename deployment/k8/{minikubeTool.sh => minikubeLocal.sh} (100%) diff --git a/deployment/k8/README.md b/deployment/k8/README.md new file mode 100644 index 000000000..1c418ef9a --- /dev/null +++ b/deployment/k8/README.md @@ -0,0 +1,85 @@ +# Kubernetes Deployment + +## Prerequisites + +#### Install kubectl +Follow instructions [here](https://kubernetes.io/docs/tasks/tools/) to install the Kubernetes command-line tool. This will be the go-to tool for interacting with the Kubernetes cluster + +#### Install helm +Follow instructions [here](https://helm.sh/docs/intro/install/) to install helm. helm will be used for deploying to the Kubernetes cluster + +#### Install docker +Follow instructions [here](https://docs.docker.com/engine/install/) to set up Docker. Docker will be used to build Docker images as well as run a local Kubernetes cluster. Later versions are recommended. + + +## Local Kubernetes Cluster +Creating a local Kubernetes cluster is useful for testing and developing a given deployment. There are a few different tools for running a Kubernetes cluster locally. This documentation focuses on using [Minikube](https://github.com/kubernetes/minikube) to run the local Kubernetes cluster. + +### Install Minikube +Follow instructions [here](https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fbinary+download) to install Minikube + +### Loading Docker images into Minikube +Since Minikube uses a different Docker registry than the normal host machine, the Docker images shown will differ from that on the host machine. The script `buildDockerImagesMini.sh` in this directory will configure the environment to use the Minikube Docker registry and build the Docker images into Minikube + +Show Docker images available to Minikube +```shell +minikube image ls +``` +Build Docker images into Minikube +```shell +./buildDockerImagesMini.sh +``` + +### Start/Pause/Delete +A convenience script `minikubeLocal.sh` is located in this directory which wraps the Minikube commands to start/pause/delete Minikube. This is useful for automatically handling items such as mounting the local repo and creating a tunnel to make localhost calls to containers +```shell +./miniKubeLocal.sh --start +./miniKubeLocal.sh --pause +./miniKubeLocal.sh --delete +``` + + +## Deploying + +### Full environment +Guide for deploying a complete environment helm chart comprised of many Migration service helm charts + +The full environment helm charts consists of: +* Source cluster +* Target cluster +* Migration services + +**Note**: For first-time deployments and deployments after changes have been made to a dependent helm package, such as the `migration-console` chart, the following command is needed to update dependent charts +```shell +helm dependency update environments/full-environment +``` + +The full environment helm chart can be deployed with the helm command +```shell +helm install local environments/full-environment +``` + +### Specific services +Guide for deploying an individual Migration service helm chart + +Most migration services have a dependency on Persistent Volumes that can be installed to the Kubernetes cluster using the following commands +```shell +helm install shared-logs shared/shared-logs-vol +helm install snapshot-vol shared/snapshot-vol +``` + +A particular service could then be deployed with a command similar to the below. +```shell +helm install migration-console migration-console +``` + +## Uninstalling +To show all helm deployments +```shell +helm list +``` + +To uninstall a particular helm deployment +```shell +helm uninstall +``` diff --git a/deployment/k8/migration-console/Chart.lock b/deployment/k8/migration-console/Chart.lock index 1157df320..2c411285e 100644 --- a/deployment/k8/migration-console/Chart.lock +++ b/deployment/k8/migration-console/Chart.lock @@ -2,5 +2,5 @@ dependencies: - name: migrations-lib repository: file://../migrations-lib version: 0.1.0 -digest: sha256:16ba79c267bb045bbee80921a6d838f88f8bd9d4d7d2549b82ac700691a91236 -generated: "2024-10-19T00:23:01.6744-05:00" +digest: sha256:7d5c25e2ed7da25adb550d420edcd8fbb2793d966da650dfbb68265aea5ca41e +generated: "2024-10-21T14:49:22.624024-05:00" diff --git a/deployment/k8/migration-console/Chart.yaml b/deployment/k8/migration-console/Chart.yaml index d97fe9a2e..4210da4af 100644 --- a/deployment/k8/migration-console/Chart.yaml +++ b/deployment/k8/migration-console/Chart.yaml @@ -8,5 +8,5 @@ dependencies: - name: migrations-lib version: "0.1.0" repository: "file://../migrations-lib" - import-values: - - "otelCollector" +# import-values: +# - "otelCollector" diff --git a/deployment/k8/migration-console/templates/deployment.yml b/deployment/k8/migration-console/templates/deployment.yml index 69f03feb3..a6f4c2f11 100644 --- a/deployment/k8/migration-console/templates/deployment.yml +++ b/deployment/k8/migration-console/templates/deployment.yml @@ -13,6 +13,8 @@ spec: metadata: labels: app: {{ .Chart.Name }} + annotations: + sidecar.opentelemetry.io/inject: "true" # CORRECT spec: containers: - name: {{ .Chart.Name }} @@ -31,7 +33,6 @@ spec: mountPath: {{ .Values.servicesYamlVolume.mountPath }} - name: {{ .Values.snapshotVolume.volumeName }} mountPath: {{ .Values.snapshotVolume.mountPath }} - {{- include "migrations-lib.otel-sidecar" . | indent 8 }} volumes: - name: {{ .Values.sharedLogVolume.volumeName }} persistentVolumeClaim: diff --git a/deployment/k8/migrations-lib/templates/_otel-collector.yml b/deployment/k8/migrations-lib/templates/_otel-collector.yml index acd2e5eb1..e991ae747 100644 --- a/deployment/k8/migrations-lib/templates/_otel-collector.yml +++ b/deployment/k8/migrations-lib/templates/_otel-collector.yml @@ -1,15 +1,21 @@ -{{- define "migrations-lib.otel-sidecar" -}} -- name: {{ .Values.otelCollector.name}} - image: "{{ .Values.otelCollector.image.repository }}:{{ .Values.otelCollector.image.tag }}" - imagePullPolicy: {{ .Values.otelCollector.image.pullPolicy }} - ports: - {{- range .Values.otelCollector.ports }} - - name: {{ .name }} - containerPort: {{ .containerPort }} - protocol: {{ .protocol | default "TCP" }} - {{- end }} - restartPolicy: {{ .Values.otelCollector.restartPolicy }} - {{- if .Values.otelCollector.args }} - args: {{ .Values.otelCollector.args }} - {{- end }} -{{- end }} +apiVersion: opentelemetry.io/v1beta1 +kind: OpenTelemetryCollector +metadata: + name: sidecar-for-my-app +spec: + mode: sidecar + config: + receivers: + jaeger: + protocols: + thrift_compact: {} + processors: + + exporters: + debug: {} + + service: + pipelines: + traces: + receivers: [jaeger] + exporters: [debug] diff --git a/deployment/k8/migrations-lib/values.yaml b/deployment/k8/migrations-lib/values.yaml index 8a81608a2..33a8239cc 100644 --- a/deployment/k8/migrations-lib/values.yaml +++ b/deployment/k8/migrations-lib/values.yaml @@ -1,28 +1,28 @@ -otelCollector: - name: otel-collector - restartPolicy: "Always" - #args: "--config=/etc/otel-config-debug-only.yaml" - #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] - image: - repository: migrations/otel_collector - pullPolicy: IfNotPresent - tag: "latest" - ports: - - name: pprof - containerPort: 1888 - protocol: TCP - - name: health-check - containerPort: 13133 - protocol: TCP - - name: zpages - containerPort: 55679 - protocol: TCP - - name: otlp-receiver - containerPort: 4317 - protocol: TCP -# - name: prom-metrics -# containerPort: 8888 +#otelCollector: +# name: otel-collector +# restartPolicy: "Always" +# #args: "--config=/etc/otel-config-debug-only.yaml" +# #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] +# image: +# repository: migrations/otel_collector +# pullPolicy: IfNotPresent +# tag: "latest" +# ports: +# - name: pprof +# containerPort: 1888 # protocol: TCP -# - name: prom-exporter -# containerPort: 8889 +# - name: health-check +# containerPort: 13133 # protocol: TCP +# - name: zpages +# containerPort: 55679 +# protocol: TCP +# - name: otlp-receiver +# containerPort: 4317 +# protocol: TCP +## - name: prom-metrics +## containerPort: 8888 +## protocol: TCP +## - name: prom-exporter +## containerPort: 8889 +## protocol: TCP diff --git a/deployment/k8/minikubeTool.sh b/deployment/k8/minikubeLocal.sh similarity index 100% rename from deployment/k8/minikubeTool.sh rename to deployment/k8/minikubeLocal.sh From cc31d0def34cb6afbe5380197853b55918e0a186 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Thu, 24 Oct 2024 13:19:08 -0500 Subject: [PATCH 10/11] Start structure change Signed-off-by: Tanner Lewis --- .../k8/capture-proxy/templates/deployment.yml | 46 ------------- deployment/k8/capture-proxy/values.yaml | 56 --------------- .../charts/elasticsearch-8.5.1.tgz | Bin 28898 -> 0 bytes deployment/k8/elasticsearch/values.yaml | 31 --------- .../environments/full-environment/Chart.lock | 30 -------- .../environments/full-environment/Chart.yaml | 40 ----------- .../environments/full-environment/values.yaml | 13 ---- deployment/k8/migration-assistant/Chart.lock | 9 +++ deployment/k8/migration-assistant/Chart.yaml | 40 +++++++++++ deployment/k8/migration-assistant/values.yaml | 65 ++++++++++++++++++ deployment/k8/migration-console/Chart.lock | 6 -- .../templates/deployment.yml | 46 ------------- deployment/k8/migration-console/values.yaml | 38 ---------- deployment/k8/migrations-lib/Chart.yaml | 5 -- .../charts/opensearch-2.23.1.tgz | Bin 24952 -> 0 bytes .../{ => services}/capture-proxy/.helmignore | 0 .../k8/services/capture-proxy/Chart.lock | 6 ++ .../{ => services}/capture-proxy/Chart.yaml | 4 ++ .../capture-proxy/templates/deployment.yml | 1 + .../capture-proxy/templates/service.yml | 1 + .../k8/services/capture-proxy/values.yaml | 3 + .../common-lib}/.helmignore | 0 deployment/k8/services/common-lib/Chart.yaml | 5 ++ .../common-lib/templates/_deployment.yaml | 64 +++++++++++++++++ .../templates/_otel-collector.yaml} | 0 .../common-lib/templates/_service.yaml} | 4 ++ .../common-lib}/values.yaml | 0 .../elasticsearch-helm/Chart.lock | 0 .../elasticsearch-helm/Chart.yaml | 0 .../elasticsearch-helm/values.yaml | 0 .../{ => services}/elasticsearch/Chart.yaml | 0 .../elasticsearch}/templates/service.yml | 0 .../elasticsearch/templates/statefulset.yml | 0 .../services/elasticsearch/values-local.yaml | 28 ++++++++ .../k8/services/elasticsearch/values.yaml | 60 ++++++++++++++++ .../k8/{ => services}/grafana/Chart.lock | 0 .../k8/{ => services}/grafana/Chart.yaml | 0 .../grafana/templates/configmap.yaml | 0 .../k8/{ => services}/grafana/values.yaml | 0 .../k8/{ => services}/jaeger/Chart.lock | 0 .../k8/{ => services}/jaeger/Chart.yaml | 0 .../k8/{ => services}/jaeger/values.yaml | 0 .../kafka-op}/.helmignore | 0 .../k8/{ => services}/kafka-op/Chart.lock | 0 .../k8/{ => services}/kafka-op/Chart.yaml | 0 .../kafka-op/templates/kafka-single-node.yaml | 0 .../k8/{ => services}/kafka-op/values.yaml | 0 .../migration-console}/.helmignore | 0 .../k8/services/migration-console/Chart.lock | 6 ++ .../migration-console/Chart.yaml | 6 +- .../templates/deployment.yml | 1 + .../k8/services/migration-console/values.yaml | 3 + .../{ => services}/opensearch-helm/Chart.lock | 0 .../{ => services}/opensearch-helm/Chart.yaml | 0 .../opensearch-helm/values.yaml | 0 .../{ => services}/opensearch-op/Chart.lock | 0 .../{ => services}/opensearch-op/Chart.yaml | 0 .../opensearch-op/templates/cluster.yaml | 0 .../{ => services}/opensearch-op/values.yaml | 0 .../k8/{ => services}/prometheus/Chart.lock | 0 .../k8/{ => services}/prometheus/Chart.yaml | 0 .../k8/{ => services}/prometheus/values.yaml | 0 .../reindex-from-snapshot/.helmignore | 0 .../reindex-from-snapshot/Chart.yaml | 0 .../reindex-from-snapshot/templates/job.yml | 0 .../reindex-from-snapshot/values.yaml | 0 .../k8/{ => services}/replayer/.helmignore | 0 .../k8/{ => services}/replayer/Chart.yaml | 0 .../replayer/templates/deployment.yml | 0 .../k8/{ => services}/replayer/values.yaml | 0 70 files changed, 302 insertions(+), 315 deletions(-) delete mode 100644 deployment/k8/capture-proxy/templates/deployment.yml delete mode 100644 deployment/k8/capture-proxy/values.yaml delete mode 100644 deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz delete mode 100644 deployment/k8/elasticsearch/values.yaml delete mode 100644 deployment/k8/environments/full-environment/Chart.lock delete mode 100644 deployment/k8/environments/full-environment/Chart.yaml delete mode 100644 deployment/k8/environments/full-environment/values.yaml create mode 100644 deployment/k8/migration-assistant/Chart.lock create mode 100644 deployment/k8/migration-assistant/Chart.yaml create mode 100644 deployment/k8/migration-assistant/values.yaml delete mode 100644 deployment/k8/migration-console/Chart.lock delete mode 100644 deployment/k8/migration-console/templates/deployment.yml delete mode 100644 deployment/k8/migration-console/values.yaml delete mode 100644 deployment/k8/migrations-lib/Chart.yaml delete mode 100644 deployment/k8/opensearch-helm/charts/opensearch-2.23.1.tgz rename deployment/k8/{ => services}/capture-proxy/.helmignore (100%) create mode 100644 deployment/k8/services/capture-proxy/Chart.lock rename deployment/k8/{ => services}/capture-proxy/Chart.yaml (60%) create mode 100644 deployment/k8/services/capture-proxy/templates/deployment.yml create mode 100644 deployment/k8/services/capture-proxy/templates/service.yml create mode 100644 deployment/k8/services/capture-proxy/values.yaml rename deployment/k8/{kafka-op => services/common-lib}/.helmignore (100%) create mode 100644 deployment/k8/services/common-lib/Chart.yaml create mode 100644 deployment/k8/services/common-lib/templates/_deployment.yaml rename deployment/k8/{migrations-lib/templates/_otel-collector.yml => services/common-lib/templates/_otel-collector.yaml} (100%) rename deployment/k8/{elasticsearch/templates/service.yml => services/common-lib/templates/_service.yaml} (77%) rename deployment/k8/{migrations-lib => services/common-lib}/values.yaml (100%) rename deployment/k8/{ => services}/elasticsearch-helm/Chart.lock (100%) rename deployment/k8/{ => services}/elasticsearch-helm/Chart.yaml (100%) rename deployment/k8/{ => services}/elasticsearch-helm/values.yaml (100%) rename deployment/k8/{ => services}/elasticsearch/Chart.yaml (100%) rename deployment/k8/{capture-proxy => services/elasticsearch}/templates/service.yml (100%) rename deployment/k8/{ => services}/elasticsearch/templates/statefulset.yml (100%) create mode 100644 deployment/k8/services/elasticsearch/values-local.yaml create mode 100644 deployment/k8/services/elasticsearch/values.yaml rename deployment/k8/{ => services}/grafana/Chart.lock (100%) rename deployment/k8/{ => services}/grafana/Chart.yaml (100%) rename deployment/k8/{ => services}/grafana/templates/configmap.yaml (100%) rename deployment/k8/{ => services}/grafana/values.yaml (100%) rename deployment/k8/{ => services}/jaeger/Chart.lock (100%) rename deployment/k8/{ => services}/jaeger/Chart.yaml (100%) rename deployment/k8/{ => services}/jaeger/values.yaml (100%) rename deployment/k8/{migration-console => services/kafka-op}/.helmignore (100%) rename deployment/k8/{ => services}/kafka-op/Chart.lock (100%) rename deployment/k8/{ => services}/kafka-op/Chart.yaml (100%) rename deployment/k8/{ => services}/kafka-op/templates/kafka-single-node.yaml (100%) rename deployment/k8/{ => services}/kafka-op/values.yaml (100%) rename deployment/k8/{migrations-lib => services/migration-console}/.helmignore (100%) create mode 100644 deployment/k8/services/migration-console/Chart.lock rename deployment/k8/{ => services}/migration-console/Chart.yaml (62%) create mode 100644 deployment/k8/services/migration-console/templates/deployment.yml create mode 100644 deployment/k8/services/migration-console/values.yaml rename deployment/k8/{ => services}/opensearch-helm/Chart.lock (100%) rename deployment/k8/{ => services}/opensearch-helm/Chart.yaml (100%) rename deployment/k8/{ => services}/opensearch-helm/values.yaml (100%) rename deployment/k8/{ => services}/opensearch-op/Chart.lock (100%) rename deployment/k8/{ => services}/opensearch-op/Chart.yaml (100%) rename deployment/k8/{ => services}/opensearch-op/templates/cluster.yaml (100%) rename deployment/k8/{ => services}/opensearch-op/values.yaml (100%) rename deployment/k8/{ => services}/prometheus/Chart.lock (100%) rename deployment/k8/{ => services}/prometheus/Chart.yaml (100%) rename deployment/k8/{ => services}/prometheus/values.yaml (100%) rename deployment/k8/{ => services}/reindex-from-snapshot/.helmignore (100%) rename deployment/k8/{ => services}/reindex-from-snapshot/Chart.yaml (100%) rename deployment/k8/{ => services}/reindex-from-snapshot/templates/job.yml (100%) rename deployment/k8/{ => services}/reindex-from-snapshot/values.yaml (100%) rename deployment/k8/{ => services}/replayer/.helmignore (100%) rename deployment/k8/{ => services}/replayer/Chart.yaml (100%) rename deployment/k8/{ => services}/replayer/templates/deployment.yml (100%) rename deployment/k8/{ => services}/replayer/values.yaml (100%) diff --git a/deployment/k8/capture-proxy/templates/deployment.yml b/deployment/k8/capture-proxy/templates/deployment.yml deleted file mode 100644 index ec5190224..000000000 --- a/deployment/k8/capture-proxy/templates/deployment.yml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app: {{ .Chart.Name }} - template: - metadata: - labels: - app: {{ .Chart.Name }} - spec: - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: - - "/bin/sh" - - "-c" - - "{{ .Values.container.command }}" - # Load all env variables - env: - {{- range $key, $value := .Values.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} - {{- if .Values.otelCollectorSidecar.enabled }} - initContainers: - - name: {{ .Values.otelCollectorSidecar.name}} - image: "{{ .Values.otelCollectorSidecar.image.repository }}:{{ .Values.otelCollectorSidecar.image.tag }}" - imagePullPolicy: {{ .Values.otelCollectorSidecar.image.pullPolicy }} - ports: - {{- range .Values.otelCollectorSidecar.ports }} - - name: {{ .name }} - containerPort: {{ .containerPort }} - protocol: {{ .protocol | default "TCP" }} - {{- end }} - restartPolicy: {{ .Values.otelCollectorSidecar.restartPolicy }} - {{- if .Values.otelCollectorSidecar.args }} - args: {{ .Values.otelCollectorSidecar.args }} - {{- end }} - {{- end }} diff --git a/deployment/k8/capture-proxy/values.yaml b/deployment/k8/capture-proxy/values.yaml deleted file mode 100644 index bf1986918..000000000 --- a/deployment/k8/capture-proxy/values.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# Default values for capture proxy. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: migrations/capture_proxy - pullPolicy: IfNotPresent - tag: "latest" - -service: - type: LoadBalancer - port: 9201 # Port exposed to external - targetPort: 9200 # Container port - -container: - command: "/runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy --kafkaConnection kafka-cluster-kafka-bootstrap:9092 --destinationUri https://elasticsearch:19200 --insecureDestination --listenPort 9200 --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml --otelCollectorEndpoint http://localhost:4317" - -resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - -otelCollectorSidecar: - name: otel-collector - enabled: true - restartPolicy: "Always" - #args: "--config=/etc/otel-config-debug-only.yaml" - #args: ["--config=/etc/otel-config-prometheus-jaeger.yaml"] - image: - repository: migrations/otel_collector - pullPolicy: IfNotPresent - tag: "latest" - ports: - - name: pprof - containerPort: 1888 - protocol: TCP - - name: health-check - containerPort: 13133 - protocol: TCP - - name: zpages - containerPort: 55679 - protocol: TCP - - name: otlp-receiver - containerPort: 4317 - protocol: TCP -# - name: prom-metrics -# containerPort: 8888 -# protocol: TCP -# - name: prom-exporter -# containerPort: 8889 -# protocol: TCP diff --git a/deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz b/deployment/k8/elasticsearch-helm/charts/elasticsearch-8.5.1.tgz deleted file mode 100644 index 1a88b2269f497501cc537cf7c41fdc644c54cf13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28898 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/opensearch-migrations:/opensearch-migrations + - name: services-yaml + hostPath: + path: /opensearch-migrations/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml + type: File + - name: shared-logs + persistentVolumeClaim: + claimName: shared-logs-pvc + - name: snapshot-vol + persistentVolumeClaim: + claimName: snapshot-vol-pvc + volumeMounts: + - name: services-yaml + mountPath: /etc/migration_services.yaml + - name: shared-logs + mountPath: /shared-logs-output + - name: snapshot-vol + mountPath: /storage + +capture-proxy: + enabled: true + replicaCount: 1 + image: + repository: migrations/capture_proxy + pullPolicy: IfNotPresent + tag: "latest" + service: + type: LoadBalancer + port: 9201 # Port exposed to external + targetPort: 9200 # Container port + container: + command: > + /runJavaWithClasspath.sh org.opensearch.migrations.trafficcapture.proxyserver.CaptureProxy + --kafkaConnection kafka-cluster-kafka-bootstrap:9092 + --destinationUri https://elasticsearch:19200 + --insecureDestination + --listenPort 9200 + --sslConfigFile /usr/share/elasticsearch/config/proxy_tls.yml + --otelCollectorEndpoint http://localhost:4317 + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + diff --git a/deployment/k8/migration-console/Chart.lock b/deployment/k8/migration-console/Chart.lock deleted file mode 100644 index 2c411285e..000000000 --- a/deployment/k8/migration-console/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: migrations-lib - repository: file://../migrations-lib - version: 0.1.0 -digest: sha256:7d5c25e2ed7da25adb550d420edcd8fbb2793d966da650dfbb68265aea5ca41e -generated: "2024-10-21T14:49:22.624024-05:00" diff --git a/deployment/k8/migration-console/templates/deployment.yml b/deployment/k8/migration-console/templates/deployment.yml deleted file mode 100644 index a6f4c2f11..000000000 --- a/deployment/k8/migration-console/templates/deployment.yml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Chart.Name }} - labels: - app: {{ .Chart.Name }} -spec: - replicas: {{ .Values.replicaCount }} - selector: - matchLabels: - app: {{ .Chart.Name }} - template: - metadata: - labels: - app: {{ .Chart.Name }} - annotations: - sidecar.opentelemetry.io/inject: "true" # CORRECT - spec: - containers: - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - # Load all env variables - env: - {{- range $key, $value := .Values.env }} - - name: {{ $key }} - value: {{ $value | quote }} - {{- end }} - volumeMounts: - - name: {{ .Values.sharedLogVolume.volumeName }} - mountPath: {{ .Values.sharedLogVolume.mountPath }} - - name: services-yaml-file - mountPath: {{ .Values.servicesYamlVolume.mountPath }} - - name: {{ .Values.snapshotVolume.volumeName }} - mountPath: {{ .Values.snapshotVolume.mountPath }} - volumes: - - name: {{ .Values.sharedLogVolume.volumeName }} - persistentVolumeClaim: - claimName: {{ .Values.sharedLogVolume.pvcClaimName }} - - name: services-yaml-file - hostPath: - path: {{ .Values.servicesYamlVolume.path }} - type: File - - name: {{ .Values.snapshotVolume.volumeName }} - persistentVolumeClaim: - claimName: {{ .Values.snapshotVolume.pvcClaimName }} diff --git a/deployment/k8/migration-console/values.yaml b/deployment/k8/migration-console/values.yaml deleted file mode 100644 index 678cb366e..000000000 --- a/deployment/k8/migration-console/values.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Default values for traffic replayer. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: migrations/migration_console - pullPolicy: IfNotPresent - tag: "latest" - -resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - -env: - SHARED_LOGS_DIR_PATH: /shared-logs-output/traffic-replayer-default - -# For minikube required: minikube mount /Volumes/workplace/opensearch/lewijacn-migrations/opensearch-migrations:/opensearch-migrations -servicesYamlVolume: - path: /opensearch-migrations/TrafficCapture/dockerSolution/src/main/docker/migrationConsole/lib/console_link/services.yaml # Local file path on the host - mountPath: /etc/migration_services.yaml # Path inside the container - -sharedLogVolume: - volumeName: shared-logs - mountPath: /shared-logs-output # Path inside the container where the volume should be mounted - pvcClaimName: shared-logs-pvc - -snapshotVolume: - volumeName: snapshot-vol - mountPath: /storage # Path inside the container where the volume should be mounted - pvcClaimName: snapshot-vol-pvc - -test: true diff --git a/deployment/k8/migrations-lib/Chart.yaml b/deployment/k8/migrations-lib/Chart.yaml deleted file mode 100644 index ca274fc0d..000000000 --- a/deployment/k8/migrations-lib/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: migrations-lib -version: 0.1.0 -description: A migrations shared library chart -type: library diff --git a/deployment/k8/opensearch-helm/charts/opensearch-2.23.1.tgz b/deployment/k8/opensearch-helm/charts/opensearch-2.23.1.tgz deleted file mode 100644 index 423725534d391b9a3c4c8aed47a69ac3da19a405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24952 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

lN{E1*E=~3!yWGC5l|KH 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 HV4(gN`AjP8 diff --git a/deployment/k8/capture-proxy/.helmignore b/deployment/k8/services/capture-proxy/.helmignore similarity index 100% rename from deployment/k8/capture-proxy/.helmignore rename to deployment/k8/services/capture-proxy/.helmignore diff --git a/deployment/k8/services/capture-proxy/Chart.lock b/deployment/k8/services/capture-proxy/Chart.lock new file mode 100644 index 000000000..ad6428d8a --- /dev/null +++ b/deployment/k8/services/capture-proxy/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common-lib + repository: file://../common-lib + version: 0.1.0 +digest: sha256:20073f8787800aa68dec8f48b8c4ee0c196f0d6ee2eba090164f5a9478995895 +generated: "2024-10-23T20:23:14.087737-05:00" diff --git a/deployment/k8/capture-proxy/Chart.yaml b/deployment/k8/services/capture-proxy/Chart.yaml similarity index 60% rename from deployment/k8/capture-proxy/Chart.yaml rename to deployment/k8/services/capture-proxy/Chart.yaml index 6f0fe47cd..200ed4778 100644 --- a/deployment/k8/capture-proxy/Chart.yaml +++ b/deployment/k8/services/capture-proxy/Chart.yaml @@ -4,3 +4,7 @@ description: A Helm chart to install the Capture Proxy type: application version: 0.1.0 appVersion: "1.16.0" +dependencies: + - name: common-lib + version: "0.1.0" + repository: "file://../common-lib" diff --git a/deployment/k8/services/capture-proxy/templates/deployment.yml b/deployment/k8/services/capture-proxy/templates/deployment.yml new file mode 100644 index 000000000..038b61297 --- /dev/null +++ b/deployment/k8/services/capture-proxy/templates/deployment.yml @@ -0,0 +1 @@ +{{- include "common-lib.deployment.yml" . }} diff --git a/deployment/k8/services/capture-proxy/templates/service.yml b/deployment/k8/services/capture-proxy/templates/service.yml new file mode 100644 index 000000000..bd2d4bf89 --- /dev/null +++ b/deployment/k8/services/capture-proxy/templates/service.yml @@ -0,0 +1 @@ +{{- include "common-lib.service.yml" . }} diff --git a/deployment/k8/services/capture-proxy/values.yaml b/deployment/k8/services/capture-proxy/values.yaml new file mode 100644 index 000000000..90beddc2e --- /dev/null +++ b/deployment/k8/services/capture-proxy/values.yaml @@ -0,0 +1,3 @@ +# Default values for capture proxy. + +enabled: false diff --git a/deployment/k8/kafka-op/.helmignore b/deployment/k8/services/common-lib/.helmignore similarity index 100% rename from deployment/k8/kafka-op/.helmignore rename to deployment/k8/services/common-lib/.helmignore diff --git a/deployment/k8/services/common-lib/Chart.yaml b/deployment/k8/services/common-lib/Chart.yaml new file mode 100644 index 000000000..6d741d765 --- /dev/null +++ b/deployment/k8/services/common-lib/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: common-lib +version: 0.1.0 +description: A common library for the Migration Assistant +type: library diff --git a/deployment/k8/services/common-lib/templates/_deployment.yaml b/deployment/k8/services/common-lib/templates/_deployment.yaml new file mode 100644 index 000000000..49b8eb2a9 --- /dev/null +++ b/deployment/k8/services/common-lib/templates/_deployment.yaml @@ -0,0 +1,64 @@ +{{- define "common-lib.deployment.yml" -}} +{{- if .Values.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Chart.Name }} + labels: + app: {{ .Chart.Name }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ .Chart.Name }} + template: + metadata: + labels: + app: {{ .Chart.Name }} + annotations: + sidecar.opentelemetry.io/inject: "true" # CORRECT + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if and .Values.container .Values.container.command }} + command: + - "/bin/sh" + - "-c" + - "{{ .Values.container.command }}" + {{- end }} + # Load all env variables + env: + {{- range $key, $value := .Values.env }} + - name: {{ $key }} + value: {{ $value | quote }} + {{- end }} + volumeMounts: + {{- range .Values.volumeMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + {{- end }} + volumes: + {{- range .Values.volumes }} + - name: {{ .name }} + {{- if .configMap }} + configMap: + name: {{ .configMap.name }} + {{- end }} + {{- if .secret }} + secret: + secretName: {{ .secret.secretName }} + {{- end }} + {{- if .persistentVolumeClaim }} + persistentVolumeClaim: + claimName: {{ .persistentVolumeClaim.claimName }} + {{- end }} + {{- if .hostPath }} + hostPath: + path: {{ .hostPath.path }} + type: {{ .hostPath.type | default "DirectoryOrCreate" }} + {{- end }} + {{- end }} +{{- end }} +{{- end -}} diff --git a/deployment/k8/migrations-lib/templates/_otel-collector.yml b/deployment/k8/services/common-lib/templates/_otel-collector.yaml similarity index 100% rename from deployment/k8/migrations-lib/templates/_otel-collector.yml rename to deployment/k8/services/common-lib/templates/_otel-collector.yaml diff --git a/deployment/k8/elasticsearch/templates/service.yml b/deployment/k8/services/common-lib/templates/_service.yaml similarity index 77% rename from deployment/k8/elasticsearch/templates/service.yml rename to deployment/k8/services/common-lib/templates/_service.yaml index 717b34a20..2b148ab44 100644 --- a/deployment/k8/elasticsearch/templates/service.yml +++ b/deployment/k8/services/common-lib/templates/_service.yaml @@ -1,3 +1,5 @@ +{{- define "common-lib.service.yml" -}} +{{- if .Values.enabled }} apiVersion: v1 kind: Service metadata: @@ -12,3 +14,5 @@ spec: targetPort: {{ .Values.service.targetPort }} selector: app: {{ .Chart.Name }} +{{- end }} +{{- end -}} diff --git a/deployment/k8/migrations-lib/values.yaml b/deployment/k8/services/common-lib/values.yaml similarity index 100% rename from deployment/k8/migrations-lib/values.yaml rename to deployment/k8/services/common-lib/values.yaml diff --git a/deployment/k8/elasticsearch-helm/Chart.lock b/deployment/k8/services/elasticsearch-helm/Chart.lock similarity index 100% rename from deployment/k8/elasticsearch-helm/Chart.lock rename to deployment/k8/services/elasticsearch-helm/Chart.lock diff --git a/deployment/k8/elasticsearch-helm/Chart.yaml b/deployment/k8/services/elasticsearch-helm/Chart.yaml similarity index 100% rename from deployment/k8/elasticsearch-helm/Chart.yaml rename to deployment/k8/services/elasticsearch-helm/Chart.yaml diff --git a/deployment/k8/elasticsearch-helm/values.yaml b/deployment/k8/services/elasticsearch-helm/values.yaml similarity index 100% rename from deployment/k8/elasticsearch-helm/values.yaml rename to deployment/k8/services/elasticsearch-helm/values.yaml diff --git a/deployment/k8/elasticsearch/Chart.yaml b/deployment/k8/services/elasticsearch/Chart.yaml similarity index 100% rename from deployment/k8/elasticsearch/Chart.yaml rename to deployment/k8/services/elasticsearch/Chart.yaml diff --git a/deployment/k8/capture-proxy/templates/service.yml b/deployment/k8/services/elasticsearch/templates/service.yml similarity index 100% rename from deployment/k8/capture-proxy/templates/service.yml rename to deployment/k8/services/elasticsearch/templates/service.yml diff --git a/deployment/k8/elasticsearch/templates/statefulset.yml b/deployment/k8/services/elasticsearch/templates/statefulset.yml similarity index 100% rename from deployment/k8/elasticsearch/templates/statefulset.yml rename to deployment/k8/services/elasticsearch/templates/statefulset.yml diff --git a/deployment/k8/services/elasticsearch/values-local.yaml b/deployment/k8/services/elasticsearch/values-local.yaml new file mode 100644 index 000000000..39f341744 --- /dev/null +++ b/deployment/k8/services/elasticsearch/values-local.yaml @@ -0,0 +1,28 @@ +elasticsearch-local: + replicaCount: 1 + + image: + repository: migrations/elasticsearch_searchguard + pullPolicy: IfNotPresent + tag: "latest" + + service: + type: LoadBalancer + port: 19200 # Port exposed to external + targetPort: 9200 # Container port + + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + + env: + path.repo: "/storage/snapshot" + + snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + pvcClaimName: snapshot-vol-pvc diff --git a/deployment/k8/services/elasticsearch/values.yaml b/deployment/k8/services/elasticsearch/values.yaml new file mode 100644 index 000000000..e7620417f --- /dev/null +++ b/deployment/k8/services/elasticsearch/values.yaml @@ -0,0 +1,60 @@ +## Default values for elasticsearch +## This is a YAML-formatted file. +## Declare variables to be passed into your templates. +# +#replicaCount: 1 +# +#image: +# repository: migrations/elasticsearch_searchguard +# pullPolicy: IfNotPresent +# tag: "latest" +# +#service: +# type: LoadBalancer +# port: 19200 # Port exposed to external +# targetPort: 9200 # Container port +# +#resources: +# limits: +# cpu: 100m +# memory: 128Mi +# requests: +# cpu: 100m +# memory: 128Mi +# +#env: +# path.repo: "/storage/snapshot" +# +#snapshotVolume: +# volumeName: snapshot-vol +# mountPath: /storage # Path inside the container where the volume should be mounted +# pvcClaimName: snapshot-vol-pvc + +elasticsearch-local: + replicaCount: 1 + + image: + repository: migrations/elasticsearch_searchguard + pullPolicy: IfNotPresent + tag: "latest" + + service: + type: LoadBalancer + port: 19200 # Port exposed to external + targetPort: 9200 # Container port + + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + + env: + path.repo: "/storage/snapshot" + + snapshotVolume: + volumeName: snapshot-vol + mountPath: /storage # Path inside the container where the volume should be mounted + pvcClaimName: snapshot-vol-pvc diff --git a/deployment/k8/grafana/Chart.lock b/deployment/k8/services/grafana/Chart.lock similarity index 100% rename from deployment/k8/grafana/Chart.lock rename to deployment/k8/services/grafana/Chart.lock diff --git a/deployment/k8/grafana/Chart.yaml b/deployment/k8/services/grafana/Chart.yaml similarity index 100% rename from deployment/k8/grafana/Chart.yaml rename to deployment/k8/services/grafana/Chart.yaml diff --git a/deployment/k8/grafana/templates/configmap.yaml b/deployment/k8/services/grafana/templates/configmap.yaml similarity index 100% rename from deployment/k8/grafana/templates/configmap.yaml rename to deployment/k8/services/grafana/templates/configmap.yaml diff --git a/deployment/k8/grafana/values.yaml b/deployment/k8/services/grafana/values.yaml similarity index 100% rename from deployment/k8/grafana/values.yaml rename to deployment/k8/services/grafana/values.yaml diff --git a/deployment/k8/jaeger/Chart.lock b/deployment/k8/services/jaeger/Chart.lock similarity index 100% rename from deployment/k8/jaeger/Chart.lock rename to deployment/k8/services/jaeger/Chart.lock diff --git a/deployment/k8/jaeger/Chart.yaml b/deployment/k8/services/jaeger/Chart.yaml similarity index 100% rename from deployment/k8/jaeger/Chart.yaml rename to deployment/k8/services/jaeger/Chart.yaml diff --git a/deployment/k8/jaeger/values.yaml b/deployment/k8/services/jaeger/values.yaml similarity index 100% rename from deployment/k8/jaeger/values.yaml rename to deployment/k8/services/jaeger/values.yaml diff --git a/deployment/k8/migration-console/.helmignore b/deployment/k8/services/kafka-op/.helmignore similarity index 100% rename from deployment/k8/migration-console/.helmignore rename to deployment/k8/services/kafka-op/.helmignore diff --git a/deployment/k8/kafka-op/Chart.lock b/deployment/k8/services/kafka-op/Chart.lock similarity index 100% rename from deployment/k8/kafka-op/Chart.lock rename to deployment/k8/services/kafka-op/Chart.lock diff --git a/deployment/k8/kafka-op/Chart.yaml b/deployment/k8/services/kafka-op/Chart.yaml similarity index 100% rename from deployment/k8/kafka-op/Chart.yaml rename to deployment/k8/services/kafka-op/Chart.yaml diff --git a/deployment/k8/kafka-op/templates/kafka-single-node.yaml b/deployment/k8/services/kafka-op/templates/kafka-single-node.yaml similarity index 100% rename from deployment/k8/kafka-op/templates/kafka-single-node.yaml rename to deployment/k8/services/kafka-op/templates/kafka-single-node.yaml diff --git a/deployment/k8/kafka-op/values.yaml b/deployment/k8/services/kafka-op/values.yaml similarity index 100% rename from deployment/k8/kafka-op/values.yaml rename to deployment/k8/services/kafka-op/values.yaml diff --git a/deployment/k8/migrations-lib/.helmignore b/deployment/k8/services/migration-console/.helmignore similarity index 100% rename from deployment/k8/migrations-lib/.helmignore rename to deployment/k8/services/migration-console/.helmignore diff --git a/deployment/k8/services/migration-console/Chart.lock b/deployment/k8/services/migration-console/Chart.lock new file mode 100644 index 000000000..a5ec9383c --- /dev/null +++ b/deployment/k8/services/migration-console/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common-lib + repository: file://../common-lib + version: 0.1.0 +digest: sha256:20073f8787800aa68dec8f48b8c4ee0c196f0d6ee2eba090164f5a9478995895 +generated: "2024-10-23T18:22:16.76174-05:00" diff --git a/deployment/k8/migration-console/Chart.yaml b/deployment/k8/services/migration-console/Chart.yaml similarity index 62% rename from deployment/k8/migration-console/Chart.yaml rename to deployment/k8/services/migration-console/Chart.yaml index 4210da4af..68891d764 100644 --- a/deployment/k8/migration-console/Chart.yaml +++ b/deployment/k8/services/migration-console/Chart.yaml @@ -5,8 +5,6 @@ type: application version: 0.1.0 appVersion: "1.16.0" dependencies: - - name: migrations-lib + - name: common-lib version: "0.1.0" - repository: "file://../migrations-lib" -# import-values: -# - "otelCollector" + repository: "file://../common-lib" diff --git a/deployment/k8/services/migration-console/templates/deployment.yml b/deployment/k8/services/migration-console/templates/deployment.yml new file mode 100644 index 000000000..038b61297 --- /dev/null +++ b/deployment/k8/services/migration-console/templates/deployment.yml @@ -0,0 +1 @@ +{{- include "common-lib.deployment.yml" . }} diff --git a/deployment/k8/services/migration-console/values.yaml b/deployment/k8/services/migration-console/values.yaml new file mode 100644 index 000000000..e69b3fc13 --- /dev/null +++ b/deployment/k8/services/migration-console/values.yaml @@ -0,0 +1,3 @@ +# Default values for migration-console. + +enabled: false diff --git a/deployment/k8/opensearch-helm/Chart.lock b/deployment/k8/services/opensearch-helm/Chart.lock similarity index 100% rename from deployment/k8/opensearch-helm/Chart.lock rename to deployment/k8/services/opensearch-helm/Chart.lock diff --git a/deployment/k8/opensearch-helm/Chart.yaml b/deployment/k8/services/opensearch-helm/Chart.yaml similarity index 100% rename from deployment/k8/opensearch-helm/Chart.yaml rename to deployment/k8/services/opensearch-helm/Chart.yaml diff --git a/deployment/k8/opensearch-helm/values.yaml b/deployment/k8/services/opensearch-helm/values.yaml similarity index 100% rename from deployment/k8/opensearch-helm/values.yaml rename to deployment/k8/services/opensearch-helm/values.yaml diff --git a/deployment/k8/opensearch-op/Chart.lock b/deployment/k8/services/opensearch-op/Chart.lock similarity index 100% rename from deployment/k8/opensearch-op/Chart.lock rename to deployment/k8/services/opensearch-op/Chart.lock diff --git a/deployment/k8/opensearch-op/Chart.yaml b/deployment/k8/services/opensearch-op/Chart.yaml similarity index 100% rename from deployment/k8/opensearch-op/Chart.yaml rename to deployment/k8/services/opensearch-op/Chart.yaml diff --git a/deployment/k8/opensearch-op/templates/cluster.yaml b/deployment/k8/services/opensearch-op/templates/cluster.yaml similarity index 100% rename from deployment/k8/opensearch-op/templates/cluster.yaml rename to deployment/k8/services/opensearch-op/templates/cluster.yaml diff --git a/deployment/k8/opensearch-op/values.yaml b/deployment/k8/services/opensearch-op/values.yaml similarity index 100% rename from deployment/k8/opensearch-op/values.yaml rename to deployment/k8/services/opensearch-op/values.yaml diff --git a/deployment/k8/prometheus/Chart.lock b/deployment/k8/services/prometheus/Chart.lock similarity index 100% rename from deployment/k8/prometheus/Chart.lock rename to deployment/k8/services/prometheus/Chart.lock diff --git a/deployment/k8/prometheus/Chart.yaml b/deployment/k8/services/prometheus/Chart.yaml similarity index 100% rename from deployment/k8/prometheus/Chart.yaml rename to deployment/k8/services/prometheus/Chart.yaml diff --git a/deployment/k8/prometheus/values.yaml b/deployment/k8/services/prometheus/values.yaml similarity index 100% rename from deployment/k8/prometheus/values.yaml rename to deployment/k8/services/prometheus/values.yaml diff --git a/deployment/k8/reindex-from-snapshot/.helmignore b/deployment/k8/services/reindex-from-snapshot/.helmignore similarity index 100% rename from deployment/k8/reindex-from-snapshot/.helmignore rename to deployment/k8/services/reindex-from-snapshot/.helmignore diff --git a/deployment/k8/reindex-from-snapshot/Chart.yaml b/deployment/k8/services/reindex-from-snapshot/Chart.yaml similarity index 100% rename from deployment/k8/reindex-from-snapshot/Chart.yaml rename to deployment/k8/services/reindex-from-snapshot/Chart.yaml diff --git a/deployment/k8/reindex-from-snapshot/templates/job.yml b/deployment/k8/services/reindex-from-snapshot/templates/job.yml similarity index 100% rename from deployment/k8/reindex-from-snapshot/templates/job.yml rename to deployment/k8/services/reindex-from-snapshot/templates/job.yml diff --git a/deployment/k8/reindex-from-snapshot/values.yaml b/deployment/k8/services/reindex-from-snapshot/values.yaml similarity index 100% rename from deployment/k8/reindex-from-snapshot/values.yaml rename to deployment/k8/services/reindex-from-snapshot/values.yaml diff --git a/deployment/k8/replayer/.helmignore b/deployment/k8/services/replayer/.helmignore similarity index 100% rename from deployment/k8/replayer/.helmignore rename to deployment/k8/services/replayer/.helmignore diff --git a/deployment/k8/replayer/Chart.yaml b/deployment/k8/services/replayer/Chart.yaml similarity index 100% rename from deployment/k8/replayer/Chart.yaml rename to deployment/k8/services/replayer/Chart.yaml diff --git a/deployment/k8/replayer/templates/deployment.yml b/deployment/k8/services/replayer/templates/deployment.yml similarity index 100% rename from deployment/k8/replayer/templates/deployment.yml rename to deployment/k8/services/replayer/templates/deployment.yml diff --git a/deployment/k8/replayer/values.yaml b/deployment/k8/services/replayer/values.yaml similarity index 100% rename from deployment/k8/replayer/values.yaml rename to deployment/k8/services/replayer/values.yaml From 233ac38146da97f7c89053bfd12161dcc9946fa7 Mon Sep 17 00:00:00 2001 From: Tanner Lewis Date: Thu, 24 Oct 2024 18:18:09 -0500 Subject: [PATCH 11/11] Checkpoint 10-24 fill in structure more, a couple more services need refactoring Signed-off-by: Tanner Lewis --- deployment/k8/migration-assistant/Chart.lock | 10 +- deployment/k8/migration-assistant/Chart.yaml | 26 ++-- deployment/k8/migration-assistant/values.yaml | 31 +++- .../k8/services/capture-proxy/values.yaml | 2 - .../common-lib/templates/_deployment.yaml | 2 - .../common-lib/templates/_service.yaml | 2 - deployment/k8/services/grafana/Chart.lock | 6 - deployment/k8/services/grafana/Chart.yaml | 9 -- .../services/grafana/templates/configmap.yaml | 136 ------------------ deployment/k8/services/grafana/values.yaml | 40 ------ deployment/k8/services/jaeger/Chart.lock | 6 - deployment/k8/services/jaeger/Chart.yaml | 9 -- deployment/k8/services/jaeger/values.yaml | 13 -- ...ka-single-node.yaml => kafka-cluster.yaml} | 14 +- deployment/k8/services/kafka-op/values.yaml | 37 ----- .../k8/services/migration-console/values.yaml | 2 - .../k8/services/opensearch-helm/Chart.lock | 6 - .../k8/services/opensearch-helm/Chart.yaml | 8 -- .../k8/services/opensearch-helm/values.yaml | 17 --- deployment/k8/services/prometheus/Chart.lock | 6 - deployment/k8/services/prometheus/Chart.yaml | 9 -- deployment/k8/services/prometheus/values.yaml | 1 - 22 files changed, 55 insertions(+), 337 deletions(-) delete mode 100644 deployment/k8/services/grafana/Chart.lock delete mode 100644 deployment/k8/services/grafana/Chart.yaml delete mode 100644 deployment/k8/services/grafana/templates/configmap.yaml delete mode 100644 deployment/k8/services/grafana/values.yaml delete mode 100644 deployment/k8/services/jaeger/Chart.lock delete mode 100644 deployment/k8/services/jaeger/Chart.yaml delete mode 100644 deployment/k8/services/jaeger/values.yaml rename deployment/k8/services/kafka-op/templates/{kafka-single-node.yaml => kafka-cluster.yaml} (74%) delete mode 100644 deployment/k8/services/opensearch-helm/Chart.lock delete mode 100644 deployment/k8/services/opensearch-helm/Chart.yaml delete mode 100644 deployment/k8/services/opensearch-helm/values.yaml delete mode 100644 deployment/k8/services/prometheus/Chart.lock delete mode 100644 deployment/k8/services/prometheus/Chart.yaml delete mode 100644 deployment/k8/services/prometheus/values.yaml diff --git a/deployment/k8/migration-assistant/Chart.lock b/deployment/k8/migration-assistant/Chart.lock index cdb8f2444..4f6677b16 100644 --- a/deployment/k8/migration-assistant/Chart.lock +++ b/deployment/k8/migration-assistant/Chart.lock @@ -1,9 +1,15 @@ dependencies: +- name: opensearch + repository: https://opensearch-project.github.io/helm-charts/ + version: 2.23.1 +- name: kafka-op + repository: file://../services/kafka-op + version: 0.1.0 - name: migration-console repository: file://../services/migration-console version: 0.1.0 - name: capture-proxy repository: file://../services/capture-proxy version: 0.1.0 -digest: sha256:7897ada3193d874398b7fdc67a8f45eeb650302c190fe07ef9b29494d678e2f2 -generated: "2024-10-23T20:35:14.098691-05:00" +digest: sha256:3dcd125d6e968ddfc212318128d5f4222822bf33d0593f061f3c2eed40cea144 +generated: "2024-10-24T15:36:04.42393-05:00" diff --git a/deployment/k8/migration-assistant/Chart.yaml b/deployment/k8/migration-assistant/Chart.yaml index eaa4f99a8..b316df4c7 100644 --- a/deployment/k8/migration-assistant/Chart.yaml +++ b/deployment/k8/migration-assistant/Chart.yaml @@ -5,21 +5,26 @@ dependencies: # - name: elasticsearch # version: "0.1.0" # repository: "file://../services/elasticsearch" -# - name: opensearch-helm -# version: "0.1.0" -# repository: "file://../services/opensearch-helm" -# - name: kafka-op -# version: "0.1.0" -# repository: "file://../services/kafka-op" + - name: opensearch + version: "2.23.1" + repository: "https://opensearch-project.github.io/helm-charts/" + alias: opensearch-helm + condition: opensearch-helm-enabled + - name: kafka-op + version: "0.1.0" + repository: "file://../services/kafka-op" + condition: kafka-op-enabled - name: migration-console version: "0.1.0" repository: "file://../services/migration-console" + condition: migration-console-enabled # - name: replayer # version: "0.1.0" # repository: "file://../services/replayer" - name: capture-proxy version: "0.1.0" repository: "file://../services/capture-proxy" + condition: capture-proxy-enabled # - name: reindex-from-snapshot # version: "0.1.0" # repository: "file://../services/reindex-from-snapshot" @@ -29,12 +34,3 @@ dependencies: # - name: snapshot-vol # version: "0.1.0" # repository: "file://../services/shared/snapshot-vol" -# - name: jaeger -# version: "0.1.0" -# repository: "file://../services/jaeger" -# - name: prometheus -# version: "0.1.0" -# repository: "file://../services/prometheus" -# - name: grafana -# version: "0.1.0" -# repository: "file://../services/grafana" diff --git a/deployment/k8/migration-assistant/values.yaml b/deployment/k8/migration-assistant/values.yaml index 9c7e9f34d..028ccf449 100644 --- a/deployment/k8/migration-assistant/values.yaml +++ b/deployment/k8/migration-assistant/values.yaml @@ -1,6 +1,11 @@ +# Define all enabled/disabled migration services +migration-console-enabled: false +capture-proxy-enabled: false +kafka-op-enabled: true +opensearch-helm-enabled: false +# Define migration service configuration migration-console: - enabled: true replicaCount: 1 image: repository: migrations/migration_console @@ -36,7 +41,6 @@ migration-console: mountPath: /storage capture-proxy: - enabled: true replicaCount: 1 image: repository: migrations/capture_proxy @@ -63,3 +67,26 @@ capture-proxy: cpu: 100m memory: 128Mi +kafka-op: + clusterName: kafka-cluster + kafkaVersion: 3.8.0 + kafkaMetadataVersion: 3.8-IV0 + nodePool: + replicas: 1 + volume: + size: 10Gi + deleteClaim: true + +opensearch-helm: + fullnameOverride: "opensearch" + image: + tag: "2.17.0" + replicas: 1 + singleNode: true + config: + discovery.type: single-node + extraEnvs: + - name: OPENSEARCH_INITIAL_ADMIN_PASSWORD + value: myStrongPassword123! + service: + type: LoadBalancer diff --git a/deployment/k8/services/capture-proxy/values.yaml b/deployment/k8/services/capture-proxy/values.yaml index 90beddc2e..1af029ff9 100644 --- a/deployment/k8/services/capture-proxy/values.yaml +++ b/deployment/k8/services/capture-proxy/values.yaml @@ -1,3 +1 @@ # Default values for capture proxy. - -enabled: false diff --git a/deployment/k8/services/common-lib/templates/_deployment.yaml b/deployment/k8/services/common-lib/templates/_deployment.yaml index 49b8eb2a9..647ae4d5a 100644 --- a/deployment/k8/services/common-lib/templates/_deployment.yaml +++ b/deployment/k8/services/common-lib/templates/_deployment.yaml @@ -1,5 +1,4 @@ {{- define "common-lib.deployment.yml" -}} -{{- if .Values.enabled }} apiVersion: apps/v1 kind: Deployment metadata: @@ -61,4 +60,3 @@ spec: {{- end }} {{- end }} {{- end }} -{{- end -}} diff --git a/deployment/k8/services/common-lib/templates/_service.yaml b/deployment/k8/services/common-lib/templates/_service.yaml index 2b148ab44..24d7bcea8 100644 --- a/deployment/k8/services/common-lib/templates/_service.yaml +++ b/deployment/k8/services/common-lib/templates/_service.yaml @@ -1,5 +1,4 @@ {{- define "common-lib.service.yml" -}} -{{- if .Values.enabled }} apiVersion: v1 kind: Service metadata: @@ -15,4 +14,3 @@ spec: selector: app: {{ .Chart.Name }} {{- end }} -{{- end -}} diff --git a/deployment/k8/services/grafana/Chart.lock b/deployment/k8/services/grafana/Chart.lock deleted file mode 100644 index 23e9f4fec..000000000 --- a/deployment/k8/services/grafana/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: grafana - repository: https://grafana.github.io/helm-charts - version: 8.5.0 -digest: sha256:9a11b7ae0a252d66e7bb0db397b666f2a205f644aa0d0b2a79db35358e38015c -generated: "2024-10-17T23:02:18.615764-05:00" diff --git a/deployment/k8/services/grafana/Chart.yaml b/deployment/k8/services/grafana/Chart.yaml deleted file mode 100644 index 8ad83f9fe..000000000 --- a/deployment/k8/services/grafana/Chart.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v2 -name: grafana -description: A Helm chart for deploying Grafana -appVersion: "3.5.0" -version: 0.1.0 -dependencies: - - name: grafana - version: "8.5.0" - repository: "https://grafana.github.io/helm-charts" diff --git a/deployment/k8/services/grafana/templates/configmap.yaml b/deployment/k8/services/grafana/templates/configmap.yaml deleted file mode 100644 index 3de2b1bfa..000000000 --- a/deployment/k8/services/grafana/templates/configmap.yaml +++ /dev/null @@ -1,136 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: prometheus-metrics-dashboard - labels: - grafana_dashboard: "1" -data: - prometheus-metrics-dashboard.json: | - { - "id": null, - "title": "Prometheus Metrics Dashboard", - "tags": [], - "timezone": "browser", - "schemaVersion": 30, - "version": 1, - "refresh": "5s", - "panels": [ - { - "type": "graph", - "title": "CPU Usage", - "datasource": "Prometheus", - "targets": [ - { - "expr": "sum(rate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (instance)", - "legendFormat": "thing", - "refId": "A" - } - ], - "xaxis": { - "mode": "time" - }, - "yaxes": [ - { - "format": "percent", - "label": "CPU Usage" - } - ], - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "type": "graph", - "title": "Memory Usage", - "datasource": "Prometheus", - "targets": [ - { - "expr": "node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes", - "legendFormat": "Memory Usage", - "refId": "A" - } - ], - "xaxis": { - "mode": "time" - }, - "yaxes": [ - { - "format": "percent", - "label": "Memory Usage" - } - ], - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "type": "graph", - "title": "Disk I/O", - "datasource": "Prometheus", - "targets": [ - { - "expr": "rate(node_disk_io_time_seconds_total[5m])", - "legendFormat": "thing - thing2", - "refId": "A" - } - ], - "xaxis": { - "mode": "time" - }, - "yaxes": [ - { - "format": "s", - "label": "I/O Time" - } - ], - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 8 - } - }, - { - "type": "singlestat", - "title": "Total Requests", - "datasource": "Prometheus", - "targets": [ - { - "expr": "sum(rate(http_requests_total[5m]))", - "refId": "A" - } - ], - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 16 - }, - "format": "none" - }, - { - "type": "singlestat", - "title": "Up Time", - "datasource": "Prometheus", - "targets": [ - { - "expr": "time() - node_boot_time_seconds", - "refId": "A" - } - ], - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 16 - }, - "format": "s" - } - ] - } \ No newline at end of file diff --git a/deployment/k8/services/grafana/values.yaml b/deployment/k8/services/grafana/values.yaml deleted file mode 100644 index 4bc84f74b..000000000 --- a/deployment/k8/services/grafana/values.yaml +++ /dev/null @@ -1,40 +0,0 @@ -grafana: - service: - type: LoadBalancer - port: 3000 - targetPort: 3000 - grafana.ini: - auth: - # Disable login form so anonymous users won't be prompted to log in - disable_login_form: true - auth.anonymous: - # Enable anonymous access - enabled: true - # Set the role for anonymous users (e.g., Viewer, Editor) - org_role: Editor - ## Grafana data sources configuration - datasources: - datasources.yaml: - apiVersion: 1 - datasources: - - name: Prometheus - type: prometheus - access: proxy - url: http://prometheus-server - isDefault: true - editable: true - - name: Jaeger - type: jaeger - access: proxy - url: http://jaeger-query:16686 - isDefault: false - editable: true - - ## Set up the sidecar to import data sources (usually enabled by default) - sidecar: - datasources: - enabled: true - dashboards: - enabled: true - label: grafana_dashboard - diff --git a/deployment/k8/services/jaeger/Chart.lock b/deployment/k8/services/jaeger/Chart.lock deleted file mode 100644 index 1e746c04d..000000000 --- a/deployment/k8/services/jaeger/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: jaeger - repository: https://jaegertracing.github.io/helm-charts - version: 3.2.0 -digest: sha256:41ac5fc4455e3fbdd08464f77e94d308ccab23dfde20a1c8f44b168bcbc38194 -generated: "2024-10-18T11:21:05.929732-05:00" diff --git a/deployment/k8/services/jaeger/Chart.yaml b/deployment/k8/services/jaeger/Chart.yaml deleted file mode 100644 index ebfcc5be9..000000000 --- a/deployment/k8/services/jaeger/Chart.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v2 -name: jaeger -description: A Helm chart for deploying Jaeger -appVersion: "3.5.0" -version: 0.1.0 -dependencies: - - name: jaeger - version: "3.2.0" - repository: "https://jaegertracing.github.io/helm-charts" diff --git a/deployment/k8/services/jaeger/values.yaml b/deployment/k8/services/jaeger/values.yaml deleted file mode 100644 index f1658bb75..000000000 --- a/deployment/k8/services/jaeger/values.yaml +++ /dev/null @@ -1,13 +0,0 @@ -jaeger: - allInOne: - enabled: true - provisionDataStore: - cassandra: false - storage: - type: memory - agent: - enabled: false - collector: - enabled: false - query: - enabled: false diff --git a/deployment/k8/services/kafka-op/templates/kafka-single-node.yaml b/deployment/k8/services/kafka-op/templates/kafka-cluster.yaml similarity index 74% rename from deployment/k8/services/kafka-op/templates/kafka-single-node.yaml rename to deployment/k8/services/kafka-op/templates/kafka-cluster.yaml index 018ba3090..d43fdd37f 100644 --- a/deployment/k8/services/kafka-op/templates/kafka-single-node.yaml +++ b/deployment/k8/services/kafka-op/templates/kafka-cluster.yaml @@ -4,9 +4,9 @@ kind: KafkaNodePool metadata: name: dual-role labels: - strimzi.io/cluster: kafka-cluster + strimzi.io/cluster: {{ .Values.clusterName}} spec: - replicas: 1 + replicas: {{ .Values.nodePool.replicas}} roles: - controller - broker @@ -15,22 +15,22 @@ spec: volumes: - id: 0 type: persistent-claim - size: 10Gi - deleteClaim: true + size: {{ .Values.nodePool.volume.size}} + deleteClaim: {{ .Values.nodePool.volume.deleteClaim}} kraftMetadata: shared --- apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: - name: kafka-cluster + name: {{ .Values.clusterName}} annotations: strimzi.io/node-pools: enabled strimzi.io/kraft: enabled spec: kafka: - version: 3.8.0 - metadataVersion: 3.8-IV0 + version: {{ .Values.kafkaVersion}} + metadataVersion: {{ .Values.kafkaMetadataVersion}} listeners: - name: plain port: 9092 diff --git a/deployment/k8/services/kafka-op/values.yaml b/deployment/k8/services/kafka-op/values.yaml index 01cce5cc2..e871f0dbf 100644 --- a/deployment/k8/services/kafka-op/values.yaml +++ b/deployment/k8/services/kafka-op/values.yaml @@ -1,38 +1 @@ # Configuration for Strimzi Kafka Operator -#strimzi-kafka-operator: -# You can add operator-specific configurations here if needed -# For example, enabling metrics, RBAC settings, etc. - -## Configuration for the Kafka Cluster -#kafka: -# name: kafka-cluster -# version: "3.6.0" # Kafka version supporting KRaft -# replicas: 1 -# config: -# processRoles: "broker,controller" -# nodeId: 1 -# controllerQuorumVoters: "1@kafka-cluster-0.kafka-cluster-bootstrap:9093" -# interBrokerProtocolVersion: "3.5" -# logMessageFormatVersion: "3.5" -# autoCreateTopicsEnable: "true" -# storage: -# type: "ephemeral" # Use "persistent-claim" for persistent storage -# size: "20Gi" -# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class -# deleteClaim: false -# -## Configuration for the Controller -#controller: -# replicas: 1 -# resources: -# limits: -# memory: "2Gi" -# cpu: "1000m" -# requests: -# memory: "1Gi" -# cpu: "500m" -# storage: -# type: "ephemeral" # Use "persistent-claim" for persistent storage -# size: "10Gi" -# class: "managed-nfs-storage" # Set to empty string "" if not using a specific storage class -# deleteClaim: false diff --git a/deployment/k8/services/migration-console/values.yaml b/deployment/k8/services/migration-console/values.yaml index e69b3fc13..3f45c058a 100644 --- a/deployment/k8/services/migration-console/values.yaml +++ b/deployment/k8/services/migration-console/values.yaml @@ -1,3 +1 @@ # Default values for migration-console. - -enabled: false diff --git a/deployment/k8/services/opensearch-helm/Chart.lock b/deployment/k8/services/opensearch-helm/Chart.lock deleted file mode 100644 index 54483035e..000000000 --- a/deployment/k8/services/opensearch-helm/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: opensearch - repository: https://opensearch-project.github.io/helm-charts/ - version: 2.23.1 -digest: sha256:0aab035ab026b655b42c6441cf5ce4e7d05cdec3a37bd049acf1781ab8894514 -generated: "2024-10-11T18:07:51.973102-05:00" diff --git a/deployment/k8/services/opensearch-helm/Chart.yaml b/deployment/k8/services/opensearch-helm/Chart.yaml deleted file mode 100644 index f2f9b6f96..000000000 --- a/deployment/k8/services/opensearch-helm/Chart.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v2 -name: opensearch-helm -version: 0.1.0 -dependencies: - - name: opensearch - version: "2.23.1" - repository: "https://opensearch-project.github.io/helm-charts/" - alias: opensearch-local diff --git a/deployment/k8/services/opensearch-helm/values.yaml b/deployment/k8/services/opensearch-helm/values.yaml deleted file mode 100644 index e79669d6f..000000000 --- a/deployment/k8/services/opensearch-helm/values.yaml +++ /dev/null @@ -1,17 +0,0 @@ -opensearch-local: - fullnameOverride: "target-cluster" - image: - tag: "2.17.0" - replicas: 1 - singleNode: true - config: - discovery.type: single-node - extraEnvs: - - name: OPENSEARCH_INITIAL_ADMIN_PASSWORD - value: myStrongPassword123! -# - name: http.port -# value: "29200" - service: - type: LoadBalancer -# httpPort: 29200 -# httpHostPort: 29200 diff --git a/deployment/k8/services/prometheus/Chart.lock b/deployment/k8/services/prometheus/Chart.lock deleted file mode 100644 index 3dae47c0c..000000000 --- a/deployment/k8/services/prometheus/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: prometheus - repository: https://prometheus-community.github.io/helm-charts - version: 25.27.0 -digest: sha256:30e4a566c45c3dd4ce80a501e9c4d0903d1364a2810aaba965e8796a703a2093 -generated: "2024-10-17T23:31:30.225286-05:00" diff --git a/deployment/k8/services/prometheus/Chart.yaml b/deployment/k8/services/prometheus/Chart.yaml deleted file mode 100644 index 7a4fa048e..000000000 --- a/deployment/k8/services/prometheus/Chart.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v2 -name: prometheus -description: A Helm chart for deploying Prometheus -appVersion: "3.5.0" -version: 0.1.0 -dependencies: - - name: prometheus - version: "25.27.0" - repository: "https://prometheus-community.github.io/helm-charts" diff --git a/deployment/k8/services/prometheus/values.yaml b/deployment/k8/services/prometheus/values.yaml deleted file mode 100644 index 208967dd3..000000000 --- a/deployment/k8/services/prometheus/values.yaml +++ /dev/null @@ -1 +0,0 @@ -#prometheus: