การปรับขนาดแบบไดนามิกในที่เก็บ - แบ็กกราวเดอร์ของ Tableau Server

บทนำ

การปรับขนาดแบบไดนามิกของแบ็กกราวเดอร์ในที่เก็บช่วยให้สามารถใช้กลยุทธ์การปรับขนาดต่างๆ กับแบ็กกราวเดอร์และงานที่กำหนดเวลาไว้ใน Tableau Server ได้ การปรับขนาดอัตโนมัติในบริบทนี้หมายความว่าบริการต่างๆ จะสามารถได้รับการปรับขนาดได้อย่างอิสระเพื่อจัดการกับภาระงานที่หลากหลายโดยไม่ต้องมีการแทรกแซงของมนุษย์หรือส่งผลกระทบต่อเวลาทำงานของระบบเซิร์ฟเวอร์อื่นๆ ที่เก็บของ Tableau Server ที่มีโหนดที่สมบูรณ์ของกระบวนการ Tableau Server จะยังคงทำงานเป็นระบบ Monolithic แต่ชุดบริการที่เก็บอิสระแบบแยกส่วนที่มีขนาดเล็กกว่า ซึ่งประกอบด้วยบทบาทบริการ "แบ็กกราวเดอร์" จะสามารถปรับขนาดแบบไดนามิกและจัดการโหลดการคำนวณที่ปกติจะถูกจัดการโดยที่เก็บ Tableau Server ได้ บริการแบ็กกราวเดอร์มีหน้าที่รับผิดชอบในการประมวลผลงานของระบบซึ่งรวมถึงการรีเฟรช/สร้างข้อมูลที่แยก การส่งการสมัครรับข้อมูล การตรวจสอบการแจ้งเตือนข้อมูล และงานบำรุงรักษาจำนวนมาก ตัวอย่างเช่น หากบางครั้งการรีเฟรชชุดข้อมูลจำนวนมากหรือการคำนวณการแจ้งเตือนข้อมูลที่มีราคาสูงเป็นจำนวนเท่าๆ กันเป็นประโยชน์ต่อคุณ คุณจะสามารถใช้ประโยชน์จาก Kubernetes เพื่อขยายกำลังการประมวลผลเพื่อทำงานเหล่านั้นให้เสร็จลุล่วงได้อย่างคุ้มค่าได้แล้ว คู่มือนี้ครอบคลุมข้อกำหนดในการกำหนดค่าและการปรับใช้สำหรับการปรับขนาดแบ็กกราวเดอร์อัตโนมัติใน Kubernetes เอกสารนี้เป็นส่วนเสริมของ Tableau Server ในคอนเทนเนอร์

ข้อกำหนดเบื้องต้น

การปรับขนาดแบ็กกราวเดอร์อัตโนมัติใช้ได้เฉพาะใน Kubernetes และอิงตาม Tableau Server ในที่เก็บ ในการใช้ฟีเจอร์การปรับขนาดแบ็กกราวเดอร์อัตโนมัติ คุณต้องมีคุณสมบัติตรงตามข้อกำหนดเบื้องต้นบางประการ:

ข้อจำกัด

  • ฟีเจอร์นี้ทำงานเป็นส่วนหนึ่งของการปรับใช้บน Linux เท่านั้น
  • การปรับขนาดแบ็กกราวเดอร์อัตโนมัติไม่รองรับงานลำดับงาน งานลำดับงานจะได้รับการจัดการโดยบริการแบ็กกราวเดอร์ที่จะทำงานต่อไปในที่เก็บ Tableau Server

การสร้าง Tableau Server และอิมเมจจากพ็อดสำหรับแบ็กกราวเดอร์

ขั้นตอนแรกสำหรับการใช้การปรับขนาดแบ็กกราวเดอร์อัตโนมัติในที่เก็บคือการสร้างอิมเมจของบริการที่ประกอบเป็นการติดตั้ง Tableau Server อิมเมจเหล่านี้จะรวมถึงอิมเมจของ Tableau Server รวมทั้งอิมเมจสำหรับแบ็กกราวเดอร์แยกต่างหากและบริการสนับสนุน คุณควรใช้เครื่องมือสร้างเดียวกันกับที่ใช้ในการสร้างอิมเมจที่เก็บ Tableau Server แบบ all-in-one ที่ครอบคลุม แต่เครื่องมือต้องเป็นเวอร์ชัน 2022.3.0 หรือใหม่กว่า นอกจากนั้นยังต้องมีใบอนุญาตใช้ Advanced Management และจำเป็นต้องใช้แฟล็กพิเศษเมื่อสร้างอิมเมจอีกด้วย

  1. ในการสร้างอิมเมจของบริการ ให้เรียกคำสั่งนี้:

    build-image --accepteula -i <installer> --backgrounder-images

    คำสั่งนี้จะสร้าง Tableau Server และอิมเมจใหม่ 4 รายการ อิมเมจเพิ่มเติมเหล่านี้จะมีบริการต่างๆ ที่ประกอบเป็นพ็อดแบ็กกราวเดอร์ที่ปรับขนาดอัตโนมัติได้ใหม่

    รายการคำสั่ง docker images ที่อิมเมจสร้างขึ้นในที่เก็บด็อกเกอร์ภายใน:

    hyper                          20214.21.1117.1006             52fd9843c178   10 seconds ago
    gateway                        20214.21.1117.1006             2308e602a2a3   11 seconds ago
    backgrounder                   20214.21.1117.1006             4540e459cf23   12 seconds ago
    dataserver                     20214.21.1117.1006             c5345ed47f51   12 seconds ago
    tableau_server_image           20214.21.1117.1006             b27817047dd1   7 minutes ago

    อิมเมจ Hyper, เกตเวย์, แบ็กกราวเดอร์ และเซิร์ฟเวอร์ข้อมูลจะประกอบเป็นพ็อดแบ็กกราวเดอร์ใหม่ ไดรเวอร์ที่กำหนดเอง สคริปต์การติดตั้ง และพร็อพเพอร์ตี้จะถูกแชร์กับทั้ง 5 อิมเมจเหล่านี้ หากต้องการข้อมูลเพิ่มเติม โปรดดู การปรับแต่งอิมเมจ

  2. เผยแพร่อิมเมจเหล่านี้ทั้งหมดไปยังที่เก็บอิมเมจภายในของคุณเพื่อปรับใช้

