Для внутренней связи между различными микроуслугами в Kubernetes следует использовать Service
типа ClusterIP . На самом деле это тип по умолчанию , поэтому, даже если вы не укажете его в файле определения Service
yaml, Kubernetes предполагает, что вы хотите создать ClusterIP
. Он создает виртуальный внутренний IP-адрес (доступный в вашем кластере Kubernetes) и предоставляет ваш кластерный компонент (микросервис) в качестве единой точки входа , даже если он поддерживается многими модулями.
Предположим, у вас есть внешнее приложение, которое должно взаимодействовать с внутренним компонентом, которое запускается в 3 разных модулях. Служба ClusterIP
обеспечивает единую точку входа и управляет балансировкой нагрузки между различными модулями, равномерно распределяя запросы между ними.
Вы можете получить доступ к службе ClusterIP
, указав ее IP-адрес и порт, доступный для компонента приложения. на. Обратите внимание, что вы можете определить другой порт (называемый port
в Service
определении) для Service
для прослушивания, отличный от фактического порта, используемого вашим приложением (обозначается как targetPort
в вашем Service
определении). Хотя к Service
можно получить доступ по его адресу ClusterIP
, все компоненты, которые взаимодействуют с модулями, внутренне выставленными им , должны использовать его DNS-имя . Это просто имя Service
, которое вы создали, если все компоненты приложения размещены в одном пространстве имен. Если некоторые компоненты находятся в разных пространствах имен, вам необходимо использовать полное доменное имя, чтобы они могли обмениваться данными между пространствами имен.
Ваши Service
файлы определений могут выглядеть следующим образом:
apiVersion: v1
kind: Service
metadata:
name: angular-service
spec:
type: ClusterIP ### may be ommited as it is a default type
selector:
name: angular ### should match your labels defined for your angular pods
ports:
- protocol: TCP
targetPort: 4200 ### port your angular app listens on
port: 4200 ### port on which you want to expose it within your cluster
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
type: ClusterIP ### may be ommited as it is a default type
selector:
name: backend ### should match your labels defined for your backend pods
ports:
- protocol: TCP
targetPort: 5000 ### port your backend app listens on
port: 5000 ### port on which you want to expose it within your cluster
Вы можете найти подробное описание этой темы в официальной Kubernetes документации .
NodePort
имеет совершенно другую функцию. Это может быть использовано, например, чтобы выставить ваше внешнее приложение на определенный порт на IP вашего узла. Обратите внимание, что если у вас есть кластер Kubernetes, состоящий из множества узлов, и ваши внешние модули размещены на разных узлах, для доступа к вашему приложению вам нужно использовать 3 разных IP-адреса. В таком случае вам нужен дополнительный балансировщик нагрузки. Если вы используете какое-то облачное платформенное решение и хотите открыть интерфейсную часть своего приложения для внешнего мира, лучше использовать сервисный тип LoadBalancer (вместо использования NodePort
).