Puncte:0

Problemă cu pornirea podurilor kubernetes elasticsearch din cauza accesului refuzat în elasticsearch.keystore

drapel ai

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ă.

Aditya Agarwal avatar
drapel ai
Această problemă a fost rezolvată după ce am repornit toate nodurile pe care a fost configurat cluster-ul kubernetes. Nu sunt sigur cum acest lucru a eliminat intrările învechite, deoarece podurile foloseau volum persistent care ar fi rămas același chiar și după reporniri.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.