Puncte:1

Cum creez un serviciu Kubernetes care direcționează traficul către diferite poduri în funcție de port?

drapel ng

Aș dori să am un serviciu de tip LoadBalancer care să indice un nginx pe portul 80 și să indice un pod sshd separat pentru portul 22. Cu toate acestea, nu pot ruta pe baza portului cu un singur selector.

Cazul de utilizare pentru care merg este similar cu github.com, care acceptă trafic către github.com pentru portul 80, precum și 22 pentru trafic ssh. Deci, DNS ar indica un set de balansoare de încărcare k8s în acest caz, despre care aș presupune că ar fi direcționat către podurile adecvate per port.Deci, dacă merg greșit, lasă-mă să știu. Sunt deschis la alte solutii.

Ceea ce aș dori să evit este să înființez un pod separat, cum ar fi HAProxy, care rutează pe port.

Am căutat să folosesc un Ingress, dar asta este doar pentru trafic HTTP.

Un Ingress nu expune porturi sau protocoale arbitrare. Expunerea altor servicii decât HTTP și HTTPS la internet utilizează de obicei un serviciu de tip Service.Type=NodePort sau Service.Type=LoadBalancer.

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

mozello avatar
drapel cn
Bună Matt, ați putea vă rog să vă corectați expresia „Totuși, nu pot ruta pe baza portului cu un singur selector”? Ce este „w/”?
mozello avatar
drapel cn
Știți că Kubernetes Ingress poate expune porturile TCP așa cum este descris [aici](https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/)? Cum ți-ai configurat clusterul k8s (furnizor de cloud sau on-premise)? Ce versiune k8s folosești?
drapel ng
@IvanM. În prezent, rulez acest lucru la nivel local, folosind tipul care este pe kubernetes v1.23.3. Pentru ca LoadBalancer să funcționeze, folosesc metallb. Lasă-mă să verific acel link, totuși. Văd că controlerul nginx extinde controlerul de intrare implicit al kubernetes.
Puncte:1
drapel cn

Ceea ce aș dori să evit este să înființez un pod separat, cum ar fi HAProxy, care rutează pe port.

Nu trebuie să configurați un astfel de Pod separat.

Kubernetes Ingress în mod implicit nu acceptă serviciile TCP sau UDP. Dar de exemplu, ingress-nginx controlerul oferă un mecanism pentru a suporta TCP sau UDP pe diferite porturi. Puteți expune porturile TCP sau UDP modificând ConfigMaps.

Din acest motiv, acest controler Ingress folosește steagurile „--tcp-services-configmap” și „--udp-services-configmap” pentru a indica o hartă de configurare existentă unde cheia este portul extern de utilizat și valoarea indică serviciu de expunere folosind formatul:

<spațiu de nume/nume serviciu>:<port serviciu>:[PROXY]:[PROXY]

Verificați informații suplimentare Aici.

Un astfel de ConfigMap ar trebui să fie deja disponibil inainte de implementarea controlerului de intrare.

Deci, încercați să:

1. Creați un ConfigMap cu următoarea configurație a serviciului TCP.

$ cat ingress-nginx-tcp.yml
apiVersion: v1
fel: ConfigMap
metadate:
  nume: ingress-nginx-tcp
  spatiu de nume: implicit  
date:
  „22”: targetnamespace/target-service:22

2. Îndreptați controlerul Ingress către această ConfigMap folosind --tcp-services-configmap marcați în configurație astfel:

$ kubectl obține implementarea ingress-nginx-controller -o yaml
apiVersion: apps/v1
fel: Desfăşurare
metadate:
  nume: ingress-nginx-controller
  spatiu de nume: implicit
specificație:
...
  șablon:
...
    specificație:
      containere:
      - argumente:
        - /nginx-ingress-controller
        - --tcp-services-configmap=$(POD_NAMESPACE)/ingress-nginx-tcp
...

3. Expuneți portul 22 în Serviciul definit pentru Intrare astfel:

$ kubectl obține svc ingress-nginx-controller -o yaml 
apiVersion: v1
fel: Serviciu
metadate:
  nume: ingress-nginx-controller
  spatiu de nume: implicit
specificație:
  porturi:
  - nume: tcp-22
    nodePort: 30957
    port: 22
    protocol: TCP
    targetPort: 22
...
  tip: LoadBalancer
...

Puteți defini orice număr de porturi care pot fi expuse folosind această metodă.

Există o altă opțiune pentru cei care folosesc un ingress-nginx helm chart. Cea mai mare parte a configurației este deja făcută și trebuie doar să specificați porturile tcp sectiune ca aceasta:
tcp: 
  2222: „default/example-tcp-svc:22”

Unde 2222 este portul expus şi 22 este portul de serviciu.

Puncte:0
drapel ng

Mulțumesc lui @Ivan M. care m-a îndreptat în direcția corectă, vreau doar să adaug un exemplu de cod al soluției aici:

În primul rând, lucrul confuz este că documentația kubernetes mă conduce pe calea greșită, gândindu-mă că nu poți folosi o intrare pentru trafic non-http. Lucrul despre care trebuie să știți este că puteți utiliza un controler de intrare diferit. Cu controlerul de intrare nginx, puteți proxy traficul arbitrar tcp sau chiar udp.

Al doilea obstacol este că există două repoziții separate pentru intrarea nginx. Acestea sunt:

Am ajuns să folosesc controlerul kubernetes/ingress-nginx.

nginx-values.yaml

controlor:
  serviciu:
    enableHttp: adevărat

tcp:
  "22": "altul-spațiu-de-nume/nume-serviciu:22"

Apoi avem instalarea cârmei

helm repo adăugați ingress-nginx https://kubernetes.github.io/ingress-nginx
actualizare helm repo
helm -n nginx -f nginx-values.yaml instalează ingress-nginx ingress-nginx/ingress-nginx

Apoi instalez Ingress în k8s. Observați ingressClassName

intrare.yaml

apiVersion: networking.k8s.io/v1
fel: Intrare
metadate:
  nume: intrarea mea
  spațiu de nume: nginx
specificație:
  ingressClassName: nginx
  defaultBackend:
    serviciu:
      nume: my-http-service
      port:
        număr: 80

Și apoi îl cubectl pe băiatul ăla rău

kubectl aplica -f ingress.yaml

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.