Отказ в соединении при попытке доступа к модулю kubernetes через DNS-сервер kubernetes - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь настроить один узел hadoop на kubernetes.Странно то, что, когда я вхожу в модуль через kubectl exec -it <pod> /bin/bash, я могу счастливо получить доступ, например, к узлу имени на порту 9000.

root@hadoop-5dcf94b54d-7fgfq:/hadoop/hadoop-2.8.5# telnet localhost 9000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Я также могу bin/hdfs dfs -put файлы и тому подобное, поэтому кластерКажется, работает нормально.Я также могу получить доступ к интерфейсу через kubectl port-forward <podname> 50070:50070 и вижу, что узел данных запущен и работает.Таким образом, кластер (установка «псевдораспределенная», как описано здесь .), Кажется, работает нормально.

Однако, когда я хочу получить доступ к своему сервису через kubernetes dns, я получаюConnection refused.

telnet hadoop.aca534.svc.cluster.local  9000
Trying 10.32.89.21...
telnet: Unable to connect to remote host: Connection refused

В чем разница при доступе к порту через k8s-dns?

Порт должен быть открыт, я также вижу, что hadoopимя узла прослушивает 9000.

lsof -i :9000
COMMAND  PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
java    2518 root  227u  IPv4 144574393      0t0  TCP localhost:9000 (LISTEN)
java    2518 root  237u  IPv4 144586825      0t0  TCP localhost:9000->localhost:58480 (ESTABLISHED)
java    2660 root  384u  IPv4 144584032      0t0  TCP localhost:58480->localhost:9000 (ESTABLISHED)

Для полной ссылки здесь приведена моя спецификация обслуживания и развертывания kubernetes yml.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    service: hadoop
  name: hadoop
spec:
  selector:
    matchLabels:
      service: hadoop
  replicas: 1
  template:
    metadata:
      labels:
        service: hadoop
        run: hadoop
        track: stable
    spec:
      containers:
      - name: hadoop
        image: falcowinkler/hadoop:2.8.5
        imagePullPolicy: Never
        ports:
          # HDFS Ports
          - containerPort: 50010
          - containerPort: 50020
          - containerPort: 50070
          - containerPort: 50075
          - containerPort: 50090
          - containerPort: 8020
          - containerPort: 9000
          # Map Reduce Ports
          - containerPort: 19888
          # YARN Ports
          - containerPort: 8030
          - containerPort: 8031
          - containerPort: 8032
          - containerPort: 8033
          - containerPort: 8040
          - containerPort: 8042
          - containerPort: 8088
          - containerPort: 22
          # Other Ports
          - containerPort: 49707
          - containerPort: 2122
---
apiVersion: v1
kind: Service
metadata:
  labels:
    service: hadoop
  name: hadoop
spec:
  ports:
  - name: hadoop
    port: 9000
  - name: ssh
    port: 22
  - name: hadoop-ui
    port: 50070
  selector:
    service: hadoop
  type: ClusterIP

1 Ответ

0 голосов
/ 20 января 2019

В чем разница при доступе к порту через k8s-dns?

Когда вы вызываете IP-адрес модуля, вы подключаетесь напрямую к модулю, а не к услуге.

Когда вы обращаетесь к DNS-имени вашей службы, она преобразуется в IP-адрес службы, который перенаправляет ваш запрос к действительным модулям, используя селекторы в качестве фильтра для поиска пункта назначения, поэтому это 2 разных способа доступа к модулям.

Кроме того, вы можете звонить на IP-адрес службы напрямую, а не использовать DNS, он будет работать так же. Более того, служебный IP-адрес, в отличие от IP-адресов Pod, является статическим, поэтому вы можете использовать его все время, если хотите.

Для связи в кластере вы используете ClusterIP сервисный режим, который является режимом по умолчанию, и вы устанавливаете его, так что все в порядке.

Текущие конечные точки, где ваша служба перенаправляет запросы, которые вы можете получить kubectl get service $servicename -o wide в столбце «конечная точка».

Что касается ваших текущих проблем с подключением, я могу порекомендовать вам:

  • Проверьте конечную точку вашего сервиса (должен быть один или несколько IP-адресов модулей),

  • Установить параметр targetPort для каждого из сервисных портов, например:

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        service: hadoop
      name: hadoop
    spec:
      ports:
      - name: hadoop
        port: 9000
        targetPort: 9000 # here is
      - name: ssh
        port: 22
        targetPort: 22 # here is
      - name: hadoop-ui
        port: 50070
        targetPort: 50070 # here is
      selector:
        service: hadoop
      type: ClusterIP
    

P.S. Здесь - хорошая тема с объяснением того, как работает Сервис. Также вы можете проверить официальную документацию .

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