Балансировка нагрузки приложения "Hello World" Kubernetes - PullRequest
0 голосов
/ 23 февраля 2020

Чтобы начать играть с Kubernetes, я создал небольшой проект, в котором я создаю кластер из трех узлов на своем локальном компьютере с помощью Vagrant и Vbox: https://github.com/sasadangelo/k8s-cluster

Просто наберите vagrant up my кластер работает и я могу начать играть с ним. Я ознакомился с основными понятиями и командами и создал простое приложение «Hello World», состоящее из docker изображения с веб-сервером NGINX, где вы можете подключиться через браузер, и появится сообщение «Hello World» с именем хоста. Имя хоста помогает мне понять, какой Pod ответил на мой запрос.

Здесь проект: https://github.com/sasadangelo/k8s-tutorials/tree/master/hello-k8s

В настоящее время я могу создать развертывание с kubectl create, выставляя это как служба с kubectl expose, а затем увеличить реплику с kubect scale. В настоящее время я могу использовать службу NodePort, поэтому с kubectl describe service я вижу, по какому IP прослушивают 5 модулей, я подключаюсь к ним, и все работает нормально.

Моя проблема в том, что теперь я хочу загрузить баланс траффи c. Я хочу подключиться к одному IP , и как только я нажимаю на кнопку перезагрузки браузера, я хочу видеть, что появляются разные имена Pod.

Я знаю, что Kubernetes по умолчанию предлагает только NodePort сервис, и если я хочу балансировщик нагрузки, мне нужно что-то вроде Ingress. Я также знаю, что простой обратный прокси-сервер, такой как Ingress Nginx, является хорошей реализацией для моих нужд.

Тем не менее, я прочитал много учебников, но мне трудно понять, как мне настроить его, чтобы добиться того, что мне нужно .

Вот код, который у меня есть на данный момент: https://github.com/sasadangelo/k8s-cluster/tree/master/ingress

Может кто-нибудь помочь мне, как исправить входной код для достижения того, что мне нужно?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Kube Proxy, который является компонентом kubernetes, обеспечивает балансировку нагрузки на уровне L4 с помощью балансировки нагрузки iptables. Так что с помощью самой службы типа ClusterIP вы получаете балансировку нагрузки между модулями. Но с сервисом типа clusterIP вы не можете получить к нему доступ из-за пределов кластера, т.е. из браузера. Служба типа Nodeport предоставляет доступ к модулям вне кластера с балансировкой нагрузки на уровне L4 через прокси-сервер kube.

LoadBalancer и Ingress обеспечивают балансировку нагрузки и маршрутизацию на основе правил на уровне L7, если это то, что вы ищете.

Глядя на ваш код, вы получаете yamls для nginx входного контроллера и выставляете его как Nodeport. Далее вам нужно создать входной ресурс

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 8080

Как только вы создадите вышеупомянутый входной файл и у вас будет служба типа ClusterIP для вашего модуля с именем web, открывающим порт 8080, вы должны иметь к нему доступ. .

Вот do c при использовании входа nginx для приложения hello world на Minikube, которому вы также можете следовать, чтобы заставить вход работать в настройках.

0 голосов
/ 04 марта 2020

Вот что я сделал подробно, чтобы решить проблему. Прежде всего, я установил Nginx Входные ресурсы:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

, затем я создал Nginx Входной ресурс в ingress-nginx.yaml файле:

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-k8s-ingress
  annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: hello-k8s.info
      http:
      paths:
    - path: /
      backend:
        serviceName: hello-k8s
        servicePort: 80

и установил его с помощью команда:

kubectl apply -f ingress-nginx.yaml

Вы можете увидеть код здесь .

Внутри кластера (выполнение vagrant s sh на любом узле), который я тестировал:

curl -H "Host: hello-k8s.info" IP

где IP получен из команды:

kubectl get ingress

Предположим, это 10.97.139.101. Вне кластера, на моем Ma c (работает на 3 VirtualBox на моем Ma c) для доступа к приложению, мне нужно было добавить маршрут:

sudo route add -net 10.97.0.0/16 192.168.205.10

, где 192.168.205.10 - это IP-адрес мастер-узел. В /etc/hosts я добавил строку:

10.97.139.101 hello-k8s.info

Теперь, набрав в браузере hello-k8s.info, я вижу, что появляется веб-страница «Hello World». Спасибо Arghya Sadhu за помощь.

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