, но я не могу использовать, например:
kubectl expose pod site-web --type=LoadBalancer --port=8080
Конечно, вы можете, однако выставление одного Pod
через LoadBalancer
Service
не имеет большого смысла , Если у вас есть Deployment
, который обычно управляет набором Pods
, между которым можно сбалансировать реальную нагрузку, LoadBalancer
выполняет свою работу. Однако вы все равно можете использовать его только для демонстрации одного Pod
.
Обратите внимание, что ваш контейнер предоставляет порт 80
, а не 8080
(containerPort: 80
в вашей спецификации container
), поэтому вам нужно укажите его как target-port
в вашем Service
. Ваша команда kubectl expose
может выглядеть следующим образом:
kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80
Если вы указали только --port=8080
флаг для вашей команды kubectl expose
, предполагается, что значение target-port
совпадает со значением --port
. Вы можете легко проверить это самостоятельно, посмотрев на только что созданную службу:
kubectl get svc site-web -o yaml
, и вы увидите нечто подобное в разделе spec.ports
:
- nodePort: 32576
port: 8080
protocol: TCP
targetPort: 8080
После выставив ваш Pod
(или Deployment
) правильно, т.е. используя:
kubectl expose pod site-web --type=LoadBalancer --port=8080 --target-port=80
вы увидите нечто похожее:
- nodePort: 31181
port: 8080
protocol: TCP
targetPort: 80
После выдачи kubectl get services
вы должны увидеть похожий вывод :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
site-web ClusterIP <Cluster IP> <External IP> 8080:31188/TCP 4m42s
Если затем в браузере вы набрали go - http://<External IP>:8080
или запустили curl http://<External IP>:8080
, вы должны увидеть интерфейс вашего сайта.
Имейте в виду, что это решение имеет смысл и будет полностью функциональным в облачной среде, которая сможет предоставить вам реальный балансировщик нагрузки. Обратите внимание, что если вы объявляете такой тип Service
в Minikukbe , на самом деле он создает службу NodePort , поскольку он не может предоставить вам реальный балансировщик нагрузки. Таким образом, ваше приложение будет доступно на IP-адресе вашего Node (вашей виртуальной машины Minikube) на случайно выбранном порту в диапазоне 30000-32767
(в моем примере это порт 31181
).
Что касается вашего вопроса о томе:
У меня есть общий том, поэтому, если я понимаю, я не могу использовать развертывание, а только модули (возможно, с состоянием?)
да, если вы хотите использовать специально EmptyDir том, он не может быть разделен между различными Pods
(даже если они были запланированы на одном узле), он разделяется только между контейнерами в одном и том же Pod
. Если вы хотите использовать Deployment
, вам нужно подумать о другом решении для хранения данных, таком как PersistenetVolume .
РЕДАКТИРОВАТЬ:
В первый момент я не заметил ошибку в вашей команде:
kubectl expose pod site-web --type=LoadBalancer --port=8080
Вы пытаетесь выставить несуществующие Pod
, так как имя Pod
- site-home
, а не site-web
. site-web
- это имя одного из ваших контейнеров (в вашем site-home
Pod
). Помните: мы выставляем Pod
, а не containers
через Service
.
Я меняю 80-> 8080, но я всегда прихожу к error:kubectl expose pod
site-home --type=LoadBalancer --port=8080 return:error: couldn't
retrieve selectors via --selector flag or introspection: the pod has
no labels and cannot be exposed
См. 'kubectl expose -h'
для помощи и примеров .
Ключевым моментом здесь является: the pod has no labels and cannot be exposed
Похоже, что для вашего Pod
не определено ни одного labels
, необходимого для того, чтобы Service
Вы можете выбрать этот конкретный Pod
(или набор похожих Pods
, которые имеют такую же метку) среди других Pods
в вашем кластере. Вам нужен хотя бы один ярлык в вашем определении Pod
. Добавление простой метки name: site-web
в разделе Pod
metadata
должно помочь. Это может выглядеть так в вашем Pod
определении:
apiVersion: v1
kind: Pod
metadata:
name: site-home
labels:
name: site-web
spec:
...
Теперь вы даже можете предоставить эту метку в качестве селектора в вашей службе, однако она должна обрабатываться автоматически, если вы опустите флаг --selector
:
kubectl expose pod site-home --type=LoadBalancer --port=8080 --target-port=80 --selector=name=site-web
Помните: in Minikube реальный балансировщик нагрузки не может быть создан, и вместо него будет создан тип LoadBalancer
NodePort
. Команда kubectl get svc
сообщит вам, на каком порту (в диапазоне 30000-32767
) ваше приложение будет доступно.
и `kubectl expose pod site-web --type = LoadBalancer --port = 8080 return: Ошибка с сервера (NotFound): модули "site-web" не найдены. Site-home - это модуль, site-web - контейнер с открытым портом, в чем проблема?
если у вас нет Pod
с именем "site-web"
, вы можете ожидать такого сообщение. Здесь вы просто пытаетесь разоблачить несуществующие Pod
.
Если я открыл порт из контейнера, порт автоматически открывается и для модуля?
Да, у вас есть порт, определенный в определении контейнера. Ваш Pods
автоматически открывает все порты, которые отображаются внутри них Containers
.