Невозможно получить доступ к сервису Kubernetes, предоставляемому через NodePort - PullRequest
0 голосов
/ 05 марта 2019

Я использую minikube для тестирования kubernetes на последних версиях MacOS.

Вот мои соответствующие YAML:

namespace.yml

apiVersion: v1
kind: Namespace
metadata:
  name: micro
  labels:
    name: micro

deploy.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: adderservice
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: adderservice
    spec:
      containers:
      - name: adderservice
        image: jeromesoung/adderservice:0.0.1
        ports:
        - containerPort: 8080

service.yml

apiVersion: v1
kind: Service
metadata:
  name: adderservice
  labels:
    run: adderservice
spec:
  ports:
    - port: 8080
      name: main
      protocol: TCP
      targetPort: 8080
  selector:
    run: adderservice
  type: NodePort

После запуска minikube start шаги, которые я предпринял для развертывания, следующие:следующим образом:

  1. kubectl create -f namespace.yml для создания пространства имен

  2. kubectl config set-context minikube --namespace=micro

  3. kubectl create -f deployment.yml

  4. kubectl create -f service.yml

Затем я получаю NodeIP и NodePort с помощью следующих команд:

  1. kubectl get services, чтобы получить NodePort
$ kubectl get services
NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
adderservice   NodePort   10.99.155.255   <none>        8080:30981/TCP   21h
minikube ip для получения узла IP
$ minikube ip
192.168.99.103

Но когда я делаю скручивание, я всегда получаю Отказ в соединении , например:

$ curl http://192.168.99.103:30981/add/1/2
curl: (7) Failed to connect to 192.168.99.103 port 30981: Connection refused

Таким образом, я проверил узел, модуль, развертывание и конечную точку следующим образом:

$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    23h       v1.13.3

$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
adderservice-5b567df95f-9rrln   1/1       Running   0          23h

$ kubectl get deployments
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
adderservice   1         1         1            1           23h

$ kubectl get endpoints
NAME           ENDPOINTS         AGE
adderservice   172.17.0.5:8080   21h

Я также проверил список сервисов из миникуба с помощью:

$ minikube service -n micro adderservice --url
http://192.168.99.103:30981

Я прочитал много сообщений о доступе к k8sсервис через NodePorts.Насколько я знаю, я должен иметь доступ к приложению без проблем.Единственное, что я подозреваю, это то, что я использую собственное пространство имен.Вызовет ли это проблему с доступом?

Я знаю, что пространство имен изменит DNS, поэтому, чтобы закончить, я также выполнил следующие команды:

$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.default
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

$ kubectl exec -ti adderservice-5b567df95f-9rrln -- nslookup kubernetes.micro
Server:     10.96.0.10
Address:    10.96.0.10#53

Non-authoritative answer:
Name:   kubernetes.micro
Address: 198.105.244.130
Name:   kubernetes.micro
Address: 104.239.207.44

Может ли кто-нибудь мне помочь?Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Ошибка Connection Refused в основном означает, что приложение внутри контейнера не принимает запросы на целевой интерфейс или не отображается через ожидаемые порты.

Вещи, о которых вам необходимо знать:

  • Убедитесь, что ваше приложение привязано к 0.0.0.0, чтобы оно могло получать запросы извне контейнера, как снаружи, так и через другие контейнеры.
  • Убедитесь, что ваше приложение действительно прослушиваетcontainerPort и targetPort, как ожидается

В вашем случае вы должны убедиться, что ADDERSERVICE_SERVICE_HOST равно 0.0.0.0 и ADDERSERVICE_SERVICE_PORT равно 8080, что должно быть одинаковым значениемкак targetPort в service.yml и containerPort в deployment.yml

0 голосов
/ 05 марта 2019

Проверьте, действительно ли служба прослушивает 8080.

Попробуйте telnet внутри контейнера.

telnet 127.0.0.1 8080
.
.
.
telnet 172.17.0.5 8080

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