Sobes.tech
Middle

Ako môžeme získať prístup ku kontajneru Kubernetes, v ktorom beží aplikácia, z vonkajšej siete?

sobes.tech AI

Odpoveď od AI

Existuje niekoľko základných spôsobov, ako získať prístup ku kontajneru Kubernetes z vonkajšej siete:

  1. Služba typu LoadBalancer:

    • Cloudoví poskytovatelia (AWS, GCP, Azure) vytvárajú externý vyvažovač záťaže, ktorý smeruje prevádzku na vaše pody.
    • Priraďuje sa externá IP adresa.
    • Najjednoduchší spôsob v cloudovom prostredí.
  2. Služba typu NodePort:

    • Otvára port na každom uzle v klasteri.
    • Tento port smeruje prevádzku na službu vašej aplikácie.
    • Prístup je cez IP adresu ktoréhokoľvek uzla a číslo NodePort.
    • Menej škálovateľné a bezpečnejšie ako LoadBalancer.
  3. Služba typu ClusterIP spolu s Ingress:

    • ClusterIP je služba dostupná iba vo vnútri klastera.
    • Ingress je objekt API, ktorý riadi externý prístup ku službám v klasteri.
    • Ingress kontrolér (napríklad Nginx Ingress Controller, Traefik) počúva externý prevádzku a smeruje ho na príslušnú ClusterIP službu.
    • Umožňuje centralizovanú správu smerovania, SSL termináciu, vyvažovanie záťaže.
    • Flexibilný a škálovateľný prístup.
  4. Služba typu ExternalName:

    • Vytvára pseudonym pre externú doménu. Neposkytuje priame prístup k kontajneru cez túto službu, ale umožňuje používanie DNS mena vnútri klastera na prístup k externému zdroju. Nie je vhodná pre priame prístup k kontajneru zvonku.
  5. Priamy prístup k NodePort/HostPort na Pod:

    • Môžete špecifikovať hostPort v špecifikácii podu, aby ste otvorili port na uzle, kde beží pod. Neodporúča sa v produkčnom prostredí kvôli nízkej spravovateľnosti a potenciálnym konfliktom portov.
    • Podobne, nodePort môžete špecifikovať v službe typu NodePort.

Príklady konfigurácií:

  • LoadBalancer služba:

    // 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 služba:

    // 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 # voliteľné, Kubernetes mu priradí, ak nie je uvedené
      type: NodePort
    
  • Ingress (service typu ClusterIP):

    // service-clusterip.yaml (už existuje)
    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
    

Voľba metódy závisí od požiadaviek na škálovanie, bezpečnosť, prostredie nasadenia (cloud alebo on-premise) a potreby centralizovanej správy prístupu. Ingress je preferované riešenie pre produkčné systémy.