Межконтейнерная коммуникация в Kubernetes multi container Pod

У меня есть модуль с 3 контейнерами A, B и C. Я хотел бы получить доступ к сервису в контейнере A и B из C. Ни localhost:<port> не работает, ни 127.0.0.1.

мой ямл

apiVersion: "v1"
kind: Pod
metadata:
  name: web3
  labels:
    name: web
    app: demo
spec:
  containers:
    - name: client
      image: ubuntu
      command: ['cat']
      tty: true
    - name: apache1
      image: nimmis/apache-php5
      ports:
        - containerPort: 8080
          name: apacheport1
          protocol: TCP
    - name: apache2
      image: nimmis/apache-php5
      command: ['cat']
      tty: true
      ports:
        - containerPort: 8088
          name: apacheport2
          protocol: TCP

что я делаю

kubectl apply -f example.yaml
kubectl exec -it web3 -c client bash

а затем попробуйте связаться с двумя другими сервисами

root@web3:/# curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused
root@web3:/# curl http://localhost:8088
curl: (7) Failed to connect to localhost port 8088: Connection refused
root@web3:/# curl http://localhost:80

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu

Вопросы Как заставить работать первые 2 завитка. (Я не хочу использовать эту службу, поскольку мой вариант использования предназначен только для целей тестирования) Почему есть открытый порт 80, когда я не открыл его.


person Ram Kamath    schedule 08.03.2019    source источник
comment
какой открытый порт внутри образа nimmis / apache-php5?   -  person Jose Armesto    schedule 08.03.2019
comment
80 и 443 порта открыты в контейнере Apache   -  person Ram Kamath    schedule 08.03.2019


Ответы (1)


Дело в том, что с nimmis/apache-php5 Apache прослушивает порт 80. Итак, порт 80 открыт. Через containerPort: <P> вы не говорите открыть порт 80 контейнера для <P>, а скорее выставляете порт <P>. Кроме того, как написано в документации, Not specifying a port here DOES NOT prevent that port from being exposed..

Я не нашел способа сопоставить внутренний порт контейнера с другим портом в модуле. Однако вы можете сопоставить внутренний порт контейнера с портом хоста через поле hostPort.

apiVersion: "v1"
kind: Pod
metadata:
name: web3
labels:
name: web
app: demo
spec:
containers:
- name: client
  image: ubuntu
  command: ['cat']
  tty: true
- name: apache1
  image: nimmis/apache-php5
  ports:
    - containerPort: 80
      name: apacheport1
      hostPort: 8002
      protocol: TCP
- name: apache2
  image: nimmis/apache-php5
  command: ['cat']
  tty: true
  ports:
    - containerPort: 80
      hostPort: 8001
      name: apacheport2
      protocol: TCP

Затем вы получаете IP-адрес узла, например, на Minikube.

$ minikube ip  # e.g., 192.168.97.100

и убедитесь, что с client вы можете получить доступ к службам Apache:

$ kubectl exec -it web3 -c client bash
# apt-get update && apt-get install curl
# curl 192.168.99.100:8002 
person metaphori    schedule 08.03.2019
comment
Нет возможности реплицировать -p hostPort: containerPort поведение докера в Pod? - person Ram Kamath; 08.03.2019
comment
Можно использовать hostPort, чтобы открыть containerPort: 80 для порта хоста. Тогда вы должны curl в hostIP:hostPort. - person metaphori; 09.03.2019
comment
Большое спасибо за уделенное время. Я попробовал этот вариант, но не смог создать модуль, когда у меня было включено сопоставление портов хоста. У вас есть где-нибудь под рукой минимальный рабочий пример? Я также где-то читал, что hostPort на самом деле относится к фактическому узлу kubernetes. - person Ram Kamath; 09.03.2019
comment
Да, он отображает порт на узле кластера, на котором запущен модуль. Я расширил ответ на пример. Я просто хотел бы отметить, что разоблачение вещей осуществляется через сервисы. - person metaphori; 09.03.2019
comment
Спасибо, это проясняет мой вопрос, и теперь я лучше понимаю решение. - person Ram Kamath; 09.03.2019