Score:1

NGINX Ingress บน Kubernetes ไม่ได้ใช้ HTTPS

ธง in

ฉันกำลังตั้งค่าคลัสเตอร์ Kubernetes บนโลหะเปลือย ฉันใช้ Kubeadm สำหรับการติดตั้ง ในการทำให้บริการของฉันสามารถเข้าถึงได้จากภายนอกคลัสเตอร์ ฉันได้ติดตั้ง NGINX Ingress โดยใช้เอกสารต่อไปนี้: เอกสาร NGINX

เนื่องจากฉันไม่ต้องการสื่อสารกับบริการของฉันโดยไม่มีการรักษาความปลอดภัย TLS ฉันจึงกำหนดค่าใบรับรองด้วย cert-manager : เอกสารผู้จัดการใบรับรอง.

$kubectl รับใบรับรอง
ชื่อพร้อมอายุความลับ
ใบรับรอง tls-prod True tls-secret-prod 3h1m
tls-secret-prod ทรู tls-secret-prod 41m

การสร้างใบรับรองใช้งานได้และได้รับการยอมรับจากลูกค้า

ตอนนี้ ฉันกำลังพยายามติดตั้งรีจิสทรี Docker ของตัวเอง (registry:2.7.1) ในคลัสเตอร์ หลังจากปรับใช้ Pod และบริการแล้ว ฉันกำลังพยายามทำ เข้าสู่ระบบนักเทียบท่า จากลูกค้าของฉัน แต่มันใช้งานไม่ได้

การกำหนดค่าขาเข้า:

รุ่น api: networking.k8s.io/v1
ชนิด: ทางเข้า
ข้อมูลเมตา:
  คำอธิบายประกอบ:
    # nginx.ingress.kubernetes.io/ssl-redirect: "จริง"
    # nginx.ingress.kubernetes.io/force-ssl-redirect: "จริง"
    # nginx.ingress.kubernetes.io/ssl-passthrough: "จริง"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    cert-manager.io/issuer: "letsencrypt-prod"
  เนมสเปซ: ค่าเริ่มต้น
  ชื่อ: nginx-ingress
ข้อมูลจำเพาะ:
  tls:
  - เจ้าภาพ:
    -example.com
    ชื่อลับ: tls-secret-prod
  กฎ:
  - โฮสต์: example.com
    http:
      เส้นทาง:
      - เส้นทาง: /
        pathType: คำนำหน้า
        แบ็กเอนด์:
          บริการ:
            ชื่อ: docker-registry
            ท่า: 
              จำนวน: 5000

เมื่อฉันพยายามเข้าถึงบริการโดยทำลอนผมง่ายๆ :

ขด -v https://example.com/