คู่มือการนำไปใช้งาน

ข้อมูลต่อไปนี้จะให้บริบทเกี่ยวกับวิธีการปรับใช้ Tableau Server ในที่เก็บและที่ใช้การปรับขนาดแบ็กกราวเดอร์อัตโนมัติ ข้อมูลนี้จะถือว่าคุณเข้าใจและรู้วิธีปรับใช้ Tableau Server ในที่เก็บที่มีอยู่ในตัวแล้ว หากต้องการข้อมูลเพิ่มเติม โปรดดูTableau Server ในคอนเทนเนอร์ ไฟล์การกำหนดค่า Kubernetes 3 ไฟล์ในส่วนการกำหนดค่า Kubernetes เป็นเทมเพลตที่ใช้ตั้งค่าการปรับใช้งาน ส่วนอื่นๆ ในคู่มือนี้จะอธิบายข้อกำหนดและรายละเอียดของการปรับใช้

การปรับใช้ Tableau Server และการปรับใช้แบ็กกราวเดอร์อัตโนมัติควรจะง่ายพอๆ กับการปรับใช้ไฟล์การกำหนดค่า Kubernetes ที่แสดงขึ้นที่ด้านล่างของคู่มือ:

kubectl apply -f <tableau-kubeconfig-dir>

งานของแบ็กกราวเดอร์

พ็อดแบ็กกราวเดอร์จะช่วย Tableau Server ในที่เก็บคำนวณปริมาณงานที่กำหนดเวลาเพิ่มเติมควบคู่กันได้ แบ็กกราวเดอร์จะจัดการการรีเฟรชการแยกข้อมูล การสมัครรับข้อมูล การแจ้งเตือน ลำดับงาน และปริมาณงานของระบบ การกระจายงานระหว่างพ็อดแบ็กกราวเดอร์หมายความว่าจะมีทรัพยากรการประมวลผลมากขึ้นสำหรับ Tableau Server ในการจัดการงานอื่นๆ อย่างเช่น กิจกรรมของผู้ใช้แบบโต้ตอบ เช่น การแสดงผลเวิร์กบุ๊กและแดชบอร์ด งานลำดับงานเป็นงานของแบ็กกราวเดอร์ประเภทเดียวที่ไม่ทำงานในแบ็กกราวเดอร์ หากต้องการรายละเอียดเกี่ยวกับงานของแบ็กกราวเดอร์ โปรดดู การจัดการงานพื้นหลังใน Tableau Server

พ็อดแบ็กกราวเดอร์สามารถจัดการปริมาณงานได้ทุกประเภท ยกเว้นงานลำดับงาน ซึ่งต้องเรียกใช้ในที่เก็บ Tableau Server หลัก ซึ่งจะเรียกใช้บริการแบ็กกราวด์ต่อไป

ฟีเจอร์บทบาทของโหนดช่วยให้ผู้ใช้มีความยืดหยุ่นในการใช้พ็อดแบ็กกราวเดอร์สำหรับงานบางประเภทโดยเฉพาะ ฟีเจอร์นี้เป็นส่วนขยายของฟีเจอร์บทบาทของโหนดบน Tableau server คำอธิบายโดยละเอียดเกี่ยวกับบทบาทของโหนดต่างๆ สามารถดูได้ที่นี่ โปรดทราบว่า โดยค่าเริ่มต้นแล้ว งานลำดับงานจะถูกปิดใช้งานบนพ็อดแบ็กกราวเดอร์ (เช่น บทบาทถูกตั้งค่าเป็น "ไม่มีลำดับงาน") เนื่องจากพ็อดแบ็คกราวเดอร์ไม่สามารถเรียกใช้งานลำดับงานได้

ในการตั้งค่าบทบาทของโหนดสำหรับแบ็กกราวเดอร์ คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม NODE_ROLES เป็นส่วนหนึ่งของ kubeconfig สำหรับที่เก็บที่เรียกใช้บริการแบ็กกราวเดอร์ ตัวอย่างเช่น หากต้องการตั้งค่าให้แบ็กกราวเดอร์เรียกใช้เฉพาะงานรีเฟรชการแยกข้อมูล ให้ตั้งค่าตัวแปรสภาพแวดล้อม NODE_ROLES เป็น extract-refreshes ดังแสดงด้านล่าง:

NODE_ROLE_CONFIG

