Kubernetes сервис внешний ip ожидает

Я пытаюсь развернуть nginx на kubernetes, версия kubernetes v1.5.2, Я развернул nginx с 3 репликами, файл YAML ниже,

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

и теперь я хочу выставить свой порт 80 на порт 30062 node, для чего я создал службу ниже,

kind: Service
apiVersion: v1
metadata:
  name: nginx-ils-service
spec:
  ports:
    - name: http
      port: 80
      nodePort: 30062
  selector:
    app: nginx
  type: LoadBalancer

эта служба работает хорошо, как и должно быть, но она показывается как ожидающая не только на панели приборов кубернетов также на терминале. Выход терминала Состояние панели управления

пожалуйста, помогите мне решить эту проблему. Спасибо...

Ответ 1

Похоже, вы используете пользовательский кластер Kubernetes (используя minikube, kubeadm или тому подобное). В этом случае встроенный LoadBalancer отсутствует (в отличие от AWS или Google Cloud). При такой настройке по умолчанию вы можете использовать только NodePort или Ingress Controller.

С Ingress Controller вы можете настроить доменное имя, которое сопоставляется с вашим модулем; вам не нужно указывать тип службы LoadBalancer, если вы используете Ingress Controller.

Ответ 2

Если вы не используете GCE или EKS (вы использовали kubeadm), вы можете добавить спецификацию externalIPs к своей службе YAML. Вы можете использовать IP-адрес, связанный с основным интерфейсом вашего узла, например eth0. Затем вы можете получить доступ к сервису извне, используя внешний IP-адрес узла.

...
spec:
  type: LoadBalancer
  externalIPs:
  - 192.168.0.10

Ответ 3

Чтобы получить доступ к службе на minikube, вам необходимо выполнить следующую команду:

minikube service [-n NAMESPACE] [--url] NAME

Дополнительная информация здесь: Minikube GitHub

Ответ 5

Я создал кластер K8S с одним узлом, используя kubeadm. Когда я попробовал PortForward и kubectl прокси, он показал внешний IP как ожидающий.

$ kubectl get svc -n argocd argocd-server
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-server   LoadBalancer   10.107.37.153   <pending>     80:30047/TCP,443:31307/TCP   110s

В моем случае я пропатчил сервис следующим образом:

kubectl patch svc <svc-name> -n <namespace> -p '{"spec": {"type": "LoadBalancer", "externalIPs":["172.31.71.218"]}}'

После этого он начал обслуживать общедоступный IP

$ kubectl get svc argo-ui -n argo
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
argo-ui   LoadBalancer   10.103.219.8   172.31.71.218   80:30981/TCP   7m50s

Ответ 6

Если вы работаете в Minikube, не забудьте упомянуть пространство имен, если вы не используете default.

служба мини-куба << имя_службы >> --url --namespace = << имя_пространства_имя >>

Ответ 7

та же проблема:

os> kubectl получить svc right-sabertooth-wordpress

НАЗВАНИЕ ТИПА КЛАСТЕР-IP ПОРТ ВНЕШНИХ-IP (S)
right-sabertooth-wordpress LoadBalancer 10.97.130.7 "в ожидании" 80: 30454/TCP, 443: 30427/TCP

os> список услуг minikube

| ------------- | ---------------------------- | ------ -------------------------- |

| NAMESPACE | ИМЯ | URL |

| ------------- | ---------------------------- | ------ -------------------------- |

| по умолчанию | Кубернетес | Нет узла порта |

| по умолчанию | правый саблезубый мариадб | Нет узла порта |

| по умолчанию | право-саблезубый-wordpress | http://192.168.99.100:30454 |

| | | http://192.168.99.100:30427 |

| куб-система | куб-днс | Нет узла порта |

| куб-система | Тиллер-Развернуть | Нет узла порта |

| ------------- | ---------------------------- | ------ -------------------------- |

Это, однако, доступно через этот http://192.168.99.100:30454.

Ответ 8

Используйте NodePort:

kubectl run user-login --replicas = 2 --labels = "run = user-login" --image = kingslayerr/teamproject: version2 --port = 5000

kubectl выставить развертывание user-login --type = NodePort --name = пользователь-логин-сервис

kubectl описывает услуги user-login-service (Запишите порт)

kubect cluster-info (IP-> Получить IP-адрес, где выполняется мастер)

Доступ к вашему сервису доступен по адресу (IP) :( порт)

Ответ 9

Удалить существующий сервис и создать такой же новый сервис решил мои проблемы. Мои проблемы в том, что Ip балансировки нагрузки, который я определяю, используется, так что внешняя конечная точка находится в состоянии ожидания. Когда я изменил новый IP балансировки нагрузки, он все равно не мог работать. Наконец, удалить существующий сервис и создать новый решил мою проблему.

Ответ 10

Проверьте логи куб-контроллера. Мне удалось решить эту проблему, установив теги clusterID для экземпляра ec2, на котором я развернул кластер.

Ответ 11

После ответа @Javier. Я решил пойти с "исправлением внешнего IP" для моего балансировщика нагрузки.

 $ kubectl patch service my-loadbalancer-service-name \
-n lb-service-namespace \
-p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.39.25"]}}'

Это заменит "ожидающий" новый исправленный IP-адрес, который вы можете использовать для своего кластера.

Подробнее об этом. Смотрите сообщение о поддержке LoadBalancer с Minikube для Kubernetes

. Не самый чистый способ сделать это. Мне нужно было временное решение. Надеюсь, это кому-нибудь поможет.

Ответ 12

При использовании Minikube вы можете получить IP и порт, через который вы можете получить доступ к сервису, запустив сервис Minikube kubia-http.