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
Ответ 4
Если вы используете Minikube, есть волшебная команда!
$ minikube tunnel
Надеюсь, кто-то может сэкономить несколько минут с этим.
Ссылочная ссылка https://github.com/kubernetes/minikube/blob/master/docs/networking.md#loadbalancer-emulation-minikube-tunnel
Ответ 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.