#kubernetes #kubernetes-pod
#kubernetes #kubernetes-pod
Вопрос:
У меня есть модуль с 3 контейнерами A, B и C. Я хотел бы получить доступ к сервису в контейнерах A и B из C. Ни localhost:<port>
не работает, ни 127.0.0.1
.
мой yaml
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 curl. (Я не хочу использовать сервис, поскольку мой вариант использования предназначен только для тестирования)
Почему открыт порт 80, когда я не предоставил доступ к порту.
Комментарии:
1. какой открытый порт находится внутри образа nimmis / apache-php5?
2. В контейнере Apache открыты 80 и 443 порта
Ответ №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 amp;amp; apt-get install curl
# curl 192.168.99.100:8002
Комментарии:
1. Нет способа воспроизвести -p hostPort: поведение docker в контейнере в Pod?
2. Одним из вариантов было бы использовать
hostPort
для предоставленияcontainerPort: 80
доступа к порту хоста. Тогда вы быcurl
наhostIP:hostPort
.3. Большое спасибо за ваше время. Я попробовал эту опцию, но не смог создать модуль, когда у меня было включено сопоставление портов хоста. У вас где-нибудь под рукой есть минимальный рабочий пример? Я также где-то читал, что hostPort фактически ссылается на фактический узел kubernetes.
4. Да, он отображает порт на узле кластера, на котором запущен модуль. Я расширил ответ примером. Я просто хотел бы отметить, что раскрытие информации осуществляется через сервисы.
5. Спасибо, это проясняет мой вопрос, и теперь я лучше понимаю, как найти решение.