Sobes.tech
Middle

Kaip galime pasiekti Kubernetes konteinerį, kuriame veikia programa, iš išorinės tinklo?

sobes.tech AI

Atsakymas iš AI

Yra keletas pagrindinių būdų, kaip pasiekti Kubernetes konteinerį iš išorinio tinklo:

  1. Service tipas LoadBalancer:

    • Debesų teikėjai (AWS, GCP, Azure) sukuria išorinį apkrovos balansierių, kuris nukreipia srautą į jūsų programėlės podus.
    • Priskiriamas išorinis IP adresas.
    • Paprasčiausias būdas debesų aplinkoje.
  2. Service tipas NodePort:

    • Atveria prievadą kiekviename mazge klasteryje.
    • Šis prievadas nukreipia srautą į jūsų programėlės paslaugą.
    • Prieiga vyksta per bet kurio mazgo IP ir NodePort numerį.
    • Mažiau mastelinis ir mažiau saugus nei LoadBalancer.
  3. Service tipas ClusterIP kartu su Ingress:

    • ClusterIP - paslauga, prieinama tik klasteryje.
    • Ingress - API objektas, valdantis išorinę prieigą prie paslaugų klasteryje.
    • Ingress kontroleris (pvz., Nginx Ingress Controller, Traefik) klausosi išorinio srauto ir maršrutizuoja jį į tinkamą ClusterIP paslaugą.
    • Leidžia centralizuotai valdyti maršrutizaciją, SSL terminaciją, apkrovos balansavimą.
    • Lanksti ir mastelį leidžianti prieiga.
  4. Service tipas ExternalName:

    • Sukuria pseudonimą išoriniam domenui. Nesuteikia tiesioginės prieigos prie konteinerio per šią paslaugą, bet leidžia naudoti DNS vardą viduje klasteryje, norint pasiekti išorinį išteklių. Nerekomenduojama tiesioginei prieigai prie konteinerio iš išorės.
  5. Tiesioginė prieiga prie NodePort/HostPort ant Pod:

    • Galite nurodyti hostPort pod'o specifikacijoje, kad atidarytumėte prievadą mazge, kuriame veikia podas. Labai nerekomenduojama gamybinėje aplinkoje dėl mažo valdomumo ir galimų konfliktų prievadų.
    • Panašiai, nodePort galima nurodyti NodePort tipo paslaugoje.

Konfigūracijos pavyzdžiai:

  • LoadBalancer paslauga:

    // service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: LoadBalancer
    
  • NodePort paslauga:

    // service-nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-np
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          nodePort: 30000 # jei nenurodyta, Kubernetes priskirs
      type: NodePort
    
  • Ingress (ClusterIP paslauga):

    // service-clusterip.yaml (turi būti jau egzistuojanti)
    apiVersion: v1
    kind: Service
    metadata:
      name: my-app-service-ci
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: ClusterIP
    
    // ingress.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-app-ingress
    spec:
      rules:
        - host: myapp.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: my-app-service-ci
                    port:
                      number: 80
    

Pasirinktas metodas priklauso nuo mastelio, saugumo, diegimo aplinkos (debesis ar vietoje) ir poreikio centralizuotai valdyti prieigą. Ingress yra pageidaujamas sprendimas gamybinėms sistemoms.