Как получить доступ к сервисам kubernetes извне в голом металлическом кластере - PullRequest
0 голосов
/ 07 января 2020

У меня есть API-сервис с типом 'ClusterIp', который работает нормально и доступен на узле с clusterip. Я хочу получить к нему доступ извне. Это голая металлическая установка с kubeadm. Я не могу использовать Loadbalancer или Nodeport.

Если я использую nginx -адрес, который я тоже буду использовать как 'ClusterIP', так как получить доступ к внешней службе в API-сервисе или в случае nginx -приемника.

NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
api                    ClusterIP   10.97.48.17      <none>        80/TCP           41s
ingress-nginx          ClusterIP   10.107.76.178    <none>        80/TCP           3h49m

Изменения для решения проблемы:

  1. nginx конфигурация на узле

в / etc / nginx / sites-available

 upstream backend {
       server node1:8001;
       server node2:8001;
       server node3:8001;
        }
    server_name _;

    location / {
            proxy_pass http://backend;
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
    }
Запустил два моих сервиса как DaemonSet

Ответы [ 2 ]

1 голос
/ 07 января 2020

ClusterIP сервисы доступны только внутри кластера.

Для кластеров типа «голое железо» вы можете использовать любой из следующих подходов, чтобы сделать сервис доступным извне. Предложения от наиболее рекомендуемого до наименее рекомендуемого порядка:

  1. Использование metallb для реализации LoadBalancer Поддержка типа обслуживания - https://metallb.universe.tf/. Вам понадобится пул IP-адресов для раздачи metallb. Он также поддерживает режим совместного использования IP-адресов, при котором вы можете использовать один и тот же IP-адрес для нескольких служб LoadBalancer.

  2. Использовать NodePort . Вы можете получить доступ к своему сервису с любого IP-адреса узла: адрес узла_порта. Сервис NodePort выбирает случайный порт в диапазоне портов узла по умолчанию. Вы можете выбрать пользовательский порт в диапазоне портов узла, используя поле spec.ports.nodePort в спецификации сервиса.

    Недостаток: Диапазон портов узла по умолчанию составляет 30000-32767. Таким образом, вы не можете привязать какой-либо пользовательский порт, например, 8080. Хотя вы можете изменить диапазон портов узла с флагом --service-node-port-range kube-api-server, не рекомендуется использовать его с низкими диапазонами портов.

  3. Используйте hostPort для привязки порта на узле.

    Недостаток: У вас нет фиксированного IP-адреса, потому что вы не знаете, на какой узел назначен ваш модуль, если вы не используете nodeAffinity. Вы можете сделать свой модуль демоном, если хотите, чтобы он был доступен со всех узлов данного порта.

Если вы имеете дело с трафиком HTTP c, другой вариант - установить IngressController как nginx или Traefik и использовать ресурс Ingress. В рамках своей установки они используют один из упомянутых выше подходов, чтобы сделать себя доступными извне.

0 голосов
/ 07 января 2020

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

Чтобы сделать службу доступной вне кластера, у вас есть c 3 варианта:

  1. NodePort Тип сервиса
  2. LoadBalancer Тип сервиса (вам все равно придется управлять LoadBalancer вручную)
  3. Ingress

Существует четвертый вариант, который hostPort (который не тип услуги), но я бы предпочел не использовать его в особом случае, когда вы абсолютно уверен, что ваш модуль всегда будет располагаться на одном и том же узле (или, в конечном счете, для отладки).

С учетом вышесказанного у нас остается только одно решение, предлагаемое Kubernetes: Ingress.

...