* ลอง <cluster-ip>:443...
* เชื่อมต่อกับ example.com (<cluster-ip>) พอร์ต 443 (#0)
* ALPN ให้บริการ h2
* ALPN ให้บริการ http/1.1
* ตั้งค่าตำแหน่งการตรวจสอบใบรับรองสำเร็จแล้ว:
* ไฟล์ CA: /etc/ssl/certs/ca-certificates.crt
* CApath: ไม่มี
* TLSv1.3 (ออก), การจับมือ TLS, สวัสดีลูกค้า (1):
* TLSv1.3 (IN), การจับมือ TLS, สวัสดีเซิร์ฟเวอร์ (2):
* TLSv1.2 (IN), การจับมือ TLS, ใบรับรอง (11):
* TLSv1.2 (IN), การจับมือ TLS, การแลกเปลี่ยนคีย์เซิร์ฟเวอร์ (12):
* TLSv1.2 (IN), การจับมือ TLS, เซิร์ฟเวอร์เสร็จสิ้น (14):
* TLSv1.2 (ออก), การจับมือ TLS, การแลกเปลี่ยนคีย์ไคลเอนต์ (16):
* TLSv1.2 (ออก), TLS เปลี่ยนรหัส, เปลี่ยนข้อมูลจำเพาะของรหัส (1):
* TLSv1.2 (ออก), การจับมือ TLS, เสร็จสิ้น (20):
* TLSv1.2 (IN), การจับมือ TLS, เสร็จสิ้น (20):
* การเชื่อมต่อ SSL โดยใช้ TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN เซิร์ฟเวอร์ที่ยอมรับให้ใช้ http/1.1
* ใบรับรองเซิร์ฟเวอร์:
* หัวเรื่อง: CN=example.com
* วันที่เริ่ม: 13 ก.ค. 10:03:45 น. 2021 GMT
* วันหมดอายุ: 11 ต.ค. 10:03:44 น. 2021 GMT
* subjectAltName: โฮสต์ "example.com" ตรงกับ "example.com" ของใบรับรอง
* ผู้ออก: C=US; O=มาเข้ารหัสกันเถอะ; CN=R3
* ใบรับรอง SSL ตรวจสอบตกลง
> เก็ท / HTTP/1.1
> โฮสต์: example.com
> User-Agent: curl/7.77.0
> ยอมรับ: */*
> 
* รับ HTTP/0.9 เมื่อไม่ได้รับอนุญาต
* ปิดการเชื่อมต่อ 0
* TLSv1.2 (OUT), การแจ้งเตือน TLS, ปิดการแจ้งเตือน (256):
curl: (1) รับ HTTP/0.9 เมื่อไม่ได้รับอนุญาต

การจับมือดูเหมือนจะถูกต้อง แต่สุดท้ายก็มีบางอย่างผิดพลาด

บันทึกของพ็อดรีจิสทรีของ Docker :

http: ข้อผิดพลาด TLS handshake จาก <ingress-pod-ip>:38686: tls: บันทึกแรกไม่เหมือน TLS handshake

บันทึกของ Ingress Pod :

[ข้อผิดพลาด] 84#84: *40 อัปสตรีมส่งไม่มีส่วนหัว HTTP/1.0 ที่ถูกต้องขณะอ่านส่วนหัวการตอบสนองจากอัปสตรีม ไคลเอ็นต์: <cluster-ip> เซิร์ฟเวอร์: example.com คำขอ: "GET / HTTP/1.1" อัปสตรีม: "http://<registry-pod-ip>:5000/", โฮสต์: "example.com"

บันทึกการเข้าสู่ระบบ Docker จากลูกค้า:

เข้าสู่ระบบนักเทียบท่า https://example.com
การตอบสนองข้อผิดพลาดจากภูต: รับ "https://example.com/v2/": net/http: การเชื่อมต่อการขนส่ง HTTP/1.x เสียหาย: การตอบสนอง HTTP ที่มีรูปแบบไม่ถูกต้อง "\x15\x03\x01\x00\x02\x02"

จากที่ฉันเข้าใจ ปัญหามาจากการที่ส่วนประกอบหนึ่งพยายามสื่อสารกับ http แทนที่จะเป็น https อย่างไรก็ตาม อัปสตีมอยู่ใน http ซึ่งดูแปลก
ขออภัย ฉันไม่สามารถแก้ไขปัญหานี้ได้ ฉันลองใช้คำอธิบายประกอบหลายรายการ (ซึ่งมีความคิดเห็น) ในการประกาศขาเข้าเพื่อบังคับให้ใช้ https แต่ก็ไม่ได้ผล

ฉันเห็นสิ่งนี้ ปัญหาเกี่ยวกับ Githubแต่ apiserver ของฉันไม่มีพารามิเตอร์ --kubelet-https=เท็จ

ฉันจะขอบคุณถ้าคุณมีเงื่อนงำใด ๆ ที่สามารถช่วยฉันได้

djdomi avatar
za flag
เป็นไปได้ไหมว่าคุณใช้ http แทน https
Thomas avatar
in flag
@djdomi คุณหมายถึงอะไร ? ส่วนใดของการกำหนดค่าของฉันที่คุณคิดว่าฉันอาจผิดพลาด
Mikołaj Głodziak avatar
id flag
คุณใช้ Kuberneted เวอร์ชันใด โปรดทราบว่ามี Nginx อยู่ 3 ประเภท โอเพ่นซอร์ส Nginx Ingress Controller, Nginx Incorporaton (nginx inc) และ Nginx Incorporaton Plus ลองใช้โอเพ่นซอร์ส nginx[นี่คือตัวอย่าง](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/)?
Thomas avatar
in flag
ขอขอบคุณสำหรับความช่วยเหลือของคุณ ! ฉันจัดการเพื่อให้มันใช้งานได้ ดูเหมือนว่ามาจากการกำหนดค่ารีจิสตรีนักเทียบท่า ฉันแก้ไขใบรับรองและรีสตาร์ทพ็อด
Score:1
ธง id

เนื่องจาก โทมัส ได้กล่าวถึงในความคิดเห็น:

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

โพสต์คำตอบ

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