Доступ к конечной точке кластера AWS под управлением Kubernetes - PullRequest
0 голосов
/ 14 марта 2019

Я новичок в Kubernetes и в настоящее время развертываю кластер в AWS с использованием Kubeadm.Контейнеры развернуты просто отлично, но я не могу получить к ним доступ через браузер.Когда я делал это через Docker Swarm, я мог просто использовать IP-адрес узла AWS для доступа и входа в свое приложение с помощью браузера, но, похоже, это не работает с моими текущими настройками Kubernetes.

Поэтому мой вопрос: как я могу получить доступ к своему работающему приложению с этими новыми настройками?

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Вы должны прочитать о том, как использовать Сервисы в Kubernetes:

Сервис Kubernetes - это абстракция, которая определяет логический набор модулей и политику доступа к ним.- иногда называется микросервисом.

В основном Службы позволяют осуществлять развертывание (или модуль) изнутри или вне кластера.

В вашем случае, если вы хотитепредоставить один сервис в AWS, это так просто:

apiVersion: v1
kind: Service
metadata:
  name: myApp
  labels:
    app: myApp
spec:
  ports:
  - port: 80 #port that the service exposes
    targetPort: 8080 #port of a container in "myApp"
  selector:
    app: myApp #your deployment must have the label "app: myApp"
  type: LoadBalancer

Вы можете проверить, был ли сервис успешно создан в консоли AWS EC2 в разделе «Упругие балансировщики нагрузки» или с помощью kubectl describe service myApp

1 голос
/ 14 марта 2019

Оба ответа помогли мне в решении моей проблемы, но я потерял детали.Вот пример, который может помочь другим в подобной ситуации:

1) Рассмотрим следующее приложение yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-web-app
  labels:
    app: my-web-app
spec:
  serviceName: my-web-app
  replicas: 1
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: my-web-app
        image: myregistry:443/mydomain/my-web-app
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: cp

2) Я решил принять Node Port (спасибо @Leandro зауказав это), чтобы показать мой сервис, поэтому я добавил в свой yaml следующее приложение:

---
apiVersion: v1
kind: Service
metadata:
  name: my-web-app
  labels:
    name: my-web-app
spec:
  type: NodePort
  ports:
    - name: http1
      port: 80
      nodePort: 30036
      targetPort: 8080
      protocol: TCP
  selector:
     name: my-web-app

Одна вещь, которую мне не хватало, состоит в том, что имена меток в обоих наборах должны совпадать, чтобы связать my-web-app:StatefulSet (1) - my-web-app:Service (2).Тогда my-web-app:StatefulSet:containerPort должен совпадать с my-web-app:Service:targetPort (8080).Наконец, my-web-app:Service:nodePort - это порт, который мы публикуем публично, и он должен иметь значение между 30000-32767.

3) Последний шаг - убедиться, что группа безопасности в AWS разрешает входящий трафик для выбранного my-web-app:Service:nodePort, в данном случае 30036, если не добавить правило.

После выполнения этих шагов я смог получить доступ к своему приложению через aws-node-ip:30036/my-web-app.

0 голосов
/ 14 марта 2019

В основном способ, которым построен kubernetes, отличается.Прежде всего, ваши контейнеры скрыты от мира, если только вы не создадите сервис для их представления, балансировщик нагрузки или nodePort.Если вы создадите сервис типа clusterIP, он будет доступен только внутри кластера.Для простоты используйте порт перенаправления для тестирования ваших контейнеров, если все работает, создайте сервис для их показа (Node Port или балансировщик нагрузки).Лучший и более сложный подход - создать вход для обработки входящего трафика и маршрутизации к сервисам.

Пример переадресации портов:

kubectl port-forward redis-master-765d459796-258hz 6379:6379

Измените redis для вашего имени модуля и соответствующего порта вашего контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...