Score:1

ฉันจะสร้างบริการ Kubernetes ที่กำหนดเส้นทางการรับส่งข้อมูลไปยังพ็อดต่างๆ ตามพอร์ตได้อย่างไร

ธง ng

ฉันต้องการมีประเภท Service of LoadBalancer ที่ชี้ไปที่ nginx บนพอร์ต 80 และชี้ไปที่ sshd pod แยกต่างหากสำหรับพอร์ต 22 อย่างไรก็ตาม ฉันไม่สามารถกำหนดเส้นทางตามพอร์ตด้วยตัวเลือกเดียว

กรณีการใช้งานที่ฉันกำลังจะทำนั้นคล้ายกับ github.com ซึ่งรับทราฟฟิกไปยัง github.com สำหรับพอร์ต 80 และ 22 สำหรับทราฟฟิก ssh ดังนั้น DNS จะชี้ไปที่ชุดของตัวโหลดบาลานเซอร์ k8s ในกรณีนี้ ซึ่งผมถือว่าจะกำหนดเส้นทางไปยังพ็อดที่เหมาะสมต่อพอร์ตถ้าฉันไปผิดทางก็จงรู้ไว้ ฉันเปิดรับโซลูชันอื่นๆ

สิ่งที่ฉันต้องการหลีกเลี่ยงคือการตั้งค่าพ็อดแยกต่างหากเช่น HAProxy ซึ่งกำหนดเส้นทางต่อพอร์ต

ฉันตรวจสอบโดยใช้ Ingress แต่นั่นใช้สำหรับการรับส่งข้อมูล HTTP เท่านั้น

Ingress ไม่เปิดเผยพอร์ตหรือโปรโตคอลโดยพลการ การเปิดเผยบริการอื่นนอกเหนือจาก HTTP และ HTTPS ไปยังอินเทอร์เน็ตโดยทั่วไปจะใช้บริการประเภท Service.Type=NodePort หรือ Service.Type=LoadBalancer

https://kubernetes.io/docs/concepts/services-networking/ingress/

mozello avatar
cn flag
สวัสดี Matt คุณช่วยแก้ไขวลีของคุณว่า 'อย่างไรก็ตาม ฉันไม่สามารถกำหนดเส้นทางตามพอร์ตด้วยตัวเลือกเดียว' ได้ไหม 'w/' คืออะไร?
mozello avatar
cn flag
คุณทราบหรือไม่ว่า Kubernetes Ingress สามารถเปิดเผยพอร์ต TCP ตามที่อธิบายไว้ [ที่นี่](https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/) คุณตั้งค่าคลัสเตอร์ k8s ของคุณอย่างไร (ผู้ให้บริการคลาวด์หรือภายในองค์กร) คุณใช้ k8s เวอร์ชันใด
ng flag
@IvanM ฉันกำลังเรียกใช้สิ่งนี้ในเครื่องโดยใช้ชนิดซึ่งอยู่บน kubernetes v1.23.3 เพื่อให้ LoadBalancer ทำงาน ฉันใช้ metallb ให้ฉันตรวจสอบลิงก์นั้น ฉันเห็นว่าตัวควบคุม nginx ขยายตัวควบคุมขาเข้าเริ่มต้นของ kubernetes
Score:1
ธง cn

สิ่งที่ฉันต้องการหลีกเลี่ยงคือการตั้งค่าพ็อดแยกต่างหากเช่น HAProxy ซึ่งกำหนดเส้นทางต่อพอร์ต

คุณไม่จำเป็นต้องตั้งค่า Pod แยกต่างหาก

ตามค่าเริ่มต้น Kubernetes Ingress ไม่รองรับบริการ TCP หรือ UDP แต่ยกตัวอย่าง ทางเข้า nginx คอนโทรลเลอร์จัดเตรียมกลไกเพื่อรองรับ TCP หรือ UDP บนพอร์ตต่างๆ คุณสามารถเปิดเผยพอร์ต TCP หรือ UDP ได้โดยแก้ไข ConfigMaps

ด้วยเหตุนี้ ตัวควบคุม Ingress นี้จึงใช้แฟล็ก '--tcp-services-configmap' และ '--udp-services-configmap' เพื่อชี้ไปที่ config map ที่มีอยู่ โดยที่คีย์คือพอร์ตภายนอกที่จะใช้ และค่าบ่งชี้ บริการที่จะเปิดเผยโดยใช้รูปแบบ:

<เนมสเปซ/ชื่อบริการ>:<พอร์ตบริการ>:[PROXY]:[PROXY]

ตรวจสอบข้อมูลเพิ่มเติม ที่นี่.

ConfigMap ดังกล่าวควรมีอยู่แล้ว ก่อน การปรับใช้ Ingress Controller

ดังนั้น พยายาม:

1. สร้าง ConfigMap ด้วยการกำหนดค่าบริการ TCP ต่อไปนี้

