ฉันกำลังตั้งค่าคลัสเตอร์ 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=เท็จ
ฉันจะขอบคุณถ้าคุณมีเงื่อนงำใด ๆ ที่สามารถช่วยฉันได้