containers:
- name: backgrounder
image: <backgrounder_image> # Backgrounder Image
ports:
- containerPort: 8600
volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
- name: dataengine-volume
mountPath: /docker/dataengine
- name: temp
mountPath: /var/opt/tableau/tableau_server/data/tabsvc/temp
env:
- name: ROOT_LOG_DIR
value: /var/log/tableau
- name: CLONE_ARTIFACT_DIR
value: /docker/clone/clone-artifacts
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
- name: NODE_ROLES
value: extract-refreshes

พ็อด Tableau Server จะมีการกำหนดค่าแบ็กกราวเดอร์อย่างน้อยหนึ่งรายการในโทโพโลยี ซึ่งจำเป็นต้องทำเช่นนี้เพื่อให้แน่ใจว่ามีที่สำหรับเรียกใช้งานแบ็กกราวเดอร์เสมอ โดยค่าเริ่มต้น TSM จะกำหนดให้ต้องมีแบ็กกราวเดอร์ที่สามารถจัดการงานแบ็กกราวเดอร์ทุกบทบาทได้ ในบางสถานการณ์ คุณอาจต้องการให้พ็อดแบ็กกราวเดอร์จัดการงานทุกๆ รายการของประเภทงานที่กำหนด ในการดำเนินการดังกล่าว คุณต้องตั้งค่าคีย์การกำหนดค่าเซิร์ฟเวอร์ topology.roles_handle_all_jobs_constraint_disabled เป็น true ซึ่งจะปิดใช้งานข้อกำหนดที่ให้โทโพโลยี TSM จัดการกับงานทุกประเภท เมื่อตั้งค่าพารามิเตอร์เช่นนี้ บทบาทของแบ็กกราวเดอร์สำหรับอินสแตนซ์แบ็กกราวเดอร์ของ Tableau Server จะสามารถตั้งค่าเป็น no-extract-refreshes และบทบาทสำหรับพ็อดแบ็กกราวเดอร์สามารถตั้งค่าเป็น extract-refreshes ได้ ซึ่งจะทำให้มั่นใจได้ว่างานการรีเฟรชการแยกข้อมูลทั้งหมดจะทำงานบนพ็อดแบ็กกราวเดอร์เท่านั้น

หมายเหตุ: การปิดใช้งานข้อจำกัดนี้จะทำให้คุณสามารถกำหนดค่าบทบาทได้ในระดับที่อาจไม่มีการกำหนดเวลาให้กับงานบางประเภทเลยก็ได้ ต้องตั้งค่าการกำหนดค่าบทบาทของแบ็กกราวเดอร์และงานของแบ็กกราวเดอร์ของ TSM อย่างระมัดระวัง เนื่องจาก TSM จะไม่ตรวจสอบยืนยันอีกต่อไปว่าสามารถกำหนดเวลางานประเภทแบ็กกราวเดอร์ทั้งหมดได้หรือไม่

พ็อด Tableau Server ในที่เก็บ

ที่เก็บที่มี Tableau Server เป็นส่วนหนึ่งของพ็อดการปรับขนาดแบ็กกราวเดอร์อัตโนมัติจะปรับใช้ในลักษณะเดียวกันกับ Tableau Server ในที่เก็บที่มีอยู่ มีการเปลี่ยนแปลงข้อกำหนดที่สำคัญบางประการ:

  • กำหนดให้ต้องแชร์ไฟล์เครือข่ายเพื่อถ่ายโอนการกำหนดค่าระหว่างที่เก็บ Tableau Server และพ็อดแบ็กกราวเดอร์
  • คุณต้องเปิดใช้งานและใช้ฟีเจอร์ที่เก็บไฟล์ภายนอก นอกจากนี้ยังต้องมีการแชร์ไฟล์เครือข่ายโดยเฉพาะ

พ็อดแบ็กกราวเดอร์

พ็อดแบ็กกราวเดอร์ประกอบด้วยที่เก็บบริการอิสระ 4 รายการที่ทำงานร่วมกัน: เกตเวย์, Hyper, เซิร์ฟเวอร์ข้อมูล และแบ็กกราวเดอร์ คุณสามารถปรับใช้พ็อดเหล่านี้ได้เหมือนกับพ็อดที่เก็บ Kubernetes ทั่วไป โดยพ็อดดังกล่าวจะมีข้อกำหนดดังต่อไปนี้:

  • พ็อดแบ็กกราวเดอร์ต้องสามารถเข้าถึงโหนด Tableau Server ได้โดยใช้การแก้ปัญหา DNS เกี่ยวกับชื่อโฮสต์
  • ต้องจัดเตรียมที่เก็บไฟล์ภายนอกและการแชร์ไฟล์เครือข่ายการโคลนไว้

หมายเหตุ: พ็อดแบ็กกราวเดอร์ได้รับการกำหนดค่าด้วย init-container ให้รอจนกว่าที่เก็บ Tableau Server จะสร้างเอาต์พุตการกำหนดค่าการโคลนได้สำเร็จก่อนที่จะดำเนินการทำงานต่อไป

บันทึก