$ cat ingress-nginx-tcp.yml
api เวอร์ชัน: v1
ประเภท: ConfigMap
ข้อมูลเมตา:
  ชื่อ: ingress-nginx-tcp
  เนมสเปซ: ค่าเริ่มต้น  
ข้อมูล:
  "22": targetnamespace/target-service:22

2. ชี้ตัวควบคุม Ingress ไปที่ ConfigMap นี้โดยใช้ --tcp-services-configmap ตั้งค่าสถานะในการกำหนดค่าดังนี้:

$ kubectl รับการปรับใช้ ingress-nginx-controller -o yaml
apiVersion: แอป/v1
ประเภท: การปรับใช้
ข้อมูลเมตา:
  ชื่อ: ingress-nginx-controller
  เนมสเปซ: ค่าเริ่มต้น
ข้อมูลจำเพาะ:
...
  แม่แบบ:
...
    ข้อมูลจำเพาะ:
      ตู้คอนเทนเนอร์:
      - หาเรื่อง:
        - /nginx-ingress-ตัวควบคุม
        - --tcp-services-configmap=$(POD_NAMESPACE)/ingress-nginx-tcp
...

3. เปิดเผยพอร์ต 22 ในบริการที่กำหนดไว้สำหรับ Ingress ดังนี้:

$ kubectl รับ svc ingress-nginx-controller -o yaml 
api เวอร์ชัน: v1
ชนิด:บริการ
ข้อมูลเมตา:
  ชื่อ: ingress-nginx-controller
  เนมสเปซ: ค่าเริ่มต้น
ข้อมูลจำเพาะ:
  พอร์ต:
  - ชื่อ: tcp-22
    โหนดพอร์ต: 30957
    พอร์ต: 22
    โปรโตคอล: TCP
    พอร์ตเป้าหมาย: 22
...
  ประเภท: LoadBalancer
...

คุณสามารถกำหนดจำนวนพอร์ตที่สามารถเปิดเผยได้โดยใช้วิธีนี้

มีอีกทางเลือกหนึ่งสำหรับผู้ที่กำลังใช้ แผนภูมิหางเสือ ingress-nginx. การกำหนดค่าส่วนใหญ่เสร็จสิ้นแล้ว และคุณเพียงแค่ระบุพอร์ตของคุณ ทีซีพี ส่วนเช่นนี้:
ทีซีพี: 
  2222: "default/example-tcp-svc:22"

ที่ไหน 2222 เป็นพอร์ตเปิดและ 22 เป็นท่าเรือที่ให้บริการ

Score:0
ธง ng

ขอบคุณ @Ivan M. ที่ชี้ให้ฉันเห็นทิศทางที่ถูกต้อง ฉันแค่ต้องการเพิ่มตัวอย่างโค้ดของวิธีแก้ปัญหาที่นี่:

ก่อนอื่น สิ่งที่ทำให้เกิดความสับสนคือเอกสารประกอบของ kubernetes ทำให้ฉันหลงทางโดยคิดว่าคุณไม่สามารถใช้ทางเข้าสำหรับการรับส่งข้อมูลที่ไม่ใช่ http สิ่งที่คุณต้องรู้คือคุณสามารถใช้ตัวควบคุมทางเข้าอื่นได้ ด้วยตัวควบคุม nginx ingress คุณสามารถพร็อกซี tcp หรือแม้แต่การรับส่งข้อมูล udp โดยพลการ

อุปสรรคที่สองคือมีสอง repos แยกต่างหากสำหรับการเข้า nginx เหล่านี้คือ:

ฉันลงเอยด้วยการใช้ตัวควบคุม kubernetes/ingress-nginx

nginx-values.yaml

ตัวควบคุม:
  บริการ:
    enableHttp: จริง

ทีซีพี:
  "22": "เนมสเปซอื่น/ชื่อบริการ:22"

จากนั้นเราก็ติดตั้งหางเสือ

หางเสือ repo เพิ่ม ingress-nginx https://kubernetes.github.io/ingress-nginx
การปรับปรุง repo หางเสือ
helm -n nginx -f nginx-values.yaml ติดตั้ง ingress-nginx ingress-nginx/ingress-nginx

จากนั้นฉันติดตั้ง Ingress ลงใน k8s แจ้งให้ทราบ ingressClassName

ingress.yaml

รุ่น api: networking.k8s.io/v1
ชนิด: ทางเข้า
ข้อมูลเมตา:
  ชื่อ: my-ingress
  เนมสเปซ: nginx
ข้อมูลจำเพาะ:
  ชื่อคลาส ingress: nginx
  แบ็กเอนด์เริ่มต้น:
    บริการ:
      ชื่อ: my-http-service
      ท่า:
        จำนวน: 80

แล้วคุณก็คบเด็กเลวคนนั้น

kubectl ใช้ -f ingress.yaml

โพสต์คำตอบ

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