Puncte:1

NGINX Ingress pe Kubernetes nu folosește HTTPS

drapel in

Setez un cluster Kubernetes pe bare metal. Am folosit Kubeadm pentru instalare. Pentru a-mi face serviciile accesibile din afara clusterului, am instalat un NGINX Ingress, folosind următoarea documentație: NGINX doc

Pentru că nu vreau să comunic cu serviciile mele fără securitate TLS, am configurat certificatul datorită cert-manager : Cert-manager doc.

$kubectl obține certificat
NUME GATA SECRET VARSTA
certificat-tls-prod True tls-secret-prod 3h1m
tls-secret-prod True tls-secret-prod 41m

Generarea certificatelor funcționează și sunt recunoscute de client.

Acum, încerc să instalez propriul meu registru Docker (registry:2.7.1) în cluster. După implementarea Pod-ului și a Serviciului, încerc să fac a conectare la docker de la clientul meu, dar nu merge.

Configurație de intrare:

apiVersion: networking.k8s.io/v1
fel: Intrare
metadate:
  adnotari:
    # nginx.ingress.kubernetes.io/ssl-redirect: „adevărat”
    # nginx.ingress.kubernetes.io/force-ssl-redirect: „adevărat”
    # nginx.ingress.kubernetes.io/ssl-passthrough: „adevărat”
    nginx.ingress.kubernetes.io/backend-protocol: „HTTPS”
    cert-manager.io/issuer: „letsencrypt-prod”
  spatiu de nume: implicit
  nume: nginx-ingress
specificație:
  tls:
  - gazde:
    - example.com
    secretName: tls-secret-prod
  reguli:
  - gazdă: example.com
    http:
      trasee:
      - cale: /
        pathType: Prefix
        backend:
          serviciu:
            nume: docker-registry
            port: 
              număr: 5000

Când încerc să ajung la serviciu făcând un simplu curl:

curl -v https://example.com/

* Se încearcă <cluster-ip>:443...
* Conectat la example.com (<cluster-ip>) portul 443 (#0)
* ALPN, oferind h2
* ALPN, oferind http/1.1
* setați cu succes locațiile de verificare a certificatelor:
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: niciunul
* TLSv1.3 (OUT), strângere de mână TLS, salut client (1):
* TLSv1.3 (IN), strângere de mână TLS, salut server (2):
* TLSv1.2 (IN), strângere de mână TLS, Certificat (11):
* TLSv1.2 (IN), strângere de mână TLS, schimb de chei de server (12):
* TLSv1.2 (IN), TLS handshake, Server terminat (14):
* TLSv1.2 (OUT), TLS handshake, Schimb cheie client (16):
* TLSv1.2 (OUT), TLS schimbă cifra, Schimbă specificația cifrului (1):
* TLSv1.2 (OUT), TLS handshake, Terminat (20):
* TLSv1.2 (IN), strângere de mână TLS, Terminat (20):
* Conexiune SSL folosind TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server acceptat să utilizeze http/1.1
* Certificat de server:
* subiect: CN=example.com
* data începerii: 13 iulie 10:03:45 2021 GMT
* data expirării: 11 octombrie 10:03:44 2021 GMT
* subjectAltName: gazda „example.com” a corespuns certificatului „example.com”
* emitent: C=US; O=Let's Encrypt; CN=R3
* Verificare certificat SSL ok.
> GET / HTTP/1.1
> Gazdă: example.com
> User-Agent: curl/7.77.0
> Accept: */*
> 
* A primit HTTP/0.9 când nu este permis
* Închiderea conexiunii 0
* TLSv1.2 (OUT), alertă TLS, notificare de închidere (256):
curl: (1) A primit HTTP/0.9 când nu este permis

Strângerea de mână pare corectă. Dar, ceva nu este în regulă până la urmă.

Jurnalul podului de registru Docker:

http: Eroare de strângere de mână TLS de la <ingress-pod-ip>:38686: tls: prima înregistrare nu arată ca o strângere de mână TLS

Jurnalul Podului de intrare:

[eroare] 84#84: *40 în amonte nu a trimis un antet HTTP/1.0 valid în timp ce citiți antetul răspunsului din amonte, client: <cluster-ip>, server: example.com, cerere: „GET / HTTP/1.1”, în amonte: „http://<registry-pod-ip>:5000/”, gazdă: „example.com”

Jurnalul de conectare Docker de la client:

conectare la docker https://example.com
Răspuns de eroare de la demon: Obțineți „https://example.com/v2/”: net/http: conexiune de transport HTTP/1.x întreruptă: răspuns HTTP incorect „\x15\x03\x01\x00\x02\x02”

Din câte am înțeles, problema vine din faptul că una dintre componente încearcă să comunice cu http în loc de https. Apropo, upsteam-ul este în http, ceea ce pare ciudat.
Din păcate, se pare că nu pot remedia această problemă. Am încercat mai multe adnotări (care sunt comentate) în declarația de intrare pentru a forța utilizarea https, dar nu a funcționat.

am vazut asta problemă pe Github, dar apiserver-ul meu nu are parametrul --kubelet-https=fals

Aș aprecia dacă ai avea vreun indiciu care m-ar putea ajuta.

djdomi avatar
drapel za
s-ar putea să folosești http în loc de https?
Thomas avatar
drapel in
@djdomi Ce vrei să spui? Cu ce ​​parte a configurației mele crezi că aș putea greși?
Mikołaj Głodziak avatar
drapel id
Ce versiune de Kuberneted ați folosit? Vă rugăm să rețineți că există 3 tipuri de Nginx. Open Source Nginx Ingress Controller, Nginx Incorporaton (nginx inc) și Nginx Incorporaton Plus. Încercați să utilizați nginx open source.[Iată exemplul](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/)?
Thomas avatar
drapel in
Vă mulţumesc pentru ajutor ! Am reușit să o fac să funcționeze. Se pare că a venit din configurația registrului docker. Am modificat certificatele și am repornit podul.
Puncte:1
drapel id

La fel de Thomas a menționat în comentariu:

Am reușit să o fac să funcționeze. Se pare că a venit din configurația registrului docker. Am modificat certificatele și am repornit podul.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.