Как получить доступ к сервису kubernetes извне на голой железной установке

Пытаясь создать чистый кластер K8S для предоставления некоторых услуг и необходимости их предоставления на TCP-порт 80 и UDP-порт 69 (доступный из-за пределов кластера K8S.) Я настроил кластер с помощью Kubeadm, и он работает Ubuntu 16,04. Как я могу получить доступ к услугам извне? Я пытался использовать балансировщики нагрузки и вход, но мне не повезло, так как я не использую внешний балансировщик нагрузки (локальный, а не AWS и т. Д.)

Пример того, что я пытаюсь сделать, можно найти здесь, но он использует GCE.

Спасибо

3 ответа

Сервис с NodePort

Создать сервис с типом NodePort Сервис может прослушивать TCP/UDP порт 30000-32767 на каждом узле. По умолчанию вы не можете просто выставить Сервис на порту 80 на своих узлах.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: {SERVICE_PORT}
    targetPort: {POD_PORT}
    nodePort: 31000
  - portocol: UDP
    port: {SERVICE_PORT}
    targetPort: {POD_PORT}
    nodePort: 32000
  type: NodePort

Изображение контейнера gcr.io/google_containers/proxy-to-service:v2 это очень маленький контейнер, который будет выполнять переадресацию портов для вас. Вы можете использовать его для перенаправления порта pod или хост-порта в сервис. Контейнеры могут выбирать любой порт или порт хоста, и не ограничиваются тем же способом, что и Сервисы.

apiVersion: v1
kind: Pod
metadata:
  name: dns-proxy
spec:
  containers:
  - name: proxy-udp
    image: gcr.io/google_containers/proxy-to-service:v2
    args: [ "udp", "53", "kube-dns.default", "1" ]
    ports:
    - name: udp
      protocol: UDP
      containerPort: 53
      hostPort: 53
  - name: proxy-tcp
    image: gcr.io/google_containers/proxy-to-service:v2
    args: [ "tcp", "53", "kube-dns.default" ]
    ports:
    - name: tcp
      protocol: TCP
      containerPort: 53
      hostPort: 53

вход

Если существует несколько служб, совместно использующих один и тот же порт TCP с разными узлами / путями, разверните контроллер входа NGINX, который прослушивает HTTP 80 и HTTPS 443.

Создайте вход, перенаправьте трафик на указанные сервисы.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

Если у вас есть только один узел, разверните входной контроллер как демон с хост-портом 80. Не развертывайте для него службу

Если у вас есть несколько узлов; у облачных провайдеров балансировщик нагрузки - это структура вне кластера, которая в основном является прокси-сервером HA для каждого узла, на котором запущены модули вашей службы на некоторых портах. Вы можете сделать это вручную, для любого сервиса, который вы хотите выставить для типа набора на NodePort с некоторым портом в допустимом диапазоне (где-то в 30k) и подключить другую виртуальную машину с балансировщиком TCP (например, nginx) ко всем вашим узлам. в этом порту. Вы будете ограничены тем, чтобы запускать столько модулей, сколько у вас есть узлов для этой службы.

Если бы я собирался сделать это в своей домашней сети, я бы сделал это так:
Сконфигурируйте правила переадресации 2 портов на моем маршрутизаторе, чтобы перенаправить трафик на ящик nginx, выступающий в качестве балансировщика нагрузки L4

Так что, если мой маршрутизатор IP был 1.2.3.4, а мой пользовательский L4 nginx LB был 192.168.1.200
Затем я бы сказал моему маршрутизатору перенести порт вперед:
1.2.3.4:80 -> 192.168.1.200:80
1.2.3.4:443 -> 192.168.1.200:443

Я бы следовал этому https://kubernetes.github.io/ingress-nginx/deploy/
и разверните большую часть того, что есть в стандартном облачном входном контроллере (это должно создать модуль входного контроллера, развертывание Lgin Nginx LB и сервис в кластере, и выставить его на узлы портов, чтобы у вас были NodePort 32080 и 32443 (обратите внимание, что они будут на самом деле будь случайным, но за этим легче следить))
(Поскольку вы работаете с голым металлом, я не верю, что он сможет автоматически порождать и настраивать балансировщик нагрузки L4 для вас.)


Затем я бы вручную настроил балансировщик нагрузки L4 для трафика, поступающего на баланс нагрузки
порт 80 ---> NodePort 32080
порт 443 ---> NodePort 32443
Так что между этой большой картиной того, что вы делаете, и по следующей ссылке вы должны быть хорошими.
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

(Кстати, это позволит вам продолжить настройку входа с помощью контроллера входа)

Примечание: я планирую установить кластер из чистого металла в моем домашнем шкафу через несколько месяцев, поэтому дайте мне знать, как это происходит!

Другие вопросы по тегам