Sobes.tech
Middle

როგორ შეგვიძლია მივიღოთ წვდომა Kubernetes კონტეინერზე, სადაც აპლიკაცია მუშაობს, გარედან ქსელიდან?

sobes.tech AI

პასუხი AI-სგან

კი არსებობს რამდენიმე ძირითადი გზა, რათა მიიღოთ წვდომა Kubernetes კონტეინერზე გარე ქსელიდან:

  1. Service ტიპი LoadBalancer:

    • ღრუბლოვანი პროვაიდერები (AWS, GCP, Azure) ქმნიან გარე ტვირთის ბალანსს, რომელიც მიმართავს თქვენს აპლიკაციის პოდებს.
    • მიენიჭება გარე IP-მისამართი.
    • ყველაზე მარტივი გზა ღრუბლოვან გარემოში.
  2. Service ტიპი NodePort:

    • ხსნის პორტს თითოეულ ნოდზე კლასტერში.
    • ეს პორტი გადამისამართავს ტრაფიკს თქვენს აპლიკაციის სერვისზე.
    • წვდომა ხდება ნებისმიერი ნოდის IP-მისამართით და NodePort ნომრით.
    • ნაკლებად მასშტაბური და ნაკლებად უსაფრთხო, ვიდრე LoadBalancer.
  3. Service ტიპი ClusterIP ერთად Ingress-თან:

    • ClusterIP - სერვისი, რომელიც ხელმისაწვდომია მხოლოდ კლასტერში.
    • Ingress - API ობიექტი, რომელიც მართავს გარე წვდომას კლასტერში სერვისებზე.
    • Ingress-კონტროლერი (მაგ. Nginx Ingress Controller, Traefik) უსმენს გარე ტრაფიკს და маршруტირებს მას შესაბამის ClusterIP სერვისზე.
    • საშუალებას აძლევს ცენტრალიზებულად მართოს მარშრუტიზაცია, SSL-ტერიმინაცია, ტვირთის ბალანსი.
    • მოქნილი და მასშტაბური მიდგომა.
  4. Service ტიპი ExternalName:

    • ქმნის ალტერნატიულ სახელწოდებას გარე დომენზე. არ უზრუნველყოფს პირდაპირ წვდომას კონტეინერზე ამ სერვისით, მაგრამ საშუალებას აძლევს გამოიყენოს DNS-სახელი კლასტერში გარე რესურსის მისამართით. არ არის შესაფერისი პირდაპირი წვდომისთვის კონტეინერზე გარედან.
  5. პირდაპირი წვდომა NodePort/HostPort-ით პოდზე:

    • შეიძლება მიუთითოთ hostPort პოდსის სპეციფიკაციაში, რათა გახსნათ პორტი ნოდზე, სადაც მუშაობს პოდი. ძალიან არაპრაქტიკული პროდაქშენისთვის, რადგან მართვადობა დაბალია და პორტების კონფლიქტების რისკი არსებობს.
    • ანალოგიურად, nodePort შეიძლება მიუთითოთ Service ტიპი 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
    

მეთოდის არჩევანი დამოკიდებულია მასშტაბირების მოთხოვნებზე, უსაფრთხოებაზე, განთავსების გარემოზე (ღრუბელი თუ ოფისში) და ცენტრალიზებული წვდომის მართვის საჭიროებაზე. Ingress არის სასურველი გადაწყვეტილება პროდაქშენ-სისტემებისთვის.