บริการพ็อดแบ็กกราวเดอร์ (เช่น Tableau Server) ยังคงเขียนบันทึกส่วนใหญ่ไปยังดิสก์ เนื่องจากพ็อดแบ็กกราวเดอร์สามารถปรับขนาดเข้าและออกได้ จึงจำเป็นอย่างยิ่งที่จะต้องตรวจสอบให้แน่ใจว่าบันทึกจะถูกจัดเก็บนอกพ็อด ลูกค้าจำนวนมากที่มีสภาพแวดล้อม K8 อยู่แล้วจะใช้บริการการรวมบันทึกบางประเภทอยู่แล้ว ทั้งนี้เพื่อรวบรวมบันทึกจากพ็อดที่พวกเขาปรับใช้ ตัวอย่างของบริการการรวมบันทึกคือ Splunk และ Fluentd เราขอแนะนำอย่างยิ่งให้ลูกค้าใช้บริการรวมบันทึกบางประเภทเพื่อรวบรวมบันทึกจากพ็อดแบ็กกราวเดอร์ของตนเอง เพื่อให้การจัดการบันทึกเป็นไปได้ง่ายขึ้น kubeconfig ที่เราจัดเตรียมไว้จะกำหนดค่าแต่ละบริการในพ็อดให้เขียนไปยังโวลุ่มบันทึกที่แชร์ พาธของไดเรกทอรีในที่เก็บบริการแต่ละรายการจะถูกระบุโดยตัวแปรสภาพแวดล้อม ROOT_LOG_DIR

หากคุณต้องการเปิดกรณีการสนับสนุนและจัดเตรียมบันทึก คุณจะต้องจัดเตรียมบันทึกสองชุด: ziplogs ที่รวบรวมจากที่เก็บเซิร์ฟเวอร์หลัก และบันทึกจากพ็อดแบ็กกราวเดอร์ (ไม่ว่าจะดึงมาจากบริการรวมบันทึกของคุณ หรือใช้กระบวนการจัดการด้วยตนเองด้านล่าง)

สำหรับลูกค้าที่ไม่สามารถใช้บริการรวมบันทึกได้ สามารถดึงบันทึกด้วยตนเองจากพ็อดได้

หมายเหตุ: บันทึกจากพ็อดใดๆ ที่ไม่ได้ใช้ Persistent Volume Claim สำหรับโวลุ่มที่มีบันทึกจะสูญหายไปเมื่อพ็อดถูกลดขนาดลง!

คุณจะสามารถดูบันทึกที่เกี่ยวข้องทั้งหมดได้ที่ไดเรกทอรี /var/log/tableau (กำหนดค่าได้ผ่านตัวแปรสภาพแวดล้อม ROOT_LOG_DIR) ภายในพ็อดแบ็กกราวเดอร์ เราขอแนะนำให้คุณติดตั้ง PersistantVolumeClaim ที่ตำแหน่งนี้ เพื่อให้บันทึกพร้อมใช้งานเมื่อพ็อดไม่ทำงาน

การรวบรวมบันทึกเมื่อพ็อดแบ็กกราวเดอร์กำลังทำงาน:

สร้างไฟล์ tar ของบันทึกภายในที่เก็บ:

kubectl exec -it <backgrounder-pod-name> -- bash -c "tar -czf /docker/user/backgrounder-pod-logs.tar.gz /var/log/tableau"

คัดลอกไฟล์ tar ไปยังภายนอกที่เก็บ:

kubectl cp <backgrounder-pod-name>:docker/user/backgrounder-pod-logs.tar.gz ./backgrounder-pod-logs.tar.gz
การรวบรวมบันทึกเมื่อพ็อดแบ็กกราวเดอร์ปิดอยู่ (หรือไม่สามารถใช้งานได้)

แนบพ็อดที่ใช้งานได้ยาวนานด้วยการติดตั้ง PersistantVolumeClaim ซึ่งใช้สำหรับบันทึกการปรับใช้พ็อดแบ็กกราวเดอร์ ตัวอย่างการกำหนดค่าหนึ่งตัวอย่าง:

apiVersion: v1
kind: Pod
metadata:
name: <name>
namespace: <namespace>
spec:
containers:
- name: get-logs-pod
image: busybox:1.28
securityContext:
runAsUser: 0
allowPrivilegeEscalation: true
command: ['sh', '-c', "while :; do sleep 5; done"]
volumeMounts:
- name: logmount
mountPath: /var/log/tableau restartPolicy: Never
volumes:
- name: logmount
persistentVolumeClaim:
claimName: logvolume

สร้างไฟล์ tar ของบันทึกภายในที่เก็บ:

kubectl exec -it <backgrounder-pod-name> -- bash -c "tar -czf /backgrounder-pod-logs.tar.gz /var/log/tableau"

คัดลอกไฟล์ tar ไปยังภายนอกที่เก็บ:

kubectl cp <backgrounder-pod-name>:/backgrounder-pod-logs.tar.gz ./backgrounder-pod-logs.tar.gz

การเปลี่ยนการกำหนดค่าแบบสด

