Внешний IP-адрес Kubernetes работает не на всех узлах - PullRequest
0 голосов
/ 10 июня 2018

Я создал кластер Kubernetes Kubeadm с 3 узлами.Их IP-адрес и имя хоста: 10.10.10.146/24(k8s1, master), 10.10.10.135/24(k8s2), 10.10.10.170/24(k8s3).

Теперь я создаю сервис nginx, который содержит 3pods с этим файлом yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-app
        image: nginx:1.14.0
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-srv
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - 10.10.100.1

Наконец, один из pods был назначен на k8s2, а два из них на k8s3.

Затем, если я направлю 10.10.100.0/24 на k8s2, толькоодна работа.Если до k8s3, работают только два модуля.А если до k8s1, то никакие модули не работают.

Как заставить все модули работать нормально через внешний IP извне точно так же, как через кластерный IP изнутри независимо от того, какой узелМаршрутизировать подсеть с внешним IP на ?Или это невозможно, или мне нужно что-то еще, например, Kubernetes Ingress?

1 Ответ

0 голосов
/ 11 июня 2018

Существует несколько вариантов для предоставления вашей службы за пределами кластера:

Первый вариант - использовать тип NodePort Служба Kubernetes .Таким образом, Сервис откроет порт на сетевом интерфейсе каждого узла в кластере, и весь трафик, поступающий на этот порт, будет перенаправлен на сервис.По умолчанию диапазон портов для этого вида услуг ограничен 30000–32767.

Вот пример конфигурации Service NodePort:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: NodePort
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
    nodePort: 30080

Второй вариант доступен, если вы работаетеKubernetes кластер в облаках, как AWS, GCP, Azure.Если вы создадите сервис типа LoadBalancer, он создаст новый балансировщик нагрузки в облаке и перенаправит весь трафик из этого балансировщика нагрузки в сервис.Недостатком этого способа является то, что каждая служба создает отдельный балансировщик нагрузки, который будет стоить вам дополнительных денег.

Вот пример конфигурации Service LoadBalancer:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  type: LoadBalancer
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376

Третий вариант -использовать объект Ingress .Контроллер Ingress должен работать в кластере для настройки облачной сети в соответствии с содержимым созданного вами объекта Ingress.Ingress может предоставить вам функциональность маршрутизации запросов к различным сервисам в зависимости от имени DNS и пути URI.Вы также можете использовать его в чистом кластере Kubernetes, но в этом случае вы несете ответственность за маршрутизацию сетевого трафика на контроллер Ingress, например, по правилам брандмауэра.

Вот несколько примеров конфигурации Ingress:

# redirect all traffic to a service
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  backend:
    serviceName: testsvc
    servicePort: 80


# redirect traffic to a service for specified URI path
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...