K8s - Не удается получить доступ к сервису/кластеру с другого узла

Я пытаюсь получить доступ (с рабочего узла) к поду (на рабочем узле) через службу/ClusterIP, используя curl http://cluster_ip:port_no, но это не работает.

Вот немного информации о сервисе

masternode@Master:/localdocker$ kubectl describe svc registry
Name:              registry
Namespace:         default
Labels:            io.kompose.service=registry
Annotations:       kompose.cmd: kompose convert -f docker-compose.yaml -o localregistry.yaml
                   kompose.version: 1.1.0 (36652f6)
Selector:          io.kompose.service=registry
Type:              ClusterIP
IP:                10.100.126.230
Port:              5000  5000/TCP
TargetPort:        5000/TCP
Endpoints:         192.168.171.74:5000
Session Affinity:  None
Events:            <none>```

вот некоторая информация о стручке

masternode@Master:/localdocker$ kubectl describe pod registry-7ccd695dc7-69cx4
Name:         registry-7ccd695dc7-69cx4
Namespace:    default
Priority:     0
Node:         worker/10.0.1.5
Start Time:   Sun, 19 Jul 2020 06:09:14 +0000
Labels:       io.kompose.service=registry
              pod-template-hash=7ccd695dc7
Annotations:  cni.projectcalico.org/podIP: 192.168.171.74/32
              cni.projectcalico.org/podIPs: 192.168.171.74/32
Status:       Running
IP:           192.168.171.74
IPs:
  IP:           192.168.171.74
Controlled By:  ReplicaSet/registry-7ccd695dc7
Containers:
  registry:
    Container ID:   docker://ca372f12ef7a1a3cb23e7d6c58337f47848f91212f6c75af6bfd04bc48ea2f27
    Image:          registry:2
    Image ID:       docker-pullable://registry@sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
    Port:           5000/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 19 Jul 2020 06:09:24 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY:  /data
    Mounts:
      /data from registry-claim0 (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-fhf5k (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  registry-claim0:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  registry-claim0
    ReadOnly:   false
  default-token-fhf5k:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-fhf5k
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  13m   default-scheduler  Successfully assigned default/registry-7ccd695dc7-69cx4 to worker
  Normal  Pulling    13m   kubelet, worker    Pulling image "registry:2"
  Normal  Pulled     13m   kubelet, worker    Successfully pulled image "registry:2"
  Normal  Created    13m   kubelet, worker    Created container registry
  Normal  Started    13m   kubelet, worker    Started container registry

Это практическое упражнение, в котором я смог сделать это (в их реальной среде) без каких-либо NodePorts.

Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.


person Aakash Verma    schedule 19.07.2020    source источник


Ответы (1)


Это ожидаемое поведение, поскольку служба типа ClusterIP доступна только из кластера kubernetes, т. е. из другого модуля и т. д.

Если вы хотите получить доступ к поду через службу из-за пределов кластера kubernetes, то есть из самих узлов, используйте NodePort.

После того, как вы откроете его через службу NodePort, вы сможете получить к нему доступ с помощью curl http://<NODE-IP>:<NODE-PORT>.

ClusterIP создается в сервисной сети кластера, а узлы находятся в другой сети. При создании службы NodePort в сети каждого узла открывается порт для пересылки трафика на ClusterIP. Таким образом, по сути, NodePort использует ClusterIP внутри и представляет собой абстракцию более высокого уровня, построенную поверх ClusterIP.

person Arghya Sadhu    schedule 19.07.2020
comment
То есть вы хотите сказать, что узлы не становятся частью кластера? Кроме того, зачем мне нужен кластерный IP/служба, поскольку модули могут общаться друг с другом без NAT? NodePorts предназначены для предоставления порта модуля внешнему порту узла для общего доступа. - person Aakash Verma; 19.07.2020
comment
Я вполне могу использовать IP-адрес модуля для связи между двумя модулями, но я считаю, что если я использую службу, она предоставляет модули для использования другими узлами и модулями. - person Aakash Verma; 19.07.2020
comment
IP-адреса модуля меняются, если модуль перезапускается, что довольно часто встречается в kubernetes. IP-адреса службы стабильны. Кроме того, создание службы clusterIP дает имя на основе DNS, которое можно использовать для связи между модулями в кластере. - person Arghya Sadhu; 19.07.2020
comment
У меня есть упражнение, в котором я должен построить локальный реестр на узле и использовать другой узел для извлечения образа из реестра на себя. В сервисах нет NodePorts:/ - person Aakash Verma; 19.07.2020
comment
не могли бы вы проверить вопрос еще раз? - person Aakash Verma; 19.07.2020
comment
Это все докер.. Я не вижу там необходимости в kubernetes - person Arghya Sadhu; 19.07.2020
comment
команды основаны на докере, но реестр находится на главном узле, из которого изображения загружаются в рабочий узел. - person Aakash Verma; 19.07.2020
comment
Так в чем проблема или ошибка снова? Технически невозможно получить доступ к модулю из-за пределов кластера, используя clusterIP. Так что либо вопрос неверен, либо мы его неправильно понимаем. - person Arghya Sadhu; 19.07.2020
comment
Давайте продолжим это обсуждение в чате. - person Aakash Verma; 19.07.2020