Điểm:1

NGINX Ingress trên Kubernetes không sử dụng HTTPS

lá cờ in

Tôi đang thiết lập cụm Kubernetes trên kim loại trần. Tôi đã sử dụng Kubeadm để cài đặt. Để làm cho các dịch vụ của tôi có thể truy cập được từ bên ngoài cụm, tôi đã cài đặt NGINX Ingress, sử dụng tài liệu sau: Tài liệu NGINX

Vì tôi không muốn giao tiếp với các dịch vụ của mình mà không có bảo mật TLS, nên tôi đã định cấu hình chứng chỉ nhờ cert-manager : Tài liệu quản lý chứng chỉ.

$kubectl nhận chứng chỉ
TÊN SẴN SÀNG BÍ MẬT TUỔI
chứng chỉ-tls-prod True tls-secret-prod 3h1m
tls-bí mật-prod Đúng tls-bí mật-prod 41m

Việc tạo chứng chỉ hoạt động và được khách hàng công nhận.

Bây giờ, tôi đang cố gắng cài đặt sổ đăng ký Docker của riêng mình (đăng ký: 2.7.1) trong cụm. Sau khi triển khai Pod và Dịch vụ, tôi đang cố gắng thực hiện đăng nhập docker từ khách hàng của tôi, nhưng nó không hoạt động.

Cấu hình xâm nhập:

apiVersion: mạng.k8s.io/v1
loại: Xâm nhập
metadata:
  chú thích:
    # nginx.ingress.kubernetes.io/ssl-redirect: "true"
    # nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    # nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    cert-manager.io/issuer: "letsencrypt-prod"
  không gian tên: mặc định
  tên: nginx-ingress
thông số kỹ thuật:
  tls:
  - máy chủ:
    - ví dụ.com
    secretName: tls-secret-prod
  quy tắc:
  - máy chủ: example.com
    http:
      con đường:
      - con đường: /
        pathType: Tiền tố
        phụ trợ:
          dịch vụ:
            tên: đăng ký docker
            Hải cảng: 
              số: 5000

Khi tôi cố gắng tiếp cận dịch vụ bằng cách thực hiện một thao tác cuộn tròn đơn giản:

cuộn tròn -v https://example.com/

* Đang thử <cluster-ip>:443...
* Đã kết nối với cổng example.com (<cluster-ip>) 443 (#0)
* ALPN, cung cấp h2
* ALPN, cung cấp http/1.1
* đặt thành công vị trí xác minh chứng chỉ:
* Tệp CA: /etc/ssl/certs/ca-certificates.crt
* CApath: không có
* TLSv1.3 (OUT), bắt tay TLS, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), bắt tay TLS, Chứng chỉ (11):
* TLSv1.2 (IN), bắt tay TLS, trao đổi khóa máy chủ (12):
* TLSv1.2 (IN), bắt tay TLS, Máy chủ hoàn tất (14):
* TLSv1.2 (OUT), bắt tay TLS, Trao đổi khóa máy khách (16):
* TLSv1.2 (OUT), Thay đổi mật mã TLS, Thay đổi thông số mật mã (1):
* TLSv1.2 (OUT), bắt tay TLS, Đã hoàn thành (20):
* TLSv1.2 (IN), bắt tay TLS, Đã hoàn thành (20):
* Kết nối SSL sử dụng TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, máy chủ được chấp nhận sử dụng http/1.1
* Chứng chỉ máy chủ:
* chủ đề: CN=example.com
* ngày bắt đầu: 13 tháng 7 10:03:45 2021 GMT
* ngày hết hạn: 11 tháng 10 10:03:44 2021 GMT
* chủ đềAltName: máy chủ "example.com" khớp với "example.com" của chứng chỉ
* tổ chức phát hành: C=US; O=Hãy mã hóa; CN=R3
* Chứng chỉ SSL xác minh ok.
> NHẬN / HTTP/1.1
> Máy chủ: example.com
> Tác nhân người dùng: curl/7.77.0
> Chấp nhận: */*
> 
* Đã nhận HTTP/0.9 khi không được phép
* Đóng kết nối 0
* TLSv1.2 (OUT), cảnh báo TLS, thông báo đóng (256):
curl: (1) Đã nhận HTTP/0.9 khi không được phép

Cái bắt tay có vẻ đúng. Nhưng, cuối cùng có gì đó không ổn.

Nhật ký của nhóm đăng ký Docker:

http: Lỗi bắt tay TLS từ <ingress-pod-ip>:38686: tls: bản ghi đầu tiên trông không giống như bắt tay TLS

Nhật ký của Ingress Pod:

[lỗi] 84#84: *40 ngược dòng không gửi tiêu đề HTTP/1.0 hợp lệ trong khi đọc tiêu đề phản hồi từ ngược dòng, máy khách: <cluster-ip>, máy chủ: example.com, yêu cầu: "GET / HTTP/1.1", ngược dòng: "http://<registry-pod-ip>:5000/", máy chủ lưu trữ: "example.com"

Nhật ký đăng nhập Docker từ máy khách:

đăng nhập docker https://example.com
Phản hồi lỗi từ trình nền: Nhận "https://example.com/v2/": net/http: kết nối truyền tải HTTP/1.x bị hỏng: phản hồi HTTP không đúng định dạng "\x15\x03\x01\x00\x02\x02"

Theo những gì tôi hiểu, vấn đề xuất phát từ việc một trong các thành phần cố gắng giao tiếp với http thay vì https. Nhân tiện, upsteam là ở http, điều này có vẻ lạ.
Thật không may, tôi dường như không thể khắc phục vấn đề này. Tôi đã thử một số chú thích (được nhận xét) trong khai báo xâm nhập để buộc sử dụng https, nhưng nó không hoạt động.

Tôi đã thấy nó vấn đề trên Github, nhưng apiserver của tôi không có tham số --kubelet-https=false

Tôi sẽ đánh giá cao nếu bạn có bất kỳ manh mối nào có thể giúp tôi.

djdomi avatar
lá cờ za
có thể là bạn đang sử dụng http thay vì https?
Thomas avatar
lá cờ in
@djdomi Ý bạn là gì? Bạn nghĩ tôi có thể sai với phần nào trong cấu hình của mình?
Mikołaj Głodziak avatar
lá cờ id
Bạn đã sử dụng phiên bản Kuberneted nào? Xin lưu ý rằng có 3 loại Nginx. Mã nguồn mở Nginx Ingress Controller, Nginx Incorporaton (nginx inc) và Nginx Incorporaton Plus. Hãy thử sử dụng mã nguồn mở nginx.[Đây là ví dụ](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/)?
Thomas avatar
lá cờ in
Cảm ơn sự giúp đỡ của bạn ! Tôi quản lý để làm cho nó hoạt động. Có vẻ như nó đến từ cấu hình đăng ký docker. Tôi đã sửa đổi các chứng chỉ và khởi động lại nhóm.
Điểm:1
lá cờ id

Như Thomas đã đề cập trong nhận xét:

Tôi quản lý để làm cho nó hoạt động. Có vẻ như nó đến từ cấu hình đăng ký docker. Tôi đã sửa đổi các chứng chỉ và khởi động lại nhóm.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.