Невозможно получить доступ к открытому порту на кубернетах

Я создал собственный образ tcserver, открывающий порт 80, 8080 и 8443. В основном у вас есть apache, а внутри конфигурации у вас есть прокси-пропуск, чтобы перенаправить его на tcserver tomcat.

EXPOSE 80 8080 8443

После этого я создал kubernetes yaml для сборки модуля, открывающего только порт 80.

apiVersion: v1
kind: Pod
metadata:
  name: tcserver
  namespace: default
spec:
  containers:
  - name: tcserver
    image: tcserver-test:v1
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80

И сервис вместе с этим.

apiVersion: v1
kind: Service
metadata:
  name: tcserver-svc
  labels:
    app: tcserver
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080
  selector:
    app: tcserver

Но проблема в том, что я не могу получить к нему доступ.
Если я захожу в модуль (kubectl exec -it tcserver -- /bin/bash), я могу сделать curl -k -v http://localhost, и он ответит.

Я считаю, что что-то не так с сервисом, но не знаю, что именно.
Любая помощь будет принята с благодарностью.

Изменение SVC
Как было предложено sfgroups, я добавил targetPort: 80 в svc, но все еще не работает.

Когда я пытаюсь скрутить IP, я получаю сообщение Нет маршрута к хосту

[root@testmaster tcserver]# curl -k -v http://172.30.62.162:30080/
* About to connect() to 172.30.62.162 port 30080 (#0)
*   Trying 172.30.62.162...
* No route to host
* Failed connect to 172.30.62.162:30080; No route to host
* Closing connection 0
curl: (7) Failed connect to 172.30.62.162:30080; No route to host

Это описание из svc:

[root@testmaster tcserver]# kubectl describe svc tcserver-svc
Name:                   tcserver-svc
Namespace:              default
Labels:                 app=tcserver
Annotations:            <none>
Selector:               app=tcserver
Type:                   NodePort
IP:                     172.30.62.162
Port:                   <unset> 80/TCP
NodePort:               <unset> 30080/TCP
Endpoints:              <none>
Session Affinity:       None
Events:                 <none>

person radicaled    schedule 10.01.2019    source источник
comment
В вашей службе я вижу, что селектор app: tcserver, но я не вижу метки в определении Pod.   -  person    schedule 11.01.2019


Ответы (2)


Когда вы посмотрите на вывод kubectl describe service, вы увидите, что он на самом деле не прикреплен ни к каким модулям:

Endpoints:              <none>

Это потому, что в спецификации службы указано, что служба будет подключаться к модулям, помеченным с помощью app: tcserver

spec:
  selector:
    app: tcserver

Но в метаданных модуля вы вообще не указываете никаких меток.

metadata:
  name: tcserver
  namespace: default
  # labels: {}

Итак, исправление состоит в том, чтобы добавить в спецификацию модуля соответствующую метку.

metadata:
  labels:
    app: tcserver

Также обратите внимание, что на практике развертывание «голого модуля» немного необычно. Обычно они заключены в контроллер более высокого уровня, чаще всего в развертывание, которое фактически создает поды. В спецификации развертывания есть спецификация модуля шаблона, и важны метки модуля.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tcserver
  # Labels here are useful, but the service doesn't look for them
spec:
  template:
    metadata:
      labels:
        # These labels are what the service cares about
        app: tcserver
    spec:
      containers: [...]
person David Maze    schedule 11.01.2019
comment
Я развертываю его как модуль, потому что тестировал его. Идея в том, чтобы в будущем подняться выше, когда я буду знать, что все работает правильно. Спасибо - person radicaled; 11.01.2019

Я вижу, что целевой пост отсутствует, можете ли вы добавить порт traget и протестировать?

apiVersion: v1
kind: Service
metadata:
  name: tcserver-svc
  labels:
    app: tcserver
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30080
    targetPort: 80
  selector:
    app: tcserver
person sfgroups    schedule 10.01.2019
comment
Согласно документации kubernetes.io/docs/concepts/services-networking/service, Note that a Service can map an incoming port to any targetPort. By default the targetPort will be set to the same value as the port field. . Следовательно, нет необходимости определять nodePort категорически. - person ; 11.01.2019
comment
@JasonStanley, согласен, нодпорт не нужен. Как указал Дэвид, проблема с селектором ярлыков. - person sfgroups; 11.01.2019