Middle
Как можем да получим достъп до контейнера Kubernetes, в който работи приложението, от външната мрежа?
sobes.tech AI
Отговор от AI
Има няколко основни начина за достъп до контейнер Kubernetes от външната мрежа:
-
Услуга тип LoadBalancer:
- Облачните доставчици (AWS, GCP, Azure) създават външен балансировач на натоварването, който насочва трафика към вашите подове.
- Назначава се външен IP адрес.
- Най-лесният начин в облачна среда.
-
Услуга тип NodePort:
- Отваря порт на всеки възел в клъстера.
- Този порт пренасочва трафика към услугата на вашето приложение.
- Достъпът е чрез IP адреса на който и да е възел и номер на NodePort.
- По-малко мащабируем и по-безопасен от LoadBalancer.
-
Услуга тип ClusterIP заедно с Ingress:
- ClusterIP е услуга, достъпна само вътре в клъстера.
- Ingress е API обект, който управлява външния достъп до услугите в клъстера.
- Ingress контролерът (например Nginx Ingress Controller, Traefik) слуша външния трафик и го маршрутизира към подходящата ClusterIP услуга.
- Позволява централизирано управление на маршрутизацията, SSL терминализацията, балансировката на натоварването.
- Гъвкав и мащабируем подход.
-
Услуга тип ExternalName:
- Създава псевдоним за външно домейн име. Не предоставя директен достъп до контейнера чрез тази услуга, но позволява използването на DNS име вътре в клъстера за достъп до външен ресурс. Не е подходящо за директен достъп до контейнера отвън.
-
Директен достъп до 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 е предпочитано решение за производствени системи.