Sobes.tech
Middle

Как можем да получим достъп до контейнера Kubernetes, в който работи приложението, от външната мрежа?

sobes.tech AI

Отговор от AI

Има няколко основни начина за достъп до контейнер Kubernetes от външната мрежа:

  1. Услуга тип LoadBalancer:

    • Облачните доставчици (AWS, GCP, Azure) създават външен балансировач на натоварването, който насочва трафика към вашите подове.
    • Назначава се външен IP адрес.
    • Най-лесният начин в облачна среда.
  2. Услуга тип NodePort:

    • Отваря порт на всеки възел в клъстера.
    • Този порт пренасочва трафика към услугата на вашето приложение.
    • Достъпът е чрез IP адреса на който и да е възел и номер на NodePort.
    • По-малко мащабируем и по-безопасен от LoadBalancer.
  3. Услуга тип ClusterIP заедно с Ingress:

    • ClusterIP е услуга, достъпна само вътре в клъстера.
    • Ingress е API обект, който управлява външния достъп до услугите в клъстера.
    • Ingress контролерът (например Nginx Ingress Controller, Traefik) слуша външния трафик и го маршрутизира към подходящата ClusterIP услуга.
    • Позволява централизирано управление на маршрутизацията, SSL терминализацията, балансировката на натоварването.
    • Гъвкав и мащабируем подход.
  4. Услуга тип ExternalName:

    • Създава псевдоним за външно домейн име. Не предоставя директен достъп до контейнера чрез тази услуга, но позволява използването на DNS име вътре в клъстера за достъп до външен ресурс. Не е подходящо за директен достъп до контейнера отвън.
  5. Директен достъп до NodePort/HostPort на Pod:

    • Може да зададете hostPort в спецификацията на пода, за да отворите порт на възела, където работи подът. Не се препоръчва за продукционна среда поради ниската управляемост и потенциални конфликти на портове.
    • По същия начин, nodePort може да бъде зададен в услуга тип NodePort.

Примери за конфигурации:

  • LoadBalancer услуга:

    // 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 услуга:

    // 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 # по избор, Kubernetes ще го назначи ако не е посочено
      type: NodePort
    
  • Ingress (услуга тип ClusterIP):

    // service-clusterip.yaml (вече съществува)
    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
    

Изборът на метод зависи от изискванията за мащабиране, сигурност, среда за внедряване (облак или on-premise) и необходимостта от централизирано управление на достъпа. Ingress е предпочитано решение за производствени системи.