หากคุณทำการเปลี่ยนแปลงการกำหนดค่าใน Tableau Server ในที่เก็บ (เช่น การใช้บรรทัดคำสั่ง tsm) และต้องการให้การเปลี่ยนแปลงการกำหนดค่าเหล่านั้นแสดงในพ็อดแบ็กกราวเดอร์ คุณต้องเรียกใช้คำสั่ง tsm settings clone เพื่อสร้างไฟล์การกำหนดค่าการโคลนชุดใหม่ ("เพย์โหลดการโคลน")

  1. ใช้ TSM เพื่อทำการเปลี่ยนแปลงการกำหนดค่าใน Tableau Server ในพ็อดที่เก็บและปรับใช้การเปลี่ยนแปลงการกำหนดค่ากับเซิร์ฟเวอร์
  2. เรียกใช้คำสั่งต่อไปนี้ในพ็อด Tableau Server ในที่เก็บ

    ## Run this command in the Tableau Server in a Container pod.
    tsm settings clone -d $CLONE_ARTIFACT_DIR

    คำสั่งนี้จะสร้างชุดไฟล์การกำหนดค่าใหม่และเขียนลงในตำแหน่งไดรฟ์ Clone NFS

  3. ปรับใช้พ็อดแบ็กกราวเดอร์ของคุณอีกครั้ง ควรกำหนดค่าพ็อดให้ใช้ไดรฟ์ Clone NFS และพ็อดจะรับการกำหนดค่าใหม่นั้นมาใช้

กลยุทธ์การปรับขนาด

พ็อดแบ็กกราวเดอร์สามารถปรับขนาดได้ใน Kubernetes โดยใช้เทคนิคและกลยุทธ์ที่หลากหลาย เราจะให้ตัวอย่างกลยุทธ์การปรับขนาดที่เปลี่ยนขนาดพูลของพ็อดแบ็กกราวเดอร์ตามกำหนดเวลา

โปรดทราบว่าการใช้ CPU และหน่วยความจำไม่ใช่ตัวชี้วัดที่ดีสำหรับการปรับขนาดพ็อดแบ็กกราวเดอร์ การใช้หน่วยความจำและ CPU ไม่ได้แสดงถึงความต้องการด้านโหลดงานโดยรวมบนคลัสเตอร์อย่างถูกต้อง ตัวอย่างเช่น พ็อดแบ็กกราวเดอร์อาจใช้ประโยชน์ได้สูงสุดเพื่อรีเฟรชการแยกข้อมูล แต่ไม่มีงานเพิ่มเติมรออยู่ในคิวงานแบ็กกราวเดอร์ ในกรณีนี้ การปรับขนาดอัตโนมัติจะไม่ปรับปรุงอัตราความเร็วการประมวลผลงาน

การปรับขนาดตามกำหนดเวลา

กลไกของ Kubernetes มาตรฐานที่ใช้งาน Cron ช่วยให้คุณกำหนดเวลาโซลูชันการปรับขนาดได้

ตัวอย่างการกำหนดค่า Kubernetes สำหรับการดำเนินการนี้มีอยู่ในส่วนการกำหนดค่า Kubernetes ด้านล่าง

การกำหนดค่า Kubernetes

ตัวแปรสภาพแวดล้อมใหม่

นอกเหนือจากตัวแปรสภาพแวดล้อมที่เก็บ Tableau Server มาตรฐานแล้ว (โปรดดู ตัวเลือกการกำหนดค่าเบื้องต้น) ยังมีตัวแปรสภาพแวดล้อมใหม่ที่จำเป็นบางอย่างที่ต้องตั้งค่าในการกำหนดค่า Kubernetes อีกด้วย

ตัวแปรสภาพแวดล้อมค่าที่แนะนำคำอธิบาย
FILESTORE_MOUNT_PATH/docker/dataengineตำแหน่งการติดตั้งไดเรกทอรีที่เก็บไฟล์ภายนอก ไดเรกทอรีนี้ควรชี้ไปที่ไดเรกทอรี dataengine NFS ที่ติดตั้งอยู่ภายในแต่ละที่เก็บ Tableau ที่ปรับใช้ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับที่เก็บไฟล์ภายนอก โปรดดู ที่จัดเก็บไฟล์ภายนอกของ Tableau Server ค่านี้ควรเหมือนกันสำหรับ Tableau Server ในพ็อดที่เก็บและพ็อดแบ็กกราวเดอร์
CLONE_ARTIFACT_DIR/docker/clone/clone-artifactsโคลนตำแหน่งการติดตั้งไดเรกทอรีการกำหนดค่า ไดเรกทอรีนี้ควรชี้ไปที่ไดเรกทอรี NFS ที่ติดตั้งอยู่ภายในที่เก็บ Tableau แต่ละรายการ Tableau Server จะส่งข้อมูลการกำหนดค่าที่พ็อดแบ็กกราวเดอร์ใช้เพื่อให้เป็นสมาชิกของคลัสเตอร์
ROOT_LOG_DIR/var/log/tableau(พ็อดแบ็กกราวเดอร์เท่านั้น)

ตำแหน่งไดเรกทอรีบันทึกทั่วไปสำหรับบริการทั้งหมดที่ทำงานในพ็อดแบ็กกราวเดอร์

พอร์ตของพ็อดแบ็กกราวเดอร์

พ็อดแบ็กกราวเดอร์ประกอบด้วยบริการ 4 รายการ โดยแต่ละรายการจะถูกตั้งค่าให้ทำงานบนพอร์ตที่ระบุตามค่าเริ่มต้น หากคุณต้องการเปลี่ยนพอร์ตที่บริการเชื่อมต่อภายในที่เก็บ คุณต้องระบุคีย์ที่สอดคล้องกับการกำหนดพอร์ตของบริการ ในกรณีส่วนใหญ่แล้วการกำหนดค่าประเภทนี้ไม่ควรเป็นสิ่งจำเป็น เว้นแต่จะมีที่เก็บแบบ Sidecar หรือส่วนประกอบเพิ่มเติมอื่นๆ ที่ถูกเพิ่มลงในพ็อดและมีความขัดแย้งกับพอร์ตของบริการ

