Am deja o stivă EFK pe un cluster Kubernetes în AWS EKS și intenționez să adaug funcționalitatea de înregistrare s3 pentru podurile elasticsearch în es-statefulset. Pentru aceasta, am creat o imagine elasticseach personalizată în care am adăugat pluginul repository-s3 și apoi am adăugat un container init pentru stocarea acreditărilor AWS în fișierul es-statefulset yaml. Dar la aplicarea modificărilor, partea elasticseach pods din es statefulset eșuează cu „Eroare”.
Configurația statefulset este după cum urmează:
apiVersion: apps/v1 # Versiunea API a kubernetes în care `StatefulSet` este disponibil. Pentru Kubernetes 1.8.7 aplicațiile sale/v1beta1
kind: StatefulSet # Tipul de resursă pe care o creăm
metadate: # Deține metadate pentru această resursă
nume: es # Numele acestei resurse
spațiu de nume: kube-logging
etichete: # Metadatele suplimentare merg în interiorul etichetelor. Este pentru resursa cu stat
componentă: elasticsearch # Doar o metadate pe care le adăugăm
spec: # Deține specificația acestei resurse
replici: 5 # Responsabil pentru menținerea numărului dat de replici
selector:
matchLabels:
componentă: elasticsearch
serviceName: elasticsearch # Numele serviciului, cerut de statefulset
template: # Template conține specificațiile podului care vor fi create și întreținute de statefulset
metadate: # Deține metadate pentru pod
etichete: # Metadatele suplimentare merg în interiorul etichetelor. Este pentru pod
componentă: elasticsearch # Doar o metadate pentru pod
spec: # Deține specificațiile podului
initContainers: # se va inițializa întotdeauna înaintea altor containere din pod
- nume: init-sysctl # Numele containerului init
imagine: busybox # Imagine care va fi implementată în acest container
imagePullPolicy: IfNotPresent # Setează politica care extrage imaginea din registru numai dacă nu este disponibilă local
comandă: ["sysctl", "-w", "vm.max_map_count=262144"] # Setează variabilitatea sistemului în container, această valoare este cerută de ES
securityContext: # Contextul de securitate deține orice permisiune specială dată acestui container
privilegiat: true # Acest container primește dreptul de a rula în modul privilegiat
- nume: add-aws-keys
imagine: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
env:
- nume: AWS_ACCESS_KEY_ID
valoareDe la:
secretKeyRef:
nume: aws-s3-keys
cheie: access-key-id
- nume: AWS_SECRET_ACCESS_KEY
valoareDe la:
secretKeyRef:
nume: aws-s3-keys
cheie: acces-cheie-secretă
comanda:
- SH
- -c
- |
echo $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore add --stdin --force s3.client.default.access_key
echo $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore add --stdin --force s3.client.default.secret_key
containere: # Deține lista și configurațiile containerelor normale în pod
- nume: es # Numele primului container
securityContext: # Contextul de securitate deține orice permisiune specială dată acestui container
capabilități: # Containerul va avea capacitatea de a bloca IPC, poate bloca memorie astfel încât să nu fie schimbată.
adăuga:
- IPC_LOCK
imagine: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
env: # matrice de variabile de mediu cu valori sunt transmise acestei imagini
- nume: KUBERNETES_CA_CERTIFICATE_FILE
valoare: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- nume: NAMESPACE
valoareDe la:
fieldRef:
fieldPath: metadata.namespace
- nume: „CLUSTER_NAME”
valoare: "myesdb1"
- nume: „DISCOVERY_SERVICE”
valoare: „elasticsearch”
- nume: NETWORK_HOST
valoare: "_eth0_"
- nume: ES_JAVA_OPTS #Specify the Heap Size
valoare: -Xms1536m -Xmx1536m
porturi: # Porturi pe care le va deschide acest pod
- containerPort: 9200
nume: http
protocol: TCP
- containerPort: 9300
nume: transport
protocol: TCP
volumeMounts: # Calea unde va fi montat volumul.
- mountPath: /data
nume: stocare # Nume dat acestei monturi
updateStrategy:
tip: RollingUpdate
volumeClaimTemplates: # Oferă stocare stabilă folosind PersistentVolumes furnizate de un PersistentVolume Provisioner
- metadate: # Metadate date acestei resurse (Revendicare de volum persistentă)
nume: stocare # Numele acestei resurse
spec: # Specificația acestui PVC (Revendicare de volum persistentă)
storageClassName: gp2 # Clasa de stocare utilizată pentru furnizarea acestui PVC
accessModes: [ ReadWriteOnce ] # Modul de acces al volumului
resurse: # Deține lista de resurse
solicitări: # Solicitări trimise la clasa de stocare
stocare: 100Gi
Podul descris oferă următoarele:
$ kubectl descrie pod/es-0 -n kube-logging
Nume: es-0
Spațiu de nume: kube-logging
Prioritate: 0
Nod: ip-xxxxxxxxxxxx.ap-southeast-1.compute.internal/xxxxxxxxx
Ora de începere: joi, 19 august 2021 16:23:44 +0000
Etichete: component=elasticsearch
controller-revision-hash=es-7dc4b7477c
statefulset.kubernetes.io/pod-name=es-0
Adnotări: kubernetes.io/psp: eks.privileged
Stare: Running
IP: xxxxxxxxxxxx
IP-uri:
IP: xxxxxxxxxxxxx
Controlat de: StatefulSet/es
Containere Init:
init-sysctl:
ID container: docker://291ab715d302d7f505925168685955ad20c529e4db3371c3385e911614d60179
Imagine: busybox
ID imagine: docker-pullable://busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
Port: <niciunul>
Port gazdă: <niciun>
Comanda:
sysctl
-w
vm.max_map_count=262144
Stare: Terminat
Motiv: finalizat
Cod de ieșire: 0
Început: joi, 19 august 2021 16:23:50 +0000
Terminat: joi, 19 august 2021 16:23:50 +0000
Gata: Adevărat
Număr de reporniri: 0
Mediu: <niciun>
Suporturi:
/var/run/secrets/kubernetes.io/serviceaccount din default-token-9nv96 (ro)
add-aws-keys:
ID container: docker://23e3335b99c8a5bf144f2f2a52c1bbd357a667205ce335ead5e0627ecdf403e9
Imagine: xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
ID imagine: docker-pullable://xxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7ddac1c43e7ddac6
Port: <niciunul>
Port gazdă: <niciun>
Comanda:
SH
-c
echo $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore add --stdin --force s3.client.default.access_key
echo $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore add --stdin --force s3.client.default.secret_key
Stare: Terminat
Motiv: finalizat
Cod de ieșire: 0
Început: joi, 19 august 2021 16:23:50 +0000
Terminat: joi, 19 august 2021 16:23:53 +0000
Gata: Adevărat
Număr de reporniri: 0
Mediu inconjurator:
AWS_ACCESS_KEY_ID: <set la cheia „access-key-id” în secret „aws-s3-keys”> Opțional: fals
AWS_SECRET_ACCESS_KEY: <setată la cheia „access-secret-key” în secret „aws-s3-keys”> Opțional: fals
Suporturi:
/var/run/secrets/kubernetes.io/serviceaccount din default-token-9nv96 (ro)
Containere:
es:
ID container: docker://a26a4cf4ed98f0f6dd535069e8a5c54dbf39746a04e8a14fbacb0c51ff4684ec
Imagine: xxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
ID imagine: docker-pullable://xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7ddac64
Porturi: 9200/TCP, 9300/TCP
Porturi gazdă: 0/TCP, 0/TCP
Stare: În așteptare
Motiv: CrashLoopBackOff <<<<<<<<<<<
Ultima stare: Terminat <<<<<<<<<<<<<<<<<
Motiv: Eroare
Cod de ieșire: 1
Început: joi, 19 august 2021 16:50:16 +0000
Terminat: joi, 19 august 2021 16:50:17 +0000
Gata: Fals
Număr de reporniri: 10
Mediu inconjurator:
KUBERNETES_CA_CERTIFICATE_FILE: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
NAMESPACE: kube-logging (v1:metadata.namespace)
CLUSTER_NAME: myesdb1
DISCOVERY_SERVICE: elasticsearch
NETWORK_HOST: _eth0_
ES_JAVA_OPTS: -Xms1536m -Xmx1536m
Suporturi:
/date din stocare (rw)
/var/run/secrets/kubernetes.io/serviceaccount din default-token-9nv96 (ro)
Conditii:
Tastați Stare
Adevărat inițializat
Gata Fals
ContainersReady False
PodScheduled Adevărat
Volume:
depozitare:
Tip: PersistentVolumeClaim (o referință la un PersistentVolumeClaim în același spațiu de nume)
ClaimName: stocare-es-0
Numai citire: fals
default-token-9nv96:
Tip: Secret (un volum populat de un Secret)
SecretName: default-token-9nv96
Opțional: fals
Clasa QoS: BestEffort
Selectori de noduri: <niciunul>
Tolerări: node.kubernetes.io/not-ready:NoExecute pentru 300 de secunde
node.kubernetes.io/unreachable:NoExecute pentru 300 de secunde
Evenimente:
Introduceți Motivul Vârsta din mesaj
---- ------ ---- ---- -------
Normal programat 29m default-scheduler Alocat cu succes kube-logging/es-0 la ip-xxxxxxx.ap-southeast-1.compute.internal
Normal SuccessfulAttachVolume 29m attachdetach-controller AttachVolume.Atașarea reușită pentru volumul „pvc-2abce33a-7193-4070-b4da-74486e72d568”
Normal Tras 29m kubelet Imaginea containerului „busybox” deja prezentă pe mașină
Normal Creat 29m kubelet Container creat init-sysctl
Normal Pornit 29m kubelet Pornit container init-sysctl
Imaginea containerului Kubelet normal tras 29 m „xxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2” deja prezentă pe mașină
Normal Creat 29m kubelet Creat container add-aws-keys
Normal Pornit 29m kubelet Pornit container add-aws-keys
Normal Creat 29m (x4 peste 29m) kubelet Creat container es
Normal Started 29m (x4 over 29m) Kubelet Started container es
Normal tras 28 m (x5 peste 29 m) Kubelet Imaginea containerului „xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2” deja prezentă pe mașină
Avertisment BackOff 4m46s (x115 peste 29m) kubelet Back-off repornirea containerului eșuat
Jurnalele pod oferă următoarea eroare legată de AccessDeniedException: /elasticsearch/config/elasticsearch.keystore:
$ kubectl înregistrează pod/es-0 -n kube-logging
Pornirea Elasticsearch 6.4.2
Excepție în firul „principal” org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore
Cauza principală probabilă: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore <<<<<<<<<<<<
la sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
la sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
la sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
la sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
la java.nio.file.Files.newByteChannel(Files.java:361)
la java.nio.file.Files.newByteChannel(Files.java:407)
la org.apache.lucene.store.SimpleFSDirectory.openInput(SimpleFSDirectory.java:77)
la org.elasticsearch.common.settings.KeyStoreWrapper.load(KeyStoreWrapper.java:215)
la org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:226)
la org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:291)
la org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136)
la org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)
la org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
la org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
la org.elasticsearch.cli.Command.main(Command.java:90)
la org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)
la org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)
Consultați jurnalul pentru detalii complete despre eroare.
Cercetând în continuare despre acest lucru, am găsit câteva link-uri referitoare la această problemă care indică o problemă cu locația depozitului de chei în containerul elasticsearch și o formatare a cheilor în gcp: https://github.com/elastic/cloud-on-k8s/issues/4124 https://discuss.elastic.co/t/access-denied-error-on-keystore-when-using-eck/276297
dar nu sunt sigur cum să rezolv acest lucru ca în AWS, în plus, când am încercat să adaug acreditările direct în timpul creării imaginii personalizate, a fost adăugat cu succes fără nicio eroare, (testat prin pornirea unui container din imaginea personalizată construită folosind Dockerfile):
...
Pasul 6/8: RUN echo $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore add --stdin --force s3.client.default.access_key
---> Rulează în 42f5231573a7
S-a creat magazinul de chei elasticsearch în /elasticsearch/config
Scoaterea containerului intermediar 42f5231573a7
---> 3b202f355a8b
Pasul 7/8: RUN echo $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore add --stdin --force s3.client.default.secret_key
---> Rulează în 644e555f2362
Scoaterea containerului intermediar 644e555f2362
---> d08abcc761ce
Pasul 8/8: RUN bin/elasticsearch-plugin install --batch repository-s3
---> Rulează în d21d7d4fbb7b
-> Descărcarea repository-s3 din elastic
[=================================================== ] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
@ AVERTISMENT: pluginul necesită permisiuni suplimentare @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission suppressAccessChecks
* java.net.SocketPermission * conectați, rezolvați
* java.util.PropertyPermission es.allow_insecure_settings citi, scrie
Consultați http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
pentru descrieri despre ceea ce permit aceste permisiuni și riscurile asociate.
-> Repository-s3 instalat
Îndepărtarea containerului intermediar d21d7d4fbb7b
---> 19f4588f1f7f
19f4588f1f7f construit cu succes
Etichetat cu succes xxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
De asemenea, rețineți că am încercat să schimb permisiunea /elasticsearch/config/elasticsearch.keystore la 777, dar nici nu a ajutat.
Aș aprecia ceva ajutor în această problemă.