ฉันมีสแต็ก EFK บนคลัสเตอร์ kubernetes ใน AWS EKS แล้ว และฉันตั้งใจที่จะเพิ่มฟังก์ชันการบันทึก s3 สำหรับพ็อด elasticsearch ใน es-statefulset สำหรับสิ่งนี้ ฉันได้สร้างอิมเมจ elasticseach แบบกำหนดเองโดยเพิ่มปลั๊กอิน repository-s3 แล้วเพิ่ม init-container สำหรับจัดเก็บข้อมูลรับรอง AWS ในไฟล์ es-statefulset yaml แต่เมื่อใช้การเปลี่ยนแปลง ส่วนelasticseach pods ของ es statefulset ล้มเหลวด้วย 'ข้อผิดพลาด'
การกำหนดค่า statefulset เป็นดังนี้:
apiVersion: เวอร์ชัน API ของแอป/v1 # ของ kubernetes ซึ่งมี "StatefulSet" ให้ใช้งาน สำหรับ Kubernetes 1.8.7 แอพ/v1beta1
ชนิด: StatefulSet # ประเภทของทรัพยากรที่เรากำลังสร้าง
ข้อมูลเมตา: # เก็บข้อมูลเมตาสำหรับทรัพยากรนี้
ชื่อ: es # ชื่อของทรัพยากรนี้
เนมสเปซ: การบันทึก kube
ป้ายกำกับ: # ข้อมูลเมตาเพิ่มเติมจะอยู่ภายในป้ายกำกับ มันเป็นทรัพยากร stateful
ส่วนประกอบ: elasticsearch # เป็นเพียงข้อมูลเมตาที่เรากำลังเพิ่ม
spec: # เก็บข้อมูลจำเพาะของทรัพยากรนี้
แบบจำลอง: 5 # รับผิดชอบในการรักษาจำนวนแบบจำลองที่กำหนด
ตัวเลือก:
ป้ายกำกับการแข่งขัน:
ส่วนประกอบ:elasticsearch
serviceName: elasticsearch # ชื่อของบริการ จำเป็นโดย statefulset
เทมเพลต: # เทมเพลตเก็บข้อมูลจำเพาะของพ็อดที่จะสร้างและดูแลโดย statefulset
ข้อมูลเมตา: # เก็บข้อมูลเมตาสำหรับพ็อด
ป้ายกำกับ: # ข้อมูลเมตาเพิ่มเติมจะอยู่ภายในป้ายกำกับ มันมีไว้สำหรับฝัก
ส่วนประกอบ: elasticsearch # เป็นเพียงข้อมูลเมตาสำหรับพ็อด
spec : #ชูสเป็คฝัก
initContainers: # จะเริ่มต้นก่อนคอนเทนเนอร์อื่นในพ็อดเสมอ
- ชื่อ: init-sysctl # ชื่อของ init-container
อิมเมจ: busybox # อิมเมจที่จะนำไปใช้ในคอนเทนเนอร์นี้
imagePullPolicy: IfNotPresent # ตั้งค่านโยบายที่จะดึงเฉพาะรูปภาพจากรีจิสทรีหากไม่มีอยู่ในเครื่อง
คำสั่ง: ["sysctl", "-w", "vm.max_map_count=262144"] # ตั้งค่าตัวแปรของระบบในคอนเทนเนอร์ ค่านี้จำเป็นโดย ES
securityContext: # บริบทความปลอดภัยถือสิทธิ์พิเศษใด ๆ ที่มอบให้กับคอนเทนเนอร์นี้
สิทธิ์: จริง # คอนเทนเนอร์นี้ได้รับสิทธิ์ให้ทำงานในโหมดสิทธิ์พิเศษ
- ชื่อ: add-aws-keys
รูปภาพ: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
สภาพแวดล้อม:
- ชื่อ: AWS_ACCESS_KEY_ID
มูลค่าจาก:
secretKeyRef:
ชื่อ: aws-s3-keys
คีย์: access-key-id
- ชื่อ: AWS_SECRET_ACCESS_KEY
มูลค่าจาก:
secretKeyRef:
ชื่อ: aws-s3-keys
คีย์: การเข้าถึงคีย์ลับ
สั่งการ:
- ช
- -ค
- |
เสียงสะท้อน $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.access_key
เสียงสะท้อน $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.secret_key
คอนเทนเนอร์: # เก็บรายการและการกำหนดค่าของคอนเทนเนอร์ปกติในพ็อด
- ชื่อ: es # ชื่อของคอนเทนเนอร์แรก
securityContext: # บริบทความปลอดภัยถือสิทธิ์พิเศษใด ๆ ที่มอบให้กับคอนเทนเนอร์นี้
ความสามารถ: # Container จะมีความสามารถในการ IPC Lock สามารถล็อคหน่วยความจำไม่ให้ถูกสับเปลี่ยนได้
เพิ่ม:
- IPC_LOCK
รูปภาพ: xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
env: # อาร์เรย์ของตัวแปรสภาพแวดล้อมที่มีค่าจะถูกส่งผ่านไปยังภาพนี้
- ชื่อ: KUBERNETES_CA_CERTIFICATE_FILE
ค่า: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- ชื่อ: NAMESPACE
มูลค่าจาก:
fieldRef:
fieldPath: metadata.namespace
- ชื่อ: "CLUSTER_NAME"
ค่า: "myesdb1"
- ชื่อ: "DISCOVERY_SERVICE"
ค่า: "elasticsearch"
- ชื่อ: NETWORK_HOST
ค่า: "_eth0_"
- ชื่อ: ES_JAVA_OPTS #Specify the Heap Size
ค่า: -Xms1536m -Xmx1536m
พอร์ต: # พอร์ตที่พ็อดนี้จะเปิด
- ตู้คอนเทนเนอร์พอร์ต: 9200
ชื่อ: http
โปรโตคอล: TCP
- ตู้คอนเทนเนอร์พอร์ต: 9300
ชื่อ: ขนส่ง
โปรโตคอล: TCP
volumeMounts: # เส้นทางที่จะเมานต์ไดรฟ์ข้อมูล
- mountPath: /ข้อมูล
ชื่อ: ที่เก็บข้อมูล # ชื่อที่กำหนดให้กับเมานต์นี้
อัปเดตกลยุทธ์:
ประเภท: RollingUpdate
volumeClaimTemplates: # ให้พื้นที่เก็บข้อมูลที่เสถียรโดยใช้ PersistentVolumes ที่จัดเตรียมโดย PersistentVolume Provisioner
- ข้อมูลเมตา: # ข้อมูลเมตาที่กำหนดให้กับทรัพยากรนี้ (การอ้างสิทธิ์ปริมาณแบบถาวร)
ชื่อ: ที่เก็บข้อมูล # ชื่อของทรัพยากรนี้
spec: # ข้อมูลจำเพาะของ PVC นี้ (Persistant Volume Claim)
storageClassName: gp2 # คลาสพื้นที่เก็บข้อมูลที่ใช้ในการจัดเตรียม PVC นี้
accessModes: [ ReadWriteOnce ] # โหมดการเข้าถึงของวอลุ่ม
ทรัพยากร: # เก็บรายการทรัพยากร
คำขอ: # คำขอที่ส่งไปยังคลาสที่เก็บข้อมูล
ความจุ: 100Gi
พ็อดอธิบายให้สิ่งต่อไปนี้:
$ kubectl อธิบาย pod/es-0 -n kube-logging
ชื่อ: es-0
เนมสเปซ: การบันทึก kube
ลำดับความสำคัญ: 0
โหนด: ip-xxxxxxxxxxxx.ap-southeast-1.compute.internal/xxxxxxxxx
เวลาเริ่ม: พฤ. 19 ส.ค. 2564 16:23:44 +0000
ป้ายกำกับ: component=elasticsearch
ตัวควบคุมการแก้ไขแฮช = es-7dc4b7477c
statefulset.kubernetes.io/pod-name=es-0
คำอธิบายประกอบ: kubernetes.io/psp: eks.privileged
สถานะ: กำลังดำเนินการ
IP: xxxxxxxxxxxx
IP:
IP: xxxxxxxxxxxxxx
ควบคุมโดย: StatefulSet/es
คอนเทนเนอร์เริ่มต้น:
เริ่มต้น sysctl:
รหัสคอนเทนเนอร์: นักเทียบท่า: //291ab715d302d7f505925168685955ad20c529e4db3371c3385e911614d60179
รูปภาพ: busybox
รหัสรูปภาพ: docker-pullable://busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
พอร์ต: <ไม่มี>
พอร์ตโฮสต์: <ไม่มี>
สั่งการ:
ระบบ
-ว
vm.max_map_count=262144
สถานะ: สิ้นสุด
เหตุผล: เสร็จสิ้น
รหัสทางออก: 0
เริ่มเมื่อ: พฤ. 19 ส.ค. 2564 16:23:50 +0000
เสร็จสิ้น: พฤ. 19 ส.ค. 2564 16:23:50 น. +0000
พร้อม:จริง
เริ่มนับใหม่: 0
สภาพแวดล้อม: <ไม่มี>
ภูเขา:
/var/run/secrets/kubernetes.io/serviceaccount จาก default-token-9nv96 (ro)
เพิ่มคีย์ aws:
รหัสคอนเทนเนอร์: นักเทียบท่า: //23e3335b99c8a5bf144f2f2a52c1bbd357a667205ce335ead5e0627ecdf403e9
รูปภาพ: xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
รหัสรูปภาพ: docker-pullable://xxxxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7dda1c4332c6
พอร์ต: <ไม่มี>
พอร์ตโฮสต์: <ไม่มี>
สั่งการ:
ช
-ค
เสียงสะท้อน $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.access_key
เสียงสะท้อน $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.secret_key
สถานะ: สิ้นสุด
เหตุผล: เสร็จสิ้น
รหัสทางออก: 0
เริ่มเมื่อ: พฤ. 19 ส.ค. 2564 16:23:50 +0000
เสร็จสิ้น: พฤ. 19 ส.ค. 2564 16:23:53 น. +0000
พร้อม:จริง
เริ่มนับใหม่: 0
สิ่งแวดล้อม:
AWS_ACCESS_KEY_ID: <ตั้งค่าเป็นคีย์ 'รหัสการเข้าถึงคีย์' เป็นความลับ 'aws-s3-keys'> ทางเลือก: เท็จ
AWS_SECRET_ACCESS_KEY: <ตั้งค่าเป็นคีย์ 'รหัสลับการเข้าถึง' ในรหัสลับ 'aws-s3-keys'> ไม่บังคับ: เท็จ
ภูเขา:
/var/run/secrets/kubernetes.io/serviceaccount จาก default-token-9nv96 (ro)
ตู้คอนเทนเนอร์:
es:
รหัสคอนเทนเนอร์: นักเทียบท่า: //a26a4cf4ed98f0f6dd535069e8a5c54dbf39746a04e8a14fbacb0c51ff4684ec
รูปภาพ: xxxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2
รหัสรูปภาพ: docker-pullable://xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes@sha256:c09d586a4bdc7149c41ff74783bae0138f68c4779f03315b197e7dda1c4332c6
พอร์ต: 9200/TCP, 9300/TCP
พอร์ตโฮสต์: 0/TCP, 0/TCP
รัฐ: กำลังรอ
เหตุผล: CrashLoopBackOff <<<<<<<<<<<
สถานะล่าสุด: สิ้นสุด <<<<<<<<<<<<<<<<<
เหตุผล: ข้อผิดพลาด
รหัสทางออก: 1
เริ่มเมื่อ: พฤ. 19 ส.ค. 2564 16:50:16 น. +0000
เสร็จสิ้น: พฤ. 19 ส.ค. 2564 16:50:17 น. +0000
พร้อม: เท็จ
เริ่มนับใหม่: 10
สิ่งแวดล้อม:
KUBERNETES_CA_CERTIFICATE_FILE: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
NAMESPACE: การบันทึก kube (v1:metadata.namespace)
CLUSTER_NAME: myesdb1
DISCOVERY_SERVICE: การค้นหาแบบยืดหยุ่น
NETWORK_HOST: _eth0_
ES_JAVA_OPTS: -Xms1536m -Xmx1536m
ภูเขา:
/ข้อมูลจากหน่วยเก็บข้อมูล (rw)
/var/run/secrets/kubernetes.io/serviceaccount จาก default-token-9nv96 (ro)
เงื่อนไข:
พิมพ์สถานะ
เริ่มต้น True
พร้อมเท็จ
ตู้คอนเทนเนอร์พร้อมเป็นเท็จ
PodScheduled จริง
ปริมาณ:
พื้นที่จัดเก็บ:
ประเภท: PersistentVolumeClaim (การอ้างอิงถึง PersistentVolumeClaim ในเนมสเปซเดียวกัน)
ชื่อการอ้างสิทธิ์: storage-es-0
อ่านอย่างเดียว: เท็จ
โทเค็นเริ่มต้น-9nv96:
ประเภท: ความลับ (ไดรฟ์ข้อมูลที่เป็นความลับ)
SecretName: default-token-9nv96
ตัวเลือก: เท็จ
คลาส QoS: BestEffort
ตัวเลือกโหนด: <ไม่มี>
ความคลาดเคลื่อน: node.kubernetes.io/not-ready:NoExecute เป็นเวลา 300 วินาที
node.kubernetes.io/unreachable:NoExecute เป็นเวลา 300 วินาที
เหตุการณ์:
พิมพ์อายุเหตุผลจากข้อความ
---- ------ ---- ---- -------
ตัวกำหนดตารางเวลาเริ่มต้นปกติ 29m กำหนด kube-logging/es-0 เป็น ip-xxxxxxx.ap-southeast-1.compute.internal เรียบร้อยแล้ว
สำเร็จปกติAttachVolume 29m ไฟล์แนบdetach-controller AttachVolume.Attach สำเร็จสำหรับไดรฟ์ข้อมูล "pvc-2abce33a-7193-4070-b4da-74486e72d568"
อิมเมจคอนเทนเนอร์ kubelet ขนาด 29m ที่ดึงออกมาปกติ "busybox" มีอยู่แล้วในเครื่อง
ปกติสร้าง 29m kubelet สร้างคอนเทนเนอร์ init-sysctl
ปกติเริ่มต้น 29m kubelet เริ่มต้นคอนเทนเนอร์ init-sysctl
อิมเมจคอนเทนเนอร์ kubelet ที่ดึงออกมาปกติ 29m "xxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2" มีอยู่แล้วในเครื่อง
ปกติสร้าง 29m kubelet สร้างคอนเทนเนอร์ add-aws-keys
ปกติเริ่มต้น 29m kubelet เริ่มต้นคอนเทนเนอร์ add-aws-keys
ปกติสร้าง 29m (x4 มากกว่า 29m) kubelet สร้างคอนเทนเนอร์ es
Normal Started 29m (x4 over 29m) kubelet Started container es
Normal Pulled 28m (x5 over 29m) kubelet Container image "xxxxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2" มีอยู่แล้วในเครื่อง
คำเตือน BackOff 4m46s (x115 มากกว่า 29m) kubelet Back-off การรีสตาร์ทคอนเทนเนอร์ล้มเหลว
บันทึกของพ็อดแสดงข้อผิดพลาดที่เกี่ยวข้องกับ AccessDeniedException: /elasticsearch/config/elasticsearch.keystore:
$ kubectl บันทึก pod/es-0 -n kube-logging
กำลังเริ่มต้น Elasticsearch 6.4.2
ข้อยกเว้นในเธรด "หลัก" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore
สาเหตุที่เป็นไปได้: java.nio.file.AccessDeniedException: /elasticsearch/config/elasticsearch.keystore <<<<<<<<<<<<
ที่ sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
ที่ sun.nio.fs.UnixException.rethrowAsIOException (UnixException.java:102)
ที่ sun.nio.fs.UnixException.rethrowAsIOException (UnixException.java:107)
ที่ sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
ที่ java.nio.file.Files.newByteChannel(Files.java:361)
ที่ java.nio.file.Files.newByteChannel(Files.java:407)
ที่ org.apache.lucene.store.SimpleFSDirectory.openInput(SimpleFSDirectory.java:77)
ที่ org.elasticsearch.common.settings.KeyStoreWrapper.load(KeyStoreWrapper.java:215)
ที่ org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:226)
ที่ org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:291)
ที่ org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136)
ที่ org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127)
ที่ org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
ที่ org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
ที่ org.elasticsearch.cli.Command.main(Command.java:90)
ที่ org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93)
ที่ org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86)
โปรดดูบันทึกสำหรับรายละเอียดข้อผิดพลาดทั้งหมด
การค้นคว้าเพิ่มเติมเกี่ยวกับเรื่องนี้ ฉันพบลิงก์บางส่วนเกี่ยวกับปัญหานี้ซึ่งชี้ไปที่ปัญหาเกี่ยวกับตำแหน่งที่เก็บคีย์ในคอนเทนเนอร์ elasticsearch และการจัดรูปแบบคีย์ใน gcp: https://github.com/elastic/cloud-on-k8s/issues/4124 https://discuss.elastic.co/t/access-denied-error-on-keystore-when-using-eck/276297
แต่ฉันไม่แน่ใจว่าจะแก้ปัญหานี้อย่างไรเช่นเดียวกับใน AWS นอกจากนี้ เมื่อฉันพยายามเพิ่มข้อมูลประจำตัวโดยตรงในขณะที่สร้างอิมเมจแบบกำหนดเอง มันถูกเพิ่มสำเร็จโดยไม่มีข้อผิดพลาด (ทดสอบโดยเริ่มคอนเทนเนอร์จากอิมเมจแบบกำหนดเองที่สร้างโดยใช้ Dockerfile):
...
ขั้นตอนที่ 6/8 : RUN echo $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.access_key
---> ทำงานใน 42f5231573a7
สร้างที่เก็บคีย์ของ elasticsearch ใน /elasticsearch/config
การถอดคอนเทนเนอร์กลาง 42f5231573a7
---> 3b202f355a8b
ขั้นตอนที่ 7/8 : RUN echo $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore เพิ่ม --stdin --force s3.client.default.secret_key
---> ทำงานใน 644e555f2362
การถอดคอนเทนเนอร์กลาง 644e555f2362
---> d08abcc761ce
ขั้นตอนที่ 8/8 : RUN bin/elasticsearch-plugin install --batch repository-s3
---> ทำงานใน d21d7d4fbb7b
-> กำลังดาวน์โหลด repository-s3 จากelastic
[================================================== ] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
@ คำเตือน: ปลั๊กอินต้องได้รับการอนุญาตเพิ่มเติม @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
* java.lang.RuntimePermissionDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.reflect.ReflectPermission ระงับการเข้าถึงการตรวจสอบ
* java.net.SocketPermission * เชื่อมต่อ แก้ไข
* java.util.PropertyPermission es.allow_insecure_settings อ่าน เขียน
ดู http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
สำหรับคำอธิบายเกี่ยวกับสิ่งที่อนุญาตเหล่านี้และความเสี่ยงที่เกี่ยวข้อง
-> ติดตั้ง repository-s3
การถอดคอนเทนเนอร์ระหว่างกลาง d21d7d4fbb7b
---> 19f4588f1f7f
สร้างสำเร็จแล้ว 19f4588f1f7f
ติดแท็ก xxxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/myes:6.4.2 สำเร็จแล้ว
นอกจากนี้ โปรดทราบว่าฉันได้ลองเปลี่ยนสิทธิ์ของ /elasticsearch/config/elasticsearch.keystore เป็น 777 แล้ว แต่ก็ไม่ได้ช่วยอะไรเช่นกัน
ฉันขอขอบคุณความช่วยเหลือในเรื่องนี้