ตัวแปรสภาพแวดล้อมของพอร์ตค่าเริ่มต้น
BACKGROUNDER_PORT8600
DATASERVER_PORT8400
HYPER_PORT8200
GATEWAY_PORT8080

เซิร์ฟเวอร์ข้อมูลยังใช้พอร์ต 8300 ซึ่งไม่สามารถกำหนดค่าใหม่ได้อีกด้วย

ไดเรกทอรีเครือข่ายที่แชร์

การปรับใช้ Tableau Server นี้ต้องใช้การแชร์เครือข่ายสองรายการเพื่อให้ทำงานได้อย่างถูกต้อง โปรดทราบว่าในเทมเพลตการกำหนดค่า Tableau Server และแบ็กกราวเดอร์ของ Kubernetes ทั้งหมด จะมีไดเรกทอรีเครือข่ายเหล่านี้อยู่:

  • ไดเรกทอรี Dataengine (FILESTORE_MOUNT_PATH ): พ็อดแบ็กกราวเดอร์ต้องใช้ฟีเจอร์ที่เก็บไฟล์ภายนอก การแชร์เครือข่ายนี้จะมีข้อมูลที่แยกและองค์ประกอบตามไฟล์อื่นๆ ที่จะแชร์ระหว่าง Tableau Server และพ็อดแบ็กกราวเดอร์
  • ไดเรกทอรีการโคลน (CLONE_ARTIFACT_DIR ): Tableau Server จะเขียนข้อมูลการเชื่อมต่อและการกำหนดค่าแบบคงที่ไปยังการแชร์เครือข่าย พ็อดแบ็กกราวเดอร์จะใช้ข้อมูลนี้เพื่อให้เป็นสมาชิกของคลัสเตอร์ Tableau Server ในรุ่นก่อนเผยแพร่ในอนาคต การกำหนดค่านี้จะรวมอยู่ในวงจรชีวิตมาตรฐานของการกำหนดค่า Kubernetes ด้วย

สำคัญ: หากคุณต้องการปรับใช้คลัสเตอร์ใหม่ทั้งหมด (รวมถึงที่เก็บ Tableau Server ใหม่) คุณต้องล้างเนื้อหาของการติดตั้ง Clone NFS (มิฉะนั้น พ็อดแบ็กกราวเดอร์จะพยายามแนบกับเซิร์ฟเวอร์เก่า)

ตัวอย่างการกำหนดค่า Kubernetes

หมายเหตุ: ตัวอย่างการกำหนดค่าจะมีการใช้โพรบความพร้อมด้วย คุณสามารถใช้โพรบความพร้อมเมื่อการปรับใช้ Tableau Server Container ของคุณเป็นการปรับใช้ TSM แบบโหนดเดียว (การปรับใช้สามารถรวมพ็อดแบ็คกราวด์ได้หลายตัว) แต่คุณไม่สามารถใช้โพรบความพร้อมกับ Tableau Server แบบหลายโหนดในการปรับใช้คอนเทนเนอร์

การกำหนค่าที่เก็บ Tableau Server

