Пустой доступ к куберне АДРЕС
Я попытался настроить вход на моем кластере kubernetes. Я следовал документации, чтобы установить входной контроллер, и выполнил следующие команды
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
После этого работали default-http-backend и nginx-ingress-controller:
ingress-nginx default-http-backend-846b65fb5f-6kwvp 1/1 Running 0 23h 192.168.2.28 node1
ingress-nginx nginx-ingress-controller-d658896cd-6m76j 1/1 Running 0 6m 192.168.2.31 node1
Я попытался протестировать вход и развернул следующую службу:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: my-echo
image: gcr.io/google_containers/echoserver:1.8
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: echo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
И следующий вход:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 8080
Когда я выполнил команду 'kubectl get ing', я получил:
NAME HOSTS ADDRESS PORTS AGE
happy-ingress happy.k8s.io 80 14m
Мне не удалось разрешить АДРЕС, и я не могу понять, в чем проблема, потому что все модули работают. Можете ли вы дать мне подсказку, в чем может быть проблема?
Спасибо
Ответы
Ответ 1
Вы должны включить ingress addons
с помощью следующей команды перед созданием правил входа. Вы также можете включить его перед выполнением любой другой команды
$ minikube addons enable ingress
ingress was successfully enabled
Подождите, пока стручки не заработают. Вы можете проверить, выполнив следующую команду и подождать аналогичного вывода
kubectl get pods -n kube-system | grep nginx-ingress-controller
nginx-ingress-controller-5984b97644-jjng2 1/1 Running 2 1h
Для Deployment
вы должны указать containerPort
, а для Service
вы должны указать протокол http
.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: echoserver-deploy
spec:
replicas: 2
selector:
matchLabels:
app: my-echo
template:
metadata:
labels:
app: my-echo
spec:
containers:
- name: my-echo
image: gcr.io/kubernetes-e2e-test-images/echoserver:2.1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echoserver-svc
spec:
selector:
app: my-echo
ports:
- protocol: TCP
port: 80
targetPort: 8080
name: http
Для правила входа измените порт servicePort
с 8080 на 80 порт http по умолчанию.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: happy-ingress
annotations:
INGRESS.kubernetes.io/rewrite-target: /
spec:
rules:
- host: happy.k8s.io
http:
paths:
- path: /echoserver
backend:
serviceName: echoserver-svc
servicePort: 80
Теперь примените эти файлы и создайте ваши правила, сервис и правила входа. Подождите немного, потребуется несколько минут, чтобы получить АДРЕС для вашего правила входа.
Теперь вы можете посетить свой сервис, используя адрес minikube ip
, но не по имени хоста. Для этого вам необходимо добавить хост и соответствующий IP-адрес в файл /etc/hosts
. Итак, откройте файл /etc/hosts
в вашем любимом редакторе и добавьте ниже строку, где находится фактический IP вашего мини-куба
<minikube_ip> happy.k8s.io
Теперь вы получаете доступ к своему сервису, используя имя хоста. Убедитесь, что следовали за командой
curl http://happy.k8s.io/echoserver
Ответ 2
Я не знаю, поможет ли это, но у меня была такая же проблема.
Я не устанавливал входной контроллер или что-то подобное, как говорили некоторые люди на Github,
я только что создал Ingress, чтобы иметь возможность указать свой поддомен для другой службы, и сначала у моего Ingress не было IP-адреса (он был пустым).
NAME HOSTS ADDRESS PORTS AGE
ingress delivereo.tk,back.delivereo.tk 80 39s
Я думаю, это потому, что мои 2 службы для интерфейсного приложения и серверного API имели тип LoadBalancer.
Я изменил его на NodePort, потому что им не нужен внешний ip теперь, когда входной контроллер будет управлять тем, что URL идет куда.
И когда я изменил тип своих услуг на NodePort, через 2 или 3 минуты появился IP-адрес Ingress.
Когда я указал свой Cloudflare DNS на новый входящий IP, я протестировал свой поддомен, и он заработает!
ПЕРЕД
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: LoadBalancer
ПОСЛЕ
apiVersion: v1
kind: Service
metadata:
name: delivereotk
spec:
ports:
- port: 80
selector:
app: delivereotk
type: NodePort
Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: delivereo.tk
http:
paths:
- backend:
serviceName: delivereotk
servicePort: 80
- host: back.delivereo.tk
http:
paths:
- backend:
serviceName: backdelivereotk
servicePort: 80
Ответ 3
Ваше hostname happy.k8s.io
должно разрешить фактический IP-адрес контроллера nginx-ingress, который указывает на фронт вашего балансировочного устройства.
Вы можете проверить, под каким IP-адресом работает кластер:
bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube-
system/services/kube-dns:dns/proxy
Проверьте входной контроллер для вашего кластера с помощью curl
bash-3.2$ curl http://192.168.1.100:8080
default backend - 404
В конце вы должны просто добавить запись домена в /etc/hosts
:
192.168.1.100 happy.k8s.io
Ответ 4
В официальном документе говорится:
Поскольку Сервисы NodePort не получают LoadBalancerIP, назначенный определение, контроллер входа NGINX не обновляет статус Входящие объекты, которыми он управляет
Вы развернули контроллер NGINX Ingress, как описано в руководстве по установке, поэтому нормально, чтобы ваш АДРЕС был пуст!
Вместо этого внешний клиент должен добавить NodePort, выделенный для службы ingress-nginx, к HTTP-запросам.
пс. Этот вопрос не о миникубе