Разоблачить порт 80 в управляемом Digital Ocean Kubernetes без балансировщика нагрузки - PullRequest
0 голосов
/ 10 января 2019

Я хотел бы предоставить услугу моего управляемого кластера Kubernetes Digital Ocean (один узел) на порту 80 без использования балансировщика нагрузки Digital Ocean. Это возможно? Как бы я это сделал?

По сути, это хобби-проект (я начинаю с Kubernetes), и я просто хочу, чтобы стоимость была очень низкой.

Заранее спасибо! -Joe

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Вы можете развернуть Ingress, настроенный для использования сети хоста и порта 80/443.

  1. В брандмауэре DO для вашего кластера по умолчанию нет входящего соединения 80/443. Откройте их в https://cloud.digitalocean.com/networking/firewalls

  2. Создайте вход nginx , используя сеть хоста. Я включил конфигурацию helm chart ниже, но вы можете сделать это и через процесс прямой установки.

$ helm install stable/nginx-ingress --name=myingress -f myingress.values.yml

myingress.values.yml для графика:

---
controller:
  kind: DaemonSet
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  daemonset:
    useHostPort: true
  service:
    type: ClusterIP
rbac:
  create: true
  1. вы должны иметь доступ к кластеру по: 80 и: 443 через любой IP-адрес рабочего узла, и он будет направлять трафик на ваш вход.

  2. , поскольку IP-адреса узлов могут изменяться, посмотрите на развертывание external-dns для управления записями DNS, указывающими на ваши рабочие узлы. Опять же, используя таблицу управления и предполагая, что ваш домен DNS размещен в DigitalOcean (хотя любой поддерживаемый поставщик DNS будет работать):

$ helm install --name=mydns -f mydns.values.yml stable/external-dns

mydns.values.yml для графика:

---
provider: digitalocean
digitalocean:
  # create the API token at https://cloud.digitalocean.com/account/api/tokens
  # needs read + write
  apiToken: "DIGITALOCEAN_API_TOKEN"
domainFilters:
  # domains you want external-dns to be able to edit
  - example.com
rbac:
  create: true
  1. создать ресурс Kubernetes Ingress для маршрутизации запросов к существующей службе Kubernetes:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: testing123-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: testing123.example.com             # the domain you want associated
      http:
        paths:
          - path: /
            backend:
              serviceName: testing123-service  # existing service
              servicePort: 8000                # existing service port
  1. примерно через минуту вы увидите, что записи DNS появляются и могут быть разрешены:
$ dig testing123.example.com             # should return worker IP address
$ curl -v http://testing123.example.com  # should send the request through the Ingress to your backend service
0 голосов
/ 14 января 2019

A NodePort Service может делать то, что вы хотите. Примерно так:

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

Это перенаправит входящий трафик с порта 80 узла на порт 80 вашего модуля. Опубликуйте IP-адрес узла в DNS, и все готово.

В целом представление службы внешнему миру, как это, является очень, очень плохой идеей, потому что один узел, проходящий через весь трафик к службе, получит несбалансированную нагрузку и будет единым точка отказа. Это соображение не относится к кластеру с одним узлом, однако, с учетом того, что LoadBalancer и Ingress являются отказоустойчивыми способами выполнить то, что вы ищете, NodePort лучше всего подходит для этого чрезвычайно специфического случая.

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