Назначить внешний IP-адрес службе Kubernetes

РЕДАКТИРОВАТЬ: Весь смысл моей установки заключается в достижении (если возможно) следующих результатов:

  • У меня есть несколько узлов k8s
  • Когда я связываюсь с IP-адресом (из моей сети компании), он должен быть перенаправлен на один из моих контейнеров /pod/service/whatever.
  • Я должен иметь возможность легко настроить этот IP-адрес (например, в моем определении службы .yml).

Я запускаю небольшой кластер Kubernetes (построенный с помощью kubeadm), чтобы оценить, могу ли я перенести мою установку Docker (старый) Swarm на k8s. Особенность, в которой я абсолютно нуждаюсь, - это возможность назначать IP-контейнеры, например, с помощью MacVlan.

В моей текущей настройке докеры я использую MacVlan для назначения IP-адресов из моей сети компании в некоторые контейнеры, чтобы я мог напрямую связаться (без обратного прокси-сервера), как если бы это был какой-либо физический сервер. Я пытаюсь достичь чего-то подобного с k8s.

Я узнал, что:

  • Мне нужно использовать Сервис
  • Я не могу использовать тип LoadBalancer, как и для совместимых облачных провайдеров (например, GCE или AWS).
  • Я должен использовать ExternalIPs
  • Ingress Resources - это какой-то обратный прокси-сервер?

Мой файл yaml:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
      name: nginx-deployment
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalIPs: 
    - A.B.C.D

Я надеялся, что мой сервис получит IP A.B.C.D(который является одной из моих сетей). Мое развертывание работает, так как я могу достичь своего контейнера nginx изнутри кластера k8s, используя его ClusterIP.

Что мне не хватает? Или, по крайней мере, где я могу найти информацию о моем сетевом трафике, чтобы узнать, поступают ли пакеты?

ИЗМЕНИТЬ:

$ kubectl get svc
NAME            CLUSTER-IP     EXTERNAL-IP       PORT(S)   AGE
kubernetes      10.96.0.1      <none>            443/TCP   6d
nginx-service   10.102.64.83   A.B.C.D           80/TCP    23h

Спасибо.

Ответ 1

Если это только для тестирования, то попробуйте

kubectl port-forward service/nginx-service 80:80

Тогда ты можешь

curl http://localhost:80

Ответ 2

Решение, которое может работать (и не только для тестирования, хотя и имеет свои недостатки), состоит в том, чтобы настроить ваш Pod для сопоставления сети хоста с hostNetwork спецификации hostNetwork установленным в true.

Это означает, что вам не понадобится сервис для предоставления вашего Pod, так как он всегда будет доступен на вашем хосте через один порт (containerPort вы указали в манифесте). В этом случае нет необходимости вести запись сопоставления DNS.

Это также означает, что вы можете запустить только один экземпляр этого модуля на данном узле (говоря о недостатках...). Таким образом, это делает его хорошим кандидатом на объект DaemonSet.

Если ваш Pod все еще нуждается в доступе/разрешении внутренних имен хостов Kubernetes, вам нужно установить для dnsPolicy спецификации ClusterFirstWithNoHostNet значение ClusterFirstWithNoHostNet. Этот параметр позволит вашему модулю получить доступ к службе DNS K8S.

Пример:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx-reverse-proxy
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      tolerations:  # allow a Pod instance to run on Master - optional
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - image: nginx
        name: nginx
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443

РЕДАКТИРОВАТЬ: я был поставлен на этот трек благодаря документации ingress-nginx

Ответ 3

Вы можете просто установить внешний IP

CMD: $ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'

Например: - $ kubectl patch svc kubernetes -p '{"spec":{"externalIPs":["10.2.8.19"]}}'

Ответ 4

Прежде всего выполните эту команду:

kubectl get -n namespace services

Вышеприведенная команда вернет вывод примерно так:

 NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
backend   NodePort   10.100.44.154         <none>          9400:3003/TCP   13h   
frontend        NodePort   10.107.53.39     <none>        3000:30017/TCP   13h

Из приведенного выше вывода видно, что внешние IP-адреса еще не назначены сервисам. Чтобы назначить внешние IP-адреса для внутренней службы, выполните следующую команду.

 kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

и для назначения внешнего IP-адреса внешней службе выполните эту команду.

 kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'

Теперь получите сервис пространства имен для проверки назначения внешних IP-адресов:

kubectl get -n namespace services

Мы получаем такой вывод:

NAME     TYPE     CLUSTER-IP     EXTERNAL-IP    PORT(S)             AGE
backend  NodePort 10.100.44.154  192.168.0.194  9400:3003/TCP       13h
frontend NodePort 10.107.53.39   192.168.0.194  3000:30017/TCP      13h

Ура !!! Kubernetes Внешние IP-адреса теперь назначены.

Ответ 6

Вы можете попробовать добавить "type: NodePort" в свой файл yaml для этой службы, а затем у вас будет порт для доступа к нему через веб-браузер или извне. Для моего случая это помогло.

Ответ 7

Просто включите дополнительную опцию.

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1

Ответ 8

Я не знаю, поможет ли это в вашем конкретном случае, но то, что я сделал (и я работаю в кластере Bare Metal), - это использование LoadBalancer и установка loadBalancerIP а также externalIPs на IP моего сервера, как вы это сделали.

После этого для балансировщика нагрузки появился правильный внешний IP-адрес.