---
apiVersion: v1
kind: Service
metadata:
name: <service_name>
namespace: <namespace>
spec:
selector:
app: <service_name>
ports:
- protocol: TCP
port: 8080
nodePort: <nodeport-number>
name: http
- protocol: TCP
port: 8443
nodePort: <nodeport-number>
name: https
type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
name: configfile
namespace: <namespace>
data:
config.json: |-
{
"configEntities": {
"identityStore": {
"_type": "identityStoreType",
"type": "local"
}
},
"configKeys" : {
"tabadmincontroller.init.smart_defaults.enable" : "false",
"wgserver.domain.ldap.starttls.enabled" : "false"
},
"daysLeftForMaintenanceExpiring" : 0
}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: extrepojsonfile
namespace: <namespace>
data:
config.json: |-
{
"flavor":"generic",
"masterUsername":"<admin-name>",
"masterPassword":"<password>",
"host":"<hostname>",
"port":5432,
"prerequisiteCheckEnabled":false,
"requireSsl":false
}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: datadir1
namespace: <namespace>
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
---
# This is required for multi-node tableau server in container
apiVersion: v1
kind: PersistentVolume
metadata:
name: bootstrapnfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
nfs:
server: <nfs-ip>
path: <mount-path>
---
# This is required for multi-node tableau server in container
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bootstrapnfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1Mi
---
apiVersion: v1
kind: PersistentVolumn
metadata:
name: clonenfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
nfs:
server: <nfs-ip>
path: <mount-path>
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: clonenfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1Mi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: dataenginenfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
nfs:
server: <nfs-ip>
path: <namespace>
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dataenginenfs
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1Mi
---
apiVersion: v1
kind: Secret
type: Opaque
metadata: name: tableau-server-in-a-container-secrets
namespace: <namespace>
stringData:
license_key: <license_key> # Tableau License Key String
tableau_username: <tableau_username> # Initial admin username in Tableau Server
tableau_password: <tableau_password> # Initial admin password
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: tableau-server
namespace: <namespace>
labels:
app: <service_name>
spec:
selector:
matchLabels:
app: <service_name>
replicas: 1
serviceName: <service_name>
template:
metadata:
labels:
app: <service_name>
spec:
securityContext:
runAsUser: 999
fsGroup: 998
fsGroupChangePolicy: "OnRootMismatch"
terminationGracePeriodSeconds: 120
dnsPolicy: "None"
dnsConfig:
nameservers:
- <dns_ip> # DNS IP for resolving container hostnames
searches:
- <service_name>.<namespace>.svc.<cluster_domain>.<example> # SRV Record
- <namespace>.svc.<cluster_domain>.<example> # SRV Record
- svc.<cluster_domain>.<example> # SRV Record
- <cluster_domain>.<example> # SRV Record
options:
- name: ndots
value: "5"
initContainers: # init containers are optional, to clear directory content if already exists
- name: clean-bootstrap-dir
image: busybox:1.28
securityContext:
runAsUser: 0
allowPrivilegeEscalation: true
volumeMounts:
- name: bootstrap
mountPath: /docker/config/bootstrap
command: ['sh', '-c', 'rm -rf /docker/config/bootstrap/* || true']
- name: clean-clone-artifacts-dir
image: busybox:1.28
securityContext:
runAsUser: 0
allowPrivilegeEscalation: true
volumeMounts:
- name: clone
mountPath: /docker/clone
command: ['sh', '-c', 'rm -rf /docker/clone/clone-artifacts || true']
containers:
- name: <container_name> # Name of container
image: <tableau_server_image> # Tableau Server in Container Image
env:
- name: LICENSE_KEY
valueFrom:
secretKeyRef:
name: tableau-server-in-a-container-secrets
key: license_key
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
- name: SERVER_FOR_INDEPENDENT_SERVICE_CONTAINERS
value: "1"
- name: EXT_REP_JSON_FILE
value: /docker/external-repository/config.json
- name: TABLEAU_USERNAME
valueFrom:
secretKeyRef:
name: tableau-server-in-a-container-secrets
key: tableau_username
- name: TABLEAU_PASSWORD
valueFrom:
secretKeyRef:
name: tableau-server-in-a-container-secrets
key: tableau_password
resources:
requests:
memory: 40Gi
cpu: 15
limits:
memory: 40Gi
cpu: 15
ports:
- containerPort: 8080
volumeMounts:
- name: configmount
mountPath: /docker/config/config.json
subPath: config.json
- name: externalrepomount
mountPath: /docker/external-repository
- name: datadir1
mountPath: /var/opt/tableau
- name: bootstrap
mountPath: /docker/config/bootstrap
- name: clone
mountPath: /docker/clone
- name: dataengine
mountPath: /docker/dataengine
imagePullPolicy: IfNotPresent
startupProbe:
exec:
command:
- /bin/sh
- -c
- /docker/server-ready-check
initialDelaySeconds: 300
periodSeconds: 15
timeoutSeconds: 30
failureThreshold: 200
readinessProbe:
exec:
command:
- /bin/sh
- -c
- /docker/server-ready-check
periodSeconds: 30
timeoutSeconds: 60
livenessProbe:
exec:
command:
- /bin/sh
- -c
- /docker/alive-check
initialDelaySeconds: 600
periodSeconds: 60
timeoutSeconds: 60
volumes:
- name: configmount
configMap:
name: configfile
- name: externalrepomount
configMap:
name: extrepojsonfile
- name: datadir1
persistentVolumeClaim:
claimName: datadir1
- name: bootstrap
persistentVolumeClaim:
claimName: bootstrapnfs
- name: clone
persistentVolumeClaim:
claimName: clonenfs
- name: dataengine
persistentVolumeClaim:
claimName: dataenginenfs

การกำหนดค่าพ็อดแบ็กกราวเดอร์

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logvolume
namespace: <namespace>
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backgrounder
labels:
app: backgrounder
namespace: <namespace>
spec:
replicas: 2
selector:
matchLabels:
app: backgrounder
template:
metadata:
labels:
app: backgrounder
spec:
securityContext:
runAsUser: 999
runAsGroup: 998
fsGroup: 998 fsGroupChangePolicy: "OnRootMismatch"
hostname: backgrounder
dnsPolicy: "None"
dnsConfig:
nameservers:
- <dns_ip> # DNS IP for resolving container hostnames
searches:
- <service_name>.<namespace>.svc.<cluster_domain>.<example> # SRV Record
- <namespace>.svc.<cluster_domain>.<example> # SRV Record
- svc.<cluster_domain>.<example> # SRV Record
- <cluster_domain>.<example> # SRV Record
options:
- name: ndots
value: "5" initContainers:
- name: init-myservice
image: busybox # This init-container is optional (as long as there is a mechanism to set the log volume directory permissions and the pod waits for clone artifacts)
securityContext:
runAsUser: 0
allowPrivilegeEscalation: true
env:
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
command: ['sh', '-c', "chmod 777 /var/log/tableau && while [ ! -d ${CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS} ]; do sleep 5; done"]
containers:
- name: backgrounder
image: <backgrounder_image> # Backgrounder Image
ports:
- containerPort: 8600 imagePullPolicy: IfNotPresent readinessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
periodSeconds: 30
timeoutSeconds: 60
livenessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
initialDelaySeconds: 600
periodSeconds: 60
timeoutSeconds: 60 volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
- name: dataengine-volume
mountPath: /docker/dataengine
- name: temp
mountPath: /var/opt/tableau/tableau_server/data/tabsvc/temp
env:
- name: ROOT_LOG_DIR
value: /var/log/tableau
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
- name: dataserver
image: <dataserver_image> # Dataserver Image
ports:
- containerPort: 8400 imagePullPolicy: IfNotPresent readinessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
periodSeconds: 30
timeoutSeconds: 60
livenessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
initialDelaySeconds: 600
periodSeconds: 60
timeoutSeconds: 60
volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
- name: dataengine-volume
mountPath: /docker/dataengine
- name: temp
mountPath: /var/opt/tableau/tableau_server/data/tabsvc/temp
env:
- name: ROOT_LOG_DIR
value: /var/log/tableau
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
- name: gateway
image: <gateway_image> # Gateway Image
ports:
- containerPort: 8080 imagePullPolicy: IfNotPresent readinessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
periodSeconds: 30
timeoutSeconds: 60
livenessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
initialDelaySeconds: 600
periodSeconds: 60
timeoutSeconds: 60 volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
- name: dataengine-volume
mountPath: /docker/dataengine
- name: temp
mountPath: /var/opt/tableau/tableau_server/data/tabsvc/temp
env:
- name: ROOT_LOG_DIR
value: /var/log/tableau
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
- name: hyper
image: <hyper_image> # Hyper Image
ports: - containerPort: 8200 imagePullPolicy: IfNotPresent readinessProbe:
exec:
command:
- /bin/sh
- -c
- /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
periodSeconds: 30
timeoutSeconds: 60
livenessProbe:
exec:
command:
- /bin/sh
- -c - /tsm_docker_utils/status_check.sh | grep -E 'ACTIVE|BUSY'
initialDelaySeconds: 600
periodSeconds: 60
timeoutSeconds: 60 volumeMounts:
- name: logmount
mountPath: /var/log/tableau
- name: clone-volume
mountPath: /docker/clone
- name: dataengine-volume
mountPath: /docker/dataengine
- name: temp
mountPath: /var/opt/tableau/tableau_server/data/tabsvc/temp
env:
- name: ROOT_LOG_DIR
value: /var/log/tableau
- name: CLONE_ARTIFACT_DIR_FOR_INDEPENDENT_CONTAINERS
value: /docker/clone/clone-artifacts
- name: FILESTORE_MOUNT_PATH
value: /docker/dataengine
volumes:
- name: clone-volume
nfs:
server: <nfs_ip>
path: <mount_path>
- name: dataengine-volume
nfs:
server: <nfs_ip>
path: /dataengine
- name: logmount
persistentVolumeClaim:
claimName: logvolume
- name: temp
emptyDir: {}

การกำหนดค่าการปรับขนาดตามกำหนดเวลา

apiVersion: v1
kind: ServiceAccount
metadata:
name: backgrounder-scaler-service-account
namespace: <namespace> # Namespace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: scale-backgrounder-pods
namespace: <namespace> # Namespace
subjects:
- kind: ServiceAccount
name: backgrounder-scaler-service-account
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: scale-up-job
namespace: <namespace> # Namespace
spec:
schedule: "0 7 * * *" # Cron Job timing to scale up deployment replicas
jobTemplate:
spec:
template:
spec:
serviceAccountName: backgrounder-scaler-service-account
restartPolicy: OnFailure
containers:
- name: scale
image: bitnami/kubectl:1.21
imagePullPolicy: IfNotPresent
args:
- scale
- --replicas=4
- deployment/backgrounder
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: scale-down-job
namespace: <namespace>
spec:
schedule: "0 9 * * *" # Cron Job timing to scale down deployment replicas
jobTemplate:
spec:
template:
spec:
serviceAccountName: backgrounder-scaler-service-account
restartPolicy: OnFailure
containers:
- name: scale
image: bitnami/kubectl:1.21
imagePullPolicy: IfNotPresent
args:
- scale
- --replicas=2
- deployment/backgrounder

งาน Kubernetes เพื่อล้างการกำหนดค่าการโคลน (ไม่บังคับ)

งานนี้เป็นงาน Kubernetes ที่ช่วยอำนวยความสะดวกซึ่งคุณอาจใช้ในระหว่างการทดสอบ หากคุณต้องการล้างการกำหนดค่าการโคลนที่สร้างโดย Tableau Server ในที่เก็บระหว่างการเรียกใช้การปรับใช้ที่แตกต่างกัน คุณสามารถเรียกใช้งานในลักษณะนี้เพื่อล้าง NFS ได้

apiVersion: batch/v1
kind: Job
metadata:
name: delete-clone-artifacts-job
namespace: manatee-cluster
spec:
template:
spec:
containers:
- name: delete-clone-artifacts
image: busybox:1.28
command: ['sh', '-c', "rm -rf ${CLONE_ARTIFACT_DIR}"]
env:
- name: CLONE_ARTIFACT_DIR
value: /docker/clone/clone-artifacts
securityContext:
runAsUser: 0
allowPrivilegeEscalation: true
volumeMounts:
- name: clone-volume
mountPath: /docker/clone
restartPolicy: Never
volumes:
- name: clone-volume
nfs:
server: <nfs_ip> # IP for shared NFS directory for clone output
path: /clone